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