隨機(jī)貼片與隨機(jī)子空間
BaggingClassifier也支持采樣特征。它被兩個(gè)超參數(shù)max_features和bootstrap_features控制。他們的工作方式和max_samples和bootstrap一樣,但這是對(duì)于特征采樣而不是實(shí)例采樣。因此,每一個(gè)分類(lèi)器都會(huì)被在隨機(jī)的輸入特征內(nèi)進(jìn)行訓(xùn)練。
當(dāng)你在處理高維度輸入下(例如圖片)此方法尤其有效。對(duì)訓(xùn)練實(shí)例和特征的采樣被叫做隨機(jī)貼片。保留了所有的訓(xùn)練實(shí)例(例如bootstrap=False和max_samples=1.0),但是對(duì)特征采樣(bootstrap_features=True并且/或者max_features小于 1.0)叫做隨機(jī)子空間。
采樣特征導(dǎo)致更多的預(yù)測(cè)多樣性,用高偏差換低方差。
隨機(jī)森林
正如我們所討論的,隨機(jī)森林是決策樹(shù)的一種集成,通常是通過(guò) bagging 方法(有時(shí)是 pasting 方法)進(jìn)行訓(xùn)練,通常用max_samples設(shè)置為訓(xùn)練集的大小。與建立一個(gè)BaggingClassifier然后把它放入DecisionTreeClassifier相反,你可以使用更方便的也是對(duì)決策樹(shù)優(yōu)化夠的RandomForestClassifier(對(duì)于回歸是RandomForestRegressor)。接下來(lái)的代碼訓(xùn)練了帶有 500 個(gè)樹(shù)(每個(gè)被限制為 16 葉子結(jié)點(diǎn))的決策森林,使用所有空閑的 CPU 核:
>>>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)
除了一些例外,RandomForestClassifier使用DecisionTreeClassifier的所有超參數(shù)(決定數(shù)怎么生長(zhǎng)),把BaggingClassifier的超參數(shù)加起來(lái)來(lái)控制集成本身。
隨機(jī)森林算法在樹(shù)生長(zhǎng)時(shí)引入了額外的隨機(jī);與在節(jié)點(diǎn)分裂時(shí)需要找到最好分裂特征相反(詳見(jiàn)第六章),它在一個(gè)隨機(jī)的特征集中找最好的特征。它導(dǎo)致了樹(shù)的差異性,并且再一次用高偏差換低方差,總的來(lái)說(shuō)是一個(gè)更好的模型。以下是BaggingClassifier大致相當(dāng)于之前的randomforestclassifier:
>>>bag_clf = BaggingClassifier(DecisionTreeClassifier(splitter="random", max_leaf_nodes=16),n_estimators=500, max_samples=1.0, bootstrap=True, n_jobs=-1)
極端隨機(jī)樹(shù)
當(dāng)你在隨機(jī)森林上生長(zhǎng)樹(shù)時(shí),在每個(gè)結(jié)點(diǎn)分裂時(shí)只考慮隨機(jī)特征集上的特征(正如之前討論過(guò)的一樣)。相比于找到更好的特征我們可以通過(guò)使用對(duì)特征使用隨機(jī)閾值使樹(shù)更加隨機(jī)(像規(guī)則決策樹(shù)一樣)。
這種極端隨機(jī)的樹(shù)被簡(jiǎn)稱(chēng)為Extremely Randomized Trees(極端隨機(jī)樹(shù)),或者更簡(jiǎn)單的稱(chēng)為Extra-Tree。再一次用高偏差換低方差。它還使得Extra-Tree比規(guī)則的隨機(jī)森林更快地訓(xùn)練,因?yàn)樵诿總€(gè)節(jié)點(diǎn)上找到每個(gè)特征的最佳閾值是生長(zhǎng)樹(shù)最耗時(shí)的任務(wù)之一。
你可以使用 sklearn 的ExtraTreesClassifier來(lái)創(chuàng)建一個(gè)Extra-Tree分類(lèi)器。他的 API 跟RandomForestClassifier是相同的,相似的,ExtraTreesRegressor跟RandomForestRegressor也是相同的 API。
我們很難去分辨ExtraTreesClassifier和RandomForestClassifier到底哪個(gè)更好。通常情況下是通過(guò)交叉驗(yàn)證來(lái)比較它們(使用網(wǎng)格搜索調(diào)整超參數(shù))。
特征重要度
最后,如果你觀察一個(gè)單一決策樹(shù),重要的特征會(huì)出現(xiàn)在更靠近根部的位置,而不重要的特征會(huì)經(jīng)常出現(xiàn)在靠近葉子的位置。因此我們可以通過(guò)計(jì)算一個(gè)特征在森林的全部樹(shù)中出現(xiàn)的平均深度來(lái)預(yù)測(cè)特征的重要性。sklearn 在訓(xùn)練后會(huì)自動(dòng)計(jì)算每個(gè)特征的重要度。你可以通過(guò)feature_importances_變量來(lái)查看結(jié)果。例如如下代碼在 iris 數(shù)據(jù)集(第四章介紹)上訓(xùn)練了一個(gè)RandomForestClassifier模型,然后輸出了每個(gè)特征的重要性。看來(lái),最重要的特征是花瓣長(zhǎng)度(44%)和寬度(42%),而萼片長(zhǎng)度和寬度相對(duì)比較是不重要的(分別為 11% 和 2%):
>>> 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.112492250999sepal width (cm) 0.0231192882825 petal length (cm) 0.441030464364 petal width (cm) 0.423357996355
相似的,如果你在 MNIST 數(shù)據(jù)及上訓(xùn)練隨機(jī)森林分類(lèi)器(在第三章上介紹),然后畫(huà)出每個(gè)像素的重要性,你可以得到圖 7-6 的圖片。
隨機(jī)森林可以非常方便快速得了解哪些特征實(shí)際上是重要的,特別是你需要進(jìn)行特征選擇的時(shí)候。
提升
提升(Boosting,最初稱(chēng)為假設(shè)增強(qiáng))指的是可以將幾個(gè)弱學(xué)習(xí)者組合成強(qiáng)學(xué)習(xí)者的集成方法。對(duì)于大多數(shù)的提升方法的思想就是按順序去訓(xùn)練分類(lèi)器,每一個(gè)都要嘗試修正前面的分類(lèi)。現(xiàn)如今已經(jīng)有很多的提升方法了,但最著名的就是Adaboost(適應(yīng)性提升,是Adaptive Boosting的簡(jiǎn)稱(chēng)) 和Gradient Boosting(梯度提升)。讓我們先從Adaboost說(shuō)起。
Adaboost
使一個(gè)新的分類(lèi)器去修正之前分類(lèi)結(jié)果的方法就是對(duì)之前分類(lèi)結(jié)果不對(duì)的訓(xùn)練實(shí)例多加關(guān)注。這導(dǎo)致新的預(yù)測(cè)因子越來(lái)越多地聚焦于這種情況。這是Adaboost使用的技術(shù)。
舉個(gè)例子,去構(gòu)建一個(gè) Adaboost 分類(lèi)器,第一個(gè)基分類(lèi)器(例如一個(gè)決策樹(shù))被訓(xùn)練然后在訓(xùn)練集上做預(yù)測(cè),在誤分類(lèi)訓(xùn)練實(shí)例上的權(quán)重就增加了。第二個(gè)分類(lèi)機(jī)使用更新過(guò)的權(quán)重然后再一次訓(xùn)練,權(quán)重更新,以此類(lèi)推(詳見(jiàn)圖 7-7)
圖 7-8 顯示連續(xù)五次預(yù)測(cè)的 moons 數(shù)據(jù)集的決策邊界(在本例中,每一個(gè)分類(lèi)器都是高度正則化帶有 RBF 核的 SVM)。第一個(gè)分類(lèi)器誤分類(lèi)了很多實(shí)例,所以它們的權(quán)重被提升了。第二個(gè)分類(lèi)器因此對(duì)這些誤分類(lèi)的實(shí)例分類(lèi)效果更好,以此類(lèi)推。右邊的圖代表了除了學(xué)習(xí)率減半外(誤分類(lèi)實(shí)例權(quán)重每次迭代上升一半)相同的預(yù)測(cè)序列。你可以看出,序列學(xué)習(xí)技術(shù)與梯度下降很相似,除了調(diào)整單個(gè)預(yù)測(cè)因子的參數(shù)以最小化代價(jià)函數(shù)之外,AdaBoost 增加了集合的預(yù)測(cè)器,逐漸使其更好。
一旦所有的分類(lèi)器都被訓(xùn)練后,除了分類(lèi)器根據(jù)整個(gè)訓(xùn)練集上的準(zhǔn)確率被賦予的權(quán)重外,集成預(yù)測(cè)就非常像Bagging和Pasting了。
序列學(xué)習(xí)技術(shù)的一個(gè)重要的缺點(diǎn)就是:它不能被并行化(只能按步驟),因?yàn)槊總€(gè)分類(lèi)器只能在之前的分類(lèi)器已經(jīng)被訓(xùn)練和評(píng)價(jià)后再進(jìn)行訓(xùn)練。因此,它不像Bagging和Pasting一樣。
讓我們?cè)敿?xì)看一下 Adaboost 算法。每一個(gè)實(shí)例的權(quán)重wi初始都被設(shè)為1/m第一個(gè)分類(lèi)器被訓(xùn)練,然后他的權(quán)重誤差率r1在訓(xùn)練集上算出,詳見(jiàn)公式 7-1。
公式7-1:第j個(gè)分類(lèi)器的權(quán)重誤差率
其中是第j個(gè)分類(lèi)器對(duì)于第i實(shí)例的預(yù)測(cè)。
分類(lèi)器的權(quán)重j 隨后用公式 7-2 計(jì)算出來(lái)。其中η是超參數(shù)學(xué)習(xí)率(默認(rèn)為 1)。
分類(lèi)器準(zhǔn)確率越高,它的權(quán)重就越高。如果它只是瞎猜,那么它的權(quán)重會(huì)趨近于 0。然而,如果它總是出錯(cuò)(比瞎猜的幾率都低),它的權(quán)重會(huì)使負(fù)數(shù)。
公式 7-2:分類(lèi)器權(quán)重
接下來(lái)實(shí)例的權(quán)重會(huì)按照公式 7-3 更新:誤分類(lèi)的實(shí)例權(quán)重會(huì)被提升。
公式7-3 權(quán)重更新規(guī)則
對(duì)于i=1, 2, ..., m
隨后所有實(shí)例的權(quán)重都被歸一化(例如被整除)
最后,一個(gè)新的分類(lèi)器通過(guò)更新過(guò)的權(quán)重訓(xùn)練,整個(gè)過(guò)程被重復(fù)(新的分類(lèi)器權(quán)重被計(jì)算,實(shí)例的權(quán)重被更新,隨后另一個(gè)分類(lèi)器被訓(xùn)練,以此類(lèi)推)。當(dāng)規(guī)定的分類(lèi)器數(shù)量達(dá)到或者最好的分類(lèi)器被找到后算法就會(huì)停止。
為了進(jìn)行預(yù)測(cè),Adaboost 通過(guò)分類(lèi)器權(quán)重j 簡(jiǎn)單的計(jì)算了所有的分類(lèi)器和權(quán)重。預(yù)測(cè)類(lèi)別會(huì)是權(quán)重投票中主要的類(lèi)別。(詳見(jiàn)公式 7-4)
公式7-4: Adaboost 分類(lèi)器
其中N是分類(lèi)器的數(shù)量。
sklearn 通常使用 Adaboost 的多分類(lèi)版本SAMME(這就代表了分段加建模使用多類(lèi)指數(shù)損失函數(shù))。如果只有兩類(lèi)別,那么SAMME是與 Adaboost 相同的。如果分類(lèi)器可以預(yù)測(cè)類(lèi)別概率(例如如果它們有predict_proba()),如果 sklearn 可以使用SAMME叫做SAMME.R的變量(R 代表“REAL”),這種依賴于類(lèi)別概率的通常比依賴于分類(lèi)器的更好。
接下來(lái)的代碼訓(xùn)練了使用 sklearn 的AdaBoostClassifier基于 200 個(gè)決策樹(shù)樁 Adaboost 分類(lèi)器(正如你說(shuō)期待的,對(duì)于回歸也有AdaBoostRegressor)。一個(gè)決策樹(shù)樁是max_depth=1的決策樹(shù)-換句話說(shuō),是一個(gè)單一的決策節(jié)點(diǎn)加上兩個(gè)葉子結(jié)點(diǎn)。這就是AdaBoostClassifier的默認(rèn)基分類(lèi)器:
>>>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 集成過(guò)擬合了訓(xùn)練集,你可以嘗試減少基分類(lèi)器的數(shù)量或者對(duì)基分類(lèi)器使用更強(qiáng)的正則化。
-
分類(lèi)器
+關(guān)注
關(guān)注
0文章
152瀏覽量
13242 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1209瀏覽量
24854 -
決策樹(shù)
+關(guān)注
關(guān)注
3文章
96瀏覽量
13600
原文標(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)先 登錄
相關(guān)推薦
偽隨機(jī)系列及編碼.ppt
CDMA偽隨機(jī)碼
應(yīng)用隨機(jī)過(guò)程
隨機(jī)硬盤(pán)容量
基于網(wǎng)絡(luò)表示學(xué)習(xí)與隨機(jī)游走的鏈路預(yù)測(cè)算法
![基于網(wǎng)絡(luò)表示學(xué)習(xí)與<b class='flag-5'>隨機(jī)</b>游走的鏈路預(yù)測(cè)算法](https://file.elecfans.com/web2/M00/49/6B/poYBAGKhwLCAaNKlAAAcjxv9OcE543.jpg)
最近鄰的隨機(jī)非線性降維
Python隨機(jī)數(shù)模塊的隨機(jī)函數(shù)使用
![Python<b class='flag-5'>隨機(jī)</b>數(shù)模塊的<b class='flag-5'>隨機(jī)</b>函數(shù)使用](https://file.elecfans.com/web1/M00/B3/79/pIYBAF4cPjWABsKtAAB3kJZdHss727.png)
開(kāi)隨機(jī)顏色之與Alexa的隨機(jī)玩家游戲
![開(kāi)<b class='flag-5'>隨機(jī)</b>顏色之與Alexa的<b class='flag-5'>隨機(jī)</b>玩家游戲](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
簡(jiǎn)述SystemVerilog的隨機(jī)約束方法
偽隨機(jī)數(shù)和真隨機(jī)數(shù)的區(qū)別是什么呢?
SystemVerilog的隨機(jī)約束方法
什么是隨機(jī)森林?隨機(jī)森林的工作原理
![什么是<b class='flag-5'>隨機(jī)</b>森林?<b class='flag-5'>隨機(jī)</b>森林的工作原理](https://file1.elecfans.com/web2/M00/C4/C5/wKgZomX332iAL6VsAAAj4bOxHOI608.png)
評(píng)論