一个能与随机森林相媲美的算法:自适应提升法(Adaptive Boosting, AdaBoost)
1. 概述
提升法(Boosting)是一个更新的过程,它的做法是给每一个训练样本赋予一个权重,在每一轮结束时自动调整权重。
提升(Boosting)方法图解如下所示:
AdaBoost算法已被证明是一种有效而实用的Boosting(提升)算法,其思想是提高对那些被错误分类样本关注程度,降低对那些被正确分类的样本关注程度,采用加权多数表决的方法。具体的,就是增大分类偏差率小的弱分类器的权值,使其在表决中起较大的作用;减小分类偏差率大的弱分类器的权值,使其在表决中起较小的作用。
关于AdaBoost算法结合策略有三种方法,一种是平均法,即对若干弱学习器的输出进行平均得到最终预测输出,另一种是投票法投票法是对许多个弱分类器进行结果输出,数量最多的类别为最终分类类别,而相对比较复杂的则是绝对多数投票法,不仅要求获得最高票,还要求票数过半,否则就拒绝预测。最后一种方法是学习法,相对于前两种方法较复杂,其代表方法有stacking,我们不仅只对弱学习器的结果做简单的逻辑处理,而且是再加上一层学习器,也就是说,我们将训练集弱学习器的学习结果作为输入,将训练集的输出作为输出,重新训练下一个学习器来得到最终结果。
2. 应用
AdaBoost是一种迭代算法,其思想的核心是采取对同一个训练集训练得到不同的弱分类器,然后把这些弱分类器以某种策略集合起来构成一个强大的最终分类器。
与Bagging算法不同是,Bagging算法弱分类器之间无任何的影响关系,而AdaBoost算法,上一个弱分类器的权值影响着下一个弱分类器的权值,简而言之就是说,上一个弱分类器被分正确的样本,在建立下一个弱分类器模型时,会将其权值减小,反之亦然。依次进行迭代直至建立n个弱分类器,最终这n个弱分类器以某种策略结合成一个强大的分类器。
接下来我们将用AdaBoost算法对irirs数据集进行准确率结果输出。
clf = AdaBoostClassifier(n_estimators=50, random_state=0)#训练得到50个基评估器
clf = clf.fit(Xtrain,Ytrain) #用训练集建立评估器
score_m = clf.score(Xtest,Ytest) #计算测试集得分
score_y = clf.score(Xtrain,Ytrain) #计算训练集得分
print ("test:{}".format(score_m),
"train:{}".format(score_y))
从表3-2我们可以看到,除了少数类别,AdaBoost算法相比Bagging算法,是有些许提高的,但效果差别不是很明显,考虑到仅此一次实现的偶然性,关于Bagging算法和AdaBoost算法的预测效果差异还需建立在更丰富的数据经验基础之上给出。但是为什么在训练集表现良好而在测试集上的表现过于的低呢?原因在于:模型的过拟合,训练模型过多的拟合了噪声点,导致了模型在测试集上的表现不是很好。
对于过拟合,我们可以寻找一个最佳点,在这个点上既满足训练集效果良好也能满足测试集效果达到最佳。接下来我们用网格搜索寻找用AdaBoost学习模型的最优参数如下:
from sklearn.model_selection import GridSearchCV
parameters = {'n_estimators': [1,10,20,30,40,50]}
clf = GridSearchCV (AdaBoostClassifier(), parameters, cv=3, scoring='accuracy') #用网格搜索寻找用AdaBoost学习模型的最优参数
clf.fit (Xtrain, Ytrain)
print ('最优参数:', clf.best_params_)
print ('训练集准确率:', clf.best_score_)
print ('测试集准确率:{:.3f}'.format(clf.score (Xtest,Ytest ) ) )
我们选取1,10,20,30,40,50,做模型的参数,最终输出结果如下表3-3:
当然我们只是粗略的选取了这6个指标作为参数,做了一次实验,但找到最优参数的方法是可以实现的,可以通过微元的思想,一步步的把区间缩小,最终确立一个最优的参数解。
前面我们所提AdaBoost由多个单决策树依次迭代而形成的,为了方便我们的理解,我们对AdaBoost算法和单决策树分别做了一条学习曲线,并对他们进行了比较分析。
从图3-3我们可以直观的看出,随着训练样本数的增加,单决策树的预测准确率稳定在50%左右,分类器得分在0.52~0.53之间,是个基分类器,而AdaBoost预测准确率在85%左右,明显高于单决策树,分类器得分在0.95~1之间是个强分类器。因此在单决策树面前,AdaBoost对样本分类的准确率有很明显的提升。