提升方法是机器学习中一个非常重要的分支,学习的基础包括决策树、梯度下降等多个知识点。在学习的过程中,参考了许多重要的资料,在此表示感谢。本文主要依托于博客提升方法合集,这篇博客对提升的算法的内容总结的十分地道。本文主要对博客做一些注释和自己在学习中的感受记录一下。
首先推荐几篇在学习中搜集到的优秀的资料:
一、提升算法两个绝对思路
学习一个一问题一定要抓住其核心的点,不断地去挖掘。算法的更新和改进都是围绕着这些核心的点进行的。抓住了问题的核心,也就抓住了算法迭代的核心。对发现算法中的新东西和算法比较十分有帮助。
1.在每一轮如何改变训练数据的权值或概率分布,修改的策略是什么?
2.如何将弱分类器组合成一个强分类器
二、提升算法的框架模型
提升算法就是在训练的时候不求一步到位,当然也一步到位不了。而是通过一点点优化的方式,得到最优的模型。这个过程与梯度下降相似。也是在一个衡量标准下(损失函数)不断的减小这个误差。不同的是梯度下降是对一个函数不断的迭代下降而提升方法是不断的加入简单的函数来拟合掉这部分误差。
三、AdaBoost算法
这个算法思路比较简单具体的推导和案例在博客中都已经介绍了。这里备注一下自己理解的迷惑点:
1.“每一轮迭代后通过增大误分类样本的权重,减小正确分类样本的权重,使得模型更加关注误分类的样本。”
也可能是自己语文学的差劲,对这句话一直迷糊着,怎么去关注误分类样本呢?看了博客中的案例发现,当一轮迭代完成后要根据公式来更新权重分布。这里一定要注意了更新的权重分布的时候是按照概率分布来更新的,这样误分类的的权重就会增大。那么怎么体现关注呢?当权重增大之后,下一个分类器寻找切分点时,就会找损失大的地方,而损失的大小与权重又是直接相关的。这样就体现关注误分类点了啊。具体的公式看一下博客中的案例即可。<关注误分类样本的意思是,上一轮误分类样本的权重被增大了,如果这次再把这些样本分错,则误差率会高。而每一轮选择的是误差率最低的点,则肯定不会选到上一轮分错的点>
2.“损失更新和权值更新公式怎么来的呢?”
其实Adaboost算法提出来时是个算法的框架,其内部的证明还不太完善的。后来人们通过前向分步算法推导出了Adaboost的算法原理。“Adaboost算法相当于损失函数是指数损失的前向分步算法”,具体的公式推导见博客从前向分步到Adaboost。
四、GDBT(Gradient Boosting Decision Tree_梯度提升树)
通过名字发现有梯度有提升还有树。博客中先举例分析了提升树,具体的细节去查看博客4.1~4.3部分即可。核心的问题是梯度提升(Gradient Boosting)的概念,查了一些资料总算把一些疑问搞清楚了。
1.博客中一开始的案例其实是分析梯度提升模型的一个特例,其实梯度提升模型就是在通过梯度的方法不断的拟合前面已经组合好的模型的输出与真实间的误差。通过不断的减小这个误差来达到最终提高精度的作用。
2.在提升树算法建树的案例中发现,第一次建树的过程与CART方法几乎一模一样。但是第二次迭代时就不一样了之后的迭代输入的不再是原来的样本数据了,而是上一轮迭代产生的残差。
3.GDBT算法的老祖其实是Gradient Boosting,这个方法的思想就是把梯度值当成要拟合的残差(当然可以理解成梯度值是一个方向,这个方向是可以使得误差减小最快的方向。当然还需要一个步长,这里都在提什么线性搜索法。之前也没有提到什么线性搜索法,人家论文中提到可以用这个方法来找步长就一直都在说这个。在标准的凸优化中当然是通过严格的方法来进行啊,我想在这里加入线性搜索的原因还是希望引入较小的噪声吧)。其实这里是一个新的角度来分析的GB,借用的林老师的算法思想,贴张截图理解一下:
其实单纯的求一阶导数是有问题的,我们在使用的时候一般要贴上个二次方补一下的。
4.梯度提升中为啥可以把梯度近似成残差呢?
这个问题其实一直没有查到比较严谨的说法,不过看到一个PPT还是比较好的。我截取其中的关键几张做一下说明:
上面几张截图展示了梯度和残差间的关系,有人就问了既然这样了那为啥不直接用残差啊,还用啥梯度啊?其实问题在于如果不用square loss的根本没有残差项啊,比如huber损失。并且使用square loss对离群点的鲁棒性不好,在这个环境下使用绝对值损失和huber loss比较好。再截几张图片:
虽然也不是多么严谨但是还算是说清楚了吧。
突然浏览到一篇博客觉得博主的角度也是非常棒的。残差的概念来自GDBT的论文中,大家都在说拟合这个东西。但是总觉得有点不通。文章博主开头就解释了如果把求导的f(x)看做普通情况下的theta那么就成了普通的梯度下降了。残差只是一个特殊值了。
5.都说是很多树结合在一块,但是在数学推导上也没发现啊?难道是仅仅用了一个推导的思想吗?其实一步步的发现,这里的提升方法每新添加一个树都是对所有的样本或者所有样本的残差进行运算,如果你用一颗树拟合请问怎么画???
四、Xgboost算法
这是几个常见的提升模型里面最后一个算法了,当然也有很多的变形。首先说出与前面算法最大的不同:Xgboost中不是基分类器而是一棵棵完整的树,这个树的大小通过其分割标准来判断。
Xgboost发布论文中有详细的推导感兴趣的可以去瞅一下。
关于提升方法间的对比还远远不够,后面应用xgboost的时候再详细来做!