<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    【機(jī)器學(xué)習(xí)】集成模型方法

    共 21989字,需瀏覽 44分鐘

     ·

    2021-06-08 10:59


    作者 | Salma Elshahawy, MSc.

    編譯 | VK
    來(lái)源 | Towards Data Science



    介紹


    我們之前討論了一些利用機(jī)器學(xué)習(xí)(ML)模型預(yù)測(cè)能力的常用方法。這些方法主要通過(guò)將數(shù)據(jù)分解成特定的方案來(lái)提高模型的可推廣性。
    然而,有更先進(jìn)的方法來(lái)提高模型的性能,如集成算法。在這篇文章中,我們將討論和比較多種集成算法的性能。所以,讓我們開(kāi)始吧!
    集成方法旨在將多個(gè)基估計(jì)器的預(yù)測(cè)組合起來(lái),而不是單一估計(jì)器,從而利用模型的泛化和魯棒性。


    預(yù)備知識(shí)


    1. 我將使用托管在Kaggle上的UCIML公共存儲(chǔ)庫(kù)中的toy數(shù)據(jù)集(https://www.kaggle.com/uciml/pima-indians-diabetes-database);它有九列,包括目標(biāo)變量。如果你想使用,GitHub筆記本鏈接如下:https://github.com/salma71/blog_post/blob/master/Evaluate_ML_models_with_ensamble.ipynb。
    2. 在處理時(shí),我使用kaggle api獲取數(shù)據(jù)集。如果你在Kaggle上沒(méi)有帳戶,只需下載數(shù)據(jù)集,并跳過(guò)筆記本中的這一部分。
    我獲取數(shù)據(jù)并將其下載到google colab,確保在運(yùn)行它之前生成自己的令牌。
    1. 在構(gòu)建模型之前,我對(duì)數(shù)據(jù)集做了一些基本的預(yù)處理,比如插補(bǔ)缺失的數(shù)據(jù),以避免錯(cuò)誤。
    2. 我創(chuàng)建了兩個(gè)單獨(dú)的筆記本,一個(gè)用來(lái)比較前三個(gè)集成模型。第二種方法是使用MLens庫(kù)實(shí)現(xiàn)堆疊集成。


    集成方法


    集成是建立各種模型的過(guò)程,然后將它們混合以產(chǎn)生更好的預(yù)測(cè)。與單個(gè)模型相比,集成能夠?qū)崿F(xiàn)更精確的預(yù)測(cè)。在ML比賽中,利用集成通常會(huì)帶來(lái)優(yōu)勢(shì)。你可以找到CrowdFlower winners的團(tuán)隊(duì)采訪,他們用集成贏得了比賽:https://medium.com/kaggle-blog/crowdflower-winners-interview-3rd-place-team-quartet-cead438f8918


    1.Bagging — Bootstrap聚合:


    Bootstrap聚合傾向于從不同的子樣本構(gòu)建多個(gè)模型(使用相同類型的算法),并從訓(xùn)練數(shù)據(jù)集中替換。
    Bagging是將多個(gè)好的模型集成在一起,以減少模型的方差。
    Bagging有三種類型的集成,如下所示:

    1.1Bagging決策樹(shù)

    Bagging在產(chǎn)生高方差預(yù)測(cè)的算法中表現(xiàn)最好。在下面的示例中,我們將在sklearn庫(kù)中開(kāi)發(fā)BaggingClassifier和DecisionTreeClassifier的組合。
    請(qǐng)注意,由于隨機(jī)學(xué)習(xí)的性質(zhì),結(jié)果可能會(huì)有所不同!
    from sklearn.ensemble import BaggingClassifier

    tree = 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.000000

    1.2 隨機(jī)森林(RF)

    隨機(jī)森林(RF)是一種元估計(jì)器,它在多個(gè)子樣本上擬合不同的決策樹(shù)分類器,并估計(jì)其平均準(zhǔn)確率。
    子樣本大小是恒定的,但是如果bootstrap=True(默認(rèn)),樣本將被替換。
    現(xiàn)在,讓我們來(lái)嘗試一下隨機(jī)森林(RF)模型。RF的工作原理與bagged decision tree類類似;但是,它降低了單個(gè)分類器之間的相關(guān)性。RF只考慮每個(gè)分割特征的隨機(jī)子集,而不是采用貪婪的方法來(lái)選擇最佳分割點(diǎn)。
    from sklearn.ensemble import RandomForestClassifier

    rf_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.000000

    1.3額外樹(shù)(Extra trees,ET)

    額外樹(shù)(ET)是對(duì)Bagging的一種改進(jìn)。ExtraTreesClassifier()是sklearn庫(kù)中的一個(gè)類,它創(chuàng)建一個(gè)元估計(jì)器來(lái)擬合不同子樣本的幾個(gè)隨機(jī)決策樹(shù)(又稱ET)。然后,ET計(jì)算子樣本之間的平均預(yù)測(cè)。這樣可以提高模型的準(zhǔn)確率并控制過(guò)擬合。
    from sklearn.ensemble import ExtraTreesClassifier

    ex_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.000000


    2. Boosting


    Boosting是另一種構(gòu)建多個(gè)模型(同樣來(lái)自同一類型)的技術(shù);但是,每個(gè)模型在模型序列中修復(fù)前一個(gè)模型的預(yù)測(cè)錯(cuò)誤。Boosting主要用于平衡有監(jiān)督機(jī)器學(xué)習(xí)模型中的偏差和方差。Boosting是一種將弱學(xué)習(xí)者轉(zhuǎn)化為強(qiáng)學(xué)習(xí)者的算法。
    Boosting算法從弱估計(jì)器中建立了一個(gè)連續(xù)的基估計(jì)器,從而減小了組合估計(jì)器的偏差。

    2.1 AdaBoost(AD)

    AdaBoost(AD)通過(guò)分類特征來(lái)給數(shù)據(jù)集實(shí)例添加權(quán)重。這使得算法能夠在構(gòu)建后續(xù)模型時(shí)考慮這些特征。
    from sklearn.ensemble import AdaBoostClassifier

    ada_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.000000

    2.2 隨機(jī)梯度增強(qiáng)(SGB)

    隨機(jī)梯度增強(qiáng)(SGB)是一種先進(jìn)的集成算法。在每次迭代中,SGB從訓(xùn)練集中隨機(jī)抽取一個(gè)子樣本(無(wú)需替換)。然后利用子樣本對(duì)基礎(chǔ)模型(學(xué)習(xí)者)進(jìn)行擬合,直到誤差趨于穩(wěn)定。
    from sklearn.ensemble import GradientBoostingClassifier

    grad_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.000000


    3.投票


    投票是一套同樣表現(xiàn)良好的模式,以平衡他們的弱點(diǎn)。投票采用三種方法進(jìn)行投票程序,硬、軟和加權(quán)。
    1. 硬投票-大多數(shù)的類標(biāo)簽預(yù)測(cè)。
    2. 軟投票-預(yù)測(cè)概率之和的argmax。
    3. 加權(quán)投票-預(yù)測(cè)概率加權(quán)和的argmax。
    投票很簡(jiǎn)單,也很容易實(shí)現(xiàn)。首先,它從數(shù)據(jù)集中創(chuàng)建兩個(gè)獨(dú)立的模型(可能更多,取決于用例)。在引入新數(shù)據(jù)時(shí),采用投票分類器對(duì)模型進(jìn)行包裝,并對(duì)子模型的預(yù)測(cè)進(jìn)行平均。
    from sklearn.ensemble import VotingClassifier
    from sklearn.linear_model import LogisticRegression
    from sklearn.svm import SVC

    estimators = []
    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.000000


    4.堆疊


    堆疊的工作原理與投票集成相同。然而,堆疊可以調(diào)整子模型預(yù)測(cè)順序——作為元模型的輸入,以提高性能。換句話說(shuō),堆疊從每個(gè)模型的算法中產(chǎn)生預(yù)測(cè);隨后,元模型使用這些預(yù)測(cè)作為輸入(權(quán)重)來(lái)創(chuàng)建最終輸出。
    堆疊的優(yōu)勢(shì)在于它可以結(jié)合不同的強(qiáng)大的學(xué)習(xí)者,與獨(dú)立的模型相比它作出精確和穩(wěn)健的預(yù)測(cè)。
    sklearn庫(kù)在集成模塊下有StackingClassifier()。但是,我將使用ML集成庫(kù)實(shí)現(xiàn)堆疊集成。
    為了在堆疊和以前的集成之間做一個(gè)公平的比較,我用10折重新計(jì)算了以前的準(zhǔn)確率。
    from mlens.ensemble import SuperLearner

    # 創(chuàng)建基礎(chǔ)模型列表
    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 models

    def 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

    # 超級(jí)學(xué)習(xí)者
    ensemble = get_super_learner(X_train)
    # 擬合
    ensemble.fit(X_train, y_train)
    # 摘要
    print(ensemble.data)
    # 預(yù)測(cè)
    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 go

    fig = 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()
    如圖所示,堆疊集合在測(cè)試集上表現(xiàn)良好,最高分類準(zhǔn)確率為76.623%。


    5.結(jié)論和收獲


    我們已經(jīng)探索了幾種類型的集成,并學(xué)習(xí)如何以正確的方式實(shí)現(xiàn)它們,以擴(kuò)展模型的預(yù)測(cè)能力。我們還總結(jié)了一些需要考慮的要點(diǎn):
    1. 堆疊算法在精度、魯棒性等方面都有提高,具有較好的泛化能力。
    2. 當(dāng)我們想要設(shè)置性能良好的模型以平衡其弱點(diǎn)時(shí),可以使用投票。
    3. Boosting是一個(gè)很好的集成方法,它只是把多個(gè)弱的學(xué)習(xí)者結(jié)合起來(lái),得到一個(gè)強(qiáng)大的學(xué)習(xí)者。
    4. 當(dāng)你想通過(guò)組合不同的好模型來(lái)生成方差較小的模型時(shí),可以考慮Bagging—減少過(guò)擬合。
    5. 選擇合適的組合取決于業(yè)務(wù)問(wèn)題和你想要的結(jié)果。

    最后,我希望這能為實(shí)現(xiàn)集成提供一個(gè)全面的指導(dǎo)。

    往期精彩回顧





    本站qq群851320808,加入微信群請(qǐng)掃碼:

    瀏覽 132
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    无码精品人妻 | 国产AV电影网 | 亚州精品天堂中文字幕 | 成人叉B网| 欧美性高潮 |