如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;
如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的,通常情况下特征的选取数量为m=log2d;
每棵树都尽最大程度的生长,并且没有剪枝过程。
随机森林的分类效果与下面因素有关:
前面有提到每个分类器要尽可能地独立,因此森林中任意两棵树的相关性越大,错误率就越大;
另一个就是随机森林中每棵树的分类能力,每棵树的分类能力越强,则最终的分类错误率就越低。
同时,随机森林中树的数量也是影响其性能和效率的参数,当树的数量较少时,随机森林分类的误差较大,性能差,但当数量大到一定规模时,树的复杂度将大大提升。
上面提到通常特征的选择数量为m=log2d,当减小选择特征数量m时,树的相关性和分类能力都会同时降低,增大m时,树的相关性和分类能力也会提升,因此需要平衡二者选取合适的m。
那么为什么要选择分类器能力强作为基分类器呢?从随机森林的期望和方差来看:
样本的权重并没有改变,因此整体的期望与基分类器相同,当选弱分类器作为基分类器时,则模型可能具有较大的偏差,则导致整体的偏差较大,因此必须选取较强的分类器作为基分类器。同时从方差公式来看,整体模型的方差小于等于基模型的方差,随着模型数量m的增多,整体方差也在逐渐减小,从而防止过拟合的能力变强,但是,当模型数量达到一定数量时,方差第二项对于方差的改变作用很小,因此防止过拟合能力达到极致,这也解释了为什么树的数量为什么不能无限大。
那么,如何来衡量随机森林的好坏呢?通常采用精度估计的方法来评价模型的好坏,而其中袋外(OOB,Out of Bag)精度评估方法可以在不加入测试样本的情况下评估随机森林分类器的好坏。随机森林在构建过程中,每棵树都有约1/3的样本集((1-1/m)^m,当→∞时约等于37%≈1/3)没有参与训练,这部分数据称之为OOB数据。分别对每个袋外数据利用随机森林对这部分样本进行分类,将误分类的占总样本的比率作为袋外错误率,实质上相当于进行了k折交叉实验。
下面举一个简单的随机森林的例子,还是用前面决策树中气球的例子来说明,由于颜色对于结果不起作用,故先删去该特征,在构建随机森林时,每次选取1个特征,即m=1,那么构建三棵树如下:
那么给定一个样本:小孩、用脚踩、小气球是否会发生爆炸,那么根据上面建立的森林,进行投票表决(上图中红线路径),爆炸票数1,不爆炸票数2,因此最终结果为不爆炸(也可以用概率的线性加权,最终结果也是不爆炸)。
这里就不说随进森林的建立实现了,后续会利用数据集和python带的sklearn包对随进森林进行实现。
Boosting与AdaBoost集成学习的另一种思想方法就是Boosting的方法,Boosting是基于概率近似正确(PAC)理论中的可学习性而来,所谓PAC的可学习性是指算法能够在合理的时间内,以足够大的概率输出错误率较小的模型,分为“强可学习性”和“弱可学习性”。
强学习性是指存在一个多项式算法可以学习出准确率很高的模型;
弱学习性是指存在一个多项式可学习但仅可学习到准确率略高于随机猜测的模型;
这两者在PAC的学习框架下是等价的,这也就意味着只要找到了弱学习模型就可以把其变为强学习模型(这一部分涉及到PAC相关理论,有兴趣后续再进一步学习)。
Boosting算法就是利用了这种思想,将弱学习算法提升为强学习算法,其具体做法是:
根据当前训练数据训练出一个弱模型;