随机森林算法梳理

  1. 集成学习:通过构建并结合多个学习器来完成学习任务。先产生一组“个体学习器”,再用某种策略将它们结合起来。集成学习的核心是个体学习器以及集成策略,通常集成学习能够获得比单一学习器具有更优越的泛化性能;
  2. 个体学习器:个体学习器是传统机器学习或者神经网络训练学习的学习器,按照个体的性质将集成学习分成同质与异质集成。
    (1)同质集成:个体学习器均为同一类个体学习器,比如均为决策树或者均为神经网络;
    (2) 异质集成:个体学习器为不同类型个体学习器,比如决策树与神经网络一起构成新的学习器;异质集成:个体学习器为不同类型个体学习器,比如决策树与神经网络一起构成新的学习器;
    常见的集成学习方法:boosting(个体学习器存在强依赖关系,必须串行生成的序列化方法),bagging(比如随机森林(Random Forest))(个体学习器不存在强依赖关系,可以并行生成);
    3.Boosting是一族可将弱学习器提升为强学习器的算法。先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本后续得到更多关注。常用的算法是AdaBoost和GradientBoostingboosting算法原理图
    关于Boosting的两个核心问题:
    A)在每一轮如何改变训练数据的权值或概率分布?
    通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。
    B)通过什么方式来组合弱分类器?
    通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

4.bagging是并行集成学习著名代表,采取放回采样的方式抽取数据训练多个个体学习器,可以采样出T个含有m个训练样本的学习器,每个学习可以并行训练。Bagging主要关注的是降低方差,并且自助采样的方式会使得其具有一部分的验证样本,这样就使得泛化效果更好。其算法过程如下:
A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)
B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)
总的来说,Bagging的训练样本在每次训练的时候,是通过抽样采取;而Boosting的核心是每次训练样本都是一样的,但是训练时候的训练样本的权重不一样。
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT

5.结合策略:
学习器结合可能会从三个方面带来好处,第一是从统计学方面来说,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等心梗,此时若使用单学习器可能因武宣而导致泛化性能很低;第二,从计算方面看,学习算法旺旺会陷入局部极小点,因此泛化性能很差;第三从表示方面多个学习器结合,会加大假设空间,这样泛化性能更加好。
常用的学习器结合策略:所谓的策略都是结合多个个体学习器的假设函数求得最终学习器的假设函数。

    1. 简单平均法
      对于回归预测类问题,通常使用的结合策略是平均法,通过对若干个弱学习器的输出进行平均得到最终的预测输出。其中包括算术平均和加权平均,一般而言,在个体学习器的性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法。
  • [ a] 算术平均:

在这里插入图片描述

  • [b ] 加权平均:
    在这里插入图片描述
    在这里插入图片描述
    加权平均法的权重是从训练数据中学习而得,在现实任务中的训练样本通常不充分或存在噪声,使得学习的权重不一定可靠。因此,一般地在个体学习器性能相差较大时宜采用加权平均法,而在个体学习器性能相近时使用简单平均法。

    1. 投票法:
      对于分类问题,常用投票法(voting)。常见有三种投票法:
  • [a ] 绝对多数投票法(majority voting):在这里插入图片描述其中T表示有T个分类器,N表示有N种类别。意思就是,T个分类器对类别j的预测结果若大于总投票结果的一半,那么就预测是类别j,否则就拒绝预测。

  • [ b] 相对多数投票法(plurality voting):即得票最多的那个类别为预测类别。

  • [c] 加权投票法(weighted voting) : 在分类任务中,不同类型的个体学习器产生不同类型的 。通常有两种,一个是类标记,如决策树,使用类标记的投票称为硬投票(hard voting);一个是类概率,如贝叶斯分类器,使用类概率的投票称为软投票(soft voting)

    1. 学习法:最终的输出是把个体学习器的输出 输入到一个学习器,最终得到预测结果,可以理解为多个学习器的级联;

