<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 1.11. 集成方法 校驗者: [@zehuichen123](https://github.com/zehuichen123) [@JanzenLiu](https://github.com/JanzenLiu) [@小瑤](https://github.com/apachecn/scikit-learn-doc-zh) [@\\S^R^Y/](https://github.com/apachecn/scikit-learn-doc-zh) 翻譯者: [@StupidStalker](https://github.com/apachecn/scikit-learn-doc-zh) [@文誼](https://github.com/apachecn/scikit-learn-doc-zh) [@t9UhoI](https://github.com/apachecn/scikit-learn-doc-zh) `注意,在本文中 bagging 和 boosting 為了更好的保留原文意圖,不進行翻譯``estimator->估計器? base estimator->基估計器` **集成方法** 的目標是把多個使用給定學習算法構建的基估計器的預測結果結合起來,從而獲得比單個估計器更好的泛化能力/魯棒性。 集成方法通常分為兩種: - **平均方法**,該方法的原理是構建多個獨立的估計器,然后取它們的預測結果的平均。一般來說組合之后的估計器是會比單個估計器要好的,因為它的方差減小了。 **示例:** [Bagging 方法](#bagging) , [隨機森林](#forest) , … - 相比之下,在 **boosting 方法** 中,基估計器是依次構建的,并且每一個基估計器都嘗試去減少組合估計器的偏差。這種方法主要目的是為了結合多個弱模型,使集成的模型更加強大。 **示例:** [AdaBoost](#adaboost) , [梯度提升樹](#gradient-boosting) , … ## 1.11.1. Bagging meta-estimator(Bagging 元估計器) 在集成算法中,bagging 方法會在原始訓練集的隨機子集上構建一類黑盒估計器的多個實例,然后把這些估計器的預測結果結合起來形成最終的預測結果。 該方法通過在構建模型的過程中引入隨機性,來減少基估計器的方差(例如,決策樹)。 在多數情況下,bagging 方法提供了一種非常簡單的方式來對單一模型進行改進,而無需修改背后的算法。 因為 bagging 方法可以減小過擬合,所以通常在強分類器和復雜模型上使用時表現的很好(例如,完全決策樹,fully developed decision trees),相比之下 boosting 方法則在弱模型上表現更好(例如,淺層決策樹,shallow decision trees)。 bagging 方法有很多種,其主要區別在于隨機抽取訓練子集的方法不同: > - 如果抽取的數據集的隨機子集是樣例的隨機子集,我們叫做粘貼 (Pasting) [\[B1999\]](#b1999) 。 > - 如果樣例抽取是有放回的,我們稱為 Bagging [\[B1996\]](#b1996) 。 > - 如果抽取的數據集的隨機子集是特征的隨機子集,我們叫做隨機子空間 (Random Subspaces) [\[H1998\]](#h1998) 。 > - 最后,如果基估計器構建在對于樣本和特征抽取的子集之上時,我們叫做隨機補丁 (Random Patches) [\[LG2012\]](#lg2012) 。 在 scikit-learn 中,bagging 方法使用統一的 [`BaggingClassifier`](generated/sklearn.ensemble.BaggingClassifier.html#sklearn.ensemble.BaggingClassifier "sklearn.ensemble.BaggingClassifier") 元估計器(或者 [`BaggingRegressor`](generated/sklearn.ensemble.BaggingRegressor.html#sklearn.ensemble.BaggingRegressor "sklearn.ensemble.BaggingRegressor") ),輸入的參數和隨機子集抽取策略由用戶指定。`max_samples` 和 `max_features` 控制著子集的大小(對于樣例和特征), `bootstrap` 和 `bootstrap_features` 控制著樣例和特征的抽取是有放回還是無放回的。 當使用樣本子集時,通過設置 `oob_score=True` ,可以使用袋外(out-of-bag)樣本來評估泛化精度。下面的代碼片段說明了如何構造一個 `KNeighborsClassifier` 估計器的 bagging 集成實例,每一個基估計器都建立在 50% 的樣本隨機子集和 50% 的特征隨機子集上。 ``` >>> from sklearn.ensemble import BaggingClassifier >>> from sklearn.neighbors import KNeighborsClassifier >>> bagging = BaggingClassifier(KNeighborsClassifier(), ... max_samples=0.5, max_features=0.5) ``` 示例: - [Single estimator versus bagging: bias-variance decomposition](../auto_examples/ensemble/plot_bias_variance.html#sphx-glr-auto-examples-ensemble-plot-bias-variance-py) 參考文獻 [\[B1999\]](#id2)L. Breiman, “Pasting small votes for classification in large databases and on-line”, Machine Learning, 36(1), 85-103, 1999.[\[B1996\]](#id3)L. Breiman, “Bagging predictors”, Machine Learning, 24(2), 123-140, 1996.[\[H1998\]](#id4)T. Ho, “The random subspace method for constructing decision forests”, Pattern Analysis and Machine Intelligence, 20(8), 832-844, 1998.[\[LG2012\]](#id5)G. Louppe and P. Geurts, “Ensembles on Random Patches”, Machine Learning and Knowledge Discovery in Databases, 346-361, 2012. ## 1.11.2. 由隨機樹組成的森林 [`sklearn.ensemble`](classes.html#module-sklearn.ensemble "sklearn.ensemble") 模塊包含兩個基于 [隨機決策樹](tree.html#tree) 的平均算法: RandomForest 算法和 Extra-Trees 算法。 這兩種算法都是專門為樹而設計的擾動和組合技術(perturb-and-combine techniques) [\[B1998\]](#b1998) 。 這種技術通過在分類器構造過程中引入隨機性來創建一組不同的分類器。集成分類器的預測結果就是單個分類器預測結果的平均值。 與其他分類器一樣,森林分類器必須擬合(fit)兩個數組: 保存訓練樣本的數組(或稀疏或稠密的)X,大小為 `[n_samples, n_features]`,和 保存訓練樣本目標值(類標簽)的數組 Y,大小為 `[n_samples]`: ``` >>> from sklearn.ensemble import RandomForestClassifier >>> X = [[0, 0], [1, 1]] >>> Y = [0, 1] >>> clf = RandomForestClassifier(n_estimators=10) >>> clf = clf.fit(X, Y) ``` 同 [決策樹](tree.html#tree) 一樣,隨機森林算法(forests of trees)也能用來解決 [多輸出問題](tree.html#tree-multioutput) (如果 Y 的大小是 `[n_samples,?n_outputs])` )。 ### 1.11.2.1. 隨機森林 在隨機森林中(參見 [`ExtraTreesClassifier`](generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier "sklearn.ensemble.ExtraTreesClassifier") 和 [`ExtraTreesRegressor`](generated/sklearn.ensemble.ExtraTreesRegressor.html#sklearn.ensemble.ExtraTreesRegressor "sklearn.ensemble.ExtraTreesRegressor") 類), 集成模型中的每棵樹構建時的樣本都是由訓練集經過有放回抽樣得來的(例如,自助采樣法-bootstrap sample,這里采用西瓜書中的譯法)。 另外,在構建樹的過程中進行結點分割時,選擇的分割點不再是所有特征中最佳分割點,而是特征的一個隨機子集中的最佳分割點。 由于這種隨機性,森林的偏差通常會有略微的增大(相對于單個非隨機樹的偏差),但是由于取了平均,其方差也會減小,通常能夠補償偏差的增加,從而產生一個總體上更好的模型。 與原始文獻 [\[B2001\]](#b2001) 不同的是,scikit-learn 的實現是取每個分類器預測概率的平均,而不是讓每個分類器對類別進行投票。 ### 1.11.2.2. 極限隨機樹 在極限隨機樹中(參見 [`ExtraTreesClassifier`](generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier "sklearn.ensemble.ExtraTreesClassifier") 和 [`ExtraTreesRegressor`](generated/sklearn.ensemble.ExtraTreesRegressor.html#sklearn.ensemble.ExtraTreesRegressor "sklearn.ensemble.ExtraTreesRegressor") 類), 計算分割點方法中的隨機性進一步增強。 在隨機森林中,使用的特征是候選特征的隨機子集;不同于尋找最具有區分度的閾值, 這里的閾值是針對每個候選特征隨機生成的,并且選擇這些隨機生成的閾值中的最佳者作為分割規則。 這種做法通常能夠減少一點模型的方差,代價則是略微地增大偏差: ``` >>> from sklearn.model_selection import cross_val_score >>> from sklearn.datasets import make_blobs >>> from sklearn.ensemble import RandomForestClassifier >>> from sklearn.ensemble import ExtraTreesClassifier >>> from sklearn.tree import DecisionTreeClassifier ``` ``` >>> X, y = make_blobs(n_samples=10000, n_features=10, centers=100, ... random_state=0) ``` ``` >>> clf = DecisionTreeClassifier(max_depth=None, min_samples_split=2, ... random_state=0) >>> scores = cross_val_score(clf, X, y) >>> scores.mean() 0.97... ``` ``` >>> clf = RandomForestClassifier(n_estimators=10, max_depth=None, ... min_samples_split=2, random_state=0) >>> scores = cross_val_score(clf, X, y) >>> scores.mean() 0.999... ``` ``` >>> clf = ExtraTreesClassifier(n_estimators=10, max_depth=None, ... min_samples_split=2, random_state=0) >>> scores = cross_val_score(clf, X, y) >>> scores.mean() > 0.999 True ``` [![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_forest_iris_0011.png](https://box.kancloud.cn/984614b60c192234fa0add0c5175d065_566x424.jpg)](../auto_examples/ensemble/plot_forest_iris.html) ### 1.11.2.3. 參數 使用這些方法時要調整的參數主要是 `n_estimators` 和 `max_features`。 前者(n\_estimators)是森林里樹的數量,通常數量越大,效果越好,但是計算時間也會隨之增加。 此外要注意,當樹的數量超過一個臨界值之后,算法的效果并不會很顯著地變好。 后者(max\_features)是分割節點時考慮的特征的隨機子集的大小。 這個值越低,方差減小得越多,但是偏差的增大也越多。 根據經驗,回歸問題中使用 `max_features = n_features` , 分類問題使用 `max_features = sqrt(n_features`(其中 `n_features` 是特征的個數)是比較好的默認值。 `max_depth = None` 和 `min_samples_split = 2` 結合通常會有不錯的效果(即生成完全的樹)。 請記住,這些(默認)值通常不是最佳的,同時還可能消耗大量的內存,最佳參數值應由交叉驗證獲得。 另外,請注意,在隨機森林中,默認使用自助采樣法(`bootstrap = True`), 然而 extra-trees 的默認策略是使用整個數據集(`bootstrap = False`)。 當使用自助采樣法方法抽樣時,泛化精度是可以通過剩余的或者袋外的樣本來估算的,設置 `oob_score = True` 即可實現。 提示: 默認參數下模型復雜度是:`O(M*N*log(N))` , 其中 `M` 是樹的數目, `N` 是樣本數。 可以通過設置以下參數來降低模型復雜度: `min_samples_split` , `min_samples_leaf` , `max_leaf_nodes``?和?``max_depth` 。 ### 1.11.2.4. 并行化 最后,這個模塊還支持樹的并行構建和預測結果的并行計算,這可以通過 `n_jobs` 參數實現。 如果設置 `n_jobs = k` ,則計算被劃分為 `k` 個作業,并運行在機器的 `k` 個核上。 如果設置 `n_jobs = -1` ,則使用機器的所有核。 注意由于進程間通信具有一定的開銷,這里的提速并不是線性的(即,使用 `k` 個作業不會快 `k` 倍)。 當然,在建立大量的樹,或者構建單個樹需要相當長的時間(例如,在大數據集上)時,(通過并行化)仍然可以實現顯著的加速。 示例: - [Plot the decision surfaces of ensembles of trees on the iris dataset](../auto_examples/ensemble/plot_forest_iris.html#sphx-glr-auto-examples-ensemble-plot-forest-iris-py) - [Pixel importances with a parallel forest of trees](../auto_examples/ensemble/plot_forest_importances_faces.html#sphx-glr-auto-examples-ensemble-plot-forest-importances-faces-py) - [Face completion with a multi-output estimators](../auto_examples/plot_multioutput_face_completion.html#sphx-glr-auto-examples-plot-multioutput-face-completion-py) 參考文獻 [\[B2001\]](#id9)1. Breiman, “Random Forests”, Machine Learning, 45(1), 5-32, 2001. [\[B1998\]](#id7)1. Breiman, “Arcing Classifiers”, Annals of Statistics 1998. - P. Geurts, D. Ernst., and L. Wehenkel, “Extremely randomized trees”, Machine Learning, 63(1), 3-42, 2006. ### 1.11.2.5. 特征重要性評估 特征對目標變量預測的相對重要性可以通過(樹中的決策節點的)特征使用的相對順序(即深度)來進行評估。 決策樹頂部使用的特征對更大一部分輸入樣本的最終預測決策做出貢獻;因此,可以使用接受每個特征對最終預測的貢獻的樣本比例來評估該 **特征的相對重要性** 。 通過對多個隨機樹中的 **預期貢獻率** (expected activity rates) **取平均**,可以減少這種估計的 **方差** ,并將其用于特征選擇。 下面的例子展示了一個面部識別任務中每個像素的相對重要性,其中重要性由顏色(的深淺)來表示,使用的模型是 [`ExtraTreesClassifier`](generated/sklearn.ensemble.ExtraTreesClassifier.html#sklearn.ensemble.ExtraTreesClassifier "sklearn.ensemble.ExtraTreesClassifier") 。 [](../auto_examples/ensemble/plot_forest_importances_faces.html) 實際上,對于訓練完成的模型這些估計值存儲在 `feature_importances_` 屬性中。 這是一個大小為 `(n_features,)` 的數組,其每個元素值為正,并且總和為 1.0。一個元素的值越高,其對應的特征對預測函數的貢獻越大。 示例: - [Pixel importances with a parallel forest of trees](../auto_examples/ensemble/plot_forest_importances_faces.html#sphx-glr-auto-examples-ensemble-plot-forest-importances-faces-py) - [Feature importances with forests of trees](../auto_examples/ensemble/plot_forest_importances.html#sphx-glr-auto-examples-ensemble-plot-forest-importances-py) ### 1.11.2.6. 完全隨機樹嵌入 [`RandomTreesEmbedding`](generated/sklearn.ensemble.RandomTreesEmbedding.html#sklearn.ensemble.RandomTreesEmbedding "sklearn.ensemble.RandomTreesEmbedding") 實現了一個無監督的數據轉換。 通過由完全隨機樹構成的森林,[`RandomTreesEmbedding`](generated/sklearn.ensemble.RandomTreesEmbedding.html#sklearn.ensemble.RandomTreesEmbedding "sklearn.ensemble.RandomTreesEmbedding") 使用數據最終歸屬的葉子節點的索引值(編號)對數據進行編碼。 該索引以 one-of-K 方式編碼,最終形成一個高維的稀疏二進制編碼。 這種編碼可以被非常高效地計算出來,并且可以作為其他學習任務的基礎。 編碼的大小和稀疏度可以通過選擇樹的數量和每棵樹的最大深度來確定。對于集成中的每棵樹的每個節點包含一個實例(校對者注:這里真的沒搞懂)。 編碼的大小(維度)最多為 `n_estimators * 2 ** max_depth` ,即森林中的葉子節點的最大數。 由于相鄰數據點更可能位于樹的同一葉子中,該變換可以作為一種隱式地非參數密度估計。 示例: - [Hashing feature transformation using Totally Random Trees](../auto_examples/ensemble/plot_random_forest_embedding.html#sphx-glr-auto-examples-ensemble-plot-random-forest-embedding-py) - [Manifold learning on handwritten digits: Locally Linear Embedding, Isomap…](../auto_examples/manifold/plot_lle_digits.html#sphx-glr-auto-examples-manifold-plot-lle-digits-py) 比較了手寫體數字的非線性降維技術。 - [Feature transformations with ensembles of trees](../auto_examples/ensemble/plot_feature_transformation.html#sphx-glr-auto-examples-ensemble-plot-feature-transformation-py) 比較了基于樹的有監督和無監督特征變換. See also [流形學習](manifold.html#manifold) 方法也可以用于特征空間的非線性表示, 以及降維. ## 1.11.3. AdaBoost 模型 [`sklearn.ensemble`](classes.html#module-sklearn.ensemble "sklearn.ensemble") 包含了流行的提升算法 AdaBoost, 這個算法是由 Freund and Schapire 在 1995 年提出來的 [\[FS1995\]](#fs1995). AdaBoost 的核心思想是用反復修改的數據(校對者注:主要是修正數據的權重)來訓練一系列的弱學習器(一個弱學習器模型僅僅比隨機猜測好一點, 比如一個簡單的決策樹),由這些弱學習器的預測結果通過加權投票(或加權求和)的方式組合, 得到我們最終的預測結果。在每一次所謂的提升(boosting)迭代中,數據的修改由應用于每一個訓練樣本的(新) 的權重 ![w_1](https://box.kancloud.cn/0bf8513c2e7de9ac43d1139a5dbe73e4_19x12.jpg), ![w_2](https://box.kancloud.cn/08ce0950a36a80af46904e96ae224cea_19x11.jpg), …, ![w_N](https://box.kancloud.cn/ec141c50523d11555906c57a9d7e95c3_25x11.jpg) 組成(校對者注:即修改每一個訓練樣本應用于新一輪學習器的權重)。 初始化時,將所有弱學習器的權重都設置為 ![w_i = 1/N](https://box.kancloud.cn/e5823f4ad9b540fba24bd41488459920_75x18.jpg) ,因此第一次迭代僅僅是通過原始數據訓練出一個弱學習器。在接下來的 連續迭代中,樣本的權重逐個地被修改,學習算法也因此要重新應用這些已經修改的權重。在給定的一個迭代中, 那些在上一輪迭代中被預測為錯誤結果的樣本的權重將會被增加,而那些被預測為正確結果的樣本的權 重將會被降低。隨著迭代次數的增加,那些難以預測的樣例的影響將會越來越大,每一個隨后的弱學習器都將 會被強迫更加關注那些在之前被錯誤預測的樣例 [\[HTF\]](#htf). [![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_adaboost_hastie_10_2_0011.png](https://box.kancloud.cn/e63cece5061949877c7664987beac237_566x424.jpg)](../auto_examples/ensemble/plot_adaboost_hastie_10_2.html) AdaBoost 既可以用在分類問題也可以用在回歸問題中: > - 對于 multi-class 分類, [`AdaBoostClassifier`](generated/sklearn.ensemble.AdaBoostClassifier.html#sklearn.ensemble.AdaBoostClassifier "sklearn.ensemble.AdaBoostClassifier") 實現了 AdaBoost-SAMME 和 AdaBoost-SAMME.R [\[ZZRH2009\]](#zzrh2009). > - 對于回歸, [`AdaBoostRegressor`](generated/sklearn.ensemble.AdaBoostRegressor.html#sklearn.ensemble.AdaBoostRegressor "sklearn.ensemble.AdaBoostRegressor") 實現了 AdaBoost.R2 [\[D1997\]](#d1997). ### 1.11.3.1. 使用方法 下面的例子展示了如何訓練一個包含 100 個弱學習器的 AdaBoost 分類器: ``` >>> from sklearn.model_selection import cross_val_score >>> from sklearn.datasets import load_iris >>> from sklearn.ensemble import AdaBoostClassifier >>> iris = load_iris() >>> clf = AdaBoostClassifier(n_estimators=100) >>> scores = cross_val_score(clf, iris.data, iris.target) >>> scores.mean() 0.9... ``` 弱學習器的數量由參數 `n_estimators` 來控制。 `learning_rate` 參數用來控制每個弱學習器對 最終的結果的貢獻程度(校對者注:其實應該就是控制每個弱學習器的權重修改速率,這里不太記得了,不確定)。 弱學習器默認使用決策樹。不同的弱學習器可以通過參數 `base_estimator` 來指定。 獲取一個好的預測結果主要需要調整的參數是 `n_estimators` 和 `base_estimator` 的復雜度 (例如:對于弱學習器為決策樹的情況,樹的深度 `max_depth` 或葉子節點的最小樣本數 `min_samples_leaf`等都是控制樹的復雜度的參數) 示例: - [Discrete versus Real AdaBoost](../auto_examples/ensemble/plot_adaboost_hastie_10_2.html#sphx-glr-auto-examples-ensemble-plot-adaboost-hastie-10-2-py) 使用 AdaBoost-SAMME 和 AdaBoost-SAMME.R 比較 decision stump, decision tree(決策樹)和 boosted decision stump(增強決策樹)的分類錯誤。 - [Multi-class AdaBoosted Decision Trees](../auto_examples/ensemble/plot_adaboost_multiclass.html#sphx-glr-auto-examples-ensemble-plot-adaboost-multiclass-py) 展示了 AdaBoost-SAMME 和 AdaBoost-SAMME.R 在 multi-class (多類)問題上的性能。 - [Two-class AdaBoost](../auto_examples/ensemble/plot_adaboost_twoclass.html#sphx-glr-auto-examples-ensemble-plot-adaboost-twoclass-py) 展示了使用 AdaBoost-SAMME 的非線性可分兩類問題的決策邊界和決策函數值。 - [Decision Tree Regression with AdaBoost](../auto_examples/ensemble/plot_adaboost_regression.html#sphx-glr-auto-examples-ensemble-plot-adaboost-regression-py) 使用 AdaBoost.R2 算法證明了回歸。 參考文獻: [\[FS1995\]](#id16)Y. Freund, and R. Schapire, “A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting”, 1997.[\[ZZRH2009\]](#id18)J. Zhu, H. Zou, S. Rosset, T. Hastie. “Multi-class AdaBoost”, 2009.[\[D1997\]](#id19)1. Drucker. “Improving Regressors using Boosting Techniques”, 1997. [\[HTF\]](#id17)T. Hastie, R. Tibshirani and J. Friedman, “Elements of Statistical Learning Ed. 2”, Springer, 2009. ## 1.11.4. Gradient Tree Boosting(梯度樹提升) [Gradient Tree Boosting](https://en.wikipedia.org/wiki/Gradient_boosting)或梯度提升回歸樹(GBRT)是對于任意的可微損失函數的提升算法的泛化。 GBRT 是一個準確高效的現有程序, 它既能用于分類問題也可以用于回歸問題。梯度樹提升模型被應用到各種領域,包括網頁搜索排名和生態領域。 GBRT 的優點: > - 對混合型數據的自然處理(異構特征) > - 強大的預測能力 > - 在輸出空間中對異常點的魯棒性(通過具有魯棒性的損失函數實現) GBRT 的缺點: > - 可擴展性差(校對者注:此處的可擴展性特指在更大規模的數據集/復雜度更高的模型上使用的能力,而非我們通常說的功能的擴展性;GBRT 支持自定義的損失函數,從這個角度看它的擴展性還是很強的!)。由于提升算法的有序性(也就是說下一步的結果依賴于上一步),因此很難做并行. 模塊 [`sklearn.ensemble`](classes.html#module-sklearn.ensemble "sklearn.ensemble") 通過梯度提升樹提供了分類和回歸的方法. ### 1.11.4.1. 分類 [`GradientBoostingClassifier`](generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier "sklearn.ensemble.GradientBoostingClassifier") 既支持二分類又支持多分類問題。 下面的例子展示了如何訓練一個包含 100 個決策樹弱學習器的梯度提升分類器: ``` >>> from sklearn.datasets import make_hastie_10_2 >>> from sklearn.ensemble import GradientBoostingClassifier >>> X, y = make_hastie_10_2(random_state=0) >>> X_train, X_test = X[:2000], X[2000:] >>> y_train, y_test = y[:2000], y[2000:] >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, ... max_depth=1, random_state=0).fit(X_train, y_train) >>> clf.score(X_test, y_test) 0.913... ``` 弱學習器(例如:回歸樹)的數量由參數 `n_estimators` 來控制;每個樹的大小可以通過由參數 `max_depth` 設置樹的深度,或者由參數 `max_leaf_nodes` 設置葉子節點數目來控制。 `learning_rate` 是一個在 (0,1\] 之間的超參數,這個參數通過 shrinkage(縮減步長) 來控制過擬合。 Note 超過兩類的分類問題需要在每一次迭代時推導 `n_classes` 個回歸樹。因此,所有的需要推導的樹數量等于 `n_classes * n_estimators` 。對于擁有大量類別的數據集我們強烈推薦使用 [`RandomForestClassifier`](generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier "sklearn.ensemble.RandomForestClassifier") 來代替 [`GradientBoostingClassifier`](generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier "sklearn.ensemble.GradientBoostingClassifier") 。 ### 1.11.4.2. 回歸 對于回歸問題 [`GradientBoostingRegressor`](generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor "sklearn.ensemble.GradientBoostingRegressor") 支持一系列 [different loss functions](#gradient-boosting-loss) ,這些損失函數可以通過參數 `loss` 來指定;對于回歸問題默認的損失函數是最小二乘損失函數( `'ls'` )。 ``` >>> import numpy as np >>> from sklearn.metrics import mean_squared_error >>> from sklearn.datasets import make_friedman1 >>> from sklearn.ensemble import GradientBoostingRegressor >>> X, y = make_friedman1(n_samples=1200, random_state=0, noise=1.0) >>> X_train, X_test = X[:200], X[200:] >>> y_train, y_test = y[:200], y[200:] >>> est = GradientBoostingRegressor(n_estimators=100, learning_rate=0.1, ... max_depth=1, random_state=0, loss='ls').fit(X_train, y_train) >>> mean_squared_error(y_test, est.predict(X_test)) 5.00... ``` 下圖展示了應用損失函數為最小二乘損失,基學習器個數為 500 的 [`GradientBoostingRegressor`](generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor "sklearn.ensemble.GradientBoostingRegressor") 來處理 [`sklearn.datasets.load_boston`](generated/sklearn.datasets.load_boston.html#sklearn.datasets.load_boston "sklearn.datasets.load_boston") 數據集的結果。左圖表示每一次迭代的訓練誤差和測試誤差。每一次迭代的訓練誤差保存在提升樹模型的 `train_score_` 屬性中,每一次迭代的測試誤差能夠通過 [`staged_predict`](generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor.staged_predict "sklearn.ensemble.GradientBoostingRegressor.staged_predict") 方法獲取,該方法返回一個生成器,用來產生每一 個迭代的預測結果。類似下面這樣的圖表,可以用于決定最優的樹的數量,從而進行提前停止。右圖表示每個特征的重要性,它 可以通過 `feature_importances_` 屬性來獲取. [![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_gradient_boosting_regression_0011.png](https://box.kancloud.cn/3d1e5eb08571f32e5f6641c65e446924_566x283.jpg)](../auto_examples/ensemble/plot_gradient_boosting_regression.html) 示例: - [Gradient Boosting regression](../auto_examples/ensemble/plot_gradient_boosting_regression.html#sphx-glr-auto-examples-ensemble-plot-gradient-boosting-regression-py) - [Gradient Boosting Out-of-Bag estimates](../auto_examples/ensemble/plot_gradient_boosting_oob.html#sphx-glr-auto-examples-ensemble-plot-gradient-boosting-oob-py) ### 1.11.4.3. 訓練額外的弱學習器 > [`GradientBoostingRegressor`](generated/sklearn.ensemble.GradientBoostingRegressor.html#sklearn.ensemble.GradientBoostingRegressor "sklearn.ensemble.GradientBoostingRegressor") 和 [`GradientBoostingClassifier`](generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier "sklearn.ensemble.GradientBoostingClassifier") 都支持設置參數 `warm_start=True` ,這樣設置允許我們在已經訓練的模型上面添加更多的估計器。 ``` >>> _ = est.set_params(n_estimators=200, warm_start=True) # set warm_start and new nr of trees >>> _ = est.fit(X_train, y_train) # fit additional 100 trees to est >>> mean_squared_error(y_test, est.predict(X_test)) 3.84... ``` ### 1.11.4.4. 控制樹的大小 回歸樹基學習器的大小定義了可以被梯度提升模型捕捉到的變量(即特征)相互作用(即多個特征共同對預測產生影響)的程度。 通常一棵深度為 `h` 的樹能捕獲到秩為 `h` 的相互作用。這里有兩種控制單棵回歸樹大小的方法。 如果你指定 `max_depth=h` ,那么將會產生一個深度為 `h` 的完全二叉樹。這棵樹將會有(至多) `2**h` 個葉子節點和 `2**h - 1` 個切分節點。 另外,你能通過參數 `max_leaf_nodes` 指定葉子節點的數量來控制樹的大小。在這種情況下,樹將會使用最優優先搜索來生成,這種搜索方式是通過每次選取對不純度提升最大的節點來展開。一棵 `max_leaf_nodes=k` 的樹擁有 `k - 1` 個切分節點,因此可以模擬秩最高達到 `max_leaf_nodes - 1` 的相互作用(即 `max_leaf_nodes - 1` 個特征共同決定預測值)。 我們發現 `max_leaf_nodes=k` 可以給出與 `max_depth=k-1` 品質相當的結果,但是其訓練速度明顯更快,同時也會以多一點的訓練誤差作為代價。參數 `max_leaf_nodes` 對應于文章 [\[F2001\]](#f2001) 中梯度提升章節中的變量 `J` ,同時與 R 語言的 gbm 包的參數 `interaction.depth` 相關,兩者間的關系是 `max_leaf_nodes == interaction.depth + 1` 。 ### 1.11.4.5. Mathematical formulation(數學公式) GBRT 可以認為是以下形式的可加模型: > ![F(x) = \sum_{m=1}^{M} \gamma_m h_m(x)](https://box.kancloud.cn/cff935f6178606b7d8a9f7346a803eac_160x54.jpg) 其中 ![h_m(x)](https://box.kancloud.cn/cd23f6bc11c21433c530bb04fe7850ed_45x18.jpg) 是基本函數,在提升算法場景中它通常被稱作 *weak learners* 。梯度樹提升算法(Gradient Tree Boosting)使用固定大小 的 [decision trees](tree.html#tree) 作為弱分類器,決策樹本身擁有的一些特性使它能夠在提升過程中變得有價值, 即處理混合類型數據以及構建具有復雜功能模型的能力. 與其他提升算法類似, GBRT 利用前向分步算法思想構建加法模型: > ![F_m(x) = F_{m-1}(x) + \gamma_m h_m(x)](https://box.kancloud.cn/9a2180a165d20eea1625649fdd13c075_225x18.jpg) 在每一個階段中,基于當前模型 ![F_{m-1}](https://box.kancloud.cn/87544eb168b07f07f65fc8a47461444b_39x16.jpg) 和擬合函數 ![F_{m-1}(x_i)](https://box.kancloud.cn/81d36dadb33fbbb52619971d338962d5_69x18.jpg) 選擇合適的決策樹函數 ![h_m(x)](https://box.kancloud.cn/cd23f6bc11c21433c530bb04fe7850ed_45x18.jpg) ,從而最小化損失函數 ![L](https://box.kancloud.cn/932e52dfeb15d15287c07f0b899113b1_12x12.jpg) 。 > ![F_m(x) = F_{m-1}(x) + \arg\min_{h} \sum_{i=1}^{n} L(y_i, F_{m-1}(x_i) - h(x))](https://box.kancloud.cn/4e710858fe2c3f10b20ccece77fd5926_421x51.jpg) 初始模型 ![F_{0}](https://box.kancloud.cn/1a07a37c6bdfd9fdfef275dc5a571cb3_18x15.jpg) 是問題的具體,對于最小二乘回歸,通常選擇目標值的平均值. Note 初始化模型也能夠通過 `init` 參數來指定,但傳遞的對象需要實現 `fit` 和 `predict` 函數。 梯度提升(Gradient Boosting)嘗試通過最速下降法以數字方式解決這個最小化問題.最速下降方向是在當前模型 ![F_{m-1}](https://box.kancloud.cn/87544eb168b07f07f65fc8a47461444b_39x16.jpg) 下的損失函數的負梯度方向,其中模型 ![F_{m-1}](https://box.kancloud.cn/87544eb168b07f07f65fc8a47461444b_39x16.jpg) 可以計算任何可微損失函數: > ![F_m(x) = F_{m-1}(x) + \gamma_m \sum_{i=1}^{n} \nabla_F L(y_i, F_{m-1}(x_i))](https://box.kancloud.cn/7f19e54ea333b7aade131a7e734673ec_355x51.jpg) 其中步長 ![\gamma_m](https://box.kancloud.cn/09d267d4ff91a76d3697907a6db12fd0_21x12.jpg) 通過如下方式線性搜索獲得: > ![\gamma_m = \arg\min_{\gamma} \sum_{i=1}^{n} L(y_i, F_{m-1}(x_i) - \gamma \frac{\partial L(y_i, F_{m-1}(x_i))}{\partial F_{m-1}(x_i)})](https://box.kancloud.cn/5d7bee84f5329081d38924d19536f632_417x51.jpg) 該算法處理分類和回歸問題不同之處在于具體損失函數的使用。 #### 1.11.4.5.1. Loss Functions(損失函數) 以下是目前支持的損失函數,具體損失函數可以通過參數 `loss` 指定: > - 回歸 (Regression) > - Least squares ( `'ls'` ): 由于其優越的計算性能,該損失函數成為回歸算法中的自然選擇。 初始模型 (校對者注:即損失函數的初始值,下同) 通過目標值的均值給出。 > - Least absolute deviation ( `'lad'` ): 回歸中具有魯棒性的損失函數,初始模型通過目 標值的中值給出。 > - Huber ( `'huber'` ): 回歸中另一個具有魯棒性的損失函數,它是最小二乘和最小絕對偏差兩者的結合. 其利用 `alpha` 來控制模型對于異常點的敏感度(詳細介紹請參考 [\[F2001\]](#f2001)). > - Quantile ( `'quantile'` ): 分位數回歸損失函數.用 `0 < alpha < 1` 來指定分位數這個損 失函數可以用來產生預測間隔。(詳見 [Prediction Intervals for Gradient Boosting Regression](../auto_examples/ensemble/plot_gradient_boosting_quantile.html#sphx-glr-auto-examples-ensemble-plot-gradient-boosting-quantile-py) )。 > - 分類 (Classification) > - Binomial deviance (`'deviance'`): 對于二分類問題(提供概率估計)即負的二項 log 似然損失函數。模型以 log 的比值比來初始化。 > - Multinomial deviance (`'deviance'`): 對于多分類問題的負的多項log似然損失函數具有 `n_classes` 個互斥的類。提供概率估計。 初始模型由每個類的先驗概率給出.在每一次迭代中 `n_classes` 回歸樹被構建,這使得 GBRT 在處理多類別數據集時相當低效。 > - Exponential loss (`'exponential'`): 與 [`AdaBoostClassifier`](generated/sklearn.ensemble.AdaBoostClassifier.html#sklearn.ensemble.AdaBoostClassifier "sklearn.ensemble.AdaBoostClassifier") 具有相同的損失函數。與 `'deviance'` 相比,對被錯誤標記的樣本的魯棒性較差,僅用于在二分類問題。 ### 1.11.4.6. Regularization(正則化) #### 1.11.4.6.1. 收縮率 (Shrinkage) [\[F2001\]](#f2001) 提出一個簡單的正則化策略,通過一個因子 ![\nu](https://box.kancloud.cn/5e44745efbc46bb16b54739631fc2294_10x8.jpg) 來衡量每個弱分類器對于最終結果的貢獻: ![F_m(x) = F_{m-1}(x) + \nu \gamma_m h_m(x)](https://box.kancloud.cn/a9ea6a27e433b01eedcc09e076aa1936_235x18.jpg) 參數 ![\nu](https://box.kancloud.cn/5e44745efbc46bb16b54739631fc2294_10x8.jpg) 由于它可以控制梯度下降的步長, 因此也叫作 **learning rate** ,它可以通過 `learning_rate` 參數來設置. 在訓練一定數量的弱分類器時,參數 `learning_rate` 和參數 `n_estimators` 之間有很強的制約關系。 較小的 `learning_rate` 需要大量的弱分類器才能維持訓練誤差的穩定。經驗表明數值較小的 `learning_rate`將會得到更好的測試誤差。 [\[HTF2009\]](#htf2009) 推薦把 `learning_rate` 設置為一個較小的常數 (例如: `learning_rate <= 0.1` )同時通過提前停止策略來選擇合適的 `n_estimators` . 有關 `learning_rate` 和 `n_estimators` 更詳細的討論可以參考 [\[R2007\]](#r2007). #### 1.11.4.6.2. 子采樣 (Subsampling) [\[F1999\]](#f1999) 提出了隨機梯度提升,這種方法將梯度提升(gradient boosting)和 bootstrap averaging(bagging) 相結合。在每次迭代中,基分類器是通過抽取所有可利用訓練集中一小部分的 `subsample` 訓練得到的子樣本采用無放回的方式采樣。 `subsample` 參數的值一般設置為 0.5 。 下圖表明了收縮與否和子采樣對于模型擬合好壞的影響。我們可以明顯看到指定收縮率比沒有收縮擁有更好的表現。而將子采樣和收縮率相結合能進一步的提高模型的準確率。相反,使用子采樣而不使用收縮的結果十分糟糕。 [![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_gradient_boosting_regularization_0011.png](https://box.kancloud.cn/762706ee302d6ffac27caab231d4b181_566x424.jpg)](../auto_examples/ensemble/plot_gradient_boosting_regularization.html) 另一個減少方差的策略是特征子采樣,這種方法類似于 [`RandomForestClassifier`](generated/sklearn.ensemble.RandomForestClassifier.html#sklearn.ensemble.RandomForestClassifier "sklearn.ensemble.RandomForestClassifier") 中的隨機分割。子采樣的特征數可以通過參數 `max_features` 來控制。 Note 采用一個較小的 `max_features` 值能大大縮減模型的訓練時間。 隨機梯度提升允許計算測試偏差的袋外估計值(Out-of-bag),方法是計算那些不在自助采樣之內的樣本偏差的改進。這個改進保存在屬性 `oob_improvement_` 中 `oob_improvement_[i]` 如果將第 i 步添加到當前預測中,則可以改善 OOB 樣本的損失。袋外估計可以使用在模型選擇中,例如決定最優迭代次數。 OOB 估計通常都很悲觀,因此我們推薦使用交叉驗證來代替它,而當交叉驗證太耗時時我們就只能使用 OOB 了。 示例: - [Gradient Boosting regularization](../auto_examples/ensemble/plot_gradient_boosting_regularization.html#sphx-glr-auto-examples-ensemble-plot-gradient-boosting-regularization-py) - [Gradient Boosting Out-of-Bag estimates](../auto_examples/ensemble/plot_gradient_boosting_oob.html#sphx-glr-auto-examples-ensemble-plot-gradient-boosting-oob-py) - [OOB Errors for Random Forests](../auto_examples/ensemble/plot_ensemble_oob.html#sphx-glr-auto-examples-ensemble-plot-ensemble-oob-py) ### 1.11.4.7. Interpretation(解釋性) 通過簡單地可視化樹結構可以很容易地解釋單個決策樹,然而對于梯度提升模型來說,一般擁有數百棵/種回歸樹,將每一棵樹都可視化來解釋整個模型是很困難的。幸運的是,有很多關于總結和解釋梯度提升模型的技術。 #### 1.11.4.7.1. Feature importance(特征重要性) 通常情況下每個特征對于預測目標的影響是不同的.在很多情形下大多數特征和預測結果是無關的。當解釋一個模型時,第一個問題通常是:這些重要的特征是什么?他們如何在預測目標方面產生積極的影響的? 單個決策樹本質上是通過選擇最佳切分點來進行特征選擇.這個信息可以用來評定每個特征的重要性。基本思想是:在樹的分割點中使用的特征越頻繁,特征越重要。 這個特征重要性的概念可以通過簡單地平均每棵樹的特征重要性來擴展到決策樹集合。(詳見 [特征重要性評估](#random-forest-feature-importance) )。 對于一個訓練好的梯度提升模型,其特征重要性分數可以通過屬性 `feature_importances_` 查看: ``` >>> from sklearn.datasets import make_hastie_10_2 >>> from sklearn.ensemble import GradientBoostingClassifier >>> X, y = make_hastie_10_2(random_state=0) >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, ... max_depth=1, random_state=0).fit(X, y) >>> clf.feature_importances_ array([ 0.11, 0.1 , 0.11, ... ``` 示例: - [Gradient Boosting regression](../auto_examples/ensemble/plot_gradient_boosting_regression.html#sphx-glr-auto-examples-ensemble-plot-gradient-boosting-regression-py) #### 1.11.4.7.2. Partial dependence(部分依賴) 部分依賴圖(PDP)展示了目標響應和一系列目標特征的依賴關系,同時邊緣化了其他所有特征值(候選特征)。 直覺上,我們可以將部分依賴解釋為作為目標特征函數 [\[2\]](#id36) 的預期目標響應 [\[1\]](#id35) 。 由于人類感知能力的限制,目標特征的設置必須小一點(通常是1到2),因此目標特征通常在最重要的特征中選擇。 下圖展示了加州住房數據集的四個單向和一個雙向部分依賴圖: [](../auto_examples/ensemble/plot_partial_dependence.html) 單向 PDPs 告訴我們目標響應和目標特征的相互影響(例如:線性或者非線性)。上圖中的左上圖展示了一個地區的中等收入對中等房價的影響。我們可以清楚的看到兩者之間是線性相關的。 具有兩個目標特征的 PDPs 顯示這兩個特征之間的相互影響。例如:上圖中兩個變量的 PDP 展示了房價中位數與房屋年齡和每戶平均入住人數之間的依賴關系。我們能清楚的看到這兩個特征之間的影響:對于每戶入住均值而言,當其值大于 2 時,房價與房屋年齡幾乎是相對獨立的,而其值小于 2 的時,房價對房屋年齡的依賴性就會很強。 模型 `partial_dependence` 提供了一個便捷的函數 [`plot_partial_dependence`](generated/sklearn.ensemble.partial_dependence.plot_partial_dependence.html#sklearn.ensemble.partial_dependence.plot_partial_dependence "sklearn.ensemble.partial_dependence.plot_partial_dependence") 來產生單向或雙向部分依賴圖。在下圖的例子中我們展示如何創建一個部分依賴的網格圖:特征值介于 `0` 和 `1` 的兩個單向依賴 PDPs 和一個在兩個特征間的雙向 PDPs: ``` >>> from sklearn.datasets import make_hastie_10_2 >>> from sklearn.ensemble import GradientBoostingClassifier >>> from sklearn.ensemble.partial_dependence import plot_partial_dependence >>> X, y = make_hastie_10_2(random_state=0) >>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, ... max_depth=1, random_state=0).fit(X, y) >>> features = [0, 1, (0, 1)] >>> fig, axs = plot_partial_dependence(clf, X, features) ``` 對于多類別的模型,你需要通過 `label` 參數設置類別標簽來創建 PDPs: ``` >>> from sklearn.datasets import load_iris >>> iris = load_iris() >>> mc_clf = GradientBoostingClassifier(n_estimators=10, ... max_depth=1).fit(iris.data, iris.target) >>> features = [3, 2, (3, 2)] >>> fig, axs = plot_partial_dependence(mc_clf, X, features, label=0) ``` 如果你需要部分依賴函數的原始值而不是圖,你可以調用 [`partial_dependence`](generated/sklearn.ensemble.partial_dependence.partial_dependence.html#sklearn.ensemble.partial_dependence.partial_dependence "sklearn.ensemble.partial_dependence.partial_dependence") 函數: ``` >>> from sklearn.ensemble.partial_dependence import partial_dependence >>> pdp, axes = partial_dependence(clf, [0], X=X) >>> pdp array([[ 2.46643157, 2.46643157, ... >>> axes [array([-1.62497054, -1.59201391, ... ``` 該函數允許通過 `grid` 參數指定應該被評估的部分依賴函數的的目標特征值或可以十分便利地通過設置 `X` 參數從而在訓練數據中自動創建 `grid` 。如果 `X` 被給出,函數返回的 `axes` 為每個目標特征提供軸。 對于 `grid` 中的每一個 ‘目標’ 特征值,部分依賴函數需要邊緣化一棵樹中所有候選特征的可能值的預測。 在決策樹中,這個函數可以在不參考訓練數據的情況下被高效的評估,對于每一網格點執行加權遍歷: 如果切分點包含 ‘目標’ 特征,遍歷其相關的左分支或相關的右分支,否則就遍歷兩個分支。每一個分支將被通過進入該分支的訓練樣本的占比加權, 最后,部分依賴通過所有訪問的葉節點的權重的平均值給出。組合樹(tree ensembles)的整體結果,需要對每棵樹的結果再次平均得到。 注解 (Footnotes) [\[1\]](#id34)對于損失函數為deviance的分類問題,其目標響應為 logit(p) 。[\[2\]](#id33)更精確的來說,這里指在產生初始化模型后,對于目標響應的期望;部分依賴圖并不包括 `init` 模型。示例: - [Partial Dependence Plots](../auto_examples/ensemble/plot_partial_dependence.html#sphx-glr-auto-examples-ensemble-plot-partial-dependence-py) 參考 \[F2001\]*([1](#id26), [2](#id27), [3](#id28))* J. Friedman, “Greedy Function Approximation: A Gradient Boosting Machine”, The Annals of Statistics, Vol. 29, No. 5, 2001.[\[F1999\]](#id31)1. Friedman, “Stochastic Gradient Boosting”, 1999 [\[HTF2009\]](#id29)1. Hastie, R. Tibshirani and J. Friedman, “Elements of Statistical Learning Ed. 2”, Springer, 2009. [\[R2007\]](#id30)1. Ridgeway, “Generalized Boosted Models: A guide to the gbm package”, 2007 ## 1.11.5. Voting Classifier(投票分類器) `VotingClassifier` (投票分類器)的原理是結合了多個不同的機器學習分類器,并且采用多數表決(majority vote)(硬投票) 或者平均預測概率(軟投票)的方式來預測分類標簽。 這樣的分類器可以用于一組同樣表現良好的模型,以便平衡它們各自的弱點。 ### 1.11.5.1. 多數類標簽 (又稱為 多數/硬投票) 在多數投票中,對于每個特定樣本的預測類別標簽是所有單獨分類器預測的類別標簽中票數占據多數(模式)的類別標簽。 例如,如果給定樣本的預測是 - classifier 1 -> class 1 - classifier 2 -> class 1 - classifier 3 -> class 2 類別 1 占據多數,通過 `voting='hard'` 參數設置投票分類器為多數表決方式,會得到該樣本的預測結果是類別 1 。 在平局的情況下,投票分類器(VotingClassifier)將根據升序排序順序選擇類標簽。 例如,場景如下: - classifier 1 -> class 2 - classifier 2 -> class 1 這種情況下, class 1 將會被指定為該樣本的類標簽。 #### 1.11.5.1.1. 用法 以下示例顯示如何訓練多數規則分類器: ``` >>> from sklearn import datasets >>> from sklearn.model_selection import cross_val_score >>> from sklearn.linear_model import LogisticRegression >>> from sklearn.naive_bayes import GaussianNB >>> from sklearn.ensemble import RandomForestClassifier >>> from sklearn.ensemble import VotingClassifier ``` ``` >>> iris = datasets.load_iris() >>> X, y = iris.data[:, 1:3], iris.target ``` ``` >>> clf1 = LogisticRegression(random_state=1) >>> clf2 = RandomForestClassifier(random_state=1) >>> clf3 = GaussianNB() ``` ``` >>> eclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='hard') ``` ``` >>> for clf, label in zip([clf1, clf2, clf3, eclf], ['Logistic Regression', 'Random Forest', 'naive Bayes', 'Ensemble']): ... scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy') ... print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label)) Accuracy: 0.90 (+/- 0.05) [Logistic Regression] Accuracy: 0.93 (+/- 0.05) [Random Forest] Accuracy: 0.91 (+/- 0.04) [naive Bayes] Accuracy: 0.95 (+/- 0.05) [Ensemble] ``` ### 1.11.5.2. 加權平均概率 (軟投票) 與多數投票(硬投票)相比,軟投票將類別標簽返回為預測概率之和的 argmax 。 具體的權重可以通過權重參數 `weights` 分配給每個分類器。當提供權重參數 `weights` 時,收集每個分類器的預測分類概率, 乘以分類器權重并取平均值。然后將具有最高平均概率的類別標簽確定為最終類別標簽。 為了用一個簡單的例子來說明這一點,假設我們有 3 個分類器和一個 3 類分類問題,我們給所有分類器賦予相等的權重:w1 = 1,w2 = 1,w3 = 1 。 樣本的加權平均概率計算如下: 分類器類別 1類別 2類別 3分類器 1w1 \* 0.2w1 \* 0.5w1 \* 0.3分類器 2w2 \* 0.6w2 \* 0.3w2 \* 0.1分類器 3w3 \* 0.3w3 \* 0.4w3 \* 0.3加權平均的結果0.370.40.23這里可以看出,預測的類標簽是 2,因為它具有最大的平均概率. 下邊的示例程序說明了當軟投票分類器(soft VotingClassifier)是基于線性支持向量機(linear SVM)、決策樹(Decision Tree)、K 近鄰(K-nearest)分類器時,決策域可能的變化情況: ``` >>> from sklearn import datasets >>> from sklearn.tree import DecisionTreeClassifier >>> from sklearn.neighbors import KNeighborsClassifier >>> from sklearn.svm import SVC >>> from itertools import product >>> from sklearn.ensemble import VotingClassifier ``` ``` >>> # Loading some example data >>> iris = datasets.load_iris() >>> X = iris.data[:, [0,2]] >>> y = iris.target ``` ``` >>> # Training classifiers >>> clf1 = DecisionTreeClassifier(max_depth=4) >>> clf2 = KNeighborsClassifier(n_neighbors=7) >>> clf3 = SVC(kernel='rbf', probability=True) >>> eclf = VotingClassifier(estimators=[('dt', clf1), ('knn', clf2), ('svc', clf3)], voting='soft', weights=[2,1,2]) ``` ``` >>> clf1 = clf1.fit(X,y) >>> clf2 = clf2.fit(X,y) >>> clf3 = clf3.fit(X,y) >>> eclf = eclf.fit(X,y) ``` [![http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_voting_decision_regions_0011.png](https://box.kancloud.cn/aee6cf074a58b036400b94a999a759a4_566x453.jpg)](../auto_examples/ensemble/plot_voting_decision_regions.html) ### 1.11.5.3. 投票分類器(VotingClassifier)在網格搜索(GridSearch)應用 為了調整每個估計器的超參數, VotingClassifier 也可以和 GridSearch 一起使用: ``` >>> from sklearn.model_selection import GridSearchCV >>> clf1 = LogisticRegression(random_state=1) >>> clf2 = RandomForestClassifier(random_state=1) >>> clf3 = GaussianNB() >>> eclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='soft') >>> params = {'lr__C': [1.0, 100.0], 'rf__n_estimators': [20, 200],} >>> grid = GridSearchCV(estimator=eclf, param_grid=params, cv=5) >>> grid = grid.fit(iris.data, iris.target) ``` #### 1.11.5.3.1. 用法 為了通過預測的類別概率來預測類別標簽(投票分類器中的 scikit-learn estimators 必須支持 `predict_proba` 方法): ``` >>> eclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='soft') ``` 可選地,也可以為單個分類器提供權重: ``` >>> eclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='soft', weights=[2,5,1]) ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看