使用sklearn进行集成学习——理论

系列

目录

1 前言
2 集成学习是什么?
3 误差和方差
  3.1 模型的误差和方差是什么?
  3.2 bagging的误差和方差
  3.3 boosting的误差和方差
  3.4 模型的独立性
  3.5 小结
4 Gradient Boosting
  4.1 拟合残差
  4.2 拟合反向梯度
    4.2.1 契机:引入损失函数
    4.2.2 难题一:任意损失函数的最优化
    4.2.3 难题二:没法对测试样本计算反向梯度
  4.3 常见的损失函数
  4.4 步子太大容易扯着蛋:缩减
  4.5 初始模型
  4.5 Gradient Tree Boosting
  4.6 小结
5 总结
6 参考资料html


 1 前言

  不少人在竞赛(Kaggle,天池等)或工程实践中使用了集成学习(例如,RF、GTB等),确实也取得了不错的效果,在保证准确度的同时也提高了模型防止过拟合的能力。可是,咱们真的用对了集成学习吗?git

  sklearn提供了sklearn.ensemble库,支持众多集成学习算法和模型。恐怕大多数人使用这些工具时,要么使用默认参数,要么根据模型在测试集上的性能试探性地进行调参(固然,彻底不懂的参数仍是不动算了),要么将调参的工做丢给调参算法(网格搜索等)。这样并不能真正地称为“会”用sklearn进行集成学习。github

  我认为,学会调参是进行集成学习工做的前提。然而,第一次遇到这些算法和模型时,确定会被其丰富的参数所吓到,要知道,教材上教的伪代码可没这么多参数啊!!!不要紧,暂时,咱们只要记住一句话:参数可分为两种,一种是影响模型在训练集上的准确度或影响防止过拟合能力的参数;另外一种不影响这二者的其余参数。模型在样本整体上的准确度(后简称准确度)由其在训练集上的准确度及其防止过拟合的能力所共同决定,因此在调参时,咱们主要对第一种参数进行调整,最终达到的效果是:模型在训练集上的准确度和防止过拟合能力的大和谐!算法

  本篇博文将详细阐述模型参数背后的理论知识,在下篇博文中,咱们将对最热门的两个模型Random Forrest和Gradient Tree Boosting(含分类和回归,因此共4个模型)进行具体的参数讲解。若是你实在没法静下心来学习理论,你也能够在下篇博文中找到最直接的调参指导,虽然我不赞同这么作。spring


 2 集成学习是什么?

  咱们仍是花一点时间来讲明一下集成学习是什么,若是对此有必定基础的同窗能够跳过本节。简单来讲,集成学习是一种技术框架,其按照不一样的思路来组合基础模型,从而达到其利断金的目的。框架

  目前,有三种常见的集成学习框架:bagging,boosting和stacking。国内,南京大学的周志华教授对集成学习有很深刻的研究,其在09年发表的一篇概述性论文Ensemble Learning》对这三种集成学习框架有了明确的定义,归纳以下:dom

   bagging:从训练集从进行子抽样组成每一个基模型所须要的子训练集,对全部基模型预测的结果进行综合产生最终的预测结果:wordpress

  boosting:训练过程为阶梯状,基模型按次序一一进行训练(实现上能够作到并行),基模型的训练集按照某种策略每次都进行必定的转化。对全部基模型预测的结果进行线性综合产生最终的预测结果:函数

  stacking:将训练好的全部基模型对训练基进行预测,第j个基模型对第i个训练样本的预测值将做为新的训练集中第i个样本的第j个特征值,最后基于新的训练集进行训练。同理,预测的过程也要先通过全部基模型的预测造成新的测试集,最后再对测试集进行预测:工具

  有了这些基本概念以后,直觉将告诉咱们,因为再也不是单一的模型进行预测,因此模型有了“集思广益”的能力,也就不容易产生过拟合现象。可是,直觉是不可靠的,接下来咱们将从模型的误差和方差入手,完全搞清楚这一问题。


 

3 误差和方差

  广义的误差(bias)描述的是预测值和真实值之间的差别,方差(variance)描述距的是预测值做为随机变量的离散程度。《Understanding the Bias-Variance Tradeoff》当中有一副图形象地向咱们展现了误差和方差的关系:

