項目地址:https://github.com/Daya-Jin/ML_for_learner
原博客:https://daya-jin.github.io/2018/08/15/EnsembleLearning/
Ensemble Learning
Bagging
前文說到樹模型不穩定,那麼怎麼減少模型的variance?假設有n個獨立變量Z1、Z2、……、Zn,每個變量的方差都爲σ2,那麼變量Zˉ的方差爲σ2/n,可以看到均化可以減少方差。
Bagging(bootstrap aggregation)的思想就是在原數據集中進行多次抽樣得到多個訓練子集,再在這些訓練子集上分別訓練多個模型,最後把這些模型的預測結果均化即可。
假設有訓練集X,經過B輪有放回的抽樣得到B個訓練子集[X1,X2,...,XB],分別在這些訓練子集上訓練得到B個模型[f1(x),f2(x),...,fB(x)],然後將所有模型的輸出均化作爲預測結果,即:
Y^bagging=B1i=1∑Bf^i(x)
對於分類問題,預測輸出是無量綱的離散值,無法均化,採用投票機制即可。
Bagging算法中模型的個數B不是一個很重要的參數,因爲B在過大時也不會發生過擬合。Bagging算法中最關鍵的一環就是採樣,有以下幾種策略:
- 隨機選取一個子集,叫做Pasting
- 有放回的抽樣得到一個子集,叫做Bagging,可以證明有放回的抽樣最多隻會抽到2/3的樣本
- 隨機選取一個特徵子集,叫做隨機子空間(subspace sampling)
- 如果同時隨機選取樣本子集與特徵子集,叫做Random Patches
通常使用的就是bagging抽樣,注意到使用有放回抽樣的bagging算法最多隻會抽樣原樣本集的2/3數據,那麼剩下的1/3數據就可以用來做線下驗證,所以使用bagging算法的模型不需要做CV,直接使用未被抽樣的數據來做驗證,這種策略叫做包外誤差估計(out-of-bag Error Estimation)。
樹模型+bagging
決策樹模型原本的優點就是它的強解釋性,而缺點就是模型有較大的方差,而在使用bagging之後,其解釋性被減弱了,但是其方差也被大大降低了,這是一種權衡策略。另一方面,雖然bagging算法使得決策樹模型不再具有可解釋性,但是卻可以得出一個特徵重要性(feature importance)。在使用bagging算法生成樹時,可以記錄每個特徵在B棵樹以該特徵分裂時所降低的一個平均誤差或平均基尼指數,然後以該值排序就可以得到一個特徵重要性排名。
Random Forest
假設數據中有一個或數個強特徵,那麼在bagging算法中,雖然每棵樹使用了不同的數據子集,但是每棵樹在做頂層分裂時總是會根據最強的那幾個特徵來做分裂,這樣就造成了bagging中每棵樹的相似度很高,學到的內容相似,樹之間有很高的相關性。對不滿足iid條件的變量做均化並不能降低太多的方差。前文提到了一種同時選取樣本子集與特徵子集的抽樣方法,那麼可以借鑑Random Patches的思想來降低樹之間的相關性,這種策略叫做解耦(decorrelate)。
假定訓練集X有n個特徵Z1、Z2、……、Zn,經過B輪有放回的抽樣得到B個訓練子集[X1,X2,...,XB],同樣在這B個訓練集上訓練B個樹模型[f1(x),f2(x),...,fB(x)],Random Forest與Bagging唯一的不同就在於每個樹模型的訓練過程。bagging在每棵樹生成時會在當前樣本子集所有特徵中找一個最佳分割點進行分裂,而random forest在每次分裂時只會隨機選取一個特徵子集做分裂,隨機選取的特徵子集大小一般爲p=n。
實現指導:分類 迴歸
完整代碼:分類 迴歸
Boosting
不同於bagging,boosting算法是一種串行修正算法,在同一個訓練集上串行訓練多個模型,每一個模型會針對上一個模型的錯誤進行修正。下面首先以二分類的AdaBoost做示例講解。
AdaBoost
現有訓練集X與Y,數據共有n個樣本[x1,x2,...,xn],AdaBoost算法流程如下:
- 初始化數據樣本的權重,所有樣本權重相等,wi=n1
- 在帶權數據集上訓練一個模型f1(x),並計算該模型在訓練集上的加權平均誤差err1=∑i=1nwi∑i=1nwiI(yi̸=f1(xi))
- 根據模型的表現給模型賦一個權重係數α1=log(err11−1)
- 根據模型的表現給樣本重新分配權重,wi:=wi⋅exp[α1⋅I(yi̸=f1(xi))]
- 重複2,3,4步,串行訓練得到k個模型[f1(x),f2(x),...,fk(x)],整個算法的輸出爲
F(x)=sign(i=1∑kαifi(x))
需要注意的有兩點:
在第3步計算模型權重時,注意到當err=21(隨機猜)時α=0,當err>21時α<0,當err<21時α>0,即對那些好於隨機猜的模型會賦予一個正權重,而對那些還不如隨機猜的模型賦予一個負權重;
另一個,在對樣本重新分配權重時,注意到當α1⋅I(yi̸=f1(xi))>0時,樣本的權重纔會增大,反之會減小,而等於零時則權重不變。且注意到AdaBoost只會改變被誤分類樣本的權重,而在需要改變權重I(yi̸=f1(xi))=1的條件下,樣本權重的更改量只取決於模型權重α,而模型權重α又取決於模型的分類誤差err,所以可以看出:減小那些被err>21模型誤分類樣本的權重,增大那些被err<21模型誤分類樣本的權重。
實現指導
完整代碼
增量Boosting
增量Boosting是boosting的一個變種算法,該算法在同一個數據集上同樣串行訓練得到k個模型,最後整個算法的輸出是這些模型的線性加權:
F(x)=i=1∑kβifi(x;θi)
那麼其優化問題可表示爲:
argβ,θmini=1∑nL(yi,j=1∑kβjfj(xi;θj))
其中L(yi,f(xi))爲損失計算函數。上述優化問題計算複雜很難解,下面介紹一種基於貪心策略的優化方法。
基於貪心策略的增量Boosting算法流程如下所述:
- 初始化一個空模型f0(x)=0
- 以已有模型爲基礎,訓練一個增量模型b1(x;θ1),令當前模型爲f1(x)=f0(x)+β1b1(x;θ1)
- 當前模型的訓練問題可表示成:argβ1,θ1mini=1∑nL(yi,f0(x)+β1b1(xi;θ1))
- 重複第2,3步,最後得到k個模型[b1(x),b2(x),...,bk(x)],整個算法模型爲f(x)=i=1∑kβibi(x;θi)
上述增量boosting算法也叫做前向增量建模(Forward Stagewise Additive Modeling)。然後以一個簡單例子來進一步探討此算法。
取損失函數爲平方誤差L(yi,f(xi))=(yi−f(xi))2,那麼在增量boosting第m輪時的損失函數可以寫成:
i=1∑nL(yi,fm(xi))=i=1∑nL(yi,fm−1(xi)+βmbm(xi;θm))=i=1∑n(yi−fm−1(xi)−βmbm(xi;θm))2=i=1∑n(ri,m−1−βmbm(xi;θm)2=i=1∑nL(ri,m−1,βmbm(xi;θm)
其中,ri,m−1稱爲第m−1輪的模型對第i個樣本的預測殘差。通過上述變換可以看出,增量boosting算法第m輪所訓練的增量模型βmbm(xi;θm)擬合的其實是上一輪模型的殘差。
AdaBoost等價於使用指數損失函數的增量Boosting
取損失函數爲指數損失函數:
L(y,y^)=exp(−y⋅y^)
那麼增量boosting問題可以寫成:
(βm,θm)=argβ,θmini=1∑nexp[−yi(fm−1(xi)+βmbm(xi;θm))]
待補充
GBM
在之前所講過的一系列模型中,對於參數優化問題,有一種通用解法就是梯度下降法:
θ:=θ−α∂f(x)∂L(y,f(x))
而增量boosting模型可以寫成:
f(x):=f(x)+βb(x)
僅僅受表達形式上的啓發,就可以很容易想到:把模型f(x)當做需要優化的參數,令每一輪的新模型b(x)去擬合負梯度,那麼就可以借鑑梯度下降法的思想來得到一個最優或次優模型,由此引出梯度提升機(Gradient Boosting Machine)的概念。增量boosting模型在第m輪時的損失可以寫成:
i=1∑NL(yi,fm(xi))=i=1∑NL(yi,fm−1(xi)+βmbm(xi;θm))=i=1∑NL(yi,fm−1(xi))+βmi=1∑Ngi,mbm(xi;θm)
其中gi,m=∂fm−1(xi)∂L(yi,fm−1(xi)),L(yi,fm−1(xi))稱爲僞殘差。在上式中,∑i=1NL(yi,fm−1(xi))是常數,要想最小化∑i=1NL(yi,fm(xi)),易得bm(xi;θm)必須要跟gi,m異號,這樣才能修正上一輪的錯誤以減小損失值。受上面梯度下降法的啓發,令:
bm(xi;θm)=−gi,m
即訓練一個新模型去擬合僞殘差關於上一輪模型fm−1的負梯度,那麼GBM算法的優化問題可以寫成:
θm=argθmini=1∑nL(gi,m,bm(xi;θm))
未出現的參數βm即學習率。特別地,當每輪的基模型使用樹模型時,這種GBM被稱爲梯度提升樹(Gradient Boosted Decision Trees)。在GBDT理論中,對於樹的基模型怎麼生成並沒有做具體規定,不過最常用的基模型還是CART,背後的核心思想是梯度下降法。