日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[Hands On ML] 7. 集成学习和随机森林

發布時間:2024/7/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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. 投票分類

使用不同的算法得到不同的分類器

from sklearn.datasets import make_moons from sklearn.model_selection import train_test_split X, y = make_moons(n_samples=100,shuffle=True, noise=10) # help(train_test_split) X_train, X_test, y_train, y_test = train_test_split(X,y)from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC log_clf = LogisticRegression() rnd_clf = RandomForestClassifier() svm_clf = SVC() voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('rf', rnd_clf), ('svc', svm_clf)], voting='hard') voting_clf.fit(X_train, y_train)from sklearn.metrics import accuracy_score for clf in (log_clf, rnd_clf, svm_clf, voting_clf): clf.fit(X_train, y_train)y_pred = clf.predict(X_test) print(clf.__class__.__name__, accuracy_score(y_test, y_pred))
  • 投票分類器比大部分單獨的分類表現好些
LogisticRegression 0.68 RandomForestClassifier 0.52 SVC 0.56 VotingClassifier 0.6

2. Bagging、Pasting

對每個分類器使用相同的訓練算法(在不同的訓練集上訓練)

  • 有放回采樣被稱為裝袋(Bagging,是 bootstrap aggregating 的縮寫),可進行多次采樣
  • 無放回采樣稱為粘貼(pasting)


所有的分類器被訓練后,集成通過對所有分類器結果的簡單聚合來預測

  • 聚合降低了偏差和方差,比在原始訓練集上的單一分類器更小的方差
from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=100, bootstrap=True, n_jobs=-1) bag_clf.fit(X_train, y_train) y_pred = bag_clf.predict(X_test)


采用集成方法的決策樹分類效果更好

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 進行訓練)
from sklearn.ensemble import RandomForestClassifier rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1) rnd_clf.fit(X_train, y_train) y_pred_rf = rnd_clf.predict(X_test)
  • 參數為:決策樹參數(控制樹的生長)+ 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),不找最佳的特征閾值,它使用隨機閾值使樹更加隨機
  • 所以,它訓練起來比隨機森林更快
ExtraTreesClassifier ExtraTreesRegressor

到底是 隨機森林好,還是極端隨機樹好,交叉驗證比較

7. 特征重要程度

  • 靠近樹根的特征更重要
  • 一個特征在森林的全部樹中出現的平均深度來預測特征的重要性
from sklearn.datasets import load_iris iris = load_iris() rnd_clf = RandomForestClassifier(n_estimators=500, n_jobs=-1) rnd_clf.fit(iris["data"], iris["target"]) for name, score in zip(iris["feature_names"], rnd_clf.feature_importances_): print(name, score) sepal length (cm) 0.112492250999 sepal width (cm) 0.0231192882825 petal length (cm) 0.441030464364 petal width (cm) 0.423357996355

鳶尾花四個特征的重要度

  • 隨機森林可以快速了解特征重要度,可以進行特征篩選

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

from sklearn.ensemble import GradientBoostingRegressor gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0) gbrt.fit(X, y)

超參數learning_rate 確立了每個樹的貢獻

  • 設置為很小的數,在集成中就需要更多的樹去擬合訓練集,但預測通常會更好。這個正則化技術叫做 shrinkage。
  • 下圖展示了,兩個在低學習率上訓練的 GBRT 集成:左面是一個沒有足夠樹去擬合訓練集的樹,右面是有過多的樹過擬合訓練集的樹

  • 尋找最優的tree的數量:早停技術(第四章),使用staged_predict()
import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_errorX_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)

  • 使用 warn_start = True,保留之前的預測,增量訓練,不用重頭開始
  • 當誤差超過給定次數沒有得到改善,停止訓練

sklearn中warm_start參數的作用詳解

  • GradientBoostingRegressor也支持指定用于訓練每棵樹的樣本比例subsample。如果subsample=0.25,那么每個樹都會在 25% 隨機選擇的訓練實例上訓練。

  • 這也是個高偏差換低方差的作用。它同樣也加速了訓練。這個技術叫做隨機梯度提升

8.3 Stacking

Stacking(stacked generalization 的縮寫)。
思想:不使用瑣碎的函數(如硬投票)來聚合集合中所有分類器的預測,
使用一個新的分類器模型,對所有的預測結果作為輸入,預測輸出最終結果


sklearn 暫不直接支持 stacking

總結

以上是生活随笔為你收集整理的[Hands On ML] 7. 集成学习和随机森林的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。