0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

機器學習實用指南——集成學習和隨機森林

lviY_AI_shequ ? 來源:未知 ? 作者:李倩 ? 2018-07-27 17:40 ? 次閱讀

梯度提升

另一個非常著名的提升算法是梯度提升。與 Adaboost 一樣,梯度提升也是通過向集成中逐步增加分類器運行的,每一個分類器都修正之前的分類結果。然而,它并不像 Adaboost 那樣每一次迭代都更改實例的權重,這個方法是去使用新的分類器去擬合前面分類器預測的殘差 。

讓我們通過一個使用決策樹當做基分類器的簡單的回歸例子(回歸當然也可以使用梯度提升)。這被叫做梯度提升回歸樹(GBRT,Gradient Tree Boosting 或者 Gradient Boosted Regression Trees)。首先我們用DecisionTreeRegressor去擬合訓練集(例如一個有噪二次訓練集):

>>>from sklearn.tree import DecisionTreeRegressor >>>tree_reg1 = DecisionTreeRegressor(max_depth=2) >>>tree_reg1.fit(X, y)

現(xiàn)在在第一個分類器的殘差上訓練第二個分類器:

>>>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)

現(xiàn)在我們有了一個包含三個回歸器的集成。它可以通過集成所有樹的預測來在一個新的實例上進行預測。

>>>y_pred = sum(tree.predict(X_new) for tree in (tree_reg1, tree_reg2, tree_reg3))

圖7-9在左欄展示了這三個樹的預測,在右欄展示了集成的預測。在第一行,集成只有一個樹,所以它與第一個樹的預測相似。在第二行,一個新的樹在第一個樹的殘差上進行訓練。在右邊欄可以看出集成的預測等于前兩個樹預測的和。相同的,在第三行另一個樹在第二個數(shù)的殘差上訓練。你可以看到集成的預測會變的更好。

我們可以使用 sklean 中的GradientBoostingRegressor來訓練 GBRT 集成。與RandomForestClassifier相似,它也有超參數(shù)去控制決策樹的生長(例如max_depth,min_samples_leaf等等),也有超參數(shù)去控制集成訓練,例如基分類器的數(shù)量(n_estimators)。接下來的代碼創(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 確立了每個樹的貢獻。如果你把它設置為一個很小的樹,例如 0.1,在集成中就需要更多的樹去擬合訓練集,但預測通常會更好。這個正則化技術叫做 shrinkage。圖 7-10 展示了兩個在低學習率上訓練的 GBRT 集成:其中左面是一個沒有足夠樹去擬合訓練集的樹,右面是有過多的樹過擬合訓練集的樹。

為了找到樹的最優(yōu)數(shù)量,你可以使用早停技術(第四章討論)。最簡單使用這個技術的方法就是使用staged_predict():它在訓練的每個階段(用一棵樹,兩棵樹等)返回一個迭代器。加下來的代碼用 120 個樹訓練了一個 GBRT 集成,然后在訓練的每個階段驗證錯誤以找到樹的最佳數(shù)量,最后使用 GBRT 樹的最優(yōu)數(shù)量訓練另一個集成:

>>>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)

驗證錯誤在圖 7-11 的左面展示,最優(yōu)模型預測被展示在右面。

你也可以早早的停止訓練來實現(xiàn)早停(與先在一大堆樹中訓練,然后再回頭去找最優(yōu)數(shù)目相反)。你可以通過設置warm_start=True來實現(xiàn) ,這使得當fit()方法被調用時 sklearn 保留現(xià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也支持指定用于訓練每棵樹的訓練實例比例的超參數(shù)subsample。例如如果subsample=0.25,那么每個樹都會在 25% 隨機選擇的訓練實例上訓練。你現(xiàn)在也能猜出來,這也是個高偏差換低方差的作用。它同樣也加速了訓練。這個技術叫做隨機梯度提升。

也可能對其他損失函數(shù)使用梯度提升。這是由損失超參數(shù)控制(見 sklearn 文檔)。

Stacking

本章討論的最后一個集成方法叫做 Stacking(stacked generalization 的縮寫)。這個算法基于一個簡單的想法:不使用瑣碎的函數(shù)(如硬投票)來聚合集合中所有分類器的預測,我們?yōu)槭裁床挥柧氁粋€模型來執(zhí)行這個聚合?圖 7-12 展示了這樣一個在新的回歸實例上預測的集成。底部三個分類器每一個都有不同的值(3.1,2.7 和 2.9),然后最后一個分類器(叫做 blender 或者 meta learner )把這三個分類器的結果當做輸入然后做出最終決策(3.0)。

