【机器学习】集成模型方法
作者 | Salma Elshahawy, MSc.
編譯 | VK
來源 | Towards Data Science
介紹
我們之前討論了一些利用機器學習(ML)模型預測能力的常用方法。這些方法主要通過將數據分解成特定的方案來提高模型的可推廣性。
然而,有更先進的方法來提高模型的性能,如集成算法。在這篇文章中,我們將討論和比較多種集成算法的性能。所以,讓我們開始吧!
集成方法旨在將多個基估計器的預測組合起來,而不是單一估計器,從而利用模型的泛化和魯棒性。
預備知識
我將使用托管在Kaggle上的UCIML公共存儲庫中的toy數據集(https://www.kaggle.com/uciml/pima-indians-diabetes-database);它有九列,包括目標變量。如果你想使用,GitHub筆記本鏈接如下:https://github.com/salma71/blog_post/blob/master/Evaluate_ML_models_with_ensamble.ipynb。
在處理時,我使用kaggle api獲取數據集。如果你在Kaggle上沒有帳戶,只需下載數據集,并跳過筆記本中的這一部分。
我獲取數據并將其下載到google colab,確保在運行它之前生成自己的令牌。
在構建模型之前,我對數據集做了一些基本的預處理,比如插補缺失的數據,以避免錯誤。
我創建了兩個單獨的筆記本,一個用來比較前三個集成模型。第二種方法是使用MLens庫實現堆疊集成。
集成方法
集成是建立各種模型的過程,然后將它們混合以產生更好的預測。與單個模型相比,集成能夠實現更精確的預測。在ML比賽中,利用集成通常會帶來優勢。你可以找到CrowdFlower winners的團隊采訪,他們用集成贏得了比賽:https://medium.com/kaggle-blog/crowdflower-winners-interview-3rd-place-team-quartet-cead438f8918
1.Bagging — Bootstrap聚合:
Bootstrap聚合傾向于從不同的子樣本構建多個模型(使用相同類型的算法),并從訓練數據集中替換。
Bagging是將多個好的模型集成在一起,以減少模型的方差。
Bagging有三種類型的集成,如下所示:
1.1Bagging決策樹
Bagging在產生高方差預測的算法中表現最好。在下面的示例中,我們將在sklearn庫中開發BaggingClassifier和DecisionTreeClassifier的組合。
請注意,由于隨機學習的性質,結果可能會有所不同!
from?sklearn.ensemble?import?BaggingClassifiertree?=?DecisionTreeClassifier() bagging_clf?=?BaggingClassifier(base_estimator=tree,?n_estimators=1500,?random_state=42) bagging_clf.fit(X_train,?y_train)evaluate(bagging_clf,?X_train,?X_test,?y_train,?y_test)TRAINIG?RESULTS:? =============================== CONFUSION?MATRIX: [[350???0][??0?187]] ACCURACY?SCORE: 1.0000 CLASSIFICATION?REPORT:0??????1??accuracy??macro?avg??weighted?avg precision????1.0????1.0???????1.0????????1.0???????????1.0 recall???????1.0????1.0???????1.0????????1.0???????????1.0 f1-score?????1.0????1.0???????1.0????????1.0???????????1.0 support????350.0??187.0???????1.0??????537.0?????????537.0 TESTING?RESULTS:? =============================== CONFUSION?MATRIX: [[126??24][?38??43]] ACCURACY?SCORE: 0.7316 CLASSIFICATION?REPORT:0??????????1??accuracy???macro?avg??weighted?avg precision????0.768293???0.641791??0.731602????0.705042??????0.723935 recall???????0.840000???0.530864??0.731602????0.685432??????0.731602 f1-score?????0.802548???0.581081??0.731602????0.691814??????0.724891 support????150.000000??81.000000??0.731602??231.000000????231.0000001.2 隨機森林(RF)
隨機森林(RF)是一種元估計器,它在多個子樣本上擬合不同的決策樹分類器,并估計其平均準確率。
子樣本大小是恒定的,但是如果bootstrap=True(默認),樣本將被替換。
現在,讓我們來嘗試一下隨機森林(RF)模型。RF的工作原理與bagged decision tree類類似;但是,它降低了單個分類器之間的相關性。RF只考慮每個分割特征的隨機子集,而不是采用貪婪的方法來選擇最佳分割點。
from?sklearn.ensemble?import?RandomForestClassifierrf_clf?=?RandomForestClassifier(random_state=42,?n_estimators=1000) rf_clf.fit(X_train,?y_train) evaluate(rf_clf,?X_train,?X_test,?y_train,?y_test)TRAINIG?RESULTS:? =============================== CONFUSION?MATRIX: [[350???0][??0?187]] ACCURACY?SCORE: 1.0000 CLASSIFICATION?REPORT:0??????1??accuracy??macro?avg??weighted?avg precision????1.0????1.0???????1.0????????1.0???????????1.0 recall???????1.0????1.0???????1.0????????1.0???????????1.0 f1-score?????1.0????1.0???????1.0????????1.0???????????1.0 support????350.0??187.0???????1.0??????537.0?????????537.0 TESTING?RESULTS:? =============================== CONFUSION?MATRIX: [[127??23][?38??43]] ACCURACY?SCORE: 0.7359 CLASSIFICATION?REPORT:0??????????1??accuracy???macro?avg??weighted?avg precision????0.769697???0.651515??0.735931????0.710606??????0.728257 recall???????0.846667???0.530864??0.735931????0.688765??????0.735931 f1-score?????0.806349???0.585034??0.735931????0.695692??????0.728745 support????150.000000??81.000000??0.735931??231.000000????231.0000001.3額外樹(Extra trees,ET)
額外樹(ET)是對Bagging的一種改進。ExtraTreesClassifier()是sklearn庫中的一個類,它創建一個元估計器來擬合不同子樣本的幾個隨機決策樹(又稱ET)。然后,ET計算子樣本之間的平均預測。這樣可以提高模型的準確率并控制過擬合。
from?sklearn.ensemble?import?ExtraTreesClassifierex_tree_clf?=?ExtraTreesClassifier(n_estimators=1000,?max_features=7,?random_state=42) ex_tree_clf.fit(X_train,?y_train) evaluate(ex_tree_clf,?X_train,?X_test,?y_train,?y_test)TRAINIG?RESULTS:? =============================== CONFUSION?MATRIX: [[350???0][??0?187]] ACCURACY?SCORE: 1.0000 CLASSIFICATION?REPORT:0??????1??accuracy??macro?avg??weighted?avg precision????1.0????1.0???????1.0????????1.0???????????1.0 recall???????1.0????1.0???????1.0????????1.0???????????1.0 f1-score?????1.0????1.0???????1.0????????1.0???????????1.0 support????350.0??187.0???????1.0??????537.0?????????537.0 TESTING?RESULTS:? =============================== CONFUSION?MATRIX: [[124??26][?32??49]] ACCURACY?SCORE: 0.7489 CLASSIFICATION?REPORT:0??????????1??accuracy???macro?avg??weighted?avg precision????0.794872???0.653333??0.748918????0.724103??????0.745241 recall???????0.826667???0.604938??0.748918????0.715802??????0.748918 f1-score?????0.810458???0.628205??0.748918????0.719331??????0.746551 support????150.000000??81.000000??0.748918??231.000000????231.0000002. Boosting
Boosting是另一種構建多個模型(同樣來自同一類型)的技術;但是,每個模型在模型序列中修復前一個模型的預測錯誤。Boosting主要用于平衡有監督機器學習模型中的偏差和方差。Boosting是一種將弱學習者轉化為強學習者的算法。
Boosting算法從弱估計器中建立了一個連續的基估計器,從而減小了組合估計器的偏差。
2.1 AdaBoost(AD)
AdaBoost(AD)通過分類特征來給數據集實例添加權重。這使得算法能夠在構建后續模型時考慮這些特征。
from?sklearn.ensemble?import?AdaBoostClassifierada_boost_clf?=?AdaBoostClassifier(n_estimators=30) ada_boost_clf.fit(X_train,?y_train) evaluate(ada_boost_clf,?X_train,?X_test,?y_train,?y_test)TRAINIG?RESULTS:? =============================== CONFUSION?MATRIX: [[314??36][?49?138]] ACCURACY?SCORE: 0.8417 CLASSIFICATION?REPORT:0???????????1??accuracy???macro?avg??weighted?avg precision????0.865014????0.793103??0.841713????0.829059??0.839972 recall???????0.897143????0.737968??0.841713????0.817555??0.841713 f1-score?????0.880785????0.764543??0.841713????0.822664??0.840306 support????350.000000??187.000000??0.841713??537.000000??537.000000 TESTING?RESULTS:? =============================== CONFUSION?MATRIX: [[129??21][?36??45]] ACCURACY?SCORE: 0.7532 CLASSIFICATION?REPORT:0??????????1??accuracy???macro?avg??weighted?avg precision????0.781818???0.681818??0.753247????0.731818??????0.746753 recall???????0.860000???0.555556??0.753247????0.707778??????0.753247 f1-score?????0.819048???0.612245??0.753247????0.715646??????0.746532 support????150.000000??81.000000??0.753247??231.000000????231.0000002.2 隨機梯度增強(SGB)
隨機梯度增強(SGB)是一種先進的集成算法。在每次迭代中,SGB從訓練集中隨機抽取一個子樣本(無需替換)。然后利用子樣本對基礎模型(學習者)進行擬合,直到誤差趨于穩定。
from?sklearn.ensemble?import?GradientBoostingClassifiergrad_boost_clf?=?GradientBoostingClassifier(n_estimators=100,?random_state=42) grad_boost_clf.fit(X_train,?y_train) evaluate(grad_boost_clf,?X_train,?X_test,?y_train,?y_test)TRAINIG?RESULTS:? =============================== CONFUSION?MATRIX: [[339??11][?26?161]] ACCURACY?SCORE: 0.9311 CLASSIFICATION?REPORT:0???????????1??accuracy???macro?avg??weighted?avg precision????0.928767????0.936047??0.931099????0.932407??0.931302 recall???????0.968571????0.860963??0.931099????0.914767??0.931099 f1-score?????0.948252????0.896936??0.931099????0.922594??0.930382 support????350.000000??187.000000??0.931099??537.000000??537.000000 TESTING?RESULTS:? =============================== CONFUSION?MATRIX: [[126??24][?37??44]] ACCURACY?SCORE: 0.7359 CLASSIFICATION?REPORT:0??????????1??accuracy???macro?avg??weighted?avg precision????0.773006???0.647059??0.735931????0.710032??????0.728843 recall???????0.840000???0.543210??0.735931????0.691605??????0.735931 f1-score?????0.805112???0.590604??0.735931????0.697858??????0.729895 support????150.000000??81.000000??0.735931??231.000000????231.0000003.投票
投票是一套同樣表現良好的模式,以平衡他們的弱點。投票采用三種方法進行投票程序,硬、軟和加權。
硬投票-大多數的類標簽預測。
軟投票-預測概率之和的argmax。
加權投票-預測概率加權和的argmax。
投票很簡單,也很容易實現。首先,它從數據集中創建兩個獨立的模型(可能更多,取決于用例)。在引入新數據時,采用投票分類器對模型進行包裝,并對子模型的預測進行平均。
from?sklearn.ensemble?import?VotingClassifier from?sklearn.linear_model?import?LogisticRegression from?sklearn.svm?import?SVCestimators?=?[] log_reg?=?LogisticRegression(solver='liblinear') estimators.append(('Logistic',?log_reg))tree?=?DecisionTreeClassifier() estimators.append(('Tree',?tree))svm_clf?=?SVC(gamma='scale') estimators.append(('SVM',?svm_clf))voting?=?VotingClassifier(estimators=estimators) voting.fit(X_train,?y_train)evaluate(voting,?X_train,?X_test,?y_train,?y_test)TRAINIG?RESULTS:? =============================== CONFUSION?MATRIX: [[328??22][?75?112]] ACCURACY?SCORE: 0.8194 CLASSIFICATION?REPORT:0???????????1??accuracy???macro?avg??weighted?avg precision????0.813896????0.835821??0.819367????0.824858??0.821531 recall???????0.937143????0.598930??0.819367????0.768037??0.819367 f1-score?????0.871182????0.697819??0.819367????0.784501??0.810812 support????350.000000??187.000000??0.819367??537.000000??537.000000 TESTING?RESULTS:? =============================== CONFUSION?MATRIX: [[135??15][?40??41]] ACCURACY?SCORE: 0.7619 CLASSIFICATION?REPORT:0??????????1??accuracy???macro?avg??weighted?avg precision????0.771429???0.732143??0.761905????0.751786??????0.757653 recall???????0.900000???0.506173??0.761905????0.703086??????0.761905 f1-score?????0.830769???0.598540??0.761905????0.714655??????0.749338 support????150.000000??81.000000??0.761905??231.000000????231.0000004.堆疊
堆疊的工作原理與投票集成相同。然而,堆疊可以調整子模型預測順序——作為元模型的輸入,以提高性能。換句話說,堆疊從每個模型的算法中產生預測;隨后,元模型使用這些預測作為輸入(權重)來創建最終輸出。
堆疊的優勢在于它可以結合不同的強大的學習者,與獨立的模型相比它作出精確和穩健的預測。
sklearn庫在集成模塊下有StackingClassifier()。但是,我將使用ML集成庫實現堆疊集成。
為了在堆疊和以前的集成之間做一個公平的比較,我用10折重新計算了以前的準確率。
from?mlens.ensemble?import?SuperLearner#?創建基礎模型列表 def?get_models():models?=?list()models.append(LogisticRegression(solver='liblinear'))models.append(DecisionTreeClassifier())models.append(SVC(gamma='scale',?probability=True))models.append(GaussianNB())models.append(KNeighborsClassifier())models.append(AdaBoostClassifier())models.append(BaggingClassifier(n_estimators=10))models.append(RandomForestClassifier(n_estimators=10))models.append(ExtraTreesClassifier(n_estimators=10))return?modelsdef?get_super_learner(X):ensemble?=?SuperLearner(scorer=accuracy_score,?folds?=?10,?random_state=41)model?=?get_models()ensemble.add(model) #?添加一些層ensemble.add([LogisticRegression(),?RandomForestClassifier()])ensemble.add([LogisticRegression(),?SVC()]) #?添加元模型ensemble.add_meta(SVC())return?ensemble#?超級學習者 ensemble?=?get_super_learner(X_train) #?擬合 ensemble.fit(X_train,?y_train) #?摘要 print(ensemble.data) #?預測 yhat?=?ensemble.predict(X_test) print('Super?Learner:?%.3f'?%?(accuracy_score(y_test,?yhat)?*?100))ACCURACY?SCORE?ON?TRAIN:?83.24022346368714??? ACCURACY?SCORE?ON?TEST:?76.62337662337663比較性能
import?plotly.graph_objects?as?gofig?=?go.Figure() fig.add_trace(go.Bar(x?=?test['Algo'],y?=?test['Train'],text?=?test['Train'],textposition='auto',name?=?'Accuracy?on?Train?set',marker_color?=?'indianred'))fig.add_trace(go.Bar(x?=?test['Algo'],y?=?test['Test'],text?=?test['Test'],textposition='auto',name?=?'Accuracy?on?Test?set',marker_color?=?'lightsalmon'))fig.update_traces(texttemplate='%{text:.2f}') fig.update_layout(title_text='Comprehensive?comparasion?between?ensembles?on?Train?and?Test?set') fig.show()如圖所示,堆疊集合在測試集上表現良好,最高分類準確率為76.623%。
5.結論和收獲
我們已經探索了幾種類型的集成,并學習如何以正確的方式實現它們,以擴展模型的預測能力。我們還總結了一些需要考慮的要點:
堆疊算法在精度、魯棒性等方面都有提高,具有較好的泛化能力。
當我們想要設置性能良好的模型以平衡其弱點時,可以使用投票。
Boosting是一個很好的集成方法,它只是把多個弱的學習者結合起來,得到一個強大的學習者。
當你想通過組合不同的好模型來生成方差較小的模型時,可以考慮Bagging—減少過擬合。
選擇合適的組合取決于業務問題和你想要的結果。
最后,我希望這能為實現集成提供一個全面的指導。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习】集成模型方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 傲游浏览器怎么更换皮肤 浏览器皮肤更换方
- 下一篇: 爱奇艺怎么开启数据流量自动播放