集成學習 ensemble learning 是經過構建多個學習器來完成學習任務,在實際應用以及各大競賽中應用很是普遍。根據學習器的生成方式,集成學習方法大概能夠分做兩類:html
Bagging 是藉助於 bootstrap 算法來採樣。給定包含 N 個樣本的數據集,步驟是:node
初始訓練集中有的樣本在採樣集中屢次出現,有的則從未出現。一個樣本始終不在採樣集中出現的機率是 。根據 ,所以初始訓練集中約有 63.2% 的樣原本訓練,剩下的約 36.8% 的樣本可用做驗證集來對泛化性能進行包外估計。python
使用 M 個學習器的 Bagging 的基本流程:算法
使用 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 作了一些改進。函數
聽着有些抽象,實際上就是在隨機森林中,對基決策樹的每一個結點,先從該結點的屬性集合中隨機選擇一個包含 k 個屬性的子集,而後再從這個子集中選擇一個最優屬性用於劃分:性能
隨着樹的數量的增長,隨機森林能夠有效緩解過擬合。由於隨着樹的數量增長,模型的方差會顯著下降。可是樹的數量增長並不會糾正誤差,所以隨機森林仍是會有過擬合。學習
在 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/天池這樣的比賽用的比較多,下面將一些重要的參數列一下:
提高方法(boosting) 是一種經常使用的統計學習方法。在分類問題中,它經過改變訓練樣本的權重學習多個分類器,並將這些分類器們進行線性組合來提升分類的能力。提高方法的基本思想是:對於一個複雜任務來講,將多個專家的判斷進行適當的綜合所得出的判斷,要比其中任何一個專家單獨的判斷要好。用一句古話說就是」三個臭皮匠頂一個諸葛亮「。
boosting 算法的一個大概流程是:
boosting 算法中最著名的是 AdaBoost 算法。AdaBoost 算法有兩個核心概念:
AdaBoost 算法不改變所給的訓練數據,而不斷改變訓練數據權值的分佈,使得訓練數據在基本分類器的學習中起不一樣做用。所以 AdaBoost 要求基本學習器可以對特定的數據分佈進行學習,這通常是在學習的時候爲每一個訓練樣本賦予一個權重。Adaboost 算法的基本公示以下,下面一節作一個詳細的介紹。
現有訓練數據集:
初始化訓練數據的權值分佈 。
假設有 m 個學習器,對於 ,步驟以下:
構建基本分類器的線性組合: 。獲得集成分類器:。
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 個基學習器 。一般有三種集成策略:
平均法一般用於迴歸任務中。
一般若是個體學習器性能相差較大時,適合使用加權平均法;個體學習器性能相差較近時,適合使用簡單平均法。
投票法一般用於分類任務中。
後續補充一下 gbdt 和 stacking 兩種集成學習算法。