假設(shè)你去隨機(jī)問(wèn)很多人一個(gè)很復(fù)雜的問(wèn)題,然后把它們的答案合并起來(lái)。通常情況下你會(huì)發(fā)現(xiàn)這個(gè)合并的答案比一個(gè)專(zhuān)家的答案要好。這就叫做群體智慧。同樣的,如果你合并了一組分類(lèi)器的預(yù)測(cè)(像分類(lèi)或者回歸),你也會(huì)得到一個(gè)比單一分類(lèi)器更好的預(yù)測(cè)結(jié)果。這一組分類(lèi)器就叫做集成;因此,這個(gè)技術(shù)就叫做集成學(xué)習(xí),一個(gè)集成學(xué)習(xí)算法就叫做集成方法。
例如,你可以訓(xùn)練一組決策樹(shù)分類(lèi)器,每一個(gè)都在一個(gè)隨機(jī)的訓(xùn)練集上。為了去做預(yù)測(cè),你必須得到所有單一樹(shù)的預(yù)測(cè)值,然后通過(guò)投票(例如第六章的練習(xí))來(lái)預(yù)測(cè)類(lèi)別。例如一種決策樹(shù)的集成就叫做隨機(jī)森林,它除了簡(jiǎn)單之外也是現(xiàn)今存在的最強(qiáng)大的機(jī)器學(xué)習(xí)算法之一。
向我們?cè)诘诙掠懻摰囊粯?,我們?huì)在一個(gè)項(xiàng)目快結(jié)束的時(shí)候使用集成算法,一旦你建立了一些好的分類(lèi)器,就把他們合并為一個(gè)更好的分類(lèi)器。事實(shí)上,在機(jī)器學(xué)習(xí)競(jìng)賽中獲得勝利的算法經(jīng)常會(huì)包含一些集成方法。
在本章中我們會(huì)討論一下特別著名的集成方法,包括 bagging, boosting, stacking,和其他一些算法。我們也會(huì)討論隨機(jī)森林。
投票分類(lèi)
假設(shè)你已經(jīng)訓(xùn)練了一些分類(lèi)器,每一個(gè)都有 80% 的準(zhǔn)確率。你可能有了一個(gè)邏輯斯蒂回歸、或一個(gè) SVM、或一個(gè)隨機(jī)森林,或者一個(gè) KNN,或許還有更多(詳見(jiàn)圖 7-1)
一個(gè)非常簡(jiǎn)單去創(chuàng)建一個(gè)更好的分類(lèi)器的方法就是去整合每一個(gè)分類(lèi)器的預(yù)測(cè)然后經(jīng)過(guò)投票去預(yù)測(cè)分類(lèi)。這種分類(lèi)器就叫做硬投票分類(lèi)器(詳見(jiàn)圖 7-2)。
令人驚奇的是這種投票分類(lèi)器得出的結(jié)果經(jīng)常會(huì)比集成中最好的一個(gè)分類(lèi)器結(jié)果更好。事實(shí)上,即使每一個(gè)分類(lèi)器都是一個(gè)弱學(xué)習(xí)器(意味著它們也就比瞎猜好點(diǎn)),集成后仍然是一個(gè)強(qiáng)學(xué)習(xí)器(高準(zhǔn)確率),只要有足夠數(shù)量的弱學(xué)習(xí)者,他們就足夠多樣化。
這怎么可能?接下來(lái)的分析將幫助你解決這個(gè)疑問(wèn)。假設(shè)你有一個(gè)有偏差的硬幣,他有 51% 的幾率為正面,49% 的幾率為背面。如果你實(shí)驗(yàn) 1000 次,你會(huì)得到差不多 510 次正面,490 次背面,因此大多數(shù)都是正面。如果你用數(shù)學(xué)計(jì)算,你會(huì)發(fā)現(xiàn)在實(shí)驗(yàn) 1000 次后,正面概率為 51% 的人比例為 75%。你實(shí)驗(yàn)的次數(shù)越多,正面的比例越大(例如你試驗(yàn)了 10000 次,總體比例可能性就會(huì)達(dá)到 97%)。這是因?yàn)榇髷?shù)定律 :當(dāng)你一直用硬幣實(shí)驗(yàn)時(shí),正面的比例會(huì)越來(lái)越接近 51%。圖 7-3 展示了始終有偏差的硬幣實(shí)驗(yàn)。你可以看到當(dāng)實(shí)驗(yàn)次數(shù)上升時(shí),正面的概率接近于 51%。最終所有 10 種實(shí)驗(yàn)都會(huì)收斂到 51%,它們都大于 50%。
同樣的,假設(shè)你創(chuàng)建了一個(gè)包含 1000 個(gè)分類(lèi)器的集成模型,其中每個(gè)分類(lèi)器的正確率只有 51%(僅比瞎猜好一點(diǎn)點(diǎn))。如果你用投票去預(yù)測(cè)類(lèi)別,你可能得到 75% 的準(zhǔn)確率!然而,這僅僅在所有的分類(lèi)器都獨(dú)立運(yùn)行的很好、不會(huì)發(fā)生有相關(guān)性的錯(cuò)誤的情況下才會(huì)這樣,然而每一個(gè)分類(lèi)器都在同一個(gè)數(shù)據(jù)集上訓(xùn)練,導(dǎo)致其很可能會(huì)發(fā)生這樣的錯(cuò)誤。他們可能會(huì)犯同一種錯(cuò)誤,所以也會(huì)有很多票投給了錯(cuò)誤類(lèi)別導(dǎo)致集成的準(zhǔn)確率下降。
如果使每一個(gè)分類(lèi)器都獨(dú)立自主的分類(lèi),那么集成模型會(huì)工作的很好。去得到多樣的分類(lèi)器的方法之一就是用完全不同的算法,這會(huì)使它們會(huì)做出不同種類(lèi)的錯(cuò)誤,這會(huì)提高集成的正確率
接下來(lái)的代碼創(chuàng)建和訓(xùn)練了在 sklearn 中的投票分類(lèi)器。這個(gè)分類(lèi)器由三個(gè)不同的分類(lèi)器組成(訓(xùn)練集是第五章中的 moons 數(shù)據(jù)集):
>>> 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)
讓我們看一下在測(cè)試集上的準(zhǔn)確率:
>>> 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.864 RandomForestClassifier 0.872 SVC 0.888 VotingClassifier 0.896
你看!投票分類(lèi)器比其他單獨(dú)的分類(lèi)器表現(xiàn)的都要好。
如果所有的分類(lèi)器都能夠預(yù)測(cè)類(lèi)別的概率(例如他們有一個(gè)predict_proba()方法),那么你就可以讓 sklearn 以最高的類(lèi)概率來(lái)預(yù)測(cè)這個(gè)類(lèi),平均在所有的分類(lèi)器上。這種方式叫做軟投票。他經(jīng)常比硬投票表現(xiàn)的更好,因?yàn)樗o予高自信的投票更大的權(quán)重。你可以通過(guò)把voting="hard"設(shè)置為voting="soft"來(lái)保證分類(lèi)器可以預(yù)測(cè)類(lèi)別概率。然而這不是 SVC 類(lèi)的分類(lèi)器默認(rèn)的選項(xiàng),所以你需要把它的probability hyperparameter設(shè)置為T(mén)rue(這會(huì)使 SVC 使用交叉驗(yàn)證去預(yù)測(cè)類(lèi)別概率,其降低了訓(xùn)練速度,但會(huì)添加predict_proba()方法)。如果你修改了之前的代碼去使用軟投票,你會(huì)發(fā)現(xiàn)投票分類(lèi)器正確率高達(dá) 91%
Bagging 和 Pasting
換句話(huà)說(shuō),Bagging 和 Pasting 都允許在多個(gè)分類(lèi)器間對(duì)訓(xùn)練集進(jìn)行多次采樣,但只有 Bagging
就像之前講到的,可以通過(guò)使用不同的訓(xùn)練算法去得到一些不同的分類(lèi)器。另一種方法就是對(duì)每一個(gè)分類(lèi)器都使用相同的訓(xùn)練算法,但是在不同的訓(xùn)練集上去訓(xùn)練它們。有放回采樣被稱(chēng)為裝袋(Bagging,是 bootstrap aggregating 的縮寫(xiě))。無(wú)放回采樣稱(chēng)為粘貼(pasting)。
換句話(huà)說(shuō),Bagging 和 Pasting 都允許在多個(gè)分類(lèi)器上對(duì)訓(xùn)練集進(jìn)行多次采樣,但只有 Bagging 允許對(duì)同一種分類(lèi)器上對(duì)訓(xùn)練集進(jìn)行進(jìn)行多次采樣。采樣和訓(xùn)練過(guò)程如圖7-4所示。
當(dāng)所有的分類(lèi)器被訓(xùn)練后,集成可以通過(guò)對(duì)所有分類(lèi)器結(jié)果的簡(jiǎn)單聚合來(lái)對(duì)新的實(shí)例進(jìn)行預(yù)測(cè)。聚合函數(shù)通常對(duì)分類(lèi)是統(tǒng)計(jì)模式(例如硬投票分類(lèi)器)或者對(duì)回歸是平均。每一個(gè)單獨(dú)的分類(lèi)器在如果在原始訓(xùn)練集上都是高偏差,但是聚合降低了偏差和方差。通常情況下,集成的結(jié)果是有一個(gè)相似的偏差,但是對(duì)比與在原始訓(xùn)練集上的單一分類(lèi)器來(lái)講有更小的方差。
正如你在圖 7-4 上所看到的,分類(lèi)器可以通過(guò)不同的 CPU 核或其他的服務(wù)器一起被訓(xùn)練。相似的,分類(lèi)器也可以一起被制作。這就是為什么 Bagging 和 Pasting 是如此流行的原因之一:它們的可擴(kuò)展性很好。
在 sklearn 中的 Bagging 和 Pasting
sklearn 為 Bagging 和 Pasting 提供了一個(gè)簡(jiǎn)單的API:BaggingClassifier類(lèi)(或者對(duì)于回歸可以是BaggingRegressor。接下來(lái)的代碼訓(xùn)練了一個(gè) 500 個(gè)決策樹(shù)分類(lèi)器的集成,每一個(gè)都是在數(shù)據(jù)集上有放回采樣 100 個(gè)訓(xùn)練實(shí)例下進(jìn)行訓(xùn)練(這是 Bagging 的例子,如果你想嘗試 Pasting,就設(shè)置bootstrap=False)。n_jobs參數(shù)告訴 sklearn 用于訓(xùn)練和預(yù)測(cè)所需要 CPU 核的數(shù)量。(-1 代表著 sklearn 會(huì)使用所有空閑核):
>>>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)
如果基分類(lèi)器可以預(yù)測(cè)類(lèi)別概率(例如它擁有predict_proba()方法),那么BaggingClassifier會(huì)自動(dòng)的運(yùn)行軟投票,這是決策樹(shù)分類(lèi)器的情況。
圖 7-5 對(duì)比了單一決策樹(shù)的決策邊界和 Bagging 集成 500 個(gè)樹(shù)的決策邊界,兩者都在 moons 數(shù)據(jù)集上訓(xùn)練。正如你所看到的,集成的分類(lèi)比起單一決策樹(shù)的分類(lèi)產(chǎn)生情況更好:集成有一個(gè)可比較的偏差但是有一個(gè)較小的方差(它在訓(xùn)練集上的錯(cuò)誤數(shù)目大致相同,但決策邊界較不規(guī)則)。
Bootstrap 在每個(gè)預(yù)測(cè)器被訓(xùn)練的子集中引入了更多的分集,所以 Bagging 結(jié)束時(shí)的偏差比 Pasting 更高,但這也意味著預(yù)測(cè)因子最終變得不相關(guān),從而減少了集合的方差??傮w而言,Bagging 通常會(huì)導(dǎo)致更好的模型,這就解釋了為什么它通常是首選的。然而,如果你有空閑時(shí)間和 CPU 功率,可以使用交叉驗(yàn)證來(lái)評(píng)估 Bagging 和 Pasting 哪一個(gè)更好。
Out-of-Bag 評(píng)價(jià)
對(duì)于 Bagging 來(lái)說(shuō),一些實(shí)例可能被一些分類(lèi)器重復(fù)采樣,但其他的有可能不會(huì)被采樣。BaggingClassifier默認(rèn)采樣。BaggingClassifier默認(rèn)是有放回的采樣m個(gè)實(shí)例 (bootstrap=True),其中m是訓(xùn)練集的大小,這意味著平均下來(lái)只有63%的訓(xùn)練實(shí)例被每個(gè)分類(lèi)器采樣,剩下的37%個(gè)沒(méi)有被采樣的訓(xùn)練實(shí)例就叫做 Out-of-Bag 實(shí)例。注意對(duì)于每一個(gè)的分類(lèi)器它們的 37% 不是相同的。
因?yàn)樵谟?xùn)練中分類(lèi)器從來(lái)沒(méi)有看到過(guò) oob 實(shí)例,所以它可以在這些實(shí)例上進(jìn)行評(píng)估,而不需要單獨(dú)的驗(yàn)證集或交叉驗(yàn)證。你可以拿出每一個(gè)分類(lèi)器的 oob 來(lái)評(píng)估集成本身。
在 sklearn 中,你可以在訓(xùn)練后需要?jiǎng)?chuàng)建一個(gè)BaggingClassifier來(lái)自動(dòng)評(píng)估時(shí)設(shè)置oob_score=True來(lái)自動(dòng)評(píng)估。接下來(lái)的代碼展示了這個(gè)操作。評(píng)估結(jié)果通過(guò)變量oob_score_來(lái)顯示:
>>> 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_ 0.93066666666666664
根據(jù)這個(gè) obb 評(píng)估,BaggingClassifier可以再測(cè)試集上達(dá)到93.1%的準(zhǔn)確率,讓我們修改一下:
>>> from sklearn.metrics import accuracy_score >>> y_pred = bag_clf.predict(X_test) >>> accuracy_score(y_test, y_pred) 0.93600000000000005
我們?cè)跍y(cè)試集上得到了 93.6% 的準(zhǔn)確率,足夠接近了!
對(duì)于每個(gè)訓(xùn)練實(shí)例 oob 決策函數(shù)也可通過(guò)oob_decision_function_變量來(lái)展示。在這種情況下(當(dāng)基決策器有predict_proba()時(shí))決策函數(shù)會(huì)對(duì)每個(gè)訓(xùn)練實(shí)例返回類(lèi)別概率。例如,oob 評(píng)估預(yù)測(cè)第二個(gè)訓(xùn)練實(shí)例有 60.6% 的概率屬于正類(lèi)(39.4% 屬于負(fù)類(lèi)):
>>> bag_clf.oob_decision_function_ array([[ 0., 1.], [ 0.60588235, 0.39411765],[ 1., 0. ], ... [ 1. , 0. ],[ 0., 1.],[ 0.48958333, 0.51041667]])
-
分類(lèi)器
+關(guān)注
關(guān)注
0文章
153瀏覽量
13671 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8541瀏覽量
136233 -
決策樹(shù)
+關(guān)注
關(guān)注
3文章
96瀏覽量
14011
原文標(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)先 登錄
機(jī)器學(xué)習(xí)算法之隨機(jī)森林算法詳解及工作原理圖解
不可錯(cuò)過(guò) | 集成學(xué)習(xí)入門(mén)精講
解讀決策樹(shù)與隨機(jī)森林模型的概念
基于隨機(jī)森林RF和欠采樣集成的垃圾網(wǎng)頁(yè)檢測(cè)
基于稀疏隨機(jī)森林模型的用電側(cè)異常行為檢測(cè)
淺談機(jī)器學(xué)習(xí)技術(shù)中的隨機(jī)森林算法
一種基于數(shù)據(jù)集成的隨機(jī)森林算法
隨機(jī)森林的概念、工作原理及用例
利用隨機(jī)森林進(jìn)行特征重要性評(píng)估
隨機(jī)森林算法及其實(shí)現(xiàn)
基于Python實(shí)現(xiàn)隨機(jī)森林算法
什么是隨機(jī)森林?隨機(jī)森林的工作原理

集成學(xué)習(xí)和隨機(jī)森林,提供代碼實(shí)現(xiàn)
評(píng)論