算法梳理boosting\bagging\RF(1)

1.集成学习概念

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

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

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

1.1 集成学习分类

一般来说集成学习(根据集成思想,架构)可以分为三大类:
(1)用于减少方差的bagging
(2)用于减少偏差的boosting
(3)用于提升预测结果的stacking

目前,同质个体学习器应用最为广泛,根据这些个体学习器之间是否存在依赖关系可以将其分为两类:
(1)串行集成方法,这种方法串行地生成基础模型(如AdaBoost)。串行集成的基本动机是利用基础模型之间的依赖。通过给错分样本一个较大的权重来提升性能
(2)并行集成方法,这种方法并行地生成基础模型(如Random Forest和Bagging)。并行集成的基本动机是利用基础模型的独立性,因为通过平均能够较大地降低误差

1.2 集成学习步骤

集成学习一般可分为以下3个步骤。

(1) 找到误差互相独立的个体学习器。
  这里可以选取ID3决策树作为基分类器。 事实上, 任何分类模型都可以作为基分类器, 但树形模型由于结构简单且较易产生随机性所以比较常用。
(2)训练个体学习器。
  在集成学习中需有效地生成多样性大的个体学习器。与简单地直接用初始数据训练出个体学习器相比,如何增强多样性呢?一般思路是在学习过程中引入随机性,常见做法主要是对数据样本、 输入属性、输出表示 、 算法参数进行扰动。
  1)数据样本扰动:通常是基于采样法, 例如在 Bagging中使用自助采样(即有放回的采样),在 AdaBoost 中使用序列采样.
  2)输入属性扰动:从初始属性集中抽取出若干个属性子集,再基于每个属性子集训练一个基学习器。比如随机子空间 (random subspace)算法。
  3)输出表示扰动:可对训练样本的类标记稍作变动,如"翻转法" (Flipping Output)随机改变一些训练样本的标记;也可对输出表示进行转化,如"输出调制法" (Output Smearing) 将分类输出转化为回归输出后构建个体学习器;
  4)算法参数扰动:基学习算法一般都有参数需进行设置,例如神经网络的隐层神经元数、初始连接权值等。通过随机设置不同的参数,往往可产生差别较大的个体学习器.
合并个体学习器的结果。
(3)常见的结合策略:平均法(averaging),投票法(voting),学习法(比如 stacking)
  学习器的结合能带来以下优点
  ● 统计方面,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能,此时若单个学习器可能因为误选而导致泛化性能不佳,结合多个学习器则会减少风险。
  ● 计算方面,通过多次运行之后进行结合,可降低陷入局部最小的风险。
  ● 表示方面,通过结合多个学习器,相应的假设空间也有所扩大,有可能可以到达更好的效果。

  1)averaging 常用于数值型输出。有简单平均法、加权平均法等。
  2)voting 是用投票的方式, 将获得最多选票的结果作为最终的结果。常用于分类任务。
    分为绝对多数投票法、相对多数投票法、加权投票法。

 		 绝对多数投票法,即某类别的得票数超过一半,则为预测结果。代表Bagging
  		 相对多数投票法,即少数服从多数,不要求得票数超过一半。代表Bagging
 		 加权投票法,跟加权平均类似,对每个个体学习器的分类票数乘以一个权重值,常用于分类问题的预测。代表Boosting

  3)当训练数据很多时,一种更为强大的结合策略是使用“学习法”,即通过另一个学习器来进行结合。Stacking是学习法的典型代表,这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级或者元学习器。
Stacking先从初始训练集训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当做样例标记。这里假定初始学习器使用不同学习算法产生(例如可同时包含决策树,神经网络算法),即初级集成是异质的。

2.个体学习器概念

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

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

如何选择一组个体学习器?

一组个体学习器的关键是“好而不同”,就是说,具有差异性即多样性,又要准确性。如何产生并结合“好而不同”的个体学习器,恰是集成学习研究的核心。那么如何衡量个体学习器之间的差异性呢?如何增强多样性?

衡量个体学习器之间的差异性常见的指标:

