機器學習之集成學習

概要

集成學習 ensemble learning 是經過構建多個學習器來完成學習任務,在實際應用以及各大競賽中應用很是普遍。根據學習器的生成方式,集成學習方法大概能夠分做兩類:html

  1. 每個學習器之間不存在依賴關係,能夠並行運行。好比 Bagging 和 Random Forest。
  2. 每個學習器之間存在依賴關係,必須串行運行,每一輪迭代產生一個學習器。好比 Boosting 算法。

Bagging

Bagging 是藉助於 bootstrap 算法來採樣。給定包含 N 個樣本的數據集,步驟是:node

  • 先隨機取出一個樣本放入採樣集中,再把該樣本放回原始數據集。
  • 通過 N 次隨機採樣操做後能夠獲得包含 N 個樣本的採樣集。

初始訓練集中有的樣本在採樣集中屢次出現,有的則從未出現。一個樣本始終不在採樣集中出現的機率是 \left(1-\frac{1}{N}\right)^{N}。根據 \lim _{N \rightarrow \infty}\left(1-\frac{1}{N}\right)^{N}=\frac{1}{e} \simeq=0.368,所以初始訓練集中約有 63.2% 的樣原本訓練,剩下的約 36.8% 的樣本可用做驗證集來對泛化性能進行包外估計。python

使用 M 個學習器的 Bagging 的基本流程:算法

  • 通過 M 輪自助採樣,能夠獲得 M 個包含 N 個訓練樣本的採樣集。
  • 而後基於每一個採樣集訓練出一個基學習器。
  • 最後將這 M 個基學習器進行組合,獲得集成模型。

使用 Bagging 學習器進行預測時,分類任務採起簡單投票法,取每一個基學習器的預測類別的衆數;迴歸任務使用簡單平均法,取每一個基學習器的預測值的平均。bootstrap

Bagging 算法能夠下降方差,在非剪枝決策樹、神經網絡等容易受到樣本擾動的算法上效果很明顯。而 Boosting 算法能夠用來下降誤差,它能將一些弱學習器提高爲強學習器。所以它在 svm、knn 等不容易受到樣本擾動的學習器上效果更爲明顯。網絡

在 sklearn 中使用 bagging 代碼以下,其中 n_estimators 表明使用 500 個決策樹學習器進行集成學習,max_samples 表明每一個學習器最多 100 個樣本,max_features 表明決策樹每個節點最多使用兩個特徵,oob_score=True 表明使用剩餘的 1/3 樣本進行評估。dom

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier

bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=1000, max_features=2,  bootstrap=True, oob_score=True, n_jobs=-1)
bagging_clf.fit(X, y)                            
複製代碼

隨機森林

隨機森林 Random Forest 是 Bagging 的一個演變算法。隨機森林對 Bagging 作了一些改進。函數

  • Bagging 中學習器的多樣性來自於樣本擾動。樣本擾動來自於對初始訓練集的隨機採樣。
  • 隨機森林中的學習器的多樣性不只來自樣本擾動,還來自屬性擾動。這能夠大大提升模型的泛化能力。

聽着有些抽象,實際上就是在隨機森林中,對基決策樹的每一個結點,先從該結點的屬性集合中隨機選擇一個包含 k 個屬性的子集,而後再從這個子集中選擇一個最優屬性用於劃分:性能

  • 若是 k = n,則基決策樹的構建與傳統決策樹相同。
  • 若是 k = 1,則隨機選擇一個屬性用於劃分。
  • 一般建議 k=\log _{2} n

隨着樹的數量的增長,隨機森林能夠有效緩解過擬合。由於隨着樹的數量增長,模型的方差會顯著下降。可是樹的數量增長並不會糾正誤差,所以隨機森林仍是會有過擬合。學習

在 sklearn 中使用隨機森林很是簡單,注意隨機森林擁有 DecisionTreeClassifier 和 BaggingClassifier 的全部參數,好比:

rf_clf2 = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, max_depth=10, min_samples_split=2, min_samples_leaf=2, max_leaf_nodes=None, oob_score=True, n_jobs=-1)
rf_clf2.fit(X, y)

rf_clf2.oob_score_
複製代碼

