1. 程式人生 > >整合學習:隨機森林/GBDT/XGBoost (學習筆記一)

整合學習:隨機森林/GBDT/XGBoost (學習筆記一)

知識點:

  • 隨機森林

  • 提升演算法

  • GBDT(迭代決策樹)

  • Adaboost

  • XGBoost

  • Stacking

整合學習(Ensemble Learning)

整合學習的思想就是將若干個學習器(分類器&迴歸器)組合之後產生一個新學習器.弱分類器(weak learner)指那些分類準確率只稍微好於隨機猜測的分類器(error<0.5);

整合演算法的成功在於保證弱分類器的多樣性(Diversity).而且整合不穩定的演算法也能夠得到一個較為明顯的效能提升.

常見的整合學習思想有:

Bagging

Boosting

Stacking

Why need Ensemble Learning?

1.弱分類器間存在一定的差異性,這會導致分類的邊界不同,也就是說可能存在錯誤.那麼將多個弱分類器合併後,就可以得到更加合理的邊界,減少整體的錯誤率,

2.對於資料過大或者過小,可以分別進行劃分和有放回的操作產生不同的資料子集,然後使用資料子集訓練不同的分類器,最終再合併成為一個大分類器;

3.如果資料劃分邊界過於複雜,使用線性模型很難描述情況,那麼可以訓練多個模型,然後再進行模型的融合;

4.對於多個異構的特徵集的時候,很難進行融合,那麼可以考慮每個資料集構建一個分類模型,然後將多個模型融合.

Bagging方法

Bagging方法又叫做自舉匯聚法(BoostStrap Aggregating),思想就是:在原始資料集上通過有放回的抽樣方式,重新選怎S個新資料集來分別訓練S個分類器的整合技術.也就是說這些模型的訓練資料中允許存在重複資料.

Bagging方式訓練出來的模型在預測新樣本分類的時候,會使用多數投票法或者求均值的方式來統計最終的分類結果.

Bagging方法的弱學習器可以是基本的演算法模型,eg:Liner,Ridge,Lasso,Logistic,Softmax,ID3,C4.5,CART,SVM,KNN等.

備註:Bagging方式是有放回的抽樣,並且每個子集的樣本數量必須和原始樣本數量一致,但子集中允許重複資料.

Bagging方法_訓練過程

Bagging方法_預測過程

隨機森林(Random Forest)

在Bagging策略的基礎上進行修改後的一種演算法

  • 從原始樣本集(n個樣本)中使用booststrap取樣(有放回重取樣)選出n個樣本;
  • 從所有屬性中隨機選擇k個屬性,選擇最佳分割屬性作為節點建立決策樹;
  • 重複以上兩步m次,即建立m棵決策樹
  • 這m個決策樹形成隨機森林,通過投票表決結果決定資料屬於哪一類

袋外錯誤率

隨機森林有一個重要的優點,沒必要對它,進行交叉驗證或者用一個獨立的測試集來獲得誤差的一個無偏估計.它可以在內部進行評估,也就是說生成的過程中就可以對誤差建立一個無偏估計.

我們知道,在構建每棵樹的時候,我們對於每棵樹而言使用了不同的boostrap sample (隨機且有放回的抽取).對於每棵樹而言(假設對於第k棵樹),大約有1/3的訓練例項沒有參與第k棵樹的生成,它們稱為第k棵樹的oob樣本.

而這樣的取樣點就允許我們進行oob估計,它的計算方式如下:

對每個樣本,計算它作為oob樣本的樹對它的分類情況(約1/3的樹);

然後以簡單多數投票作為該樣本的分類結果;

最後用誤分個數佔樣本總數的比率作為隨機森林的oob誤分率.

oob誤分率是隨機森林泛化誤差的一個無偏估計,它的結果近似於需要大量計算的k折交叉驗證.

特徵重要度

作為單個的決策樹模型,在模型建立時實際上是尋找到某個特徵合適的分割點.這個資訊可以作為衡量所有特徵重要性的一個指標.

 

它的基本思想:如果一個特徵被選為分割點的次數越多,那麼這個特徵的重要性就越強.這個理念可以被推廣到整合演算法當中,只要將每棵樹的特徵重要性進行簡單的平均就可以啦.

根據特徵重要度進行特徵選擇.

RF的推廣演算法

RF演算法在實際應用中具有比較好的特性,應用也比較廣泛,主要應用在:分類,迴歸,特徵轉換,異常點檢測等.常見的RF變種演算法如下:

  • EXtra tree
  • TRTE(Totally Random Trees Embedding)
  • Isolation Forest

Extra Tree

Extra Tree 是RF的一個變種,原理基本和RF一樣,區別如下:

  • 1.RF會隨機取樣來作為子決策樹的訓練集,而Extra Tree每個子決策樹採用原始資料集訓練;
  • 2.RF在選擇劃分特徵點的時候回合傳統決策樹一樣,會基於資訊增益,資訊增益率,基尼係數,均方差等原則來選擇最優特徵值;而Extra Tree會隨機選擇特徵進行劃分決策樹.

