一闷袒、基本原理
集成學(xué)習(xí)(ensemble learning) 通過(guò)構(gòu)建并結(jié)合多個(gè)學(xué)習(xí)器來(lái)完成學(xué)習(xí)任務(wù)坐儿,以提高比單個(gè)學(xué)習(xí)器更好的泛化和穩(wěn)定性能薪前。要獲得好的集成效果奏篙,個(gè)體學(xué)習(xí)器應(yīng)該“好而不同”柴淘。按照個(gè)體學(xué)習(xí)器的生成方式秘通,集成學(xué)習(xí)可分為兩類(lèi):序列集成方法,即個(gè)體學(xué)習(xí)器存在強(qiáng)依賴關(guān)系第股,必須串行生成,如Boosting盹靴;并行集成方法,即個(gè)體學(xué)習(xí)器不存在強(qiáng)依賴關(guān)系稿静,可以并行生成辕狰,如Bagging改备,隨機(jī)森林。
二蔓倍、Boosting
Boosting指的是通過(guò)算法集合將弱學(xué)習(xí)器轉(zhuǎn)換為強(qiáng)學(xué)習(xí)器。Boosting的主要原則是訓(xùn)練一系列的弱學(xué)習(xí)器默勾,所謂弱學(xué)習(xí)器是指僅比隨機(jī)猜測(cè)好一點(diǎn)點(diǎn)的模型聚谁,例如較小的決策樹(shù),訓(xùn)練的方式是利用加權(quán)的數(shù)據(jù)环疼。在訓(xùn)練的早期對(duì)于錯(cuò)分?jǐn)?shù)據(jù)給予較大的權(quán)重朵耕。
其工作機(jī)制如下:
- 先從初始訓(xùn)練集訓(xùn)練出一個(gè)基學(xué)習(xí)器;
- 再根據(jù)基學(xué)習(xí)器的表現(xiàn)對(duì)訓(xùn)練樣本分布進(jìn)行調(diào)整阎曹,使得先前基學(xué)習(xí)器做錯(cuò)的訓(xùn)練樣本在后續(xù)受到更多關(guān)注;
- 基于調(diào)整后的樣本分布來(lái)訓(xùn)練下一個(gè)基學(xué)習(xí)器望门;
- 重復(fù)進(jìn)行上述步驟筹误,直至基學(xué)習(xí)器數(shù)目達(dá)到事先指定的值T,最終將這T個(gè)基學(xué)習(xí)器進(jìn)行加權(quán)結(jié)合哄酝。
以下介紹幾種典型的Boosting方法祷膳。
2.1、AdaBoost
給定二分類(lèi)訓(xùn)練數(shù)據(jù)集搀军,AdaBoost需要將弱分類(lèi)器線性組合為強(qiáng)分類(lèi)器罩句,步驟如下:
- 初始化訓(xùn)練數(shù)據(jù)權(quán)值分布
- 對(duì)
- 使用具有權(quán)值分布的訓(xùn)練數(shù)據(jù)集學(xué)習(xí)敛摘,得到基分類(lèi)器
- 計(jì)算在訓(xùn)練數(shù)據(jù)集上的分類(lèi)誤差率
- 計(jì)算的系數(shù)
- 更新訓(xùn)練集的權(quán)值分布 其中 這里是規(guī)范化因子屯远,
- 構(gòu)建基本分類(lèi)器的線性組合慨丐,得到最終分類(lèi)器
以下為AdaBoost的sklearn實(shí)現(xiàn):
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
import mglearn
import matplotlib.pyplot as plt
X,y = make_moons(n_samples=200,noise=0.25,random_state=3)
X_train,X_test,y_train,y_test = train_test_split(X,y,stratify=y,random_state=4)
adaboost = AdaBoostClassifier(n_estimators=10,random_state=2)
adaboost.fit(X_train,y_train)
print('accuracy on training set:{:.3f}'.format(adaboost.score(X_train,y_train)))
print('accuracy on test set:{:.3f}'.format(adaboost.score(X_test,y_test)))
fig,axes= plt.subplots(1)
mglearn.plots.plot_2d_separator(adaboost,X_train,fill=True,alpha=0.4)
mglearn.discrete_scatter(X_train[:,0],X_train[:,1],y_train)
axes.set_title('AdaBoost')
以下為輸出結(jié)果及二分類(lèi)劃分邊界
accuracy on training set:0.973
accuracy on test set:0.920
2.2咖气、Gradient Boosting Decision Tree
Gradient Boosting Decision Tree (GBDT) 是以分類(lèi)樹(shù)或者回歸樹(shù)為基本分類(lèi)器的提升方法崩溪。提升樹(shù)模型可以表示為決策樹(shù)的加法模型: 其中表示決策樹(shù)斩松,表示決策樹(shù)參數(shù)惧盹,表示樹(shù)的個(gè)數(shù)瞪讼。
提升樹(shù)算法采用前向分步算法粹断。首先確定初始提升樹(shù)瓶埋,第m步模型是。
通過(guò)經(jīng)驗(yàn)風(fēng)險(xiǎn)極小化確定下一棵樹(shù)的參數(shù)曾撤,晕粪。
對(duì)于上述相同問(wèn)題,實(shí)現(xiàn)過(guò)程與結(jié)果如下所示巫湘。
gbdt = GradientBoostingClassifier(n_estimators=20,random_state=2)
gbdt.fit(X_train,y_train)
print('accuracy on training set:{:.3f}'.format(gbdt.score(X_train,y_train)))
print('accuracy on test set:{:.3f}'.format(gbdt.score(X_test,y_test)))
fig,axes= plt.subplots(1)
mglearn.plots.plot_2d_separator(gbdt,X_train,fill=True,alpha=0.4)
mglearn.discrete_scatter(X_train[:,0],X_train[:,1],y_train)
axes.set_title('GBDT')
accuracy on training set:0.967
accuracy on test set:0.880
2.3诀诊、XGBoost
XGBoost(eXtreme Gradient Boosting)是一個(gè)非常優(yōu)秀的集成學(xué)習(xí)方法怠褐。其算法思想就是不斷地添加樹(shù)您宪,不斷地進(jìn)行特征分裂來(lái)生長(zhǎng)一棵樹(shù),每次添加一個(gè)樹(shù)磷杏,其實(shí)是學(xué)習(xí)一個(gè)新函數(shù)捏卓,去擬合上次預(yù)測(cè)的殘差怠晴。
XGBoost和GBDT的區(qū)別:
- 將樹(shù)模型的復(fù)雜度加入到正則項(xiàng)中,來(lái)避免過(guò)擬合稿械,因此泛化性能會(huì)優(yōu)于GBDT冲粤。
- 損失函數(shù)是用泰勒展開(kāi)式展開(kāi)的页眯,同時(shí)用到了一階導(dǎo)和二階導(dǎo)窝撵,可以加快優(yōu)化速度襟铭。
- 和GBDT只支持CART作為基分類(lèi)器之外,還支持線性分類(lèi)器道批,在使用線性分類(lèi)器的時(shí)候可以使用L1入撒,L2正則化茅逮。
- 引進(jìn)了特征子采樣,像Random Forest那樣献雅,這種方法既能降低過(guò)擬合挺身,還能減少計(jì)算。
- 在尋找最佳分割點(diǎn)時(shí)墙贱,考慮到傳統(tǒng)的貪心算法效率較低贱傀,實(shí)現(xiàn)了一種近似貪心算法府寒,用來(lái)加速和減小內(nèi)存消耗,除此之外還考慮了稀疏數(shù)據(jù)集和缺失值的處理株搔,對(duì)于特征的值有缺失的樣本纤房,XGBoost依然能自動(dòng)找到其要分裂的方向。
- XGBoost支持并行處理巨朦,XGBoost的并行不是在模型上的并行,而是在特征上的并行拄查,將特征列排序后以block的形式存儲(chǔ)在內(nèi)存中棚蓄,在后面的迭代中重復(fù)使用這個(gè)結(jié)構(gòu)梭依。這個(gè)block也使得并行化成為了可能,其次在進(jìn)行節(jié)點(diǎn)分裂時(shí)糊探,計(jì)算每個(gè)特征的增益河闰,最終選擇增益最大的那個(gè)特征去做分割,那么各個(gè)特征的增益計(jì)算就可以開(kāi)多線程進(jìn)行瞪慧。
對(duì)于上述相同問(wèn)題部念,實(shí)現(xiàn)過(guò)程與結(jié)果如下所示。
from xgboost import XGBClassifier
xgboost = XGBClassifier(n_estimators=20,random_state=2)
xgboost.fit(X_train,y_train)
print('accuracy on training set:{:.3f}'.format(xgboost.score(X_train,y_train)))
print('accuracy on test set:{:.3f}'.format(xgboost.score(X_test,y_test)))
fig,axes= plt.subplots(1)
mglearn.plots.plot_2d_separator(xgboost,X_train,fill=True,alpha=0.4)
mglearn.discrete_scatter(X_train[:,0],X_train[:,1],y_train)
axes.set_title('xgboost')
accuracy on training set:0.960
accuracy on test set:0.860
三妓湘、問(wèn)題探討
參考資料
[1] https://scikit-learn.org/dev/modules/ensemble.html
[2] 周志華 著. 機(jī)器學(xué)習(xí). 北京:清華大學(xué)出版社,2016
[3] 李航 著. 統(tǒng)計(jì)學(xué)習(xí)方法. 北京:清華大學(xué)出版社,2012
[4] 史春奇等 著. 機(jī)器學(xué)習(xí)算法背后的理論與優(yōu)化. 北京:清華大學(xué)出版社,2019
[5] Peter Harrington 著. 李銳等 譯. 機(jī)器學(xué)習(xí)實(shí)戰(zhàn). 北京:人民郵電出版社,2013