為了訓練這個 blender ,一個通用的方法是采用保持集。讓我們看看它怎么工作。首先,訓練集被分為兩個子集,第一個子集被用作訓練第一層(詳見圖 7-13).

接下來,第一層的分類器被用來預測第二個子集(保持集)(詳見 7-14)。這確保了預測結果很“干凈”,因為這些分類器在訓練的時候沒有使用過這些事例。現(xiàn)在對在保持集中的每一個實例都有三個預測值。我們現(xiàn)在可以使用這些預測結果作為輸入特征來創(chuàng)建一個新的訓練集(這使得這個訓練集是三維的),并且保持目標數(shù)值不變。隨后 blender 在這個新的訓練集上訓練,因此,它學會了預測第一層預測的目標值。

顯然我們可以用這種方法訓練不同的 blender (例如一個線性回歸,另一個是隨機森林等等):我們得到了一層 blender 。訣竅是將訓練集分成三個子集:第一個子集用來訓練第一層,第二個子集用來創(chuàng)建訓練第二層的訓練集(使用第一層分類器的預測值),第三個子集被用來創(chuàng)建訓練第三層的訓練集(使用第二層分類器的預測值)。以上步驟做完了,我們可以通過逐個遍歷每個層來預測一個新的實例。詳見圖 7-15.

