机器学习过程中,除了使用单一算法模型外,还可以使用集成学习模型。集成学习通过构建多个学习器并将其结合,从而更好地完成预测任务,也常被称为模型融合或者基于委员会的学习。模型融合的一般步骤是,首先产生一系列“个体学习器”,然后通过某种策略将这些“个体学习器”组合起来使用,从而获得更好的预测效果。
目前,融合模型根据个体学习器生成方式的不同,可以分为两大类:
- 个体学习器之间存在强依赖关系、必须串行生成的序列化算法,代表算法是Boosting
- 个体学习器之间不存在强依赖关系、可同时生成的并行化算法,代表算法是Bagging 和随机森林。
目录
1.1 AdaBoost [Adaptive Boosting自适应增强]
一、Boosting算法 [提升法]
首先从初始训练集中训练一个基学习器,基学习器对不同的样本数据有着不同的预测结果,有些样本基学习器能很好地预测,有些则不能;对于预测错误的样本,增加其权重后,再次训练下一个基学习器;如此反复进行,直到基学习器数目达到事先指定的数值T,然后将T个基学习器进行加权结合。
典型的Boosting算法有AdaBoost。
1.1 AdaBoost [Adaptive Boosting自适应增强]
以决策树作为弱学习器的AdaBoost通常被称为最佳开箱即用的分类器。
Adaboost 迭代算法就3步:
- 初始化训练数据的权重。
如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
- 训练弱分类器。
具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,该样本点的权值就被降低;相反,如果某个样本点没有被准确地分类,那么该样本点的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
- 将各个训练得到的弱分类器组合成强分类器。
各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。
scikit-learn中Adaboost类库有AdaBoostClassifier和AdaBoostRegressor两个。AdaBoostClassifier用于分类 (AdaBoostClassifier实战 、GitHub 代码),AdaBoostRegressor用于回归。
AdaBoostClassifier使用了SAMME和SAMME.R。而AdaBoostRegressor则使用了Adaboost.R2。
当我们对Adaboost调参时,主要要对两部分内容进行调参,第一部分是对我们的Adaboost的框架进行调参, 第二部分是对我们选择的弱分类器进行调参。两者相辅相成。
二、Bagging和随机森林
2.1 Bagging算法
在融合模型中,如果个体学习器之间高度保持一致,那么通过融合的方法并不能够提升最后的预测效果。前文讲过,我们需要的个体学习器是“好而不同”的。现实中,虽然各个学习器之间没有办法做到“独立”,但我们可以设法通过尽可能增加每个学习器训练集的差异来使得学习器之间产生较大差异,从而避免各个学习器雷同。
这个思想的具体做法:
- 第一,从原始样本集中抽取训练集,每次随机抽取n个训练样本(训练集中,有些样本可能被多次抽取,有些样本则可能一次都没有被抽取),抽取T次得到T个训练集
- 第二,每次使用一个训练集得到一个模型,T个训练集共得到T个模型
- 第三,对上述T个学习器采取某种策略进行结合。
一般来说,Bagging对分类问题通常采用简单投票法,对回归问题通常采用简单平均法。
2.2 随机森林算法
随机森林算法思想仍然是Bagging算法思想,但是进行了部分改进,所以随机森林也被看成Bagging的拓展变体。随机森林使用了分类与回归树作为弱学习器,并对决策树的建立做了改进,通过随机选择节点上的一部分样本特征进一步增强了模型的泛化能力。具体来说,随机森林的“随机”主要体现在两方面:数据的随机选择、待选特征的随机选择。