还是秉持笔者一贯的文风,以通俗易懂为目标,其中大量的数学工作,喜欢证明的朋友自己去看。
1.什么是Adaboost
Adaboost是集成算法,是boosting的一种,通过给样本和分类器都设置权重的方式,达到目标的逐步优化。跟GBDT一样,也有分类和回归之分,同样只是体现在目标函数的不同。
2.Adaboost的基础知识
- 指数损失形式,目标y为{-1,1},形式为L(y,f(x)) = e(-yf(x))。f(x)是当前弱分类器的预测结果,我们都知道预测对了的话yf(x)大于0损失函数值较少,预测错的话yf(x)小于0损失函数值较大,因此这个其实是相当于更加关注预测错样本的情况。
-
分类器权重的更新方法:
这个是根据指数损失函数一顿求导求出来的,其实吧具体过程看看即可,能用就行,em是这个分类器的误差。
-
样本权重的更新方法:
也是一通计算出来的,我们只要知道形式就行了,如目标函数所说,分错的样本被分给了更大的权重,其他都好说。
- 分类问题类别的确定方法:
由于目标是{-1,1},所以最后确定类别的时候,直接用了sign函数。
3.Adaboost回归问题
回归问题一直是这类集成算法里边最好解释的问题。
(1)计算损失,回归问题的损失有绝对值和平方两种,在求损失的时候先求了一个最大值然后进行了标准化,然后依据不同的损失函数形式有不同的表达方式。根据样本权重计算加权损失和。
(2)计算分类器的权重,还记得公式吧,这个还用于更新样本权重呢。
(3)更新样本权重,根据分类器的权重,真实值以及预测值等更新各个样本的权重。
这个公式显然是推导出来的,而我们直接用就行了。
(4)基模型结合策略
不同于分类问题,回归问题的模型结合,采用的是基模型权重中位数相结合的计算方法。
其中g(x)是基模型权重和结果的中位数
4.Adaboost分类问题
同样包括二分类和多分类问题,二分类是多分类的一个特例。sklearn采取了SAMME和SAMME.R两种算法,需要的时候自己选一个用一下。
4.1 二分类问题
分类问题其实大致过程和回归问题差不多,只不过在公式上有些许的差异。
第一,目标函数用的指数损失函数
第二,虽然权重初始化的方法是一样的,计算基分类器权重方法是一样的,但是权重更新公式不同,分类问题是这样的:
第三,基分类器的组合方案不同。回归问题是中位数组合,分类问题是加权组合。
最终的分类结果是:
值得注意的是,对于二分类问题每一次都要用sign进行一下预测值转换。
4.2 多分类问题
传统的GBDT只能解决二分类,对于多分类需要修改代码。多分类问题解决方案有三种,一对多、一对其余和多对多,实际上一对多最常用。GBDT实际使用0-1编码的方式,实际就是一对多策略,将3分类转化成3个二分类问题。
当然adaboost也可以用这种思路解决。但是sklearn提供了解决多分类问题的方法。
直接说SAMME.R算法,算法的大体思路还是类似的,分类器权重计算,样本权重更新等等。不同之处在于
(1)计算分类器的权重的时候,考虑了一个分类为k类的概率,
(2)更新加法模型:
(3)计算样本权重:
(4)计算分类
其实就是计算使加法模型值最大的那个类别。
仔细想也是一对多的策略。