梯度提升
另一個(gè)非常著名的提升算法是梯度提升。與 Adaboost 一樣,梯度提升也是通過(guò)向集成中逐步增加分類器運(yùn)行的,每一個(gè)分類器都修正之前的分類結(jié)果。然而,它并不像 Adaboost 那樣每一次迭代都更改實(shí)例的權(quán)重,這個(gè)方法是去使用新的分類器去擬合前面分類器預(yù)測(cè)的殘差 。
讓我們通過(guò)一個(gè)使用決策樹(shù)當(dāng)做基分類器的簡(jiǎn)單的回歸例子(回歸當(dāng)然也可以使用梯度提升)。這被叫做梯度提升回歸樹(shù)(GBRT,Gradient Tree Boosting 或者 Gradient Boosted Regression Trees)。首先我們用DecisionTreeRegressor去擬合訓(xùn)練集(例如一個(gè)有噪二次訓(xùn)練集):
>>>from sklearn.tree import DecisionTreeRegressor >>>tree_reg1 = DecisionTreeRegressor(max_depth=2) >>>tree_reg1.fit(X, y)
現(xiàn)在在第一個(gè)分類器的殘差上訓(xùn)練第二個(gè)分類器:
>>>y2 = y - tree_reg1.predict(X) >>>tree_reg2 = DecisionTreeRegressor(max_depth=2) >>>tree_reg2.fit(X, y2)
隨后在第二個(gè)分類器的殘差上訓(xùn)練第三個(gè)分類器:
>>>y3 = y2 - tree_reg1.predict(X) >>>tree_reg3 = DecisionTreeRegressor(max_depth=2) >>>tree_reg3.fit(X, y3)
現(xiàn)在我們有了一個(gè)包含三個(gè)回歸器的集成。它可以通過(guò)集成所有樹(shù)的預(yù)測(cè)來(lái)在一個(gè)新的實(shí)例上進(jìn)行預(yù)測(cè)。
>>>y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))
圖7-9在左欄展示了這三個(gè)樹(shù)的預(yù)測(cè),在右欄展示了集成的預(yù)測(cè)。在第一行,集成只有一個(gè)樹(shù),所以它與第一個(gè)樹(shù)的預(yù)測(cè)相似。在第二行,一個(gè)新的樹(shù)在第一個(gè)樹(shù)的殘差上進(jìn)行訓(xùn)練。在右邊欄可以看出集成的預(yù)測(cè)等于前兩個(gè)樹(shù)預(yù)測(cè)的和。相同的,在第三行另一個(gè)樹(shù)在第二個(gè)數(shù)的殘差上訓(xùn)練。你可以看到集成的預(yù)測(cè)會(huì)變的更好。
我們可以使用 sklean 中的GradientBoostingRegressor來(lái)訓(xùn)練 GBRT 集成。與RandomForestClassifier相似,它也有超參數(shù)去控制決策樹(shù)的生長(zhǎng)(例如max_depth,min_samples_leaf等等),也有超參數(shù)去控制集成訓(xùn)練,例如基分類器的數(shù)量(n_estimators)。接下來(lái)的代碼創(chuàng)建了與之前相同的集成:
>>>from sklearn.ensemble import GradientBoostingRegressor>>>gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0) >>>gbrt.fit(X, y)
超參數(shù)learning_rate 確立了每個(gè)樹(shù)的貢獻(xiàn)。如果你把它設(shè)置為一個(gè)很小的樹(shù),例如 0.1,在集成中就需要更多的樹(shù)去擬合訓(xùn)練集,但預(yù)測(cè)通常會(huì)更好。這個(gè)正則化技術(shù)叫做 shrinkage。圖 7-10 展示了兩個(gè)在低學(xué)習(xí)率上訓(xùn)練的 GBRT 集成:其中左面是一個(gè)沒(méi)有足夠樹(shù)去擬合訓(xùn)練集的樹(shù),右面是有過(guò)多的樹(shù)過(guò)擬合訓(xùn)練集的樹(shù)。
為了找到樹(shù)的最優(yōu)數(shù)量,你可以使用早停技術(shù)(第四章討論)。最簡(jiǎn)單使用這個(gè)技術(shù)的方法就是使用staged_predict():它在訓(xùn)練的每個(gè)階段(用一棵樹(shù),兩棵樹(shù)等)返回一個(gè)迭代器。加下來(lái)的代碼用 120 個(gè)樹(shù)訓(xùn)練了一個(gè) GBRT 集成,然后在訓(xùn)練的每個(gè)階段驗(yàn)證錯(cuò)誤以找到樹(shù)的最佳數(shù)量,最后使用 GBRT 樹(shù)的最優(yōu)數(shù)量訓(xùn)練另一個(gè)集成:
>>>import numpy as np >>>from sklearn.model_selection import train_test_split>>>from sklearn.metrics import mean_squared_error>>>X_train, X_val, y_train, y_val = train_test_split(X, y)>>>gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120) >>>gbrt.fit(X_train, y_train)>>>errors = [mean_squared_error(y_val, y_pred) for y_pred in gbrt.staged_predict(X_val)] >>>bst_n_estimators = np.argmin(errors)>>>gbrt_best = GradientBoostingRegressor(max_depth=2,n_estimators=bst_n_estimators) >>>gbrt_best.fit(X_train, y_train)
驗(yàn)證錯(cuò)誤在圖 7-11 的左面展示,最優(yōu)模型預(yù)測(cè)被展示在右面。
你也可以早早的停止訓(xùn)練來(lái)實(shí)現(xiàn)早停(與先在一大堆樹(shù)中訓(xùn)練,然后再回頭去找最優(yōu)數(shù)目相反)。你可以通過(guò)設(shè)置warm_start=True來(lái)實(shí)現(xiàn) ,這使得當(dāng)fit()方法被調(diào)用時(shí) sklearn 保留現(xiàn)有樹(shù),并允許增量訓(xùn)練。接下來(lái)的代碼在當(dāng)一行中的五次迭代驗(yàn)證錯(cuò)誤沒(méi)有改善時(shí)會(huì)停止訓(xùn)練:
>>>gbrt = GradientBoostingRegressor(max_depth=2, warm_start=True)min_val_error = float("inf") error_going_up = 0 for n_estimators in range(1, 120): gbrt.n_estimators = n_estimators gbrt.fit(X_train, y_train) y_pred = gbrt.predict(X_val) val_error = mean_squared_error(y_val, y_pred) if val_error < min_val_error: ? ? ? ? ? ? ? ?min_val_error = val_error ? ? ? ? ? ? ? ?error_going_up = 0 ? ? ? ?else: ? ? ? ? ? ? ? ?error_going_up += 1 ? ? ? ? ? ? ? ?if error_going_up == 5: ? ? ? ? ? ? ? ? ? ? ? ?break ?# early stopping
GradientBoostingRegressor也支持指定用于訓(xùn)練每棵樹(shù)的訓(xùn)練實(shí)例比例的超參數(shù)subsample。例如如果subsample=0.25,那么每個(gè)樹(shù)都會(huì)在 25% 隨機(jī)選擇的訓(xùn)練實(shí)例上訓(xùn)練。你現(xiàn)在也能猜出來(lái),這也是個(gè)高偏差換低方差的作用。它同樣也加速了訓(xùn)練。這個(gè)技術(shù)叫做隨機(jī)梯度提升。
也可能對(duì)其他損失函數(shù)使用梯度提升。這是由損失超參數(shù)控制(見(jiàn) sklearn 文檔)。
Stacking
本章討論的最后一個(gè)集成方法叫做 Stacking(stacked generalization 的縮寫)。這個(gè)算法基于一個(gè)簡(jiǎn)單的想法:不使用瑣碎的函數(shù)(如硬投票)來(lái)聚合集合中所有分類器的預(yù)測(cè),我們?yōu)槭裁床挥?xùn)練一個(gè)模型來(lái)執(zhí)行這個(gè)聚合?圖 7-12 展示了這樣一個(gè)在新的回歸實(shí)例上預(yù)測(cè)的集成。底部三個(gè)分類器每一個(gè)都有不同的值(3.1,2.7 和 2.9),然后最后一個(gè)分類器(叫做 blender 或者 meta learner )把這三個(gè)分類器的結(jié)果當(dāng)做輸入然后做出最終決策(3.0)。
為了訓(xùn)練這個(gè) blender ,一個(gè)通用的方法是采用保持集。讓我們看看它怎么工作。首先,訓(xùn)練集被分為兩個(gè)子集,第一個(gè)子集被用作訓(xùn)練第一層(詳見(jiàn)圖 7-13).
接下來(lái),第一層的分類器被用來(lái)預(yù)測(cè)第二個(gè)子集(保持集)(詳見(jiàn) 7-14)。這確保了預(yù)測(cè)結(jié)果很“干凈”,因?yàn)檫@些分類器在訓(xùn)練的時(shí)候沒(méi)有使用過(guò)這些事例?,F(xiàn)在對(duì)在保持集中的每一個(gè)實(shí)例都有三個(gè)預(yù)測(cè)值。我們現(xiàn)在可以使用這些預(yù)測(cè)結(jié)果作為輸入特征來(lái)創(chuàng)建一個(gè)新的訓(xùn)練集(這使得這個(gè)訓(xùn)練集是三維的),并且保持目標(biāo)數(shù)值不變。隨后 blender 在這個(gè)新的訓(xùn)練集上訓(xùn)練,因此,它學(xué)會(huì)了預(yù)測(cè)第一層預(yù)測(cè)的目標(biāo)值。
顯然我們可以用這種方法訓(xùn)練不同的 blender (例如一個(gè)線性回歸,另一個(gè)是隨機(jī)森林等等):我們得到了一層 blender 。訣竅是將訓(xùn)練集分成三個(gè)子集:第一個(gè)子集用來(lái)訓(xùn)練第一層,第二個(gè)子集用來(lái)創(chuàng)建訓(xùn)練第二層的訓(xùn)練集(使用第一層分類器的預(yù)測(cè)值),第三個(gè)子集被用來(lái)創(chuàng)建訓(xùn)練第三層的訓(xùn)練集(使用第二層分類器的預(yù)測(cè)值)。以上步驟做完了,我們可以通過(guò)逐個(gè)遍歷每個(gè)層來(lái)預(yù)測(cè)一個(gè)新的實(shí)例。詳見(jiàn)圖 7-15.
然而不幸的是,sklearn 并不直接支持 stacking ,但是你自己組建是很容易的(看接下來(lái)的練習(xí))。或者你也可以使用開(kāi)源的項(xiàng)目例如 brew (網(wǎng)址為 https://github.com/viisar/brew)
練習(xí)
如果你在相同訓(xùn)練集上訓(xùn)練 5 個(gè)不同的模型,它們都有 95% 的準(zhǔn)確率,那么你是否可以通過(guò)組合這個(gè)模型來(lái)得到更好的結(jié)果?如果可以那怎么做呢?如果不可以請(qǐng)給出理由。
軟投票和硬投票分類器之間有什么區(qū)別?
是否有可能通過(guò)分配多個(gè)服務(wù)器來(lái)加速 bagging 集成系統(tǒng)的訓(xùn)練?pasting 集成,boosting 集成,隨機(jī)森林,或 stacking 集成怎么樣?
out-of-bag 評(píng)價(jià)的好處是什么?
是什么使 Extra-Tree 比規(guī)則隨機(jī)森林更隨機(jī)呢?這個(gè)額外的隨機(jī)有什么幫助呢?那這個(gè) Extra-Tree 比規(guī)則隨機(jī)森林誰(shuí)更快呢?
如果你的 Adaboost 模型欠擬合,那么你需要怎么調(diào)整超參數(shù)?
如果你的梯度提升過(guò)擬合,那么你應(yīng)該調(diào)高還是調(diào)低學(xué)習(xí)率呢?
導(dǎo)入 MNIST 數(shù)據(jù)(第三章中介紹),把它切分進(jìn)一個(gè)訓(xùn)練集,一個(gè)驗(yàn)證集,和一個(gè)測(cè)試集(例如 40000 個(gè)實(shí)例進(jìn)行訓(xùn)練,10000 個(gè)進(jìn)行驗(yàn)證,10000 個(gè)進(jìn)行測(cè)試)。然后訓(xùn)練多個(gè)分類器,例如一個(gè)隨機(jī)森林分類器,一個(gè) Extra-Tree 分類器和一個(gè) SVM。接下來(lái),嘗試將它們組合成集成,使用軟或硬投票分類器來(lái)勝過(guò)驗(yàn)證集上的所有集合。一旦找到了,就在測(cè)試集上實(shí)驗(yàn)。與單個(gè)分類器相比,它的性能有多好?
從練習(xí) 8 中運(yùn)行個(gè)體分類器來(lái)對(duì)驗(yàn)證集進(jìn)行預(yù)測(cè),并創(chuàng)建一個(gè)新的訓(xùn)練集并生成預(yù)測(cè):每個(gè)訓(xùn)練實(shí)例是一個(gè)向量,包含來(lái)自所有分類器的圖像的預(yù)測(cè)集,目標(biāo)是圖像類別。祝賀你,你剛剛訓(xùn)練了一個(gè) blender ,和分類器一起組成了一個(gè)疊加組合!現(xiàn)在讓我們來(lái)評(píng)估測(cè)試集上的集合。對(duì)于測(cè)試集中的每個(gè)圖像,用所有分類器進(jìn)行預(yù)測(cè),然后將預(yù)測(cè)饋送到 blender 以獲得集合的預(yù)測(cè)。它與你早期訓(xùn)練過(guò)的投票分類器相比如何?
-
分類器
+關(guān)注
關(guān)注
0文章
153瀏覽量
13449 -
隨機(jī)森林
+關(guān)注
關(guān)注
1文章
22瀏覽量
4371
原文標(biāo)題:【翻譯】Sklearn 與 TensorFlow 機(jī)器學(xué)習(xí)實(shí)用指南 —— 第7章 集成學(xué)習(xí)和隨機(jī)森林 (下)
文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛(ài)好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
機(jī)器學(xué)習(xí)算法之隨機(jī)森林算法詳解及工作原理圖解

機(jī)器學(xué)習(xí)實(shí)踐指南——案例應(yīng)用解析
不可錯(cuò)過(guò) | 集成學(xué)習(xí)入門精講
集成學(xué)習(xí)和隨機(jī)森林,提供代碼實(shí)現(xiàn)
5分鐘內(nèi)看懂機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的區(qū)別
機(jī)器學(xué)習(xí)的隨機(jī)森林算法簡(jiǎn)介
淺談機(jī)器學(xué)習(xí)技術(shù)中的隨機(jī)森林算法
10大常用機(jī)器學(xué)習(xí)算法匯總
一種基于數(shù)據(jù)集成的隨機(jī)森林算法

隨機(jī)森林的概念、工作原理及用例
利用隨機(jī)森林進(jìn)行特征重要性評(píng)估
使用機(jī)器學(xué)習(xí)的森林動(dòng)物計(jì)數(shù)器

基于Python實(shí)現(xiàn)隨機(jī)森林算法

評(píng)論