Boosting的意思就是提升,这是一族通过训练弱学习模型的肌肉将其提升为强学习模型的算法。要想在机器学习竞赛中追求卓越,Boosting是一种必须的存在。这是一个属于高手的技术。
我们分为5篇文章介绍集成学习,分别是:
本节课中,书中的人物小冰将一步一步的从老师咖哥身上学到Boosting的各种方法。
Boosting的基本思路是逐步优化模型,这与Bagging不同。Bagging的思路是独立的生成很多不同的模型然后对预测结果进行集成,Boosting则是持续的通过新模型来优化同一个基模型,每一个新的弱模型加入进来的时候,就在原有模型基础上整合新模型,从而成新的基模型。而对新的基模型的训练,将一直聚集于之前模型的误差点,也就是原模型预测出错的样本(而不是像Bagging时那样随机选择样本),目标是不断减小模型的预测误差。
下面的Boosting示意图展示了这样的过程:一个拟合效果很弱的模型(左上图的水平红线),通过梯度提升,逐步形成了较接近理想拟合曲线的模型(右下图中的红线)。
梯度这个词我们再熟悉不过。在线性回归、逻辑回归和神经网络中,梯度下降是机器得以自我优化的本源。机器学习的模型内部参数在梯度下降的过程中逐渐自我更新,直到达到最优解。
而Boosting这个模型逐渐优化,自我更新的过程特别类似于梯度下降,它是把梯度下降的思路从更新模型内部参数扩展到更新模型本身。因此,可以说Boosting就是模型自身通过梯度下降自我优化的过程。
像上图所示的弱分类器,经过Boosting,逐渐的接近原始函数图像的态势的过程,同学们有咩有感觉这是和Bagging刚刚反过来的思路。刚才的Bagging,是从非常精准的拟合每一个数据点(如很深的决策树)逐渐找到更粗放的算法(如随机森林)以削弱对数据的过拟合,那个是在减小方差。而现在的Boosting,则是把一个拟合很差的模型逐渐提升的比较像样,这是在减小偏差。
Boosting是如何实现自我优化的呢?有两个关键步骤:
实战中的Boosting算法,有AdaBoost,梯度提升决策树GBDT,以及XgBoost等等。这些算法都包含了Boosting提升的思想,也就是说每一个新模型的生成都是建立在上一个模型的基础之上,具体细节则各有不同。
Adaboos这种算法的特点是对不同的样本赋予不同的权重。咖哥说:“以前讲梯度下降优化器的时候提到过AdaGrad,就是给不同的模型内参数分配不同的学习速率。Ada,就是adaptive,翻译过来也就是自适应。”
AdaBoost是给不同的样本分配不同的权重,被分错的样本权重在boosting过程中会得到提高,新模型会因此更加关注这些被分错的样本,反之样本的权重会降低。然后,将修改过权值的新数据集送给下层模型进行训练,最后将每次得到的基模型组合起来,也根据其分类错误率对模型赋予权重,集成为最终的模型。
现在来应用Adaboost算法,去重做银行客户流失问题:
from sklearn.ensemble import AdaBoostClassifier
dt = DecisionTreeClassifier() # 选择决策树分类器作为AdaBoost的基准算法
adadt = AdaBoostClassifier(dt) # 进行AdaBoost
ada_param_grid = {"base_estimator__criterion" : ["gini", "entropy"],
"base_estimator__splitter" : ["best", "random"],
"base_estimator__random_state" : [7,9,10,12,15],
"algorithm" : ["SAMME","SAMME.R"],
"n_estimators" :[1,2,5,10],
"learning_rate": [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3,1.5]}
adadt_gs = GridSearchCV(adadt,param_grid = ada_param_grid,
scoring="f1", n_jobs= 10, verbose = 1)
adadt_gs.fit(X_train,y_train)
adadt_gs = adadt_gs.best_estimator_
y_pred = adadt_gs.predict(X_test)
print("Adaboost测试准确率: {:.2f}%".format(accuracy_score(y_test, y_pred)*100))
print("Adaboost测试F1分数: {:.2f}%".format(f1_score(y_test, y_pred)*100))
我们仍然选择决策树分类器作为AdaBoost的基准算法。从结果上来看,这个问题应用Adaboost模型求解,效果并不是很好。
Adaboost测试准确率: 79.45%
Adaboost测试F1分数: 51.82%
梯度提升(Granding Boosting)算法是是梯度下降和Boosting这两种思想结合的产物。因为常见的梯度提升都是基于决策树的,有时就直接叫作GBDT,即梯度提升决策树(Granding Boosting Decision Tree)。
不同于Adaboost只是对样本进行加权,GBDT算法中还会定义一个损失函数,并对损失和机器学习模型所形成的函数进行求导,每次生成的模型都是沿着前面模型的负梯度方向(一阶导数)进行优化,直到发现全局最优解。也就是说,梯度提升决策树中每一次迭代中,新的树所学习内容是之前所有树的结论和损失,对其拟合得到一个当前的树,这颗新的树就相当于是之前每一颗树效果的累加。
梯度提升,对于回归问题,目前被认为是最优算法之一。
下面用梯度提升算法重做银行客户流失问题:
# Gradient boosting tunning
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier()
gb_param_grid = {'loss' : ["deviance"],
'n_estimators' : [100,200,300],
'learning_rate': [0.1, 0.05, 0.01],
'max_depth': [4, 8],
'min_samples_leaf': [100,150],
'max_features': [0.3, 0.1]}
gb_gs = GridSearchCV(gb,param_grid = gb_param_grid,
scoring="f1", n_jobs= 10, verbose = 1)
gb_gs.fit(X_train,y_train)
gb_gs = gb_gs.best_estimator_
y_pred = gb_gs.predict(X_test)
print("GBDT测试准确率: {:.2f}%".format(accuracy_score(y_test, y_pred)*100))
print("GBDT测试F1分数: {:.2f}%".format(f1_score(y_test, y_pred)*100))
结果显示, GBDT算法的效果果然很好,F1分数达到60%以上!
GBDT测试准确率: 86.50%
GBDT测试F1分数: 60.18%
XGBoost(eXtreme Gradient Boosting,可以译为极端梯度提升)和GBDT类似,也会定义一个损失函数,不同于GBDT只用到一阶导数信息,XGBoost会利用泰勒展式把损失函数展开到二阶后求导,利用到了二阶导数信息,这样在训练集上的收敛更快。
下面用Xgboost重做银行客户流失问题:
from xgboost import XGBClassifier
xgb = XGBClassifier()
params = {'min_child_weight': [1, 5, 10],
'gamma': [0.5, 1, 1.5, 2, 5],
'subsample': [0.6, 0.8, 1.0],
'colsample_bytree': [0.6, 0.8, 1.0],
'max_depth': [3, 4, 5]}
xgb_gs = GridSearchCV(xgb,param_grid = gb_param_grid,
scoring="f1", n_jobs= 10, verbose = 1)
xgb_gs.fit(X_train,y_train)
xgb_gs = xgb_gs.best_estimator_
y_pred = xgb_gs.predict(X_test)
print("XGB测试准确率: {:.2f}%".format(accuracy_score(y_test, y_pred)*100))
print("XGB测试F1分数: {:.2f}%".format(f1_score(y_test, y_pred)*100))
XGB测试准确率: 86.25%
XGB测试F1分数: 59.62%
[ 55 210]]
结果显示F1分数也相当不错!咖哥很得意地说:“对于很多浅层的回归、分类问题,上面的这各种Boosting方法目前都是很热门、很常用的。整体而言,Boosting方法都是生成一棵树后根据反馈,才开始生成另一颗树。”
我想请各位同学从各个角度说一说Bagging与Boosting的不同之处,这样有助于加深对这两种主要集成学习方法的理解。
咖哥总结:“大家讲的都不错,尤其是同学丙,它的答案抓住了二者的本质。最后记住Bagging是降低方差,利用基础模型的独立性;而Boosting是减少偏差,基于同一个基础模型,通过增加错分样本的权重和梯度下降来提升模型性能。”
本文经作者授权,节选自机器学习小白入门书《零基础学机器学习》,这本书专门为希望轻松快乐学习机器学习和深度学习技术的您而量身定做。喜欢的读者可以直接去京东购买呦!:)作者谢谢您的支持与赞赏!
https://item.jd.com/12763913.html
http://product.dangdang.com/29159728.html
上一篇: 集成学习精讲之Bagging方法
下一篇: 集成学习精讲之Stacking和Blending