算法梳理之随机森林

目录:
一、集成学习概念
二、个体学习器概念
三、 boosting bagging
四、结合策略(平均法,投票法,学习法)
五、随机森林思想
六、随机森林的推广
七、优缺点
八、sklearn参数
九、应用场景

一、集成学习概念

集成学习方法,就是将训练的学习器集成在一起,原理来源于PAC (Probably Approximately Correct,可能近似正确学习模型)。

在PAC学习模型中,若存在一个多项式级的学习算法来识别一组概念,并且识别正确率很高,那么这组概念是强可学习的;而如果学习算法识别一组概念的正确率仅比随机猜测略好,那么这组概念是弱可学习的。他们提出了弱学习算法与强学习算法的等价性问题,即是否可以将弱学习算法提升成强学习算法。如果两者等价,那么在学习概念时,只要找到一个比随机猜测略好的弱学习算法,就可以将其提升为强学习算法,而不必直接去找通常情况下很难获得的强学习算法。

集成学习是指将若干弱分类器组合之后产生一个强分类器。弱分类器(weak learner)指那些分类准确率只稍好于随机猜测的分类器(error rate < 50%)。Bootstrap,Bagging,Boosting都属于集成学习方法。

随机森林中如何得到交叉验证误差 随机森林需要交叉验证_决策树


总之就是一句话:集成学习是指通过构建并结合多个学习器来完成学习任务的一种机器学习方法。

二、个体学习器概念

个体学习器通常是用一个现有的学习算法从训练数据产生,例如C4.5决策树算法、BP神经网络算法等。此时集成中只包含同种类型的个体学习器,例如“决策树集成”中的个体学习器全是决策树,“神经网络集成”中就全是神经网络,这样的集成是“同质”(homogeneous)的,同质集成中的个体学习器也称为“基学习器”(base learner),相应的学习算法称为“基学习算法”(base learning algorithm)。有同质就有异质(heterogeneous),若集成包含不同类型的个体学习器,例如同时包含决策树和神经网络,那么这时个体学习器一般不称为基学习器,而称作“组件学习器”(component leaner)或直接称为个体学习器。

概括如下:个体学习器是现有的学习算法通过应用训练数据集进行训练生成的。

三、 boosting 与 bagging

boosting—串行生成

Boost的含义是增强,Boosting方法就是从弱学习算法开始,在前一个学习器的基础上反复学习,得到一系列弱分类器,然后组合弱分类器,得到一个强分类器。Boosting方法在学习过程中通过改变训练数据的权值分布,针对不同的数据分布调用弱学习算法得到一系列弱分类器。

随机森林中如何得到交叉验证误差 随机森林需要交叉验证_决策树_02


提升的理论意义就是如果一个问题存在弱分类器,则可通过提升的办法得到强分类器。因此,需要解决的问题有两个。一个是在每一轮如何改变训练数据的权值或概率分布;另一个是如何将弱分类器组合成一个强分类器。Boosting算法中主要是AdaBoost(Adaptive Boosting,自适应增强算法)。

AdaBoost 的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注;并采取加权多数表决的办法来完成弱分类器的组合。具体地,加大分类误差率小的弱分类器权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。

随机森林中如何得到交叉验证误差 随机森林需要交叉验证_数据_03

统计学习方法P140:

随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林中如何得到交叉验证误差_04


随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林中如何得到交叉验证误差_05


随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林_06


随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林中如何得到交叉验证误差_07

bagging—并行生成

Bagging 是并行式集成学习方法最著名的代表。Bagging 的基本流程是通过自助采样法 (bootstrap sampling) 得到 T 个含 m 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。如下图所示:

随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林_08


自助采样法的含义:给定包含 m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过 m 次随机采样操作,我们得到含 m 个样本的采样机,初始训练集中有的样本在采样集里多次出现,有的则从未出现,初始训练集中约有 63.2% 的样本出现在采样集中。算法步骤:

1.从数据集S中取样(放回选样),总共执行t次

2.针对每一次取样训练得到分类模型,最终得到t个模型H1…Ht

3.对未知样本X分类时,每个模型都得出一个分类结果,得票最高的即为未知样本X的分类

4.也可通过得票的平均值用于连续值的预测

随机森林中如何得到交叉验证误差 随机森林需要交叉验证_数据_09

四、结合策略(平均法,投票法,学习法)

随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林_10

平均法

对于数值类的回归预测问题,通常使用的结合策略是平均法,也就是说,对于若干个弱学习器的输出进行平均得到最终的预测输出。
最简单的平均是算术平均,也就是说最终预测是:
随机森林中如何得到交叉验证误差 随机森林需要交叉验证_数据_11
如果每个个体学习器有一个权重w,则最终预测是:
随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林中如何得到交叉验证误差_12
随机森林中如何得到交叉验证误差 随机森林需要交叉验证_决策树_13
随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林_14
一般情况下,在个体学习器性能相差较大时,宜使用加权平均法;而在个体学习器性能相近时,宜使用简单平均法。

投票法

对分类任务来说,学习器 hi 将从类别标记集合 {c1,c2,⋅⋅⋅,cN} 中预测出一个标记,最常见的结合策略是使用投票法 (voting)。

最简单的投票法是相对多数投票法,也就是我们常说的少数服从多数,也就是T个弱学习器的对样本x的预测结果中,数量最多的类别ci为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。