6.随机森林:
随机森林属于集成学习(Ensemble Learning)中的bagging算法,是一种特殊的bagging方法,它将决策树用作bagging中的模型。
(1)核心思想:
核心思想就是将多个不同的决策树进行组合,利用这种组合降低单一决策树有可能带来的片面性和判断不准确性。具体来讲,随机森林是用随机的方式建立一个森林,随机森林是由很多的决策树组成,但每一棵决策树之间是没有关联的。在得到森林之后,当对一个新的样本进行判断或预测的时候,让森林中的每一棵决策树分别进行判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。
(2)随机森林推广:

  • [ a] extra trees
    extra trees是RF的一个变种, 原理几乎和RF一模一样,仅有区别有:
      1) 对于每个决策树的训练集,RF采用的是随机采样bootstrap来选择采样集作为每个决策树的训练集,而extra trees一般不采用随机采样,即每个决策树采用原始训练集。
      2) 在选定了划分特征后,RF的决策树会基于基尼系数,均方差之类的原则,选择一个最优的特征值划分点,这和传统的决策树相同。但是extra trees比较的激进,他会随机的选择一个特征值来划分决策树。
      从第二点可以看出,由于随机选择了特征值的划分点位,而不是最优点位,这样会导致生成的决策树的规模一般会大于RF所生成的决策树。也就是说,模型的方差相对于RF进一步减少,但是偏倚相对于RF进一步增大。在某些时候,extra trees的泛化能力比RF更好。

  • [ b] Totally Random Trees Embedding
      Totally Random Trees Embedding(以下简称 TRTE)是一种非监督学习的数据转化方法。它将低维的数据集映射到高维,从而让映射到高维的数据更好的运用于分类回归模型。我们知道,在支持向量机中运用了核方法来将低维的数据集映射到高维,此处TRTE提供了另外一种方法。
      TRTE在数据转化的过程也使用了类似于RF的方法,建立T个决策树来拟合数据。当决策树建立完毕以后,数据集里的每个数据在T个决策树中叶子节点的位置也定下来了。比如我们有3颗决策树,每个决策树有5个叶子节点,某个数据特征x划分到第一个决策树的第2个叶子节点,第二个决策树的第3个叶子节点,第三个决策树的第5个叶子节点。则x映射后的特征编码为(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1), 有15维的高维特征。这里特征维度之间加上空格是为了强调三颗决策树各自的子编码。
      映射到高维特征后,可以继续使用监督学习的各种分类回归算法了。
      
      - [c ]Isolation Forest
      Isolation Forest(以下简称IForest)是一种异常点检测的方法。它也使用了类似于RF的方法来检测异常点。
      对于在T个决策树的样本集,IForest也会对训练集进行随机采样,但是采样个数不需要和RF一样,对于RF,需要采样到采样集样本个数等于训练集个数。但是IForest不需要采样这么多,一般来说,采样个数要远远小于训练集个数?为什么呢?因为我们的目的是异常点检测,只需要部分的样本我们一般就可以将异常点区别出来了。
      对于每一个决策树的建立, IForest采用随机选择一个划分特征,对划分特征随机选择一个划分阈值。这点也和RF不同。
      另外,IForest一般会选择一个比较小的最大决策树深度max_depth,原因同样本采集,用少量的异常点检测一般不需要这么大规模的决策树。
    (3)随机森林的优缺点:
    RF的主要优点有:
    1) 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。
    2) 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。
    3) 在训练后,可以给出各个特征对于输出的重要性
    4) 由于采用了随机采样,训练出的模型的方差小,泛化能力强。
    5) 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。
    6) 对部分特征缺失不敏感。
     RF的主要缺点有:
     1)在某些噪音比较大的样本集上,RF模型容易陷入过拟合。
     2) 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。
        
    (4)随机森林sklearn的引用代码

    sklearn.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_decrease=0.0,
    min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1,
    random_state=None, verbose=0, warm_start=False, class_weight=None)

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

  • [ b] 随机森林特有的参数:

  • n_estimators=10:决策树的个数,越多越好,但是性能就会越差,至少100左右(具体数字忘记从哪里来的了)可以达到可接受的性能和误差率。

  • bootstrap=True:是否有放回的采样。

  • oob_score=False:oob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。

  • n_jobs=1:并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job。

  • warm_start=False:热启动,决定是否使用上次调用该类的结果然后增加新的。

  • class_weight=None:各个label的权重。

  • [ c] 进行预测可以有几种形式:

  • predict_proba(x):给出带有概率值的结果。每个点在所有label的概率和为1.

  • predict(x):直接给出预测结果。内部还是调用

  • predict_proba(),根据概率的结果看哪个类型的预测值最高就是哪个类型。

  • predict_log_proba(x):和predict_proba基本上一样,只是把结果给做了log()处理。

参考链接:
https://blog.csdn.net/starter_____/article/details/79328749
https://blog.csdn.net/loveliuzz/article/details/78758000
https://blog.csdn.net/u011995719/article/details/77863248
https://www.cnblogs.com/pinard/p/6156009.html

猜你喜欢

转载自blog.csdn.net/mengdiefeixumyname/article/details/85806894