机器学习算法梳理(四):随机森林

一、集成学习

使用一些(不同的)方法改变原始训练样本的分布,从而构建多个不同的分类器,并将这些分类器线性组合得到一个更强大的分类器,来做最后的决策。也就是常说的“三个臭皮匠顶个诸葛亮”的想法。

二、个体学习器

个体学习器:个体学习器是传统机器学习或者神经网络训练学习的学习器,按照个体的性质将集成学习分成同质与异质集成。

  • 同质集成:个体学习器均为同一类个体学习器,比如均为决策树或者均为神经网络;
  • 异质集成:个体学习器为不同类型个体学习器,比如决策树与神经网络一起构成新的学习器;

三、Boosting&Bagging

Boosting

Boosting是一族可将弱学习器提升为强学习器的算法。先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本后续得到更多关注。常用的算法是AdaBoost和GradientBoosting。
关于Boosting的两个核心问题:
A)在每一轮如何改变训练数据的权值或概率分布?
通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
B)通过什么方式来组合弱分类器?
通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

Bagging

Bagging (bootstrap aggregating)

Bagging即套袋法,其算法过程如下:

  1. 从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
  2. 每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
  3. 对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

Bagging方法完全基于bootstrapping思想,即把训练集看做全体数据的子集,训练集对全体数据中某参数的估计等价于用训练集子采样获得的数据来估计训练集。其中,每一次迭代前,采用有放回的随机抽样来获取训练数据。这样做直接体现了bagging的一大特点:每次迭代不依赖之前建立的模型,即生成的各个弱模型之间没有关联,因此就可以彻底实现数据并行训练。这是bagging方法与上述boosting方法最大的区别。

  • Bagging和Boosting的区别:
    1)样本选择上:
    Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的.
    Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化.而权值是根据上一轮的分类结果进行调整.
    2)样例权重:
    Bagging:使用均匀取样,每个样例的权重相等
    Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大.
    3)预测函数:
    Bagging:所有预测函数的权重相等.
    Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重.
    4)并行计算:
    Bagging:各个预测函数可以并行生成
    Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果.

四、组合策略

  • 平均法
    对数值型输出,最常用的结合策略是使用平均法。平均法分为简单平均法和加权平均法。在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。

  • 投票法
    对于分类问题的预测,通常使用的是投票法。

  1. 最简单的投票法是相对多数投票法,数量最多的类别为最终的分类类别。如果不止一个类别获得最高票,则随机选择一个做最终类别。
  2. 稍微复杂的投票法是绝对多数投票法。在相对多数投票法的基础上,不光要求获得最高票,还要求票过半数。否则会拒绝预测。
  3. 更加复杂的是加权投票法,和加权平均法一样,每个弱学习器的分类票数要乘以一个权重,最终将各个类别的加权票数求和,最大的值对应的类别为最终类别。
  • 学习法
    上两种简单但学习误差较大,对于学习法,代表方法是stacking。
    不是对弱学习器的结果做简单的逻辑处理,而是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练一个学习器来得到最终结果。
    在这种情况下,我们将弱学习器称为初级学习器,将用于结合的学习器称为次级学习器。对于测试集,我们首先用初级学习器预测一次,得到次级学习器的输入样本,再用次级学习器预测一次,得到最终的预测结果。
  1. 非stacking的方法:训练集输入–>若干弱学习器–>若干弱学习器输出–>平均法/投票法得到预测输出。
  2. stacking方法:训练集输入–>若干弱学习器1–>若干学习器1输出(所有的输出作为学习器2的输入特征)–>次级学习器2–>学习器2输出即为预测输出。

五、随机森林思想

随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法。

六、优缺点

  • 优点