(1)误差-分歧分解:分歧表征了个体学习器在样本x上的不一致性,即一定程度反映了个体学习器的多样性
(2)多样性度量:考虑个体分类器的两两相似/不相似性
(3)k-误差图

3.boosting & bagging

根据个体学习器的生成方式,目前集成学习的方法大致可分为两大类:

个体学习器间存在强依赖关系、必须串行生成的序列化方法,代表是Boosting;
个体学习器间不存在强依赖关系、可同时生成的并行化方法,代表是Baggig和“随机森林”(Random Forest);

3.1 boosting

  Boosting 算法是集成算法中的一种,同时也是一类算法的总称。这类算法先从初始训练集训练出一个弱学习器,然后根据弱学习器的表现对训练样本分布进行调整,不断训练出多个弱学习器,最后将它们进行加权组合成一个强分类器,为什么要这么做呢?因为弱学习器好训练,强学习器不好得。因此要打造一个好的强学习器,最好的方式就是训练多个弱学习器,然后让这些弱学习器组合起来,这样往往可以得到很好的效果。这就是 Boosting 算法的原理。
  Boosting算法中主要是AdaBoost(Adaptive Boosting,自适应增强算法)。
  AdaBoost 的做法是,提高那些被前一轮弱分类器错误分类样本的权值,而降低那些被正确分类样本的权值。这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注;并采取加权多数表决的办法来完成弱分类器的组合。具体地,加大分类误差率小的弱分类器权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
在这里插入图片描述

3.2 bagging

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

  从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

  每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

  对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

在这里插入图片描述

3.3 二者的区别

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

4.随机森林的思想

  随机森林的英文是 Random Forest,英文简写是 RF。它实际上是一个包含多个决策树的分类器,每一个子分类器都是一棵 CART 分类回归树。所以随机森林既可以做分类,又可以做回归。当它做分类的时候,输出结果是每个子分类器的分类结果中最多的那个。你可以理解是每个分类器都做投票,取投票最多的那个结果。当它做回归的时候,输出结果是每棵 CART 树的回归结果的平均值。

  随机森林算法是一种监督式分类算法。我们从名字上也能看出来,它是用来以某种方式创建一个森林,并使其随机。森林中的树的数量直接关系到算法得到的结果:树越多,结果就越准确。但是需要注意一点是,创建森林并不等同于用信息增益或构建索引的方法来创建决策。

  熟悉决策树的人在首次接触随机森林时可能会有些困惑。决策树是一种决策辅助工具,它是用一种树状的图形来展示可能的结果。如果你将一个带有目标和特征的训练集输入到决策树里,它就会表示出一些规律出来。这些规律就可以用于执行预测。举个例子,假如你想预测你的女儿是否会喜欢一部动画片,你就可以收集她以前喜欢的动画片,将某些特征作为输入。然后通过决策树算法,你就可以生成相应的规律。而收集这些信息节点和形成规律的过程就是使用信息增益方法和基尼系数计算的过程。

  随机森林算法和决策树算法分不同之处就是,在随机森林中,找到根节点和划分特征节点的过程会以随机的方式进行。
  随机森林在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。不同于传统决策树划分属性在当前节点属性集中选择最优属性的方法,在随机森林中,先从该结点的属性集合中随机选择一个包含部分属性的子集,然后再从这个子集中选择一个最优属性用于划分。

5.随机森林的推广

  由于随机森林在实际应用中的良好特性,基于随机森林,衍生出变种算法,其衍生算法可以用于分类回归,特征转换,异常点检测等。总结衍生算法如下:

