随机森林算法梳理

【任务一    随机森林算法梳理】

 

  1. 集成学习概念

集成学习简单理解就是指采用多个分类器对数据集进行预测,从而提高整体分类器的泛化能力。换个角度考虑,训练完成之后就可以看成是单独的一个”假设”(或模型),只是该”假设”不一定是在原”假设”空间里的。因此,Ensemble方法具有更多的灵活性。理论上来说,Ensemble方法也比单一模型更容易过拟合。但是,实际中有一些方法(尤其是Bagging)也倾向于避免过拟合

集成学习有个流派:

  1. boosting流派,它的特点是各个弱学习器之间有依赖关系;

包括了常用的应用:Adaboost、GBDT、xgboost等。

  1. bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合;

全称为Bootstrap aggregating,装袋法。

  1. stacking流派, 组合学习器的概念,基本的步骤如下:

1.划分训练数据集为两个不相交的集合。

2. 在第一个集合上训练多个学习器。

3. 在第二个集合上测试这几个学习器

4. 把第三步得到的预测结果作为输入,把正确的回应作为输出,训练一个高层学习器,

 

  1. 个体学习器概念

个体学习器的基本内容是,子分类器,基于当前数据而建立的简单弱分类器。

 

  1. boosting  bagging
  1. Boosting:

Boosting是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。

Boosting

  1. 是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数。
  2. 是一种框架算法,主要是通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。
  3. 可以用来提高其他弱分类算法的识别率,也就是将其他的弱分类算法作为基分类算法放于Boosting 框架中,通过Boosting框架对训练样本集的操作,得到不同的训练样本子集,用该样本子集去训练生成基分类器;
  4. 每得到一个样本集就用该基分类算法在该样本集上产生一个基分类器,这样在给定训练轮数 n 后,就可产生 n 个基分类器,然后Boosting框架算法将这 n个基分类器进行加权融合,产生一个最后的结果分类器,在这 n个基分类器中,每个单个的分类器的识别率不一定很高,但他们联合后的结果有很高的识别率,这样便提高了该弱分类算法的识别率。
  5. 在产生单个的基分类器时可用相同的分类算法,也可用不同的分类算法,这些算法一般是不稳定的弱分类算法,如神经网络(BP) ,决策树(C4.5)等。
  6. 基本思想:

原理:寻找多个识别率不是很高的弱分类算法比寻找一个识别率很高的强分类算法要容易得多,比如AdaBoost 算法的任务就是完成将容易找到的识别率不高的弱分类算法提升为识别率很高的强分类算法,这也是 AdaBoost 算法的核心指导思想所在;

如果算法完成了这个任务,那么在分类时,只要找到一个比随机猜测略好的弱分类算法,就可以将其提升为强分类算法,而不必直接去找通常情况下很难获得的强分类算法。通过产生多分类器最后联合的方法提升弱分类算法,让它变为强的分类算法,也就是给定一个弱的学习算法和训练集,在训练集的不同子集上,多次调用弱学习算法,最终按加权方式联合多次弱学习算法的预测结果得到最终学习结果。包含以下2 点:

1、样本的权重

  1. AdaBoost 通过对样本集的操作来训练产生不同的分类器,他是通过更新分布权值向量来改变样本权重的,也就是提高分错样本的权重,重点对分错样本进行训练。
  2. (1) 没有先验知识的情况下,初始的分布应为等概分布,也就是训练集如果有 n个样本,每个样本的分布概率为1/ n。
  3. (2)每次循环后提高错误样本的分布概率,分错的样本在训练集中所占权重增大,使得下一次循环的基分类器
  4. 能够集中力量对这些错误样本进行判断。弱分类器的权重最后的强分类器是通过多个基分类器联合得到的,因此在最后联合时各个基分类器所起的作用对联合结果有很大的影响,因为不同基分类器的识别率不同,他的作用就应该不同,这里通过权值体现它的作用,因此识别率越高的基分类器权重越高,识别率越低的基分类器权重越低。权值计算如下:

2、分类器的错误率:

  1. e = ∑( ht ( x i) ≠yi) Di (1)

基分类器的权重:Wt = F( e) ,由基分类器的错误率计算他的权重。

 

从偏差和方差的角度上进行考虑:

boosting从优化角度来看,是用forward-stagewise这种贪心法去最小化损失函数。

例如,常见的AdaBoost即等价于用这种方法最小化exponential loss:。所谓forward-stagewise,就是在迭代的第n步,求解新的子模型f(x)及步长a(或者叫组合系数),来最小化,这里

是前n-1步得到的子模型的和。

因此boosting是在sequential地最小化损失函数,其bias自然逐步下降。