1、RF容易理解和解释,树可以被可视化。
2、不需要太多的数据预处理工作,实现比较简单,且目前在很多现实任务中展现出强大的性能
3、隐含地创造了多个联合特征,并能够解决非线性问题。
4、和决策树模型,GBDT模型相比,随机森林模型不容易过拟合。
5、自带out-of-bag (oob)错误评估功能。每个基学习器只使用了训练集中约63.2%的样本,剩下约36.8%的样本可用做验证集来对其泛化性能进行‘包外估计’。所以不用对其进行交叉验证或者使用一个独立的测试集获得无偏估计。
5、在创建随机森林的时候,对generlization error使用的是无偏估计,模型泛化能力强,且集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。
6、可以并行化训练树,训练速度快
7、 对于不平衡的数据集来说,它可以通过调整class_weight参数来平衡误差。
8、可以处理高维数据集,因为其特征子集是随机选择的

  • 缺点

1、随机森林在某些噪音较大的分类或回归问题上会发生过拟合现象
2、对于取值划分较多的属性容易对随机森林的决策产生更大的影响,从而影响拟合的模型的效果。
3、不适合小样本,只适合大样本。

七、随机森林推广

  1. extra trees
    extra trees一般不采用随机采样,每个决策树采用原始训练集。extra trees在选择特征划分的时候随机的选择一个特征值来划分决策树,而不是选择最优特征划分。但由于其生成的决策树的规模一般会大于随机森林所生成的决策树,所以有时extra trees的泛化能力比随机森林更好。

  2. Totally Random Trees Embedding(TRTE)
    TRTE在数据转化的过程也使用了类似于RF的方法,建立T个决策树来拟合数据。当决策树建立完毕以后,数据集里的每个数据在T个决策树中叶子节点的位置也定下来了。然后用一种非监督学习的数据转化方法,将属性位于不同决策树的节点位置映射到高维,从而让映射到高维的数据更好的运用于分类回归模型。

  3. Isolation Forest(IForest)
    一种异常点检测的方法。
    对于在T个决策树的样本集,IForest也会对训练集进行随机采样,但是采样个数远远小于训练集个数,因为其目的是异常点检测,只需要部分的样本一般就可以将异常点区别出来了。
    对于每一个决策树的建立, IForest采用随机选择一个划分特征,对划分特征随机选择一个划分阈值。另外,IForest一般会选择一个比较小的最大决策树深度max_depth,也是因为异常点检测一般不需要这么大规模的决策树。

八、sklearn参数

scikit-learn随机森林类库概述

  • 在scikit-learn中,RF的分类类是RandomForestClassifier,回归类是RandomForestRegressor。当然RF的变种Extra
    Trees也有, 分类类ExtraTreesClassifier,回归类ExtraTreesRegressor。由于RF和Extra
    Trees的区别较小,调参方法基本相同,本文只关注于RF的调参。

    和GBDT的调参类似,RF需要调参的参数也包括两部分,第一部分是Bagging框架的参数,第二部分是CART决策树的参数。下面我们就对这些参数做一个介绍。

  • RF框架参数
        首先我们关注于RF的Bagging框架的参数。这里可以和GBDT对比来学习。在scikit-learn 梯度提升树(GBDT)调参小结中我们对GBDT的框架参数做了介绍。GBDT的框架参数比较多,重要的有最大迭代器个数,步长和子采样比例,调参起来比较费力。但是RF则比较简单,这是因为bagging框架里的各个弱学习器之间是没有依赖关系的,这减小的调参的难度。换句话说,达到同样的调参效果,RF调参时间要比GBDT少一些。

    下面我来看看RF重要的Bagging框架的参数,由于RandomForestClassifier和RandomForestRegressor参数绝大部分相同,这里会将它们一起讲,不同点会指出。

    1) n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。

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

    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。

参考文献:
https://blog.csdn.net/yingfengfeixiang/article/details/79369059
https://blog.csdn.net/harperyeung/article/details/85782374
https://blog.csdn.net/qq_39756719/article/details/85078552
https://blog.csdn.net/qq_39756719/article/details/85078552
https://www.cnblogs.com/maybe2030/p/4585705.html

猜你喜欢

转载自blog.csdn.net/devcy/article/details/86543440