(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,也是因为异常点检测一般不需要这么大规模的决策树。

6.随机森林的优缺点

(1)随机森林的优点:

  • 表现性能好,与其他算法相比有着很大优势。
  • 随机森林能处理很高维度的数据(也就是很多特征的数据),并且不用做特征选择。
  • 在训练完之后,随机森林能给出哪些特征比较重要。
  • 训练速度快,容易做成并行化方法(训练时,树与树之间是相互独立的)。
  • 在训练过程中,能够检测到feature之间的影响。
  • 对于不平衡数据集来说,随机森林可以平衡误差。当存在分类不平衡的情况时,随机森林能提供平衡数据集误差的有效方法。
  • 如果有很大一部分的特征遗失,用RF算法仍然可以维持准确度。
  • 随机森林算法有很强的抗干扰能力(具体体现在6,7点)。所以当数据存在大量的数据缺失,用RF也是不错的。
  • 随机森林抗过拟合能力比较强(虽然理论上说随机森林不会产生过拟合现象,但是在现实中噪声是不能忽略的,增加树虽然能够减小过拟合,但没有办法完全消除过拟合,无论怎么增加树都不行,再说树的数目也不可能无限增加的。)
  • 随机森林能够解决分类与回归两种类型的问题,并在这两方面都有相当好的估计表现。(虽然RF能做回归问题,但通常都用RF来解决分类问题)。
  • 在创建随机森林时候,对generlization error(泛化误差)使用的是无偏估计模型,泛化能力强。

(2)随机森林的缺点:

  • 随机森林在解决回归问题时,并没有像它在分类中表现的那么好,这是因为它并不能给出一个连续的输出。当进行回归时,随机森林不能够做出超越训练集数据范围的预测,这可能导致在某些特定噪声的数据进行建模时出现过度拟合。(PS:随机森林已经被证明在某些噪音较大的分类或者回归问题上回过拟合)。
  • 对于许多统计建模者来说,随机森林给人的感觉就像一个黑盒子,你无法控制模型内部的运行。只能在不同的参数和随机种子之间进行尝试。
  • 可能有很多相似的决策树,掩盖了真实的结果。
  • 对于小数据或者低维数据(特征较少的数据),可能不能产生很好的分类。(处理高维数据,处理特征遗失数据,处理不平衡数据是随机森林的长处)。
  • 执行数据虽然比boosting等快(随机森林属于bagging),但比单只决策树慢多了。

7.随机森林算法重要的超参数

sklearn库实现随机森林

sklearn官网地址(RandomForestClassifier):http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier

class 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, bootstrap=True, oob_score=False, \
n_jobs=1, random_state=None, verbose=0, warm_start=False, class_weight=None)\
n_estimators 森林中树的个数
criterion 评价划分程度的函数,
'gini'表示基尼不纯度,
'entropy'表示熵,用于信息增益
feature_importances_ 特征重要程度,值越大特征越重要

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

max_depth:
决策树最大深度。默认为"None",决策树在建立子树的时候不会限制子树的深度这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

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

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

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

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

min_impurity_split:
节点划分最小不纯度。这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点,即为叶子节点 。一般不推荐改动默认值1e-7。
上面决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。

splitter:
随机选择属性"random"还是选择不纯度最大"best"的属性,建议用默认 best。

presort:
是否对数据进行预分类,以加快拟合中最佳分裂点的发现。默认False,适用于大数据集。小数据集使用True,可以加快训练。是否预排序,预排序可以加速查找最佳分裂点,对于稀疏数据不管用,Bool,auto:非稀疏数据则预排序,若稀疏数据则不预排序

8.应用范围

  随机森林算法可被用于很多不同的领域,如银行,股票市场,医药和电子商务。 在银行领域,它通常被用来检测那些比普通人更高频率使用银行服务的客户,并及时偿还他们的债务。 同时,它也会被用来检测那些想诈骗银行的客户。 在金融领域,它可用于预测未来股票的趋势。 在医疗保健领域,它可用于识别药品成分的正确组合,分析患者的病史以识别疾病。 除此之外,在电子商务领域中,随机森林可以被用来确定客户是否真的喜欢某个产品。

参考文献:
[1]:https://blog.csdn.net/u013239656/article/details/89019819https://blog.csdn.net/u013239656/article/details/89019819
[2]:https://blog.csdn.net/weixin_36466478/article/details/85084547#
[3]:https://www.jianshu.com/p/6243190dfa8b

猜你喜欢

转载自blog.csdn.net/weixin_41725746/article/details/89034498