[Hands On ML] 7. 集成学习和随机森林
文章目錄
- 1. 投票分類
- 2. Bagging、Pasting
- 3. Out of Bag 評價
- 4. 隨機(jī)貼片與隨機(jī)子空間
- 5. 隨機(jī)森林
- 6. 極端隨機(jī)樹 Extra-Trees
- 7. 特征重要程度
- 8. 提升方法
- 8.1 AdaBoost
- 8.2 梯度提升
- 8.3 Stacking
本文為《機(jī)器學(xué)習(xí)實戰(zhàn):基于Scikit-Learn和TensorFlow》的讀書筆記。
中文翻譯參考
《統(tǒng)計學(xué)習(xí)方法》提升方法(Boosting)筆記
集成學(xué)習(xí):集體的智慧大于個人
1. 投票分類
使用不同的算法得到不同的分類器
- 投票分類器比大部分單獨(dú)的分類表現(xiàn)好些
2. Bagging、Pasting
對每個分類器使用相同的訓(xùn)練算法(在不同的訓(xùn)練集上訓(xùn)練)
- 有放回采樣被稱為裝袋(Bagging,是 bootstrap aggregating 的縮寫),可進(jìn)行多次采樣
- 無放回采樣稱為粘貼(pasting)
所有的分類器被訓(xùn)練后,集成通過對所有分類器結(jié)果的簡單聚合來預(yù)測
- 聚合降低了偏差和方差,比在原始訓(xùn)練集上的單一分類器更小的方差
采用集成方法的決策樹分類效果更好
3. Out of Bag 評價
bagging 中有放回采用中,總有些是從未被采到的,可以用來做效果評估
from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,bootstrap=True, n_jobs=-1, oob_score=True) bag_clf.fit(X_train, y_train) bag_clf.oob_score_ # oob集的預(yù)測準(zhǔn)確率 bag_clf.oob_decision_function_ # 每個oob實例的決策概率4. 隨機(jī)貼片與隨機(jī)子空間
BaggingClassifier也支持采樣特征
- 由超參數(shù)max_features和bootstrap_features控制
- 工作方式和max_samples和bootstrap一樣,但這是對于特征采樣而不是實例采樣
在處理高維度輸入下(例如圖片)此方法尤其有效
- 對訓(xùn)練實例和特征都采樣被叫做隨機(jī)貼片
- 保留所有的訓(xùn)練實例(例如bootstrap=False和max_samples=1.0),僅對特征采樣(bootstrap_features=True并且/或者max_features小于 1.0)叫做隨機(jī)子空間
采樣特征 導(dǎo)致 更多的預(yù)測多樣性,用高偏差換低方差
5. 隨機(jī)森林
- 決策樹的一種集成(通常是bagging,有時是pasting 進(jìn)行訓(xùn)練)
-
參數(shù)為:決策樹參數(shù)(控制樹的生長)+ bagging_clf 集成的參數(shù)(控制集成)
-
隨機(jī)森林算法在 樹生長時 引入了 額外的隨機(jī)
-
與在節(jié)點(diǎn)分裂時需要找到最好分裂特征相反(詳見第六章),它在一個隨機(jī)的特征集中找最好的特征。它導(dǎo)致了樹的差異性,并且再一次用高偏差換低方差,總的來說是一個更好的模型
以下 bagging 大致相當(dāng)于 隨機(jī)森林
bag_clf = BaggingClassifier(DecisionTreeClassifier(splitter="random", max_leaf_nodes=16),n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1)6. 極端隨機(jī)樹 Extra-Trees
在隨機(jī)森林上生長樹時,在每個結(jié)點(diǎn)分裂時只考慮隨機(jī)特征集上的特征。
- 極端隨機(jī)樹(Extremely Randomized
Trees),不找最佳的特征閾值,它使用隨機(jī)閾值使樹更加隨機(jī) - 所以,它訓(xùn)練起來比隨機(jī)森林更快
到底是 隨機(jī)森林好,還是極端隨機(jī)樹好,交叉驗證比較
7. 特征重要程度
- 靠近樹根的特征更重要
- 一個特征在森林的全部樹中出現(xiàn)的平均深度來預(yù)測特征的重要性
鳶尾花四個特征的重要度
- 隨機(jī)森林可以快速了解特征重要度,可以進(jìn)行特征篩選
8. 提升方法
將幾個弱學(xué)習(xí)者組合成強(qiáng)學(xué)習(xí)者的集成方法
8.1 AdaBoost
- 使一個新的分類器去修正之前分類結(jié)果的方法:對之前分類結(jié)果不對的訓(xùn)練實例多加關(guān)注
AdaBoost 迭代過程
序列學(xué)習(xí) 技術(shù)的一個重要的缺點(diǎn)就是:它不能被并行化(只能按步驟)
- 每個分類器只能在之前的分類器已經(jīng)被訓(xùn)練和評價后再進(jìn)行訓(xùn)練
- 因此,它不像Bagging和Pasting一樣
- sklearn 通常使用 Adaboost 的多分類版本 SAMME(這就代表了 分段加建模使用多類指數(shù)損失函數(shù))
- 如果只有兩類別,那么 SAMME 是與 Adaboost 相同的
- 如果分類器可以預(yù)測類別概率(例如如果它們有predict_proba()),sklearn 可以使用 SAMME.R(R 代表“REAL”)的版本,預(yù)測概率通常比預(yù)測分類更好
一個決策樹樁是max_depth=1的決策樹,一個單一決策節(jié)點(diǎn)+兩個葉子結(jié)點(diǎn)。這就是AdaBoostClassifier的默認(rèn)基分類器:
from sklearn.ensemble import AdaBoostClassifier ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200,algorithm="SAMME.R", learning_rate=0.5) ada_clf.fit(X_train, y_train)- Adaboost 集成過擬合了訓(xùn)練集,可以減少基分類器的數(shù)量 或者 對基分類器使用更強(qiáng)的正則化
8.2 梯度提升
不像 Adaboost 那樣每一次迭代都更改實例的權(quán)重,這個方法是去使用新的分類器去擬合前面分類器預(yù)測的殘差
from sklearn.tree import DecisionTreeRegressor tree_reg1 = DecisionTreeRegressor(max_depth=2) tree_reg1.fit(X, y)現(xiàn)在在第一個分類器的殘差上訓(xùn)練第二個分類器:
y2 = y - tree_reg1.predict(X) tree_reg2 = DecisionTreeRegressor(max_depth=2) tree_reg2.fit(X, y2)隨后在第二個分類器的殘差上訓(xùn)練第三個分類器:
y3 = y2 - tree_reg1.predict(X) tree_reg3 = DecisionTreeRegressor(max_depth=2) tree_reg3.fit(X, y3)通過集成所有樹的預(yù)測來在一個新的實例上進(jìn)行預(yù)測
y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))
sklearn 內(nèi)置 GBRT
超參數(shù)learning_rate 確立了每個樹的貢獻(xiàn)
- 設(shè)置為很小的數(shù),在集成中就需要更多的樹去擬合訓(xùn)練集,但預(yù)測通常會更好。這個正則化技術(shù)叫做 shrinkage。
- 下圖展示了,兩個在低學(xué)習(xí)率上訓(xùn)練的 GBRT 集成:左面是一個沒有足夠樹去擬合訓(xùn)練集的樹,右面是有過多的樹過擬合訓(xùn)練集的樹
- 尋找最優(yōu)的tree的數(shù)量:早停技術(shù)(第四章),使用staged_predict()
- 使用 warn_start = True,保留之前的預(yù)測,增量訓(xùn)練,不用重頭開始
- 當(dāng)誤差超過給定次數(shù)沒有得到改善,停止訓(xùn)練
sklearn中warm_start參數(shù)的作用詳解
-
GradientBoostingRegressor也支持指定用于訓(xùn)練每棵樹的樣本比例subsample。如果subsample=0.25,那么每個樹都會在 25% 隨機(jī)選擇的訓(xùn)練實例上訓(xùn)練。
-
這也是個高偏差換低方差的作用。它同樣也加速了訓(xùn)練。這個技術(shù)叫做隨機(jī)梯度提升
8.3 Stacking
Stacking(stacked generalization 的縮寫)。
思想:不使用瑣碎的函數(shù)(如硬投票)來聚合集合中所有分類器的預(yù)測,
使用一個新的分類器模型,對所有的預(yù)測結(jié)果作為輸入,預(yù)測輸出最終結(jié)果
sklearn 暫不直接支持 stacking
總結(jié)
以上是生活随笔為你收集整理的[Hands On ML] 7. 集成学习和随机森林的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 769. 最多能完成排
- 下一篇: LeetCode 1292. 元素和小于