树系列(三)adaboost
-
核心思想
从训练数据中学习一系列的弱分类器,将这些弱分类器线性组合成为一个强分类器,这里讲述的核心是二分类问题,
输入:训练集,其中,弱学习算法,
输出:最终分类器G(x)
- 初始化训练数据权值分布
-
对于m=1,2,…,M
- 使用具有权值分布(这里的权值分布是建立在之前所有的分类器的计算结果之上的)的训练数据集学习,得到基本分类器,
- 计算在训练数据集上的分类误差率,
- 计算的系数
这里的对数是自然对数, 且会随着的减小而增大,因而分类误差越小的基分类器在最终分类器的作用越大,- 更新整体的权值分布,
这里是正则化因子,
更新整体分布权值可以重写为如下公式,
相对比来说,误分类样本的权值被放大了倍,这样误分类的样本就会被更多的关注, - 使用具有权值分布(这里的权值分布是建立在之前所有的分类器的计算结果之上的)的训练数据集学习,得到基本分类器,
-
构建基分类器的线性组合
得到最终的分类器
adaboost的核心是不改变训练数据本身,而不断改变自定义的训练数据的权值分布,从而提高训练的正确率,
-
原理解释
前向分步算法
加法模型
学习加法模型f(x)转换为损失函数极小化问题:前向分步算法一步一步优化,每步只学习一个基函数及其系数,逐渐逼近目标,
输入:训练集,损失函数,基函数基
输出:加法模型f(x)
- 初始化,
-
对于m=1,2,…,M
- 极小化损失函数
得到更新参数,- 更新
- 得到加法模型
adaboost是一种基函数为基本分类器的加法模型,损失函数为指数函数,这个指数函数如下
证明如下,
经过m次训练,得到的分类器为
我们需要求解的目标如***意,这才是adaboost真正需要解决的问题,得到一个分类器,使得这个分类器和之前所有分类器的结果的加权平均的指数函数最小,而不是只是单纯一个分类器达到最优,
上式可表示为
其中, 这代表了之前所有分类器加权平均后对于的权重分布,而代表的是对于的权重分布,是建立在的基础上的,现在的目标需要求解和,
- 对于任意的, 使得上述式子最小由如下式子得到,这个式子能这么改写的依据是不随变化,
此分类器即为adaboost求解的及分类器,使第m轮训练分类误差最小,
- 求解,
如下公式变形,
现在说一下一个比较重要的公式,如下
这个公式表示了从m-1次概率分布更新到m次概率分布的重要衔接点,第二个等式代表的是对于建立在所有m-1个分类器的加权平均的权重分布的基础上第m轮分类的分类误差概率,第三个等式是第二个等式的代表含义,
经过对公式(1)的求导和公式(2)的转换,可以得到如下式子,
公式推导如下,
最后每一轮的权值更新,
和之前的权值更新只差了规范化因子,这个是无伤大雅的,因而证明了之前的结论:adaboost是一种损失函数为指数函数,基函数为基本分类器的加法模型。
-
个人理解
算法一开始对于每个样本的权重都是一样的,而后选择基于之前的结果的最优的一个弱分类器,经过分类得出一个结果,这个结果和标签进行对比,把分错的样本的权重加大,把分对的样本的权重变小,而后再基于这个新更新的权重列表选择最优的弱分类器,这时这个弱分类器就对上次分错的数据很敏感,因为一旦上次分错的样本这次又被分错,那么对于整体的错误概率就会瞬间提高很多,因而要想选出最优的分类器,就尽量让上次分错的样本这次划分正确,因而能够保证这次的分类器比上次能够达到更好的结果,经过有限次迭代之后,就会产生若干个弱分类器,每个分类器都有一个权重,这个权重反比于这个分类器的整体错误概率,即分类器精确度越高,其权重就会越大,这样把所有的弱分类器按照加权和放到一起,之后再按照分类阈值划分,得到一个强分类器,因而当测试的时候输入未知样本,送入强分类器之后,就能够得到较为可靠的结果。而为什么要把所有的分类器都放到一起加权求和,有两点原因,第一点就是这一轮的选择本身就是建立在之前所有分类器的的加权平均的结果,只有这样才能够体现加法模型的意义,第二个原因个人觉得是因为规避过拟合的问题,因为第n轮迭代只是更加关注第n-1轮没有分类正确的样本,而没有过多的关注n-1轮分类正确的样本,因而第n轮迭代中已经分类正确的样本在这一轮更加容易分错,久而久之就会产生过拟合的问题,而加权平均就能够很好地规避这个问题,既关注每一轮分类正确的样本,也关注分类错误的样本,
Adaboost 学习到的其实是每个样本的权重,通过样本的权重来控制下一步的阈值划分,在实际操作过程中,还会添加一个learning_rate 的参数,之前所有的基学习器训练完成的时候都是直接根据每个基学习器的权重加起来的,如下所示,
但现在不是这样了,引入了learning_rate, 如下图所示,
这样能够保证完成相同的学习任务,要用更多的基学习器才能够达成相同的目的,但是这样学习的结果会更加精确,实际调参的时候要把基学习器的个数n_estimator 和learning_rate 一起调才能达到更好的效果,