以上是基本的RF,首先利用bagging获取不同的资料,然后对不同的资料使用decision tree,最后对decision tree的结果进行公平的投票。
更近一步,我们不止将数据的获取随机化,而且在每次branch的时候选择不同的特征子集进行分割,比如总共有100个特征,我们在每次baranch时随机抽取10个特征进行分割特征的选取。
我们选取子空间的过程其实就是对原特征进行一个投影,我们用矩阵P表示,P的rows相当于投影方向,我们在每次branch的时候选择不同的投影方向进行特征选取。
validation
每次bagging大概有1/e的数据没有被选中。
我们用这些没被选中的数据进行validation,比如最后一排(XN,YN)数据,没有被g2…gT的所有模型用作训练数据,那么我们可以将g2…gT模型求平均然后用(xN,yN)进行validation,然后我们每排的(xi,yi)都做相同的validation,最后将所有的E(G_)作平均就是对我们的G的validation,这个和loov很像。
Feature Selection
如果我们有10000个特征,这里面有很多垃圾特征,我们怎么移除垃圾特征,使用重要的特征对我们的数据进行处理呢?
该方法的好处是高效,没杂讯,简单,易分析,缺点就是选取方法复杂,选的不好容易overfit,选的不好不容易解释。
对于线型模型特征选择很简单,线型模型特征之间没有联系,所以我们直接对线型模型进行分类求出w,每个feature前面的wi越大,那么这个feature就越简单。
但是对于非线性的模型,不同的特征相互关联,这种方法就不好求解了。RF就是这种非线性的特征。
对于RF我们首先对数据集的所有特征做一个学习学得一个模型,然后对这个模型进行validation得到一个分数,然后我们将我们测试的某个特征的排序打乱,然后在学得一个模型,并对模型进行validation得到一个分数(我们只做洗牌动作,所以概率模型没有变),然后两个分数相减,如果这个特征很重要,那么分数差将很大,如果这个特征不重要,那么分数差将相似。
但是每一次随机排序后,我们都要做一次train,太麻烦了,于是我们想了一个偷懒的方法,我们只对原始模型的validation的数据的特征进行打乱,然后用打乱的数据进行validation得到另一个分数,然后计算两个分数的差作为该特征的重要性。
action
第一幅图是领用random combination做出来的决策树,即每次选择不一样的特征子集。第二幅图是选取一半的数据集做的普通决策树,第三张图是利用100个普通决策树做的随机森林。效果明显好了很多。
理论上越多的树,越好。