《机器学习》周志华
《统计学习方法》李航
Boosting算法是一种可将弱学习器提升为强学习器的算法。主要思想:对于一个复杂的任务,将多个学习器的判断总和得出的结果要比任何一个学习器单独的判断好。(这里和Bagging算法区分开来,bagging算法是三个臭皮匠顶个诸葛亮,boosting算法可不是三个臭皮匠这么简单,而是三个诸葛亮顶个爱因斯坦。。结合后面就可以更好理解)。这种算法的工作机制类似:先从初始训练集训练出一个基学习器,再根据基学习器表现对训练样本分布进行调整,使先前基学习器做错的样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个学习器,一直重复进行,直到达到指定目标值。boosting方法通过分步迭代的方式来构建模型,在迭代的每一步构建的弱学习器都是为了弥补已有模型的不足。
要更多理解Boosting算法可以多看看其他文章博客,这里不多解释,Boosting算法本身比较简单,搞懂原理即可。
在说Adaboost算法和GBDT算法之前还要补充提一下这两个算法需要用到的核心,一个是前向分布算法,一个是加法模型,这两部分都是体现adaboost和GBDT算法模型的核心框架,而这里我不多介绍,可以查阅书籍《统计学习方法》或者直接网上查阅资料,如果想要更加深入地理解adaboost和GBDT算法的思想,建议还是看看这两个概念,以便更好地理解。
AdaBoost算法是Boosting算法中最具代表性的,特别能代表boosting的思想。在AdaBoost算法中会提高前一轮分类器分类错误的样本的权值,而降低那些被分类正确样本的权值。对于弱分类器的组合,AdaBoost算法采取加权多数表决的方法。具体的说就是加大分类误差率小的弱分类器的权值,使其在表决中起到较大的作用;减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。
算法过程:
1.每次迭代训练出的弱分类器的训练数据都是一模一样的,这里就和bagging思想就不一样!而每个子分类器训练数据一模一样为什么效果会不一样呢?这是因为训练数据中每个样本的权重不一样,导致每个分类器都有自己需要着重关注的侧重点,所以每个子分类器的最终效果也会不一样,这一点非常重要。
2.样本为什么要进行加权?可以举个例子:一个班级里面总有差生,所以老师如果想要提高班级的总体水平,就要将成绩较差的学生进行重点辅导,而对于成绩好的学生可以少点关注,将侧重点放到差生身上。同理,对于一个分类器分错误的数据样本,我们要加大该样本的权重,让下一个分类器更加着重关注这个样本,找到能将它分对的最佳分割线;而对于已经分对的样本就降低其权重,让模型的重心和精力去把分错的样本分对。这就是adaboost最核心的思想。
3.大多数人肯定有疑问,对于前面分类器分对的样本,降低了其权重后,那后面的分类器就一定能分对吗?肯定不是!我个人的理解,对于比较好分的样本,特征应该是比较明显的,肯定大部分分类器都能分对,但是并不是全部分类器都能分对,所以为了解决这个问题,才设置了分类器权重这样的参数。当分类器也进行了加权,在最终预测结果进行投票时,权重大的分类器更具有发言权,分类器权重是根据分类器的误差率进行计算的,具体公式可以参见开始我推荐的那两本书,所以权重更大就意味中分类的准确率更大,所以这样的投票结果准确率将更高。
4.对于adaboost的总体思想,我的理解是每个子分类器都有自己侧重的样本对象,所以他们都不是简单的“臭皮匠”,而每个分类器都是“诸葛亮”,只不过为了增加模型的说服力和泛化能力,还得将每个诸葛亮综合起来考虑,这样才能成为世界上最聪明的人–爱因斯坦!哈哈哈,开个玩笑,他们没有可比性。
下面举一个来自《统计学习方法》中的经典例子,方便大家理解:
Adaboost算法优缺点:
优点:
1.Adaboost作为分类器时,分类精度很高,构造简单
2.不容易发生过拟合
缺点:
对异常样本,噪声数据敏感,adaboost算法的核心思想是加大分类错误样本的权值,所以异常样本在这种算法特点下迭代中可能会获得较高的权重,而权重大了以后会影响整个模型的走向,而影响最终的强学习器的预测准确性。
GBDT全称Gradient Boosting Decision Tree,中文翻译为梯度提升决策树,这里这个中文名字可能会有误导性,因为一般我们优化问题都是往梯度下降的方向进行,为什么这里是梯度提升,那不是越来越偏差了吗?哈哈,这里的“梯度提升”应该分开理解为“梯度”和“提升”,而不是组合起来的意思,“梯度”是沿梯度下降的方向降低损失,而“提升”是一种算法思想。其实梯度提升树可以看成是提升树的改进方法,本质上还是提升树的思想。
提升树
先简单讲讲提升树,前面介绍了提升(boosting)的思想,所以提升树顾名思义就是基模型为决策树的提升模型。提升树可以做分类问题,也可以做回归问题。各种提升树算法的主要区别在于损失函数的选取。对于回归问题损失函数可以选择平方误差损失函数;对于二分类问题,损失函数为指数函数,基分类器为二叉树,这时提升树可以看成是Adaboost算法的一种特殊情况;当然也有一般损失函数;所以,这里只介绍解决回归问题的提升树。
上图为《统计学习方法》中对提升树算法的步骤描述,对于回归问题,损失函数是选择平方误差作为损失函数(为什么用平方误差作为损失函数:在分类树中最佳划分点的判别标准是熵或者基尼系数,都是用纯度来衡量的,但是在回归树中的样本标签是连续数值,所以再使用熵之类的指标不再合适,取而代之的是平方误差,它能更好的评判拟合程度。),所以,简单来说对于提升树来说只需要简单地拟合当前模型的残差
这样,真正的问题就来了,当损失函数是平方损失和指数损失函数时,提升树每一步优化是很简单的,但是对于一般损失函数而言,往往每一步优化起来不那么容易,针对这一问题,提出了梯度提升树算法,这是利用最速下降的近似方法,其关键是利用损失函数的负梯度作为提升树算法中的残差的近似值。GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。
注意:
1.GBDT中所有基模型都是CART回归树 ,尽管GBDT也可以解决分类问题,但是并不代表是分类树,都是CART回归树。因为GBDT每次迭代要拟合的是梯度值,是连续值所以要用回归树。
2.如果损失函数选取平方误差,那么损失函数的负梯度就是残差,所有对于回归问题,我们要拟合的就是残差。
举一个很多人都举过的经典例子,一看就懂(回归问题):
GBDT算法优缺点:
优点:
1.可以处理连续值和离散值。
2.预测的准确率也可以比较高。
3.引入bagging思想、加入正则项等方法能够有效地抵御训练数据中的噪音。
缺点:
由于基模型之间存在依赖关系,难以并行训练数据。
本人才疏学浅,很多理解不到位或者错误的地方欢迎指正!