但由于是采取这种sequential、adaptive的策略,各子模型之间是强相关的,于是子模型之和并不能显著降低variance。

所以说boosting主要还是靠降低bias来提升预测精度。

 

样本选择上:

Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

样例权重:

Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

预测函数:

Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

并行计算:

Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

 

  1. Bagging:

Bagging是一种用来提高学习算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将它们组合成一个预测函数。

Bagging要求“不稳定”(不稳定是指数据集的小的变动能够使得分类结果的显著的变动)的分类方法。比如:决策树,神经网络算法。

基本思想:

1.给定一个弱学习算法,和一个训练集;

2.单个弱学习算法准确率不高;

3.将该学习算法使用多次,得出预测函数序列,进行投票;

4.最后结果准确率将得到提高.

从偏差和方差的角度上进行考虑:

Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。

由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。

由于,所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。

另一方面,若各子模型独立,则有,此时可以显著降低variance。若各子模型完全相同,则,此时不会降低variance。

bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低variance。

为了进一步降低variance,Random forest通过随机选取变量子集做拟合的方式de-correlated了各子模型(树),使得variance进一步降低。

(用公式可以一目了然:设有i.d.的n个随机变量,方差记为,两两变量之间的相关性为,则的方差为,bagging降低的是第二项,random forest是同时降低两项。

 

样本选择上:

Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

样例权重:

Bagging:使用均匀取样,每个样例的权重相等;

预测函数:

Bagging:所有预测函数的权重相等。

并行计算:

Bagging:各个预测函数可以并行生成

 

4. 结合策略(平均法,投票法,学习法)

  1. 结合策略优点:

1.提高泛化性能

2.降低进入局部最小点的风险

3.扩大假设空间

 

  1. 平均法包括了简单平均、加权平均

适用范围:

  1. 规模大的集成,学习的权重较多,加权平均法易导致过拟合
  2. 个体学习器性能相差较大时宜使用加权平均法,相近用简单平均法。
  3. 投票法:

1.绝对多数投票法:某标记超过半数;

2.相对多数投票法:预测为得票最多的标记,若同时有多个标记的票最高,则从中随机选取一个。

3.加权投票法:提供了预测结果,与加权平均法类似。

  1. 学习法

Stacking:先从初始数据集中训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器。在新数据集中,初级学习器的输出被当做样例输入特征,初始样本的标记仍被当做样例标记。

 

  1. 随机森林思想

1、什么是随机森林?
随机森林就是用随机的方式建立一个森林,在森林里有很多决策树组成,并且每一棵决策树之间是没有关联的。当有一个新样本的时候,我们让森林的每一棵决策树分别进行判断,看看这个样本属于哪一类,然后用投票的方式,哪一类被选择的多,作为最终的分类结果。在回归问题中,随机森林输出所有决策树输出的平均值。

(1)随机森林既可以用于分类,也可以用于回归。
(2)它是一种降维手段,用于处理缺失值和异常值。
(3)它是集成学习的重要方法。

2、两个随机抽取
(1)样本有放回随机抽取固定数目
(2)构建决策树时,特征随机抽取
解释:两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)

3、随机森林算法是如何工作的?

在随机森林中,每一个决策树“种植”和“生长”的四个步骤:

(1)假设我们设定训练集中的样本个数为N,然后通过有重置的重复多次抽样获得这N个样本,这样的抽样结果将作为我们生成决策树的训练集;