Extra Tree因為是隨機選擇特徵值的劃分點,這樣會導致決策樹的規模一般大於RF所生成的決策樹.也就是說ExtraTree模型的方差相對於RF進一步減少.在某些情況下,Extra Tree的泛化能力比RF的強.

TRTE(Totally Random Trees Embedding)

TRTE是一種非監督的資料轉化方式.將低維資料對映到高維,從而讓對映到高維的資料更好 的應用於分類迴歸模型.

TRTE演算法的轉換過程類似RF演算法的方法,建立T個決策樹來擬合數據.當決策樹構建完成後,資料集裡的每個資料在T個決策樹中葉子節點的位置就定下來了,將位置資訊轉換為向量就完成了特徵轉換操作.

案例:有3棵決策樹,每顆決策樹和有5個葉子節點,某個資料x劃分到第一個決策樹的第三個葉子節點,第三個決策樹的第五個葉子節點,那麼最終的x對映特徵編碼為:(0,0,1,0,0,1,0,0,0,0,0,0,0,0,1)

IForest(Isolation Forest)

IForest是一種異常點檢測演算法,使用類似RF的方式來檢測異常點;IForest演算法和RF演算法的區別在於:

1.在隨機取樣的過程中,一般只需要少量資料即可;

2.在進行決策樹構建過程中,IForest演算法會隨機選擇一個劃分特徵,並對劃分特徵隨機選擇一個劃分閾值;

3.IForest演算法構建的決策樹一般深度max_depth是比較小的.

區別原因:目的是異常點檢測,所以只要能夠區分異常的即可,不需要大量資料;另外在異常點檢測的過程中,一般不需要太大規模的決策樹.

對於異常點的判斷,則是將測試樣本x擬合到T棵決策樹上.計算在每棵樹上該樣本的葉子節點的深度ht(x).從而計算出平均深度h(x);然後就可以使用下列公式極端樣本點x的異常概率值,p(s,m)的取值範圍為[0,1],越接近於1,則是異常點的概率越大.

RF的主要優點:
1. 訓練可以並行化,對於大規模樣本的訓練具有速度的優勢;
2. 由於進行隨機選擇決策樹劃分特徵列表,這樣在樣本維度比較高的時候,仍然具有比較高的訓練效能;

3. 給以給出各個特徵的重要性列表;
4. 由於存在隨機抽樣,訓練出來的模型方差小,泛化能力強;
5. RF實現簡單;
6. 對於部分特徵的缺失不敏感。

RF的主要缺點:
1. 在某些噪音比較大的特徵上,RF模型容易陷入過擬合;
2. 取值比較多的劃分特徵對RF的決策會產生更大的影響,從而有可能影響模型的效果。

隨機森林的思考

在隨機森林的構建過程中,由於各棵樹之間是沒有關係的,相互獨立的,在構建的過程中,構建第m棵子樹的時候,不會考慮前面的m-1棵樹.

思考:

如果構建第m棵樹的時候,考慮到前m-1棵子樹的結果,會不會對最終結果產生有益的影響?

各個決策樹組成隨機森林後,在形成最終結果的時候能不能給定一種既定得到決策順序呢?(也就是那顆子樹先進行決策,那顆子樹後進行決策)

Boosting

  • 提升學習(Boosting)是一種機器學習技術,可以用於迴歸和分類問題,它每一步產生弱預測模型(如決策樹)並加權累加到總模型中;如果每一步的弱預測模型的生成都是依據損失函式的梯度方式的,那麼就稱為梯度提升(Gradient Boosting);
  • 提升技術的意義:如果一個問題存在弱預測模型,那麼可以通過提升技術的方法得到一個強預測模型

常見模型有:

Adboost

Gradient Boosting(GBDT/GBT/GBRT)

AdaBoost演算法原理

Adaptive Boosting是一種迭代演算法.每輪迭代中會在訓練集上產生一個新的學習器,然後使用該學習器對所有樣本進行預測,以評估每個樣本的重要性(Informative).換句話說就是,演算法會為每個樣本賦予一個權重,每次用訓練好的學習器標註/預測各個樣本,如果某個樣本點唄預測的越正確,則將其權重降低,否則提高樣本的權重.權重越高的樣本在下一次迭代訓練中所佔的比重就會越大,也就是說越難區分的樣本在訓練過程中會變得越重要;

整個迭代過程知道錯誤率足夠小或者達到一定的迭代次數為止.

樣本加權

Adaboost演算法

Adaboost演算法將基分類器的線性組合作為強分類器,同時給分類誤差率較小的基本分類器以大的權值,給分類誤差率較大的分類器以較小的權重值;構建的線性組合為:

最終分類器是線上性組合的基礎上進行Sign函式轉換:

AdaBoost演算法原理

 

Adaboost演算法構建過程

 

AdaBoost總結

