随机森林,Random Forest,简称RF,是一个很强大的模型。要研究随机森林,首先要研究决策树,然后再去看RF是怎么通过多颗决策树的集成提高的模型效果。
决策树分为三种,分别是ID3、C4.5和CART决策树:
ID3:信息增益
C4.5:信息增益率
CART:Gini系数
而随机森林算法中,“随机”是这个模型的灵魂,“森林”只是一种简单的组合方式而已。随机森林在构建每棵树的时候,为了保证每棵树之间的独立性,通常会采用两到三层的随机性。
1)从数据抽样开始,每颗树都随机地在原有数据的基础上进行有放回的抽样。假定训练数据有1万条,随机抽取8千条数据,因为是有放回的抽样,可能原数据中有500条被抽了两次,即最后的8千条中有500条是重复的数据。每颗树都进行独立的随机抽样,这样保证了每颗树学习到的数据侧重点不一样,保证了树之间的独立性。
2)抽取了数据,就可以开始构建决策分支了,在每次决策分支时,也需要加入随机性,假设数据有20个特征(属性),每次只随机取其中的几个来判断决策条件。假设取4个属性,从这4个特征中来决定当前的决策条件,即忽略其它的特征。取特征的个数,通常不能太小,太小了使得单颗树的精度太低,太大了树之间的相关性会加强,独立性会减弱。通常取总特征的平方根,或者log2(特征数)+1,在scikit-learn的实现中,支持sqrt与log2,而spark还支持onethird(1/3)。
3)在结点进行分裂的时候,除了先随机取固定个特征,然后选择最好的分裂属性这种方式,还有一种方式,就是在最好的几个(依然可以指定sqrt与log2)分裂属性中随机选择一个来进行分裂。scikit-learn中实现了两种随机森林算法,一种是RandomForest,另外一种是ExtraTrees,ExtraTrees就是用这种方式。在某些情况下,会比RandomForest精度略高。
总结来说,使用随机性的三个地方如下:
1、随机有放回的抽取数据;
2、随机选取N个特征,选择最好的属性进行分裂;
3、在N个最好的分裂特征中,随机选择一个进行分裂;
这就是随机森林的三个“随机”所在,“随机”的目的就是为了保证各个基算法模型的相互独立,从而提升组合后的精度。当然,还要保证每个基分类器不至于太弱,至少要强于随机猜测,也就是错误率不要超过0.5。
调用RandomForestClassifier时的参数说明:
- n_estimators:指定森林中树的颗数,越多越好,只是不要超过内存;
- criterion:指定在分裂使用的决策算法;
- max_features:指定了在分裂时,随机选取的特征数目,sqrt即为全部特征的平均根;
- min_samples_leaf:指定每颗决策树完全生成,即叶子只包含单一的样本;
- n_jobs:指定并行使用的进程数;
从随机森林的构建过程来看,随机森林的每棵树之间都是独立构建的,而且是尽量的往独立的方向靠拢,不依赖其他树的构建。就这一特点,就被大家所喜爱,因为这样就可以做成并行的!
随机森林基本上继承了决策树的全部优点,它只需要做很少的数据准备,其他算法常常需要对数据做归一化。决策树能够处理连续变量,也能处理离散变量,当然也能做多分类问题,多分类问题依然还是二叉树。决策树就是if-else语句,区别只是哪些条件写在if,哪些写在else,因此易于理解和解释。
决策树的可解释性很强,你可以打印出整个树来,从哪个因素开始决策的,一目了然。随机森林的解释性就没这么强了,因为引入了随机抽取特征,而且是多棵树共同决定,树一旦多了,很难说清楚得出结论的具体过程,虽然可以打印出每棵树的结构,但是很难分析。
虽然不好解释,但是RF解决了决策树的过拟合问题,使模型的稳定性增加,对噪声也更加鲁棒,从而提升了整体预测精度。
因为随机森林能计算参数的重要性,因此也可用于对数据的降维,只选取少量几维重要的特征来近似表示原数据。同理,在数据有众多的特征时,也可以用于特征选择,选择关键的特征用于算法中。
最后,在大数据环境下,随着森林中树的增加,最后生成的模型可能过大,因为每颗树都是完全生长,存储了用于决策的全部数据,导致模型可能达到几G甚至几十G。如果用于在线的预测,光把模型加载到内存就需要很长时间,因此比较适合离线处理。