稍微复杂的投票法是绝对多数投票法,也就是我们常说的要票过半数。在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数。否则会拒绝预测。

更加复杂的是加权投票法,和加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。

学习法 (Stacking)

当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。Stacking 是学习法的典型代表。这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器。

五、随机森林思想

随机森林(random forest)算法是一种基于树的模型的算法。此外,还有决策树(decision trees)和提升树(boosted trees)。

随机森林 在以决策树为基学习器构建 Bagging 集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。即传统决策树在选择划分属性时是在当前结点的属性集合中选择一个最优属性;而在 RF 中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k 个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
随机性主要体现在两个方面:
1、训练每棵树时,从全部训练样本(样本数为N)中选取一个可能有重复的大小同样为N的数据集进行训练(即bootstrap取样)。
2、在每个节点,随机选取所有特征的一个子集,用来计算最佳分割方式。

六、随机森林的推广

参考博客:

由于RF在实际应用中的良好特性,基于RF,有很多变种算法,应用也很广泛,不光可以用于分类回归,还可以用于特征转换,异常点检测等。下面对于这些RF家族的算法中有代表性的做一个总结。

1、extra trees

随机森林中如何得到交叉验证误差 随机森林需要交叉验证_随机森林_15


2、Isolation Forest(以下简称IForest)是一种异常点检测的方法。它也使用了类似于RF的方法来检测异常点。

详情参考:https://zhuanlan.zhihu.com/p/25040651

3、Totally Random Trees Embedding(以下简称 TRTE),它是一种非监督学习的数据转化方法。它将低维的数据集映射到高维,从而让映射到高维的数据更好的运用于分类回归模型。我们知道,在支持向量机中运用了核方法来将低维的数据集映射到高维,此处TRTE提供了另外一种方法。

TRTE在数据转化的过程也使用了类似于RF的方法,建立T个决策树来拟合数据。当决策树建立完毕以后,数据集里的每个数据在T个决策树中叶子节点的位置也定下来了。比如我们有3颗决策树,每个决策树有5个叶子节点,某个数据特征随机森林中如何得到交叉验证误差 随机森林需要交叉验证_数据_16划分到第一个决策树的第2个叶子节点,第二个决策树的第3个叶子节点,第三个决策树的第5个叶子节点。则x映射后的特征编码为(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1), 有15维的高维特征。这里特征维度之间加上空格是为了强调三颗决策树各自的子编码。

映射到高维特征后,可以继续使用监督学习的各种分类回归算法了。

七、优缺点

随机森林的优点:

1、具有极高的准确率
2、随机性的引入,使得随机森林不容易过拟合
3、随机性的引入,使得随机森林有很好的抗噪声能力
4、能处理很高维度的数据,并且不用做特征选择
5、既能处理离散型数据,也能处理连续型数据,数据集无需规范化
6、训练速度快,可以得到变量重要性排序
7、容易实现并行化

随机森林的缺点:

1、当随机森林中的决策树个数很多时,训练时需要的空间和时间会较大
2、随机森林模型还有许多不好解释的地方,有点算个黑盒模型
与上面介绍的Bagging过程相似,随机森林的构建过程大致如下:

八、sklearn参数

参考博客:
官方链接:https://scikit-learn.org/dev/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier

在scikit-learn中,RandomForest的分类类是RandomForestClassifier,回归类是RandomForestRegressor,需要调参的参数包括两部分,第一部分是Bagging框架的参数,第二部分是CART决策树的参数。

classsklearn.ensemble.RandomForestClassifier(n_estimators=10, 
criterion='gini', max_depth=None,min_samples_split=2, 
min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features='auto', max_leaf_nodes=None, 
min_impurity_split=1e-07,bootstrap=True, oob_score=False, 
n_jobs=1, random_state=None, verbose=0,warm_start=False, 
class_weight=None)

RF框架参数

RF重要的Bagging框架的参数,由于RandomForestClassifier和RandomForestRegressor参数绝大部分相同,这里会将它们一起讲,不同点会指出。
1、n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升会很小,所以一般选择一个适中的数值。默认是100。

2、oob_score :即是否采用袋外样本来评估模型的好坏。默认识False。个人推荐设置为True,因为袋外分数反应了一个模型拟合后的泛化能力。

3、 criterion: 即CART树做划分时对特征的评价标准。分类模型和回归模型的损失函数是不一样的。分类RF对应的CART分类树默认是基尼系数gini,另一个可选择的标准是信息增益。回归RF对应的CART回归树默认是均方差mse,另一个可以选择的标准是绝对值差mae。一般来说选择默认的标准就已经很好的。

从上面可以看出, RF重要的框架参数比较少,主要需要关注的是 n_estimators,即RF最大的决策树个数。

RF决策树参数

下面我们再来看RF的决策树参数,它要调参的参数基本和GBDT相同,如下:

1、RF划分时考虑的最大特征数max_features: 可以使用很多种类型的值,默认是"auto",意味着划分时最多考虑N−−√个特征;如果是"log2"意味着划分时最多考虑log2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般我们用默认的"auto"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

2、决策树最大深度max_depth: 默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

3、内部节点再划分所需最小样本数min_samples_split: 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

4、叶子节点最少样本数min_samples_leaf: 这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

5、叶子节点最小的样本权重和min_weight_fraction_leaf:这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

6、 最大叶子节点数max_leaf_nodes: 通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

7、 节点划分最小不纯度min_impurity_split: 这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

上面决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。