由於 RandomForestClassifier/RandomForestRegression 在 kaggle/天池這樣的比賽用的比較多,下面將一些重要的參數列一下:

  • n_estimators: 子模型的數量,默認爲 10。
  • max_features: 節點分裂時參與判斷的最大特徵數,能夠有的取值:
    • int: 特徵個數。
    • float: 佔全部特徵的百分比。
    • auto/sqrt: 全部特徵數的開方。
    • log2: 全部特徵數的 log2 值。
    • None: 等於全部特徵數。
  • max_depth: 若是 max_leaf_nodes 有指定則忽略
    • int: 樹的最大深度
    • None: 樹會生長到全部葉子都分到一個類,或者某節點所表明的樣本數已小於 min_samples_split
  • min_samples_split: 分裂所需的最小樣本數,默認爲 2。
  • max_leaf_nodes: 最多有多少葉節點,爲 None 表示不限制。
  • bootstrap: 時候對樣本進行 bootstrap 抽樣,默認爲 ture,爲 false 則各個子模型的樣本一致。
  • oob_score: 是否計算袋外得分。

AdaBoost

提高方法(boosting) 是一種經常使用的統計學習方法。在分類問題中,它經過改變訓練樣本的權重學習多個分類器,並將這些分類器們進行線性組合來提升分類的能力。提高方法的基本思想是:對於一個複雜任務來講,將多個專家的判斷進行適當的綜合所得出的判斷,要比其中任何一個專家單獨的判斷要好。用一句古話說就是」三個臭皮匠頂一個諸葛亮「。

boosting 算法的一個大概流程是:

  • 首先從初始訓練集訓練出一個基學習器。
  • 再根據基學習器的表現對訓練樣本權重進行調整,使得先前基學習器作錯的訓練樣本在後續受到更多關注。
  • 而後基於調整後的樣本分佈來訓練下一個基學習器。
  • 如此重複,直到基學習器數量達到事先指定的值 M。最終將這 M 個基學習器進行加權組合。

boosting 算法中最著名的是 AdaBoost 算法。AdaBoost 算法有兩個核心概念:

  • 每一輪中如何改變訓練數據的權值?AdaBoost算法提升那些被前一輪弱分類器錯誤分類樣本的權值,而下降那些被正確分類樣本的權值。因而那些沒有獲得正確分類的數據因爲權值的加大而受到後一輪的弱分類器的更大關注。
  • 最後如何將一系列弱分類器組合成一個強分類器?AdaBoost 採用加權多數表決的方法:
    • 加大分類偏差率較小的弱分類器的權值,使得它在表決中起較大做用。
    • 減少分類偏差率較大的弱分類器的權值,使得它在表決中起較小的做用。

AdaBoost 算法不改變所給的訓練數據,而不斷改變訓練數據權值的分佈,使得訓練數據在基本分類器的學習中起不一樣做用。所以 AdaBoost 要求基本學習器可以對特定的數據分佈進行學習,這通常是在學習的時候爲每一個訓練樣本賦予一個權重。Adaboost 算法的基本公示以下,下面一節作一個詳細的介紹。

H(\overrightarrow{\mathbf{x}})=\operatorname{sign}(f(\overrightarrow{\mathbf{x}}))=\operatorname{sign}\left(\sum_{m=1}^{M} \alpha_{m} h_{m}(\overrightarrow{\mathbf{x}})\right)

算法解析

現有訓練數據集:

\mathbb{D}=\left\{\left(\overrightarrow{\mathbf{x}}_{1}, \tilde{y}_{1}\right),\left(\overrightarrow{\mathbf{x}}_{2}, \tilde{y}_{2}\right), \cdots,\left(\overrightarrow{\mathbf{x}}_{N}, \tilde{y}_{N}\right)\right\}, \overrightarrow{\mathbf{x}}_{i} \in \mathcal{X} \subset \mathbb{R}^{n}, \tilde{y}_{i} \in \mathcal{Y}=\{-1,+1\}

初始化訓練數據的權值分佈 W_{1}=\left(w_{1,1}, w_{1,2}, \cdots, w_{1, N}\right), w_{1, i}=\frac{1}{N}