3.1 模型的误差和方差是什么?

  模型的误差是一个相对来讲简单的概念:训练出来的模型在训练集上的准确度。

  要解释模型的方差,首先须要从新审视模型:模型是随机变量。设样本容量为n的训练集为随机变量的集合(X1, X2, ..., Xn),那么模型是以这些随机变量为输入的随机变量函数(其自己仍然是随机变量):F(X1, X2, ..., Xn)。抽样的随机性带来了模型的随机性。

  定义随机变量的值的差别是计算方差的前提条件,一般来讲,咱们遇到的都是数值型的随机变量,数值之间的差别再明显不过(减法运算)。可是,模型的差别性呢?咱们能够理解模型的差别性为模型的结构差别,例如:线性模型中权值向量的差别,树模型中树的结构差别等。在研究模型方差的问题上,咱们并不须要对方差进行定量计算,只须要知道其概念便可。

  研究模型的方差有什么现实的意义呢?咱们认为方差越大的模型越容易过拟合:假设有两个训练集A和B,通过A训练的模型Fa与通过B训练的模型Fb差别很大,这意味着Fa在类A的样本集合上有更好的性能,而Fb反之,这即是咱们所说的过拟合现象。

  咱们常说集成学习框架中的基模型是弱模型,一般来讲弱模型是误差高(在训练集上准确度低)方差小(防止过拟合能力强)的模型。可是,并非全部集成学习框架中的基模型都是弱模型。bagging和stacking中的基模型为强模型(误差低方差高),boosting中的基模型为弱模型。

  在bagging和boosting框架中,经过计算基模型的指望和方差,咱们能够获得模型总体的指望和方差。为了简化模型,咱们假设基模型的权重、方差及两两间的相关系数相等。因为bagging和boosting的基模型都是线性组成的,那么有:

 

3.2 bagging的误差和方差

  对于bagging来讲,每一个基模型的权重等于1/m且指望近似相等(子训练集都是从原训练集中进行子抽样),故咱们能够进一步化简获得:

  根据上式咱们能够看到,总体模型的指望近似于基模型的指望,这也就意味着总体模型的误差和基模型的误差近似。同时,总体模型的方差小于等于基模型的方差(当相关性为1时取等号),随着基模型数(m)的增多,总体模型的方差减小,从而防止过拟合的能力加强,模型的准确度获得提升。可是,模型的准确度必定会无限逼近于1吗?并不必定,当基模型数增长到必定程度时,方差公式第二项的改变对总体方差的做用很小,防止过拟合的能力达到极限,这即是准确度的极限了。另外,在此咱们还知道了为何bagging中的基模型必定要为强模型,不然就会致使总体模型的误差度低,即准确度低。

  Random Forest是典型的基于bagging框架的模型,其在bagging的基础上,进一步下降了模型的方差。Random Fores中基模型是树模型,在树的内部节点分裂过程当中,再也不是将全部特征,而是随机抽样一部分特征归入分裂的候选项。这样一来,基模型之间的相关性下降,从而在方差公式中,第一项显著减小,第二项稍微增长,总体方差还是减小。

3.3 boosting的误差和方差

  对于boosting来讲,基模型的训练集抽样是强相关的,那么模型的相关系数近似等于1,故咱们也能够针对boosting化简公式为:

  经过观察总体方差的表达式,咱们容易发现,若基模型不是弱模型,其方差相对较大,这将致使总体模型的方差很大,即没法达到防止过拟合的效果。所以,boosting框架中的基模型必须为弱模型。

  由于基模型为弱模型,致使了每一个基模型的准确度都不是很高(由于其在训练集上的准确度不高)。随着基模型数的增多,总体模型的指望值增长,更接近真实值,所以,总体模型的准确度提升。可是准确度必定会无限逼近于1吗?仍然并不必定,由于训练过程当中准确度的提升的主要功臣是总体模型在训练集上的准确度提升,而随着训练的进行,总体模型的方差变大,致使防止过拟合的能力变弱,最终致使了准确度反而有所降低。

  基于boosting框架的Gradient Tree Boosting模型中基模型也为树模型,同Random Forrest,咱们也能够对特征进行随机抽样来使基模型间的相关性下降,从而达到减小方差的效果。