AdaBoost的優點如下:

  • 可以將處理連續值和離散值;
  • 可以將不同的分類演算法作為弱分類器;
  • 解釋強,結構簡單
  • 精度高

AdaBoost的缺點如下:

  • 對異常樣本敏感,異常樣本可能會在迭代過程中獲得較高的權重值,最終影響模型效果
  • 迭代次數(弱分類器個數)不好確定

梯度提升迭代決策樹GBDT

GBDT也是Boosting演算法的一種,但是和AdaBoost演算法不同;區別如下:AdaBoost演算法是利用前一輪的弱學習器的誤差來更新樣本權重值,然後一輪一輪的迭代;GBDT也是迭代,但是GBDT要求弱學習器必須是CART模型,而且GBDT在模型訓練的時候,是要求模型預測的樣本損失儘可能的小.

當給定步長的時候,給定一個步長step,在構建下一棵樹的時候使用step*殘差值作為輸入值,這種方式可以減少過擬合發生.

梯度提升迭代決策樹GBDT

GBDT由三部分構成:DT(Regression Decistion Tree),GB(Gradient Boosting)和Shrinkage(衰減)

由於多棵決策樹組成,所有樹的結果累加起來就是最終結果

迭代決策樹和隨機森林的區別:

  • 隨機森林使用抽取不同的樣本構建不同的子樹,也就是說第m棵樹的構建和前m-1棵樹的結果沒有關係.
  • 迭代決策樹在構建子樹的時候,使用之前子樹構建結果後形成的殘差作為輸入資料構建下一個子樹;然後最終預測的時候按照子樹構建的順序進行預測,並將預測結果相加

GBDT的演算法原理

給定輸入向量x和輸出變數Y組成的若干訓練樣本(X1,Y1),(X1,Y1),......(Xn,Yn),目標是找到近似函式F(x)的損失函式L(Y,F(x))的損失值最小



L損失函式一般採用最小二乘損失函式或者絕對值損失函式

GBDT迴歸演算法和分類演算法的區別

GBDT scikit-learn相關

GBDT總結

GBDT的優點如下:

  • 可以處理連續值和離散值;
  • 在相對少的調參情況下,模型的預測值效果也不錯;
  • 模型的魯棒性比較強

GBDT的缺點如下:

  • 由於弱學習器之間存在關聯關係,難以並行訓練模型

Bagging、Boosting的區別

  • 1.樣本選擇:Bagging演算法是有放回的隨機取樣,Boosting演算法每一輪訓練集不變,只是訓練集中的每個樣例在分類器中的權重發生變化,而權重根據上一輪的分類結果進行調整;
  • 2.樣例權重:Bagging使用隨機抽樣,樣例的權重相等;Boosting根據錯誤率不斷地調整樣例的權重值,錯誤率越大權重越大
  • 3.預測函式:Bagging所有預測模型的權重相等;Boosting演算法對於誤差小的分類器具有更大的權重.
  • 4.平行計算:Bagging演算法可以並行生成各個基模型;Boosting理論上只能順序生產,因為後一個模型需要前一個的結果;
  • 5.Bagging是減少模型的variance(方差),Boosting是減少模型的Bias(偏度)
  • 6.Bagging裡每個分類模型都是強分類器,因為降低的是方差,方差過高需要降低是過擬合;Boosting裡每個分類模型都是弱分類器,因為降低的是偏度,偏度過高是欠擬合.

Bagging對樣本重取樣,對每一輪的取樣資料集都訓練一個模型,最後取平均.由於樣本集的相似性和使用的同種模型,因此各個模型具有相似的bias和variance;

XGBoost概述

XGBoost是GBDT演算法的一種變種,是一種常用的有監督整合學習演算法;是一種伸縮性強,便捷的可並行構建模型的Gradient Boosting演算法.

XGBoost官網:http://xgboost.readthedocs.io;

XGBoost Github原始碼位置:https://github.com/dmlc/xgboost;

XGBoost支援開發語言:Python,R,Java,Scala,C++等

XGBoost公式推導

XGBoost 的學習策略

當樹的結構確定的時候,我們可以得到最優的葉子點數以及對應的最小損失值,問題在於如何確定樹結構

  • 暴力窮舉所有可能得結構,選擇損失值最小的(很難求解);
  • 貪心法,每次嘗試選擇一個分類點進行分裂,計算操作前後的增益,選擇增益最大的方式進行分裂

決策樹相關演算法計算指標:

  • ID3演算法:資訊增益
  • C4.5演算法:資訊增益率
  • CART演算法:Gini係數

XGBoost的學習策略

樹節點分裂方法

精確演算法:遍歷所有特徵的所有可能得分割點,計算gain值,選擇最大的gain值對應的(feature value)進行分割

近似演算法:對於每個特徵,只考慮分位點,減少計算複雜度

樹節點分裂方法

近似演算法案例:三分位數

XGBoost的其他特性

XGBoost相關係數

參考連結:http://xgboost.readthedocs.io/en/latest/python/python_api.html#module- xgboost.sklearn

DART

Stacking