假設有 m 個學習器,對於 m=1,2, \cdots, M,步驟以下:

  • 使用具備權值分佈 W_{m} 的訓練數據集學習,根據輸入的弱學習算法獲得基本分類器:h_{m}(\overrightarrow{\mathbf{x}}) : \mathcal{X} \rightarrow\{-1,+1\}
  • 計算 h_{m}(\overrightarrow{\mathbf{x}}) 在訓練數據集上的分類偏差率:e_{m}=\sum_{i=1}^{N} w_{m, i} I\left(h_{m}\left(\overrightarrow{\mathbf{x}}_{i}\right) \neq \tilde{y}_{i}\right)。它就是全部誤分類點的權重之和。其中權重越大的偏差分類點,其在偏差率中佔比越大。
  • 若是 e_{m} \geq \frac{1}{2},算法終止。
  • \alpha_{m}=\frac{1}{2} \log \frac{1-e_{m}}{e_{m}}。該係數表示 h_{m}(\overrightarrow{\mathbf{x}}) 在集成分類器中的重要性。它是 e_{m} 的單調減函數,說明偏差越小的基本分類器,其重要性越高。根據係數大於零要求 e_{m}<\frac{1}{2}
  • 更新訓練數據集的權值分佈:W_{m+1}=\left(w_{m+1,1}, w_{m+1,2}, \cdots, w_{m+1, N}\right)。其中:w_{m+1, i}=\frac{w_{m, i}}{Z_{m}} \exp \left(-\alpha_{m} \tilde{y}_{i} h_{m}\left(\overrightarrow{\mathbf{x}}_{i}\right)\right)Z_{m}=\sum_{i=1}^{N} w_{m, i} \exp \left(-\alpha_{m} \tilde{y}_{i} h_{m}\left(\overrightarrow{\mathbf{x}}_{i}\right)\right),爲規範化因子,它使得 W_{m+1} 成爲一個機率分佈。

構建基本分類器的線性組合: f(\overrightarrow{\mathbf{x}})=\sum_{m=1}^{M} \alpha_{m} h_{m}(\overrightarrow{\mathbf{x}})。獲得集成分類器:H(\overrightarrow{\mathbf{x}})=\operatorname{sign}\left(\sum_{m=1}^{M} \alpha_{m} h_{m}(\overrightarrow{\mathbf{x}})\right)

adaboost-sklearn

sklearn 中 adaboost 使用以下:

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier

ada_clf = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=4), n_estimators=500)
ada_clf.fit(X_train, y_train)
ada_clf.score(X_test, y_test)
複製代碼

集成策略

假定集成包含 M 個基學習器 h_{1}, h_{2}, \cdots, h_{M}。一般有三種集成策略:

  • 平均法。
  • 投票法。
  • 學習法。(stacking 算法,本文暫時跳過)

平均法

平均法一般用於迴歸任務中。

  • 簡單平均法: H(\overrightarrow{\mathbf{x}})=\frac{1}{M} \sum_{i=1}^{M} h_{i}(\overrightarrow{\mathbf{x}})
  • 加權平均法:
\begin{aligned} H(\overrightarrow{\mathbf{x}}) &=\frac{1}{M} \sum_{i=1}^{M} w_{i} h_{i}(\overrightarrow{\mathbf{x}}) \\ w_{i} & \geq 0, \sum_{i=1}^{M} w_{i}=1 \end{aligned}

一般若是個體學習器性能相差較大時,適合使用加權平均法;個體學習器性能相差較近時,適合使用簡單平均法。

投票法

投票法一般用於分類任務中。

  • 相對多數投票法:選取得票最多的標記做爲預測值: H(\overrightarrow{\mathbf{x}})=\arg \max _{c_{j}} \sum_{i=1}^{M} I\left(h_{i}(\overrightarrow{\mathbf{x}})=c_{j}\right)
  • 加權投票法:相似於加權平均法,其中學習器 h_{i} 的權重 w_{i} 是從訓練數據中學的: H(\overrightarrow{\mathbf{x}})=\arg \max _{c_{j}} \sum_{i=1}^{M} w_{i} I\left(h_{i}(\overrightarrow{\mathbf{x}})=c_{j}\right)

TODO

後續補充一下 gbdt 和 stacking 兩種集成學習算法。

See Also

sklearn-ensemble

wikipedia-adabootst

wikipedia-gbdt

explain-bias-variance

相關文章
相關標籤/搜索