3.4 模型的独立性

  聪明的读者这时确定要问了,如何衡量基模型的独立性?咱们说过,抽样的随机性决定了模型的随机性,若是两个模型的训练集抽样过程不独立,则两个模型则不独立。这时便有一个天大的陷阱在等着咱们:bagging中基模型的训练样本都是独立的随机抽样,可是基模型却不独立呢?

  咱们讨论模型的随机性时,抽样是针对于样本的总体。而bagging中的抽样是针对于训练集(总体的子集),因此并不能称其为对总体的独立随机抽样。那么到底bagging中基模型的相关性体如今哪呢?在知乎问答《为何说bagging是减小variance,而boosting是减小bias?》中请教用户“过拟合”后,我总结bagging的抽样为两个过程:

  1. 样本抽样:总体模型F(X1, X2, ..., Xn)中各输入随机变量(X1, X2, ..., Xn)对样本的抽样
  2. 子抽样:从总体模型F(X1, X2, ..., Xn)中随机抽取若干输入随机变量成为基模型的输入随机变量

  倘若在子抽样的过程当中,两个基模型抽取的输入随机变量有必定的重合,那么这两个基模型对总体样本的抽样将再也不独立,这时基模型之间便具备了相关性。

3.5 小结

  还记得调参的目标吗:模型在训练集上的准确度和防止过拟合能力的大和谐!为此,咱们目前作了一些什么工做呢?

  1. 使用模型的误差和方差来描述其在训练集上的准确度和防止过拟合的能力
  2. 对于bagging来讲,总体模型的误差和基模型近似,随着训练的进行,总体模型的方差下降
  3. 对于boosting来讲,总体模型的初始误差较高,方差较低,随着训练的进行,总体模型的误差下降(虽然也不幸地伴随着方差增高),当训练过分时,因方差增高,总体模型的准确度反而下降
  4. 总体模型的误差和方差与基模型的误差和方差息息相关

  这下总算有点开朗了,那些让咱们抓狂的参数,如今能够粗略地分为两类了:控制总体训练过程的参数和基模型的参数,这两类参数都在影响着模型在训练集上的准确度以及防止过拟合的能力。


 

4 Gradient Boosting

  对基于Gradient Boosting框架的模型的进行调试时,咱们会遇到一个重要的概念:损失函数。在本节中,咱们将把损失函数的“此生来世”讲个清楚!

  基于boosting框架的总体模型能够用线性组成式来描述,其中h[i](x)为基模型与其权值的乘积:

  根据上式,总体模型的训练目标是使预测值F(x)逼近真实值y,也就是说要让每个基模型的预测值逼近各自要预测的部分真实值。因为要同时考虑全部基模型,致使了总体模型的训练变成了一个很是复杂的问题。因此,研究者们想到了一个贪心的解决手段:每次只训练一个基模型。那么,如今改写总体模型为迭代式:

  这样一来,每一轮迭代中,只要集中解决一个基模型的训练问题:使F[i](x)逼近真实值y。

4.1 拟合残差

  使F[i](x)逼近真实值,其实就是使h[i](x)逼近真实值和上一轮迭代的预测值F[i-1](x)之差,即残差(y-F[i-1](x))。最直接的作法是构建基模型来拟合残差,在博文《GBDT(MART) 迭代决策树入门教程 | 简介》中,做者举了一个生动的例子来讲明经过基模型拟合残差,最终达到总体模型F(x)逼近真实值。

  研究者发现,残差实际上是最小均方损失函数的关于预测值的反向梯度:

  也就是说,若F[i-1](x)加上拟合了反向梯度的h[i](x)获得F[i](x),该值可能将致使平方差损失函数下降,预测的准确度提升!这显然不是巧合,可是研究者们野心更大,但愿可以创造出一种对任意损失函数均可行的训练方法,那么仅仅拟合残差是不恰当的了。

4.2 拟合反向梯度

4.2.1 契机:引入任意损失函数

  引入任意损失函数后,咱们能够定义总体模型的迭代式以下:

  在这里,损失函数被定义为泛函

4.2.2 难题一:任意损失函数的最优化

  对任意损失函数(且是泛函)的最优化是困难的。咱们须要打破思惟的枷锁,将总体损失函数L'定义为n元普通函数(n为样本容量),损失函数L定义为2元普通函数(记住!!!这里的损失函数再也不是泛函!!!):

  咱们不妨使用梯度最速降低法来解决总体损失函数L'最小化的问题,先求总体损失函数的反向梯度:

  假设已知样本x的当前预测值为F[i-1](x),下一步将预测值按照反向梯度,依照步长为r[i],进行更新:

  步长r[i]不是固定值,而是设计为:

