Udacity機器學習入門筆記4-集成方法

1 概述

在機器學習的有監督學習算法中,我們的目標是學習出一個穩定的且在各個方面表現都較好的模型,但實際情況往往不這麼理想,有時我們只能得到多個有偏好的模型(弱監督模型,在某些方面表現的比較好)。集成學習就是組合這裏的多個弱監督模型以期得到一個更好更全面的強監督模型,集成學習潛在的思想是即便某一個弱分類器得到了錯誤的預測,其他的弱分類器也可以將錯誤糾正回來。
集成方法是將幾種機器學習技術組合成一個預測模型的元算法,以達到減小方差(bagging)、偏差(boosting)或改進預測(stacking)的效果。
集合方法可分爲兩類:

  • 序列集成方法,其中參與訓練的基礎學習器按照順序生成(例如 AdaBoost)。序列方法的原理是利用基礎學習器之間的依賴關係。通過對之前訓練中錯誤標記的樣本賦值較高的權重,可以提高整體的預測效果。
  • 並行集成方法,其中參與訓練的基礎學習器並行生成(例如 Random Forest)。並行方法的原理是利用基礎學習器之間的獨立性,通過平均可以顯著降低錯誤。

總結一下,集成學習法的特點:

  1. 將多個分類方法聚集在一起,以提高分類的準確率。(這些算法可以是不同的算法,也可以是相同的算法。)
  2. 集成學習法由訓練數據構建一組基分類器,然後通過對每個基分類器的預測進行投票來進行分類.
  3. 嚴格來說,集成學習並不算是一種分類器,而是一種分類器結合的方法。
  4. 通常一個集成分類器的分類性能會好於單個分類器
  5. 如果把單個分類器比作一個決策者的話,集成學習的方法就相當於多個決策者共同進行一項決策。

自然地,就產生兩個問題:

1)怎麼訓練每個算法?

2)怎麼融合每個算法?

這篇博客介紹一下集成學習的幾個方法:Bagging,Boosting以及Stacking。

2 集成學習方法

2.1 Bagging(bootstrap aggregating,裝袋)

Bagging即套袋法,先說一下bootstrap,bootstrap也稱爲自助法,它是一種有放回的抽樣方法,目的爲了得到統計量的分佈以及置信區間,其算法過程如下:
  A)從原始樣本集中抽取訓練集。每輪從原始樣本集中使用Bootstraping的方法抽取n個訓練樣本(在訓練集中,有些樣本可能被多次抽取到,而有些樣本可能一次都沒有被抽中)。共進行k輪抽取,得到k個訓練集。(k個訓練集之間是相互獨立的)
  B)每次使用一個訓練集得到一個模型,k個訓練集共得到k個模型。(注:這裏並沒有具體的分類算法或迴歸方法,我們可以根據具體問題採用不同的分類或迴歸方法,如決策樹、感知器等)
  C)對分類問題:將上步得到的k個模型採用投票的方式得到分類結果;對迴歸問題,計算上述模型的均值作爲最後的結果。(所有模型的重要性相同)

在這裏插入圖片描述
由此,總結一下bagging方法:
  ① Bagging通過降低基分類器的方差,改善了泛化誤差
  ② 其性能依賴於基分類器的穩定性;如果基分類器不穩定,bagging有助於降低訓練數據的隨機波動導致的誤差;如果穩定,則集成分類器的誤差主要由基分類器的偏倚引起
  ③ 由於每個樣本被選中的概率相同,因此bagging並不側重於訓練數據集中的任何特定實例

常用的集成算法類是隨機森林。
  在隨機森林中,集成中的每棵樹都是由從訓練集中抽取的樣本(即 bootstrap 樣本)構建的。另外,與使用所有特徵不同,這裏隨機選擇特徵子集,從而進一步達到對樹的隨機化目的。
因此,隨機森林產生的偏差略有增加,但是由於對相關性較小的樹計算平均值,估計方差減小了,導致模型的整體效果更好。

2.2 Boosting

