查看原文
其他

【周末AI课堂】Boosting集成(理论篇)| 机器学习你会遇到的“坑”

唐僧不用海飞丝 读芯术 2019-12-26


AI课堂开讲,就差你了!


很多人说,看了再多的文章,可是没有人手把手地教授,还是很难真正地入门AI。为了将AI知识体系以最简单的方式呈现给你,从这个星期开始,芯君邀请AI专业人士开设“周末学习课堂”——每周就AI学习中的一个重点问题进行深度分析,课程会分为理论篇和代码篇,理论与实操,一个都不能少!


来,退出让你废寝忘食的游戏页面,取消只有胡吃海塞的周末聚会吧。未来你与同龄人的差异,也许就从每周末的这堂AI课开启了!


读芯术读者交流群,请加小编微信号:zhizhizhuji。等你。后台回复“周末AI课堂”,查阅相关源代码

全文共3178字,预计学习时长6分钟




秋高气爽,天气不错,正是学习的大好时机~


数学准备


  • 偏差-方差分解:假设我们永远无法拟合出真实分布,偏差表达预测值与真实值的偏离程度,如果预测值完美的等于真实值,那么偏差为零,但学习器很可能是过拟合的。方差表达同一学习器在不同数据上预测值的离散程度,如果预测值均一致,那么方差为零,但学习器很可能是欠拟合的。


  • 指数损失(exponential loss):样本重要程度相同的情形下,指数损失为

    表示真实的类别标记,表示预测类别标记,总的损失可以理解为对每个样本进行预测之后的取指数损失的平均值。(与平方损失类似,它是每个样本的残差平方和的平均值)


  • 错误率:在样本重要程度相同的情况下,错误率是分类错误的样本占全部样本的比例,表达为;在样本重要程度不一致的情况下,错误率要乘以权重系数,表达为。可以看出,前者只是后者的特例。


  • 标量梯度:标量函数的梯度是一个矢量,其方向指向着该标量变化最快的方向。


  • 泰勒级数(Talor):对于无穷可微的函数,在点处可以展开为,其第一项的系数是函数的梯度,一般我们只保留低阶项,但高阶项会让近似更加精确。


Boosting 的动机


为了深刻地理解Boosting,我们有必要总结我们已经知道的部分:


  • 我们在《bagging集成和stacking集成(代码篇)》中看到,随机森林规模的增大并不会导致过拟合,反而使集成器的泛化误差趋于稳定,说明Bagging集成中基学习器数量的增加并不会增加模型的复杂度。


  • 我们在《过拟合(理论篇)》中提到,偏差是模型准确度的体现,方差是模型稳定性的体现。具体来说,偏差度量了学习器的拟合能力,拟合能力越强,偏差越小,当偏差太小时Loss也就很小,就导致了过拟合。这时,泛化误差就会很大,但偏差很小,泛化误差的主要贡献就来自于方差。同时,训练集和测试集是同一个分布采样而来,但训练集表现好,测试集表现差,对应的方差也就很大,说明方差刻画了学习器对不同数据的稳定性。


而Bagging集成添加了样本扰动,随机森林进一步地添加了特征扰动,最后将这些差异化的模型平均化,就是在尽可能提高学习器对数据扰动的稳定性,也就是降低学习器的方差。基学习器的增加只是增加模型的多样性,而没有增加模型的复杂性,越复杂的模型拟合能力越强,bagging集成却无益于降低偏差,甚至它会提高学习器的偏差。


如果我们想降低模型的偏差,bagging就不是一个好的选择。同时呢,面对可能存在复杂关系的数据,单一的简单模型无法得出低偏差的结果,我们把这类学习器叫做弱学习器,而所谓的强学习器设计并不容易,根据实际的应用效率和开发难度上,我们需要将弱学习器提升为强学习器的算法,也就是我们的Boosting集成。Boosting的想法仍然是模型的加权平均:



其中是基学习器, 是基学习器的权重系数。看起来,boosting和bagging表达式一致,但是bagging的每个基学习器是近乎独立的训练出来的模型,而boosting的每个基学习器却是在优化上一步的的结果,比如Adaboost的做法是将上一步学习器分类错的样本赋予更大的权重,Gradient Boosting的做法是下一个学习器去拟合上一步分类器的残差。


举个例子,打靶的时候,我们的任务是尽可能每次都打到靶心,bagging集成就像进行十次打靶,但会把每一次的靶纸撤掉,每一次打靶都不知道上一次的表现,那么痕迹都会很集中,方差就会很小;boosting集成就像十次打靶不更换靶纸,上一次打的偏右,我们就尽量偏左一点,痕迹不会非常集中,但偏差每次都会缩小。


从数学角度来理解,Boosting与简单线性回归一致,简单线性模型是关于特征值的函数,而我们的Boosting是函数的函数,我们需要做的是最小化Loss function:



但这样的优化会存在困难,因为我们同时需要优k个函数,Boosting采取了贪心算法,只考虑当前的学习器,因为我们是逐步将弱学习器加进去,就像打靶时候是一步步的靠近靶心,所以有递推公式:



我们每次只需要优化一个学习器,直到达到我们需要的效果。Boosting不是一个方法,而是一类方法,下面我们针对分类和回归都分举一例,主要针对性的讲解很多人理解上的难点。


Adaboost


Adaboost可能是最著名的boosting集成算法,最初的算法采用了并不被经常使用的指数损失函数,在这样的损失框架内,我们就不能把二分类样本标记为0,1。因为{0,1}的样本标记会使得只要指数项出现0,那么损失就会变成1,取而代之的是,我们采用{-1,1}的样本标记。