然而不幸的是,sklearn 并不直接支持 stacking ,但是你自己組建是很容易的(看接下來的練習)。或者你也可以使用開源的項目例如 brew (網址為 https://github.com/viisar/brew)

練習

如果你在相同訓練集上訓練 5 個不同的模型,它們都有 95% 的準確率,那么你是否可以通過組合這個模型來得到更好的結果?如果可以那怎么做呢?如果不可以請給出理由。

軟投票和硬投票分類器之間有什么區(qū)別?

是否有可能通過分配多個服務器來加速 bagging 集成系統(tǒng)的訓練?pasting 集成,boosting 集成,隨機森林,或 stacking 集成怎么樣?

out-of-bag 評價的好處是什么?

是什么使 Extra-Tree 比規(guī)則隨機森林更隨機呢?這個額外的隨機有什么幫助呢?那這個 Extra-Tree 比規(guī)則隨機森林誰更快呢?

如果你的 Adaboost 模型欠擬合,那么你需要怎么調整超參數(shù)?

如果你的梯度提升過擬合,那么你應該調高還是調低學習率呢?

導入 MNIST 數(shù)據(jù)(第三章中介紹),把它切分進一個訓練集,一個驗證集,和一個測試集(例如 40000 個實例進行訓練,10000 個進行驗證,10000 個進行測試)。然后訓練多個分類器,例如一個隨機森林分類器,一個 Extra-Tree 分類器和一個 SVM。接下來,嘗試將它們組合成集成,使用軟或硬投票分類器來勝過驗證集上的所有集合。一旦找到了,就在測試集上實驗。與單個分類器相比,它的性能有多好?

從練習 8 中運行個體分類器來對驗證集進行預測,并創(chuàng)建一個新的訓練集并生成預測:每個訓練實例是一個向量,包含來自所有分類器的圖像的預測集,目標是圖像類別。祝賀你,你剛剛訓練了一個 blender ,和分類器一起組成了一個疊加組合!現(xiàn)在讓我們來評估測試集上的集合。對于測試集中的每個圖像,用所有分類器進行預測,然后將預測饋送到 blender 以獲得集合的預測。它與你早期訓練過的投票分類器相比如何?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 分類器
    +關注

    關注

    0

    文章

    152

    瀏覽量

    13162
  • 隨機森林
    +關注

    關注

    1

    文章

    22

    瀏覽量

    4260

原文標題:【翻譯】Sklearn 與 TensorFlow 機器學習實用指南 —— 第7章 集成學習和隨機森林 (下)

文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    機器學習算法之隨機森林算法詳解及工作原理圖解

    隨機森林是一種靈活且易于使用的機器學習算法,即便沒有超參數(shù)調優(yōu),也可以在大多數(shù)情況下得到很好的結果。它也是最常用的算法之一,因為它很簡易,既可用于分類也能用于回歸任務。 在這篇文章中,
    的頭像 發(fā)表于 03-14 16:10 ?31.9w次閱讀
    <b class='flag-5'>機器</b><b class='flag-5'>學習</b>算法之<b class='flag-5'>隨機</b><b class='flag-5'>森林</b>算法詳解及工作原理圖解

    機器學習實踐指南——案例應用解析

    機器學習實踐指南——案例應用解析
    發(fā)表于 04-13 16:40

    不可錯過 | 集成學習入門精講

    的估計區(qū)間 4、隨機森林隨機森林(Random Forest)是Bagging的擴展變體。隨機森林
    發(fā)表于 06-06 10:11

    機器學習隨機森林相關知識

    機器學習隨機森林(三)
    發(fā)表于 04-02 10:06

    隨機森林的相關知識

    機器學習隨機森林(一)
    發(fā)表于 08-27 07:30

    集成學習隨機森林,提供代碼實現(xiàn)

    令人驚奇的是這種投票分類器得出的結果經常會比集成中最好的一個分類器結果更好。事實上,即使每一個分類器都是一個弱學習器(意味著它們也就比瞎猜好點),集成后仍然是一個強學習器(高準確率),
    的頭像 發(fā)表于 07-17 17:07 ?4944次閱讀

    5分鐘內看懂機器學習和深度學習的區(qū)別

    學習的比較外,我們還將研究他們未來的趨勢和走向。 深度學習機器學習簡介 一、什么是機器學習?
    發(fā)表于 09-13 17:19 ?535次閱讀

    機器學習隨機森林算法簡介

    幾個月前,我在悉尼參加了一個會議。會上fast.ai向我介紹了一門在線機器學習課程,那時候我根本沒注意。這周在Kaggle競賽尋找提高分數(shù)的方法時,我又遇到了這門課程。我決定試一試。
    的頭像 發(fā)表于 05-05 08:50 ?2428次閱讀

    淺談機器學習技術中的隨機森林算法

    本次主題是隨機森林,杰里米(講師)提供了一些基本信息以及使用Jupyter Notebook的提示和技巧。 Jeremy談到的一些重要的事情是,數(shù)據(jù)科學并不等同于軟件工程。 在數(shù)據(jù)科學中,我們做
    的頭像 發(fā)表于 09-29 15:34 ?1719次閱讀

    10大常用機器學習算法匯總

    本文介紹了10大常用機器學習算法,包括線性回歸、Logistic回歸、線性判別分析、樸素貝葉斯、KNN、隨機森林等。
    發(fā)表于 11-20 11:10 ?2714次閱讀

    一種基于數(shù)據(jù)集成隨機森林算法

    用于銷售預測的歷史數(shù)據(jù)存在稀疏性與波動性等特點,當預測周期較長時,傳統(tǒng)統(tǒng)計學或者機器學習領域預測算法的預測效果較差。為此,利用隨機森林集成
    發(fā)表于 03-16 11:37 ?12次下載
    一種基于數(shù)據(jù)<b class='flag-5'>集成</b>的<b class='flag-5'>隨機</b><b class='flag-5'>森林</b>算法

    隨機森林的概念、工作原理及用例

    隨機森林是一種監(jiān)督式算法,使用由眾多決策樹組成的一種集成學習方法,輸出是對問題最佳答案的共識。隨機森林
    的頭像 發(fā)表于 08-05 10:00 ?6765次閱讀

    利用隨機森林進行特征重要性評估

    隨機森林是以決策樹為基學習器的集成學習算法。隨機森林
    的頭像 發(fā)表于 10-10 17:14 ?1821次閱讀

    使用機器學習森林動物計數(shù)器

    電子發(fā)燒友網站提供《使用機器學習森林動物計數(shù)器.zip》資料免費下載
    發(fā)表于 06-12 14:46 ?0次下載
    使用<b class='flag-5'>機器</b><b class='flag-5'>學習</b>的<b class='flag-5'>森林</b>動物計數(shù)器

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

    機器學習算法是數(shù)據(jù)挖掘、數(shù)據(jù)能力分析和數(shù)學建模必不可少的一部分,而隨機森林算法和決策樹算法是其中較為常用的兩種算法,本文將會對隨機
    的頭像 發(fā)表于 09-21 11:17 ?1140次閱讀
    基于Python實現(xiàn)<b class='flag-5'>隨機</b><b class='flag-5'>森林</b>算法