其主要思想是將弱分類器組裝成一個強分類器。在PAC(probably approximately correct,概率近似正確)學習框架下,則一定可以將弱分類器組裝成一個強分類器。
關於Boosting的兩個核心問題:
  1)在每一輪如何改變訓練數據的權值或概率分佈?
  通過提高那些在前一輪被弱分類器分錯樣例的權值,減小前一輪分對樣例的權值,來使得分類器對誤分的數據有較好的效果。
  2)通過什麼方式來組合弱分類器?
  通過加法模型將弱分類器進行線性組合,比如:
  AdaBoost(Adaptive boosting)算法:剛開始訓練時對每一個訓練例賦相等的權重,然後用該算法對訓練集訓練t輪,每次訓練後,對訓練失敗的訓練例賦以較大的權重,也就是讓學習算法在每次學習以後更注意學錯的樣本,從而得到多個預測函數。通過擬合殘差的方式逐步減小殘差,將每一步生成的模型疊加得到最終模型。
  GBDT(Gradient Boost Decision Tree),每一次的計算是爲了減少上一次的殘差,GBDT在殘差減少(負梯度)的方向上建立一個新的模型。
在這裏插入圖片描述

3 數學模型

GBRT考慮的添加模型如下
F(x)=m=1Mγmhm(x) F(x)=\sum_{m=1}^{M} \gamma_{m} h_{m}(x)

hm(x)h_{m}(x)是弱學習的基礎函數,Gradient Tree Boosting使用固定大小決策樹作爲弱學習,決策樹有處理混合型和複雜功能的建模能力。
GBRT以貪婪風格實現加法模型:
Fm(x)=Fm1(x)+γmhm(x) F_{m}(x)=F_{m-1}(x)+\gamma_{m} h_{m}(x)
其中新添加的hm(x)h_{m}(x)努力把損失降到最低 :
hm=argminhi=1nL(yi,Fm1(xi)+h(xi)) h_{m}=\arg \min _{h} \sum_{i=1}^{n} L\left(y_{i}, F_{m-1}\left(x_{i}\right)+h\left(x_{i}\right)\right)
GBRT試圖通過最速下降數值解決這個最小化問題:最速下降方向是損失函數的負梯度方向
Fm(x)=Fm1(x)γmi=1nFL(yi,Fm1(xi)) F_{m}(x)=F_{m-1}(x)-\gamma_{m} \sum_{i=1}^{n} \nabla_{F} L\left(y_{i}, F_{m-1}\left(x_{i}\right)\right)
步長γm\gamma_{m}使用線搜索選擇:
γm=argminγi=1nL(yi,Fm1(xi)γL(yi,Fm1(xi))Fm1(xi)) \gamma_{m}=\arg \min _{\gamma} \sum_{i=1}^{n} L\left(y_{i}, F_{m-1}\left(x_{i}\right)-\gamma \frac{\partial L\left(y_{i}, F_{m-1}\left(x_{i}\right)\right)}{\partial F_{m-1}\left(x_{i}\right)}\right)
對於迴歸和分類的算法只是使用的損失函數不同。

4 sklearn 應用

>>> 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, cv=5)
>>> scores.mean()                               
0.98...

>>> clf = RandomForestClassifier(n_estimators=10, max_depth=None,
...     min_samples_split=2, random_state=0)
>>> scores = cross_val_score(clf, X, y, cv=5)
>>> 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, cv=5)
>>> scores.mean() > 0.999
True

在這裏插入圖片描述

5 mini-project

from sklearn.ensemble import AdaBoostClassifier
clf = AdaBoostClassifier(n_estimators=100)
t0 = time()
#print len(features_train[0])
clf.fit(features_train,labels_train)
print "training time:", round(time()-t0,3),"s"
t0 = time()
pred =clf.predict(features_test)
print "predict time:", round(time()-t0,3),"s"
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(labels_test,pred)
print accuracy

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

6 參考文獻

機器學習–集成學習(Ensemble Learning) https://www.cnblogs.com/zongfa/p/9304353.html
sklearn ensemble methods https://scikit-learn.org/stable/modules/ensemble.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章