Adaboost在很多材料上都会详细讲解,但加上陌生的指数损失和貌似复杂的数学变换容易把人云里雾里,但最关键的步骤却只有两步:


  • 获得学习器的权重系数


  • 更新每一轮样本的权重系数


开始时,我们假设每一个样本都是同等重要的,每个样本的权重都相等,在此基础上我们训练出第一个学习器,并得出分类误率,并将此时的错误率转化为此时学习器的权重系数:



这样的转化如何理解呢?从直观上可以理解为来自于Logistic回归中的相对概率,从数学上则是对此时学习器的指数损失做优化的必然结果,我们可以优化携带的指数损失函数:



作为变量,对其求导,就可以得到上述的转化形式,换而言之,我们之所以得到了这样的形式,根本原因在于我们采用了指数损失函数,与其他无关。但注意到此时我们并未更新权重,因为学习器的权重系数的更新都要利用学习器的错误率,错误率是由上一步的样本分布得到,我们只有获得了学习的权重系数才能更新下一步要使用的样本分布。


我们假设初始权值分布为:,上标表示样本,下标表示迭代次数。那么第一个学习器训练完成后,我们的权值更新为:



此关系我们可以从最小化当前损失函数来推导,但直观来看,就是每个样本的当前权重乘以该样本的指数损失,类别正确的损失小,新的权重也会变小,是全部的权重之和,相当于一个归一化因子,因为我们需要总的样本出现概率为1。


依照这样的步骤,我们就可以依次训练出一系列的学习器,直到达到我们需要的性能。需要注意的是,样本更新的权重会直接参与到下一轮学习器的损失函数,而非重新采样。


Gradient Boosting


梯度提升集成是另外一种性能优越的Boosting,常见的形式是梯度提升决策树,也就是著名的GBDT。为了彻底理解此算法,我们在《非参数模型进阶》中详细介绍了回归树,最初的梯度集成办法正是回归树的叠加。


我们会看到很多材料上会分类为提升树和梯度提升树,提升树是在每一步去拟合上一步的残差,而梯度提升树是用负梯度近似残差。但这样的看法会让人误以为残差比起负梯度是更根本性的东西,但事实上残差和负梯度本来就是一回事情,负梯度具有更普遍的意义。而且最重要的是,在更一般的情况下,我们理论上需要拟合的也不是负梯度。


我们首先有递推公式:



定义Boosting的损失函数为:



作为变量,对损失函数做泰勒展开,保留到二阶项:

 


要使损失函数最小,就是最小化上面的泰勒展开,第一项为常数项,不参与优化,第二项的系数我们记为,第三项的系数我们记为,所以我们令后两项之和为零:


当损失是均方误差时,就是残差,为1,所以下一步的学习器需要拟合上一步的残差。对于更一般的损失函数,我们需要拟合一阶导数和二阶导数的商,只是,二阶导数一般接近1,所以我们选择负梯度作为下一步需要拟合的目标。


但在各种Boosting的推广中,我们还会看到一种叫做xgboost的算法,它不仅考虑了二阶导数,还在二阶导数中添加了正则化项,使得拟合目标变为:



读芯君开扒


课堂TIPS


• Adaboost采用了指数损失函数,但指数损失对于Adaboost整体框架的影响只局限于学习器权重的更新形式和样本权重的更新形式,我们换用其他的分类损失函数仍然可以构建出Adaboost。


• 在Adaboost中,我主要强调了样本更新的权重要进入损失函数,使得被分错的样本在损失中所占的比例更大,但实际上,我们还可以采用一种叫做重采样的方法,是将样本更新的权重进入采样过程,是为了错误的样本能被更大几率再次采到,而损失函数是不变的。


• Gradient Boosting的基本框架可以从梯度下降来理解,我们的每一步梯度下降都会使我们的Loss在前面的基础上继续减小,同时完成一次参数的更新,梯度集成办法每一次基学习器的训练就对应着梯度下降的一次更新。


留言 点赞 发个朋友圈

我们一起探讨AI落地的最后一公里


作者:唐僧不用海飞丝


如需转载,请后台留言,遵守转载规范


推荐文章阅读


【周末AI课堂 | 第二十讲】bagging集成和stacking集成(代码篇)

【周末AI课堂 | 第十九讲】bagging集成和stacking集成(理论篇)

【周末AI课堂 | 第十八讲】非参模型进阶(代码篇)

【周末AI课堂 | 第十七讲】非参模型进阶(理论篇)

【周末AI课堂 | 第十六讲】非参模型初步(代码篇)

【周末AI课堂 | 第十五讲】非参模型初步(理论篇)

【周末AI课堂 | 第十四讲】基于贝叶斯推断的回归模型(代码篇)

【周末AI课堂 | 第十三讲】基于贝叶斯推断的回归模型(理论篇)

【周末AI课堂 | 第十二讲】基于贝叶斯推断的分类模型(代码篇)

【周末AI课堂 | 第十一讲】基于贝叶斯推断的分类模型(理论篇)

【周末AI课堂 | 第十讲】核技巧(代码篇)

【周末AI课堂 | 第九讲】核技巧(理论篇)

【周末AI课堂 | 第八讲】非线性降维方法(代码篇)

【周末AI课堂 | 第七讲】非线性降维方法(理论篇)

【周末AI课堂 | 第六讲】线性降维方法(代码篇)

【周末AI课堂 | 第五讲】线性降维方法(理论篇)

【周末AI课堂 | 第四讲】如何进行特征选择(代码篇)

【周末AI课堂 | 第三讲】如何进行特征选择(理论篇)

【周末AI课堂 | 第二讲】过拟合问题(代码篇)

【周末AI课堂 | 第一讲】过拟合问题(理论篇)


长按识别二维码可添加关注

读芯君爱你


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存