(2)如果有M个输入变量,每个节点都将随机选择m(m

(3)每棵决策树都最大可能地进行生长而不进行剪枝;

(4)通过对所有的决策树进行加总来预测新的数据(在分类时采用多数投票,在回归时采用平均)。

4、随机森林的优缺点
优点:
(1)在分类和回归都表现良好
(2)对高维数据的处理能力强,可以处理成千上万的输入变量,是一个非常不错的降维方法
(3)能够输出特征的重要程度
(4)有效的处理缺省值

5、重要参数
随机森林分类效果(错误率)与两个因素有关:
(1)森林中任意两棵树的相关性:相关性越大,错误率越大;
(2)森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。
  减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。在学习如何选择参数前首先介绍oob的概念。

6、oob:袋外错误率
为了选择最优的m,这里需要利用的是袋外错误率oob(out-of-bag error)。我们知道,在构建每个决策树的时候,采用的是随机又放回的抽取,所以对于每棵树来说,都有一些样本实力没有参与树的生成,所以这些样本成为袋外样本,即oob。所以我们需要做一下oob估计:
(1)对每个样本,计算它作为oob样本的树对它的分类情况
(2)多数投票作为该样本的分类结果
(3)用误分个数占样本总数的比率作为随机森林的oob误分率

oob误分率是随机森林泛化误差的一个无偏估计,它的结果近似于需要大量计算的k折交叉验证。所以没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。

当我们知道了oob的计算方法,我们可以通过选取不同的m,计算oob error,找出oob error最小时对应的m的值。这和交叉验证的思想非常的相似。

7、RF特征重要性的度量方法
(1)对于每一棵决策树,计算其oob error_0
(2)选取一个特征,随机对特征加入噪声干扰,再次计算oob error_1
(3)特征的重要性=∑(oob error_1-oob error_0)/随机森林中决策树的个数

(4)对随机森林中的特征变量按照特征重要性降序排序。
(5)然后重复以上步骤,直到选出m个特征。

解释:用这个公式来度量特征重要性,原因是:给某个特征随机的加入噪声后,如果oob error增大,说明这个特征对样本分类的结果影响比较大,说明重要程度比较高。

8、RF特征选择
首先特征选择的目标有两个:
1:找到与分类结果高度相关的特征变量。
2:选择出数目较少的特征变量并且能够充分的预测应变量的结果。

特征选择的步骤:
(1)对于每一棵决策树,计算其oob error
(2)随机的修改OOB中的每个特征xi的值,计算oob error_2,再次计算重要性
(3)按照特征的重要性排序,然后剔除后面不重要的特征
(4)然后重复以上步骤,直到选出m个特征。

 

6. 随机森林的推广

我认为随机森林的一种推广方式包括了独立森林IForest。

 

7. 优缺点

优点:

  1. 可以处理高维数据,不同进行特征选择(特征子集是随机选择)
  2. 模型的泛化能力较强
  3. 训练模型时速度快,成并行化方式,即树之间相互独立
  4. 模型可以处理不平衡数据,平衡误差
  5. 最终训练结果,可以对特种额排序,选择比较重要的特征
  6. 随机森林有袋外数据(OOB),因此不需要单独划分交叉验证集
  7. 对缺失值、异常值不敏感
  8. 模型训练结果准确度高
  9. 相对Bagging能够收敛于更小的泛化误差

缺点:

  1. 当数据噪声比较大时,会产生过拟合现象
  2. 对有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响

 

  1. sklearn参数2
  1. 函数本身调用以及参数:

class sklearn.ensemble.RandomForestClassifier(n_estimators=10, crite-rion=’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, bootstrap=True,  

oob_score=False, n_jobs=1, ran-dom_state=None, verbose=0,  

warm_start=False, class_weight=None)

  1. 参数

其中关于决策树的参数:

  1. criterion: ”gini” or “entropy”(default=”gini”)是计算属性的gini(基尼不纯度)还是entropy(信息增益),来选择最合适的节点。
  2. splitter: ”best” or “random”(default=”best”)随机选择属性还是选择不纯度最大的属性,建议用默认。
  3. max_features: 选择最适属性时划分的特征不能超过此值。当为整数时,即最大特征数;当为小数时,训练集特征数*小数;
  4. if “auto”, then max_features=sqrt(n_features).
  5. If “sqrt”, thenmax_features=sqrt(n_features).
  6. If “log2”, thenmax_features=log2(n_features).
  7. If None, then max_features=n_features.
  8. max_depth: (default=None)设置树的最大深度,默认为None,这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。
  9. min_samples_split:根据属性划分节点时,每个划分最少的样本数。
  10. min_samples_leaf:叶子节点最少的样本数。
  11. max_leaf_nodes: (default=None)叶子树的最大样本数。
  12. min_weight_fraction_leaf: (default=0) 叶子节点所需要的最小权值
  13. verbose:(default=0) 是否显示任务进程

关于随机森林特有的参数:

  1. n_estimators=10:决策树的个数,越多越好,但是性能就会越差,至少100左右(具体数字忘记从哪里来的了)可以达到可接受的性能和误差率。 
  2. bootstrap=True:是否有放回的采样。  
  3. oob_score=False:oob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。  
  4. n_jobs=1:并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job
  5. warm_start=False:热启动,决定是否使用上次调用该类的结果然后增加新的。  
  6. class_weight=None:各个label的权重。  

 

9.应用场景

可以用来做分类,也可以做回归。

 

参考文献(链接):

http://dataunion.org/20769.html

https://blog.csdn.net/u012102306/article/details/52228516

https://blog.csdn.net/weixin_38111819/article/details/79405984

https://blog.csdn.net/loveitlovelife/article/details/79398745?utm_source=blogxgwz9

https://blog.csdn.net/vfgbv/article/details/79403528

 

 

你可能感兴趣的:(机器学习,算法模型)