假設(shè)你去隨機(jī)問很多人一個(gè)很復(fù)雜的問題,然后把它們的答案合并起來。通常情況下你會(huì)發(fā)現(xiàn)這個(gè)合并的答案比一個(gè)專家的答案要好。這就叫做群體智慧。同樣的,如果你合并了一組分類器的預(yù)測(cè)(像分類或者回歸),你也會(huì)得到一個(gè)比單一分類器更好的預(yù)測(cè)結(jié)果。這一組分類器就叫做集成;因此,這個(gè)技術(shù)就叫做集成學(xué)習(xí),一個(gè)集成學(xué)習(xí)算法就叫做集成方法。
例如,你可以訓(xùn)練一組決策樹分類器,每一個(gè)都在一個(gè)隨機(jī)的訓(xùn)練集上。為了去做預(yù)測(cè),你必須得到所有單一樹的預(yù)測(cè)值,然后通過投票(例如第六章的練習(xí))來預(yù)測(cè)類別。例如一種決策樹的集成就叫做隨機(jī)森林,它除了簡(jiǎn)單之外也是現(xiàn)今存在的最強(qiáng)大的機(jī)器學(xué)習(xí)算法之一。
向我們?cè)诘诙掠懻摰囊粯樱覀儠?huì)在一個(gè)項(xiàng)目快結(jié)束的時(shí)候使用集成算法,一旦你建立了一些好的分類器,就把他們合并為一個(gè)更好的分類器。事實(shí)上,在機(jī)器學(xué)習(xí)競(jìng)賽中獲得勝利的算法經(jīng)常會(huì)包含一些集成方法。
在本章中我們會(huì)討論一下特別著名的集成方法,包括 bagging, boosting, stacking,和其他一些算法。我們也會(huì)討論隨機(jī)森林。
投票分類
假設(shè)你已經(jīng)訓(xùn)練了一些分類器,每一個(gè)都有 80% 的準(zhǔn)確率。你可能有了一個(gè)邏輯斯蒂回歸、或一個(gè) SVM、或一個(gè)隨機(jī)森林,或者一個(gè) KNN,或許還有更多(詳見圖 7-1)
一個(gè)非常簡(jiǎn)單去創(chuàng)建一個(gè)更好的分類器的方法就是去整合每一個(gè)分類器的預(yù)測(cè)然后經(jīng)過投票去預(yù)測(cè)分類。這種分類器就叫做硬投票分類器(詳見圖 7-2)。
令人驚奇的是這種投票分類器得出的結(jié)果經(jīng)常會(huì)比集成中最好的一個(gè)分類器結(jié)果更好。事實(shí)上,即使每一個(gè)分類器都是一個(gè)弱學(xué)習(xí)器(意味著它們也就比瞎猜好點(diǎn)),集成后仍然是一個(gè)強(qiáng)學(xué)習(xí)器(高準(zhǔn)確率),只要有足夠數(shù)量的弱學(xué)習(xí)者,他們就足夠多樣化。
這怎么可能?接下來的分析將幫助你解決這個(gè)疑問。假設(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ì)越來越接近 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è)分類器的集成模型,其中每個(gè)分類器的正確率只有 51%(僅比瞎猜好一點(diǎn)點(diǎn))。如果你用投票去預(yù)測(cè)類別,你可能得到 75% 的準(zhǔn)確率!然而,這僅僅在所有的分類器都獨(dú)立運(yùn)行的很好、不會(huì)發(fā)生有相關(guān)性的錯(cuò)誤的情況下才會(huì)這樣,然而每一個(gè)分類器都在同一個(gè)數(shù)據(jù)集上訓(xùn)練,導(dǎo)致其很可能會(huì)發(fā)生這樣的錯(cuò)誤。他們可能會(huì)犯同一種錯(cuò)誤,所以也會(huì)有很多票投給了錯(cuò)誤類別導(dǎo)致集成的準(zhǔn)確率下降。
如果使每一個(gè)分類器都獨(dú)立自主的分類,那么集成模型會(huì)工作的很好。去得到多樣的分類器的方法之一就是用完全不同的算法,這會(huì)使它們會(huì)做出不同種類的錯(cuò)誤,這會(huì)提高集成的正確率
接下來的代碼創(chuàng)建和訓(xùn)練了在 sklearn 中的投票分類器。這個(gè)分類器由三個(gè)不同的分類器組成(訓(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
你看!投票分類器比其他單獨(dú)的分類器表現(xiàn)的都要好。
如果所有的分類器都能夠預(yù)測(cè)類別的概率(例如他們有一個(gè)predict_proba()方法),那么你就可以讓 sklearn 以最高的類概率來預(yù)測(cè)這個(gè)類,平均在所有的分類器上。這種方式叫做軟投票。他經(jīng)常比硬投票表現(xiàn)的更好,因?yàn)樗o予高自信的投票更大的權(quán)重。你可以通過把voting="hard"設(shè)置為voting="soft"來保證分類器可以預(yù)測(cè)類別概率。然而這不是 SVC 類的分類器默認(rèn)的選項(xiàng),所以你需要把它的probability hyperparameter設(shè)置為True(這會(huì)使 SVC 使用交叉驗(yàn)證去預(yù)測(cè)類別概率,其降低了訓(xùn)練速度,但會(huì)添加predict_proba()方法)。如果你修改了之前的代碼去使用軟投票,你會(huì)發(fā)現(xiàn)投票分類器正確率高達(dá) 91%
Bagging 和 Pasting
換句話說,Bagging 和 Pasting 都允許在多個(gè)分類器間對(duì)訓(xùn)練集進(jìn)行多次采樣,但只有 Bagging
就像之前講到的,可以通過使用不同的訓(xùn)練算法去得到一些不同的分類器。另一種方法就是對(duì)每一個(gè)分類器都使用相同的訓(xùn)練算法,但是在不同的訓(xùn)練集上去訓(xùn)練它們。有放回采樣被稱為裝袋(Bagging,是 bootstrap aggregating 的縮寫)。無放回采樣稱為粘貼(pasting)。
換句話說,Bagging 和 Pasting 都允許在多個(gè)分類器上對(duì)訓(xùn)練集進(jìn)行多次采樣,但只有 Bagging 允許對(duì)同一種分類器上對(duì)訓(xùn)練集進(jìn)行進(jìn)行多次采樣。采樣和訓(xùn)練過程如圖7-4所示。
當(dāng)所有的分類器被訓(xùn)練后,集成可以通過對(duì)所有分類器結(jié)果的簡(jiǎn)單聚合來對(duì)新的實(shí)例進(jìn)行預(yù)測(cè)。聚合函數(shù)通常對(duì)分類是統(tǒng)計(jì)模式(例如硬投票分類器)或者對(duì)回歸是平均。每一個(gè)單獨(dú)的分類器在如果在原始訓(xùn)練集上都是高偏差,但是聚合降低了偏差和方差。通常情況下,集成的結(jié)果是有一個(gè)相似的偏差,但是對(duì)比與在原始訓(xùn)練集上的單一分類器來講有更小的方差。
正如你在圖 7-4 上所看到的,分類器可以通過不同的 CPU 核或其他的服務(wù)器一起被訓(xùn)練。相似的,分類器也可以一起被制作。這就是為什么 Bagging 和 Pasting 是如此流行的原因之一:它們的可擴(kuò)展性很好。
在 sklearn 中的 Bagging 和 Pasting
sklearn 為 Bagging 和 Pasting 提供了一個(gè)簡(jiǎn)單的API:BaggingClassifier類(或者對(duì)于回歸可以是BaggingRegressor。接下來的代碼訓(xùn)練了一個(gè) 500 個(gè)決策樹分類器的集成,每一個(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)
如果基分類器可以預(yù)測(cè)類別概率(例如它擁有predict_proba()方法),那么BaggingClassifier會(huì)自動(dòng)的運(yùn)行軟投票,這是決策樹分類器的情況。
圖 7-5 對(duì)比了單一決策樹的決策邊界和 Bagging 集成 500 個(gè)樹的決策邊界,兩者都在 moons 數(shù)據(jù)集上訓(xùn)練。正如你所看到的,集成的分類比起單一決策樹的分類產(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)證來評(píng)估 Bagging 和 Pasting 哪一個(gè)更好。
Out-of-Bag 評(píng)價(jià)
對(duì)于 Bagging 來說,一些實(shí)例可能被一些分類器重復(fù)采樣,但其他的有可能不會(huì)被采樣。BaggingClassifier默認(rèn)采樣。BaggingClassifier默認(rèn)是有放回的采樣m個(gè)實(shí)例 (bootstrap=True),其中m是訓(xùn)練集的大小,這意味著平均下來只有63%的訓(xùn)練實(shí)例被每個(gè)分類器采樣,剩下的37%個(gè)沒有被采樣的訓(xùn)練實(shí)例就叫做 Out-of-Bag 實(shí)例。注意對(duì)于每一個(gè)的分類器它們的 37% 不是相同的。
因?yàn)樵谟?xùn)練中分類器從來沒有看到過 oob 實(shí)例,所以它可以在這些實(shí)例上進(jìn)行評(píng)估,而不需要單獨(dú)的驗(yàn)證集或交叉驗(yàn)證。你可以拿出每一個(gè)分類器的 oob 來評(píng)估集成本身。
在 sklearn 中,你可以在訓(xùn)練后需要?jiǎng)?chuàng)建一個(gè)BaggingClassifier來自動(dòng)評(píng)估時(shí)設(shè)置oob_score=True來自動(dòng)評(píng)估。接下來的代碼展示了這個(gè)操作。評(píng)估結(jié)果通過變量oob_score_來顯示:
>>> 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ù)也可通過oob_decision_function_變量來展示。在這種情況下(當(dāng)基決策器有predict_proba()時(shí))決策函數(shù)會(huì)對(duì)每個(gè)訓(xùn)練實(shí)例返回類別概率。例如,oob 評(píng)估預(yù)測(cè)第二個(gè)訓(xùn)練實(shí)例有 60.6% 的概率屬于正類(39.4% 屬于負(fù)類):
>>> bag_clf.oob_decision_function_ array([[ 0., 1.], [ 0.60588235, 0.39411765],[ 1., 0. ], ... [ 1. , 0. ],[ 0., 1.],[ 0.48958333, 0.51041667]])
-
分類器
+關(guān)注
關(guān)注
0文章
152瀏覽量
13162 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8349瀏覽量
132312 -
決策樹
+關(guān)注
關(guān)注
2文章
96瀏覽量
13534
原文標(biāo)題:【翻譯】Sklearn 與 TensorFlow 機(jī)器學(xué)習(xí)實(shí)用指南 —— 第7章 集成學(xué)習(xí)和隨機(jī)森林(上)
文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論