参考资料(要是对于本文的理解不够透彻,必须将如下博客认知阅读):面试
1. https://zhuanlan.zhihu.com/p/86263786算法
2.https://blog.csdn.net/liuy9803/article/details/80598652bootstrap
3.http://www.javashuo.com/article/p-tozojgjb-gh.html框架
4.GBDT算法原理以及实例理解(!!)dom
5.Adaboost算法原理分析和实例+代码(简明易懂)(!!)机器学习
1.集成学习概念函数
2.Bagging性能
3.Random Forest(RF)学习
4.Boosting测试
5.Adaboost
6.Boosting tree(提高树)
7.GBDT
8.从误差和方差的角度理解集成学习
1. 集成学习(Ensemble learning)是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合,从而得到比单个学习器显著优越的泛化性能。它不是一种单独的机器学习算法,而更像是一种优化策略,其目的在于使得集成模型达到减少方差(bagging)、减少误差(boosting)或改进预测(stacking)的效果。
2. 根据集成学习的概念以及通常结构,咱们能都发现集成学习的两个核心问题:
2. 集成学习的通常结构是,先产生一组个体学习器,再用某种结合策略将它们结合起来。
3. 集成学习的成功在于保证个体学习器的多样性(好而不一样),且集成不稳定的算法也可以获得一个比较明显的性能提高。
4. 根据个体学习器的生成方式,目前的集成学习方法大体能够分为两类:(也有人把集成学习方法分为3类[Bagging、Boosting、stacking],stacking其实能够当作是一种集成学习方法,也能够当作是一种特殊的结合策略)
5. 集成学习优点在于:
自助采样法:对 m 个样本的训练集,有放回的采样 m 次;此时,样本在 m 次采样中始终没被采样的几率约为 0.368,即每次自助采样只能采样到所有样本的 63% 左右。
(1)给定包含m个样本的数据集,随机取出一个样本放入采样集中,再把它放回到原始数据集中,重复m次,获得含m个样本的采样集。
(2)进行一样的操做进行T次获得T个每一个含m个样本的采样集,基于每一个采样集训练一个基学习器。
(3)再将基学习器进行组合,通常使用多数投票或求均值的方式来统计最终的分类结果。
(1)Boosting是一簇可将弱学习器提高为强学习器的算法,其基于串行策略:基学习器之间存在依赖关系,新的学习器须要根据上一个学习器生成,每次学习都会使用所有训练样本。
(2)其工做机制为:先从初始训练集训练出一个基学习器,再根据基学习器的表现对样本分布进行调整,使得先前的基学习器作错的训练样本在后续收到更多的关注,而后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学习器数目达到实现指定的值T,或整个集成结果达到退出条件,而后将这些学习器进行加权结合。正确率越高的基学习器的得到的权重越大。Boosting能够用于分类和回归问题。
(3)常见的基于Boosting模型的算法有:AdaBoost、Boosting Tree、GBDT、XGBoost。
(1)从方差-误差分解的角度看,Boosting主要关注下降误差,所以Boosting能基于泛化性能至关弱的学习器构建出很强的集成。
(2)Boosting对样本分布进行调整主要有两种方法:
(1) 样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每一个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
(2) 样例权重:
Bagging:使用均匀取样,每一个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
(3) 预测函数:
Bagging:全部预测函数的权重相等。
Boosting:每一个弱分类器都有相应的权重,对于分类偏差小的分类器会有更大的权重。
(4) 并行计算:
Bagging:各个预测函数能够并行生成
Boosting:各个预测函数只能顺序生成,由于后一个模型参数须要前一轮模型的结果。
(5) 为何说bagging是减小variance,而boosting是减小bias(高频面试)
Bagging中每一个基学习器都是强学习器,主要关注的问题是下降方差;Boosting中每一个基学习器都是弱学习器,主要关注的问题是下降误差。具体解答分析见7.从误差和方差的角度理解集成学习
(1)AdaBoost [ adaptive boosting(自适应boosting) ] 是Boosting中的经典算法,其主要应用于二分类问题,也能够用于多分类以及回归问题。
(2)AdaBoost算法思路:如何改变每一轮训练数据的权重?Adaboost 算法采用调整样本权重的方式来对样本分布进行调整,即提升前一轮个体学习器错误分类的样本的权重,而下降那些正确分类的样本的权重,这样就能使得错误分类的样本能够受到更多的关注,从而在下一轮中能够正确分类,使得分类问题被一系列的弱分类器“分而治之”。如何将弱分类器组合成一个强分类器?对于组合方式,AdaBoost采用加权多数表决的方法,具体地,加大分类偏差率小的若分类器的权值,减少分类偏差率大的若分类器的权值,从而调整他们在表决中的做用。
AdaBoost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分步算法的二分类算法。AdaBoost算法中最重要的应该就是样本权重更新公式的推导。
加法模型:最终的强分类器是由若干个弱分类器加权平均获得的。
前向分布学习算法:算法是经过一轮轮的弱学习器学习,利用前一个弱学习器的结果来更新后一个弱学习器的训练集权重。第 k 轮的强学习器为:
定义损失函数为 n 个样本的指数损失函数:
利用前向分布学习算法的关系能够获得:
由于 已知,因此令
,随着每一轮迭代而将这个式子带入损失函数,损失函数转化为:
咱们求 ,能够获得:
将 带入损失函数,并对
求导,使其等于 0,则就获得了:
其中, 即为咱们前面的分类偏差率。
最后看样本权重的更新。利用 和
,便可得:
这样就获得了样本权重更新公式。
其中,表示决策树;
为决策树的参数;
为决策树的个数。
提高树对不一样问题有不一样的提高树学习算法,其主要区别在于使用的损失函数不一样。
(1)用平方偏差损失函数的回归问题。
(2)用指数损失函数的分类问题。
(3)通常损失函数的通常决策问题。(引出了GB[Gradient Boosting 梯度提高]算法,GB+决策树(回归树)就获得了GBDT)
对于二分类问题,Boosting Tree算法只须要将AdaBoost算法中的基分类器限制为CART二分类树便可。
从这个角度能够反应出,在二分类问题中 Boosting Tree = AdaBoost + Tree(二分类树)
(1)把输入空间X划分为J个互不相交的区域,而且在每一个区域上肯定的输出常量,那么树能够表示为以下:
其中,参数表示树的区域划分和各个区域上的常数。J是回归树的复杂度即叶子结点个数。
(2)回归问题提高树使用如下前向分布算法:
在第m步,给定当前模型,须要求解
获得,即第m棵树的参数。
(3)由于为回归问题,因此采用平方偏差损失函数,因此
由上式容易知道,为使损失函数最小,则须要
即须要拟合r,其中,
为当前模型拟合数据的残差(residual),因此对于回归问题的提高树算法来讲,只须要简单的拟合当前模型的残差。
算法流程以下图所示:(摘自统计学习方法)
李航的《统计学习方法》中也给出了相应的例子来讲明整个解决回归问题提高树的算法流程。因为题目太长,在这我就不粘贴出来了,有须要本身去看!
GBDT = GB + DT + Shringkage(一个重要演变),在了解GBDT以前,首先让我了解一下GB(Gradient Boosting,梯度提高)算法以及DT(Decision Tree)。
Cart回归树生成算法(用于回归问题的Boosting Tree也须要用到Cart回归树生成算法)(有关Cart回归树以及分类树的详细知识可查看博主的上一篇博客)
梯度提高树(Grandient Boosting)是提高树(Boosting Tree)的一种改进算法。
提高树利用加法模型与前向分步算法实现学习的优化过程,当损失函数是平方损失和指数损失函数时,梯度提高树每一步优化是很简单的,可是对于通常损失函数而言,每每每一步优化起来不那么容易,针对这一问题,Friedman提出了梯度提高树算法,这是利用最速降低的近似方法,其关键是利用损失函数的负梯度做为提高树算法中的残差的近似值。那么负梯度长什么样呢?第t轮的第i个样本的损失函数的负梯度为:
此时不一样的损失函数将会获得不一样的负梯度,若是选择平方损失
则负梯度为
从上述推导过程当中,能够看出当损失函数为平方损失函数时,损失函数的负梯度 = 残差。可是在GBDT中,损失函数通常不会选择平方损失函数,因此咱们利用损失函数的负梯度做为提高树算法中的残差的近似值。
介绍完了GB和DT,将二者结合起来就获得GBDT算法。GBDT(Gradient Boosting Decision Tree)是一种迭代的决策树算法,该算法由多棵决策树组成,从名字中咱们能够看出来它是属于 Boosting 策略。GBDT 是被公认的泛化能力较强的算法。
首先必须明确一点 ,GBDT 使用的是绝对损失或者 Huber 损失函数,而不是平方损失函数(网上不少博客把GBDT的损失函数看成平方损失函数,这是错误的)
GBDT算法的整个流程:
一般在2(d)步骤时,GBDT会引入缩减(Shrinkage)思想
Shrinkage 的思想认为,每走一小步逐渐逼近结果的效果要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它并非彻底信任每一棵残差树。
Shrinkage 不直接用残差修复偏差,而是只修复一点点,把大步切成小步。本质上 Shrinkage 为每棵树设置了一个 weight,累加时要乘以这个 weight,当 weight 下降时,基模型数会配合增大。
在梯度提高决策树GBDT中,经过定义不一样的损失函数,能够完成不一样的学习任务,二分类是机器学习中一类比较重要的分类算法,对于分类问题,通常将损失函数改成指数损失(二分类)或者对数似然损失(多分类)。在二分类中,其损失函数为:
其他过程见:深刻理解GBDT二分类算法(此篇博客的博主是个大牛!@!!!!!!!)
相同点:
不一样点:
误差(Bias)描述的是预测值和真实值之差;方差(Variance)描述的是预测值做为随机变量的离散程度。放一场很经典的图:
模型的误差与方差
咱们常说集成学习中的基模型是弱模型,一般来讲弱模型是误差高(在训练集上准确度低)方差小(防止过拟合能力强)的模型,但并非全部集成学习框架中的基模型都是弱模型。Bagging 和 Stacking 中的基模型为强模型(误差低,方差高),而Boosting 中的基模型为弱模型(误差高,方差低)。
在 Bagging 和 Boosting 框架中,经过计算基模型的指望和方差咱们能够获得模型总体的指望和方差。为了简化模型,咱们假设基模型的指望为 ,方差
,模型的权重为
,两两模型间的相关系数
相等。因为 Bagging 和 Boosting 的基模型都是线性组成的,那么有:
模型整体指望:
模型整体方差(公式推导参考协方差的性质,协方差与方差的关系):
模型的准确度可由误差和方差共同决定:
对于 Bagging 来讲,每一个基模型的权重等于 1/m 且指望近似相等,故咱们能够获得:
经过上式咱们能够看到:
在此咱们知道了为何 Bagging 中的基模型必定要为强模型,若是 Bagging 使用弱模型则会致使总体模型的误差提升,而准确度下降。
Random Forest 是经典的基于 Bagging 框架的模型,并在此基础上经过引入特征采样和样本采样来下降基模型间的相关性,在公式中显著下降方差公式中的第二项,略微升高第一项,从而使得总体下降模型总体方差。
对于 Boosting 来讲,因为基模型共用同一套训练集,因此基模型间具备强相关性,故模型间的相关系数近似等于 1,针对 Boosting 化简公式为:
经过观察总体方差的表达式咱们容易发现:
基于 Boosting 框架的 Gradient Boosting Decision Tree 模型中基模型也为树模型,同 Random Forrest,咱们也能够对特征进行随机抽样来使基模型间的相关性下降,从而达到减小方差的效果。