1. 程式人生 > >python機器學習案例系列教程——整合學習(Bagging、Boosting、隨機森林RF、AdaBoost、GBDT、xgboost)

python機器學習案例系列教程——整合學習(Bagging、Boosting、隨機森林RF、AdaBoost、GBDT、xgboost)

可以通過聚集多個分類器的預測結果提高分類器的分類準確率,這一方法稱為整合(Ensemble)學習或分類器組合(Classifier Combination),該方法由訓練資料構建一組基分類器(Base Classifier),然後通過對每個基分類器的預測進行投票來進行分類。

整合學習(ensemble learning)通過組合多個基分類器(base classifier)來完成學習任務,頗有點“三個臭皮匠頂個諸葛亮”的意味。基分類器一般採用的是弱可學習(weakly learnable)分類器,通過整合學習,組合成一個強可學習(strongly learnable)分類器。所謂弱可學習,是指學習的正確率僅略優於隨機猜測的多項式學習演算法;強可學習指正確率較高的多項式學習演算法。整合學習的泛化能力一般比單一的基分類器要好,這是因為大部分基分類器都分類錯誤的概率遠低於單一基分類器的

偏差與方差

“偏差-方差分解”(bias variance decomposition)是用來解釋機器學習演算法的泛化能力的一種重要工具。對於同一個演算法,在不同訓練集上學得結果可能不同。對於訓練集D=(x1,y1),(x2,y2),,(xN,yN),由於噪音,樣本x的真實類別為y(在訓練集中的類別為y),則噪聲為

ξ2=ED[(ydy)2]

各種學習模型得到的預測值的期望為

f(x)^=ED[f(x;D)]

使用樣本數相同的不同訓練集所產生的方差

var(x)=ED[(f(x;D)f(x)^)2]

期望輸出與真實類別的差別稱為bias,則

bias2(x)=(f(x)^y)2

Bagging

Bagging(Bootstrap Aggregating)對訓練資料採用自助取樣(boostrap sampling),即有放回地取樣資料;每一次的取樣資料集訓練出一個基分類器,經過M次取樣得到M個基分類器,然後根據最大表決(majority vote)原則組合基分類器的分類結果。

這裡寫圖片描述

Boosting

Boosting的思路則是採用重賦權(re-weighting)法迭代地訓練基分類器,即對每一輪的訓練資料樣本賦予一個權重,並且每一輪樣本的權值分佈依賴上一輪的分類結果;基分類器之間採用序列式的線性加權方式進行組合。他通過迭代地訓練一系列的分類器,每個分類器採用的樣本分佈都和上一輪的學習結果有關。其代表演算法是AdaBoost, GBDT。

這裡寫圖片描述

從“偏差-方差分解”的角度看,Bagging關注於降低variance,而Boosting則是降低bias;Boosting的基分類器是強相關的,並不能顯著降低variance。Bagging與Boosting有分屬於自己流派的兩大殺器:隨機森林Random Forests(RF)和梯度下降樹Gradient Boosting Decision Tree(GBDT)。AdaBoost屬於Boosting流派。

Bagging、Boosting二者之間的區別

樣本選擇上:
Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。
Boosting:每一輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整。

樣例權重:
Bagging:使用均勻取樣,每個樣例的權重相等。
Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大。

預測函式:
Bagging:所有預測函式的權重相等。
Boosting:每個弱分類器都有相應的權重,對於分類誤差小的分類器會有更大的權重。

平行計算:
Bagging:各個預測函式可以並行生成。
Boosting:各個預測函式只能順序生成,因為後一個模型引數需要前一輪模型的結果。

總結

這兩種方法都是把若干個分類器整合為一個分類器的方法,只是整合的方式不一樣,最終得到不一樣的效果,將不同的分類演算法套入到此類演算法框架中一定程度上會提高了原單一分類器的分類效果,但是也增大了計算量。

下面是將決策樹與這些演算法框架進行結合所得到的新的演算法:

Bagging + 決策樹 = 隨機森林
AdaBoost + 決策樹 = 提升樹
Gradient Boosting + 決策樹 = GBDT

隨機森林RF

理解了bagging演算法,隨機森林(Random Forest,以下簡稱RF)就好理解了。它是Bagging演算法的進化版,也就是說,它的思想仍然是bagging,但是進行了獨有的改進。我們現在就來看看RF演算法改進了什麼。   

首先,RF使用了CART決策樹作為弱學習器。第二,在使用決策樹的基礎上,RF對決策樹的建立做了改進,對於普通的決策樹,我們會在節點上所有的n個樣本特徵中選擇一個最優的特徵來做決策樹的左右子樹劃分,但是RF通過隨機選擇節點上的一部分樣本特徵,這個數字小於n,假設為nsub,然後在這些隨機選擇的nsub個樣本特徵中,選擇一個最優的特徵來做決策樹的左右子樹劃分。這樣進一步增強了模型的泛化能力。

如果nsub=n,則此時RF的CART決策樹和普通的CART決策樹沒有區別。nsub越小,則模型越健壯,當然此時對於訓練集的擬合程度會變差。也就是說nsub越小,模型的方差會減小,但是偏倚會增大。在實際案例中,一般會通過交叉驗證調參獲取一個合適的nsub的值。
除了上面兩點,RF和普通的bagging演算法沒有什麼不同, 下面簡單總結下RF的演算法。

輸入為樣本集D=(x1,y1),(x2,y2),...(xm,ym),弱分類器迭代次數T。輸出為最終的強分類器f(x):

1)對於t=1,2...,T

  • a)對訓練集進行第t次隨機取樣,得到一個包含m個樣本的取樣集Dm
  • b)用取樣集Dm訓練第m個決策樹模型Gm(x),在訓練決策樹模型的節點的時候, 在所有的特徵中選擇一部分特徵,在這些隨機選擇的部分樣本特徵中選擇最優的特徵來做決策樹的左右子樹劃分。

2) 如果是分類演算法預測,則T個弱學習器投出最多票數的類別或者類別之一為最終類別。如果是迴歸演算法,T個弱學習器得到的迴歸結果進行算術平均得到的值為最終的模型輸出。

作為一個可以高度並行化的演算法,RF在大資料時候大有可為。這裡也對常規的隨機森林演算法的優缺點做一個總結。

RF的主要優點有:

1)訓練可以高度並行化,對於大資料時代的大樣本訓練速度有優勢。個人覺得這是的最主要的優點。
2)由於可以隨機選擇決策樹節點劃分特徵,這樣在樣本特徵維度很高的時候,仍然能高效的訓練模型。
3)在訓練後,可以給出各個特徵對於輸出的重要性
4)由於採用了隨機取樣,訓練出的模型的方差小,泛化能力強。
5)相對於Boosting系列的Adaboost和GBDT, RF實現比較簡單。
6)對部分特徵缺失不敏感。

隨機森林的準確率可以和adaboost相媲美,但是對錯誤和離群點更魯棒。隨機森林中樹的個數增加,森林的泛化誤差收斂,因此過擬合不是問題。隨機森林的準確率依賴於個體分類器的實力和他們之間的依賴性。理想情況是保持個體分類的能力而不提高他們之間的相關性。隨機森林對每次劃分所考慮的屬性數目很敏感。通常選取log2d+1個屬性。

RF的主要缺點有:

1)在某些噪音比較大的樣本集上,RF模型容易陷入過擬合。
2)取值劃分比較多的特徵容易對RF的決策產生更大的影響,從而影響擬合的模型的效果。

AdaBoost

AdaBoost是由Freund與Schapire提出來解決二分類問題