4.2.3 难题二:没法对测试样本计算反向梯度

  问题又来了,因为测试样本中y是未知的,因此没法求反向梯度。这正是Gradient Boosting框架中的基模型闪亮登场的时刻!在第i轮迭代中,咱们建立训练集以下:

  也就是说,让基模型拟合反向梯度函数,这样咱们就能够作到只输入x这一个参数,就可求出其对应的反向梯度了(固然,经过基模型预测出来的反向梯度并非准确的,这也提供了泛化总体模型的机会)。

  综上,假设第i轮迭代中,根据新训练集训练出来的基模型为f[i](x),那么最终的迭代公式为:

4.3 常见的损失函数

  ls:最小均方回归中用到的损失函数。在以前咱们已经谈到,从拟合残差的角度来讲,残差便是该损失函数的反向梯度值(因此又称反向梯度为伪残差)。不一样的是,从拟合残差的角度来讲,步长是无心义的。该损失函数是sklearn中Gradient Tree Boosting回归模型默认的损失函数。

  deviance:逻辑回归中用到的损失函数。熟悉逻辑回归的读者确定还记得,逻辑回归本质是求极大似然解,其认为样本服从几何分布,样本属于某类别的几率能够logistic函数表达。因此,若是该损失函数可用在多类别的分类问题上,故其是sklearn中Gradient Tree Boosting分类模型默认的损失函数。

  exponential:指数损失函数,表达式为:

  对该损失函数求反向梯度得:

  这时,在第i轮迭代中,新训练集以下:

 

  脑壳里有什么东西浮出水面了吧?让咱们看看Adaboost算法中,第i轮迭代中第j个样本权值的更新公式:

  样本的权值何时会用到呢?计算第i轮损失函数的时候会用到:

  让咱们再回过头来,看看使用指数损失函数的Gradient Boosting计算第i轮损失函数:

  天呐,两个公式就差了一个对权值的归一项。这并非巧合,当损失函数是指数损失时,Gradient Boosting至关于二分类的Adaboost算法。是的,指数损失仅能用于二分类的状况。

4.4 步子太大容易扯着蛋:缩减

  缩减也是一个相对显见的概念,也就是说使用Gradient Boosting时,每次学习的步长缩减一点。这有什么好处呢?缩减思想认为每次走一小步,多走几回,更容易逼近真实值。若是步子迈大了,使用最速降低法时,容易迈过最优势。将缩减代入迭代公式:

   缩减须要配合基模型数一块儿使用,当缩减率v下降时,基模型数要配合增大,这样才能提升模型的准确度。

4.5 初始模型

  还有一个不那么起眼的问题,初始模型F[0](x)是什么呢?若是没有定义初始模型,总体模型的迭代式一刻都没法进行!因此,咱们定义初始模型为:

  根据上式可知,对于不一样的损失函数来讲,初始模型也是不同的。对全部的样原本说,根据初始模型预测出来的值都同样。

4.5 Gradient Tree Boosting

  终于到了备受欢迎的Gradient Tree Boosting模型了!可是,可讲的却已经很少了。咱们已经知道了该模型的基模型是树模型,而且能够经过对特征的随机抽样进一步减小总体模型的方差。咱们能够在维基百科的Gradient Boosting词条中找到其伪代码实现。

4.6 小结

  到此,读者应当很清楚Gradient Boosting中的损失函数有什么意义了。要说误差描述了模型在训练集准确度,则损失函数则是描述该准确度的间接量纲。也就是说,模型采用不一样的损失函数,其训练过程会朝着不一样的方向进行!


 

5 总结

  磨刀不误砍柴功,咱们花了这么多时间来学习必要的理论,我强调一次:必要的理论!集成学习模型的调参工做的核心就是找到合适的参数,可以使总体模型在训练集上的准确度和防止过拟合的能力达到协调,从而达到在样本整体上的最佳准确度。有了本文的理论知识铺垫,在下篇中,咱们将对Random Forest和Gradient Tree Boosting中的每一个参数进行详细阐述,同时也有一些小试验证实咱们的结论。


 

6 参考资料

  1. Ensemble Learning》
  2. 《Understanding the Bias-Variance Tradeoff》
  3. 《为何说bagging是减小variance,而boosting是减小bias?》
  4. 《GBDT(MART) 迭代决策树入门教程 | 简介》
  5. 泛函
  6. 梯度最速降低法
  7. 《logistic regression(二分类、多分类)》
  8. 《Adaboost与指数损失》