1. 随机森林的定义
随机森林属于集成学习,集成学习(ensemble)的思想是为了解决单个模型或者有一组参数的模型所固有的缺陷,从而整合更多的模型,取长补短。随机森林就是集成学习思想下的产物,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择的最多,就预测这个样本属于哪一类。
在建立每一棵决策树的过程中,有两点需要注意-采样与完全分裂。首先是两个随机采样的过程,随机森林对输入的数据要进行行采样、列采样。对于行采样,采取有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一刻树的输入样本都不是全部的样本,使得相对不容易出现过拟合。然后进行列采样,从M个feature中选择m个(m << M),之后就是对采样后的数据使用完全分裂的方式建立出决策树,这样决策树的某一叶子节点要么是无法继续分裂的,要么里面的所有样本都是指向的同一个分类。一般很多的决策树算法都有一个重要的步骤:剪枝,但是随机森林不这么干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现过拟合。
为什么要有放回抽样?
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是“有偏的”,也就是说每棵树训练出来的模型都是由很大差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是“求同”,因此使用完全不同的训练集来训练每棵树这样对最终结果是没有帮助的,这样无异于是“盲人摸象”。
2. 随机森林算法原理
随机森林属于集成学习中Bagging算法的衍生,在集成学习中,主要分为bagging算法和boosting算法。我们先看看这两种方法的特点和区别。
2.1 Bagging
Bagging算法的基本思想
Bagging的基本思想为对训练集有放回地抽取训练样例,从而为每一个基本分类器都构造出一个跟训练集大小相等但各不相同的训练集,从而训练出不同的基分类器,最后将各个基分类器进行融合,得到最终分类器。
Bagging算法的过程
1)从原始样本集中使用有放回抽样方法随机抽取n个训练样本,共进行k轮抽取,得到k
个训练集(k个训练集之间相互独立,元素可以有重复)
2)对于k个训练集,我们训练k个模型
3)对于分类问题:最终结果由k个模型投票表决产生分类结果;对于回归问题,由k个模型预测结果的均值作为最后结果
如上图所示,将原始数据通过有放回抽样的方式分为S1到ST个训练集,分别用这T个训练集训练T个模型C1(X)到CT(X),并将这T个模型融合为最终模型maxcont(X),当新来一条数据时,会经过T个模型的综合判断,得到最终结果。
2.2 Boosting
Boosting算法的基本思想
Boosting的基本思想是一个顺序执行的过程,每个后续模型都会尝试纠正之前模型的错误。后续的模型都依赖于之前的模型。
Boosting算法的过程
1)对于训练集中的每个样本建立权值wi,表示对每个样本的权重, 其关键在与对于被错误分类的样本权重会在下一轮的分类中获得更大的权重(错误分类的样本的权重增加)。
2)同时加大分类 误差概率小的弱分类器的权值,使其在表决中起到更大的作用,减小分类误差率较大弱分类器的权值,使其在表决中起到较小的作用。每一次迭代都得到一个弱分类器,需要使用某种策略将其组合,最为最终模型。
如上图所示,从原始数据集构建子集S,赋与初始权重W1,用S和W1训练模型C1,得到权重W2,W2与S训练得到模型C2,以此类推,最后所有模型加权求和得到最终模型。当新来一条数据X,会分别代入T个模型,最后再加权求和得到最终结果。
注:Boosting每次抽样为无放回抽样,即不改变原始数据分布,上图S指的是每轮迭代都从原始数据集进行无放回抽样得到的子集。
2.3随机森林
随机森林(RandomForest,RF)是Bagging算法的一种,其实在介绍完Bagging算法之后,随机森林几乎是呼之欲出的,RF相对于Bagging只是对其中一些细节做了自己的规定和设计。
【弱分类器】首先,RF使用了CART决策树作为弱学习器。换句话说,其实我们只是将使用CART决策树作为弱分类器的Bagging方法称为随机森林。
【随机性】同时,在生成每棵树的时候,每个树选取的特征都仅仅是随机选出的少数特征,一般默认取特征总数m的开方。而一般的CART树则会是选择全部的特征进行建模。因此RF的随机选取行、列使得RF不易出现过拟合。
【样本量】相对于一般的Bagging算法,RF会采集和训练集样本数N一样个数的样本。
【特点】由于随机性,对于降低模型的方差很有作用,故随机森林一般不需要额外做剪枝,即可以取得较好的泛化能力和抗过拟合能力。
3. 随机森林的优点
- 由于采用了集成算法,本身精度比大多数单个算法要好
- 在测试集上表现良好,由于两个随机性的引入,使得随机森林不容易陷入过拟合(样本随机,特征随机)
- 在工业上,由于两个随机性的引入,使得随机森林具有一定的抗噪声能力,对比其他算法具有一定优势
- 由于树的组合,使得随机森林可以处理非线性数据,本身属于非线性分类(拟合)模型
- 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化
- 训练速度快,可以运用在大规模数据集上
- 可以处理缺省值(单独作为一类),不用额外处理
- 由于有袋外数据(OOB),可以在模型生成过程中取得真实误差的无偏估计,且不损失训练数据量
- 在训练过程中,能够检测到feature间的互相影响,且可以得出feature的重要性,具有一定参考意义
- 由于每棵树可以独立、同时生成,容易做成并行化方法
- 由于实现简单、精度高、抗过拟合能力强,当面对非线性数据时,适于作为基准模型
4. scikit-learnAPI参数意义
from sklearn.ensemble import RandomForestClassifier
模型常用参数:
n_estimator:基分类器的数量,默认值为10
criterion:度量属性分裂的标准,可选"gini"与"entropy"。(针对分类问题)
max_depth:树的最大深度。integer或者None。如果为None,节点扩展直到所有叶子是纯的或者所有叶子节点包含的样例数小于min_samples_split 。默认为None
min_samples_split:内部节点划分所需最小样本数。默认为2
min_samples_leaf:叶子节点上应该有的最少样例数,默认为1
max_feature:寻找最佳分裂点时考虑的属性数,默认"auto"
oob_score:是否通过袋外样本评判模型精度,默认False
n_jobs :设定fit和predict阶段并列执行的任务个数,如果设置为-1表示并行执行的任务数等于计算级核数; [integer, optional (default=1)]
模型常用属性:
feature_importances_:返回各属性权重大小
oob_score_:使用袋外样本评估模型的分数