tree based ensemble algorithms
- 原始的Boost算法是在算法開始的時候,為每個樣本賦上一個權重值,初始的時候,每個樣本都是同樣的重要。在每一步的訓練中,得到的模型,會給出每個數據點的估計對錯,根據判斷的對錯,在每一步的訓練之后,會增加分錯樣本的權重,減少分類正確的樣本的權重,如果在后續的每一步訓練中,如果繼續被分錯,那么就會被嚴重的關注,也就是獲得了一個比較高的權重。經過N次迭代之后,將會得到N個簡單的分類器(base learner),然后將他們組裝起來(可以進行加權,或者進行投票),得到一個最終的模型。
主要介紹以下幾種ensemble的分類器(tree based algorithms)
xgboost
-
xgboost能自動利用cpu的多線程,而且適當改進了gradient boosting,加了剪枝,控制了模型的復雜程度
-
傳統的GBDT算法以CART作為基分類器,xgboost還可以支持線性分類器,相當於帶L1和L2的邏輯斯諦回歸或者線性回歸
-
傳統的GBDT在優化的時候,使用的是一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階導數和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。
-
xgboost在代價函數中加入了正則項,用於控制模型的復雜度。正則項里面包括樹的葉子節點的個數、每個葉子節點上輸出的score的L2模的平方和。( 從Bias-variance tradeoff 的角度來說,正則化降低了模型的variance,使得到的模型更加簡單,防止過擬合,這是xgboost優於傳統的GBDT的一個特征)
-
Shrinkage(縮減),相當於學習速率(xgboost中的eta)。xgboost在進行完一次迭代后,會將葉子節點的權重乘上該系數,主要是為了削弱每棵樹的影響,讓后面有更大的學習空間。實際應用中,一般把eta設置得小一點,然后迭代次數設置得大一點。(sklearn中的GBDT的實現也有學習速率)
-
列抽樣(column sampling),借鑒了隨機森林的做法,支持列抽樣可以降低過擬合,同時減少了計算量,這也是xgboost異於傳統gbdt的一個特性,sklearn中已經實現行采樣和列采樣,同樣xgboost也是可以實現的。
-
對缺失值的處理。對於樣本有特征確實的情況下,xgboost可以自動學習它的分裂方向。
-
xgboost工具支持並行。xgboost的並行並不是tree粒度的並行,xgboost也是需要一次迭代完成之后,才能進行下一次迭代的。(第t次迭代的代價函數包含了前面t-1次的預測值)。xgboost的並行是特征粒度上的。決策樹的學習最耗時的步驟是就是對特征進行排序(因為要確定最佳的分割點),xgboost在訓練之前,預先對數據進行排序,然后保存成block結構,后面的迭代中重復的使用這個結構,大大的減少了計算量。這個結構也使並行成為可能。在進行節點分裂時,需要計算每個特征的信息增益,最終選擇增益最大的那個特征去分裂,那么各個特征的增益計算就可以開多線程計算。
-
可並行的近似直方圖算法。樹節點在進行分裂時,需要計算每個特征的的每個分裂點的信息增益,即用貪心法枚舉所有的可能的分割點。當數據無法一次性載入內存或者在分布式的情況下,貪心的算法效率就會變得很低,所以xgboost還提出了一種,可並行的近似直方圖算法,用於高效的生成候選的分割點。
-
xgboost的目標函數
-
xgboost 分裂節點時所采用的公式
-
這個公式形式上與ID3算法與CART算法是一致的,兩者做差,得到某種增益。為了限制樹的生長,我們可以加入閾值,當增益大於閾值時才讓節點分裂,上式中的gamma即為閾值,它是正則項里葉子節點數T的系數,所以xhboost在優化目標函數的同時相當於也做了預剪枝。
-
公式中的系數lambda,是正則項leaf score的L2模平方的系數,對leaf score做了平滑,也起到了防止過擬合的作用,這還是傳統GBDT里不具備的特性。
-
總結下來就是兩者的區別:
- xgboost里面的基學習器除了用tree(gbtree),也可用線性分類器(gblinear)。而GBDT則特指梯度提升決策樹算法。
- xgboost相對於普通gbm的實現,可能具有以下的一些優勢:
- 顯式地將樹模型的復雜度作為正則項加在優化目標
- 公式推導里用到了二階導數信息,而普通的GBDT只用到一階
- 允許使用column(feature) sampling來防止過擬合,借鑒了Random Forest的思想。(sklearn里的gbm好像也有類似實現)
- 實現了一種分裂節點尋找的近似算法,用於加速和減小內存消耗。
- 節點分裂算法能自動利用特征的稀疏性。
- data事先排好序並以block的形式存儲,利於並行計算
- penalty function Omega主要是對樹的葉子數和葉子分數做懲罰,這點確保了樹的簡單性
- 支持分布式計算可以運行在MPI,YARN上,得益於底層支持容錯的分布式通信框架rabit。
- The correct answer is marked in red. Please consider if this visually seems a reasonable fit to you. The general principle is we want both a simple and predictive model. The tradeoff between the two is also referred as bias-variance tradeoff in machine learning.
lightGBM: 基於決策樹算法的分布式梯度提升框架
- lightGBM 與xgboost的區別:
- xgboost使用的是pre-sorted算法(對所有的特征都按照特征的數值進行預排序,在遍歷分割點的時候用O(data)的代價函數找個一個特征的最好分割點,能夠更加精確的找到數據的分割點。
- lightGBM 使用的是histogram算法,占用內存更低,數據分割的復雜度更低。
- 決策樹生長策略上
- xgboost采用的是level-wise生長策略,能夠同時分類同一層的葉子,從而進行多線程優化,不容易過擬合,但是不加區分的對待同一層的葉子,帶來了很多沒有必要的開銷(有很多的葉子分裂增益較低,沒有必要進行搜索和分裂)
- lightGBM采用的是leaf-wise的生長策略,每次從當前的葉子中找到分裂增益最大的(一般也是數據量最大)的一個葉子進行分裂,如此循環;但是生長出的決策樹枝葉過多,產生過擬合,lightGBM在leaf-wise上增加了一個最大深度的限制,在保證高效率的同時防止過擬合。
- 另一個巧妙的優化是histogram做差加速,一個容易觀察到的現象:一個葉子的直方圖可以由它的父節點的直方圖與它兄弟的直方圖做差得到。
GBDT(Gradient Boosting Decison Tree)
-
GBDT中使用的都是回歸樹,GBDT用來做回歸預測,調整后也可以用於分類,設定閾值,大於閾值為正例,反之為負例,可以發現多種有區分性的特征以及特征組合。
-
GBDT是把所有樹的結論累加起來做最終結論,GBDT的核心就在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是把一個加預測值后能得到真實值的累加量。
-
比如A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差為6歲。那么在第二棵樹里我們把A的年齡設為6歲去學習,如果第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;如果第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹里A的年齡就變成1歲,繼續學。 Boosting的最大好處在於,每一步的殘差計算其實變相地增大了分錯instance的權重,而已經分對的instance則都趨向於0。這樣后面的樹就能越來越專注那些前面被分錯的instance。
-
用公式來表示提升樹的部分原理
-
GBDT划分標准默認是friedman_mse可以查看sklearn 官方文檔中GBDT的參數說明
-
Gradient Boost與傳統的Boost的區別是
-
每一次的計算是為了減少上一次的殘差(residual),而為了消除殘差,我們可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。
-
所以說,在Gradient Boost中,每個新的模型的建立是為了使得之前模型的殘差往梯度方向減少。
-
Shrinkage(縮減)的思想認為,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。
-
即它不完全相信每一棵殘差樹,他認為每棵樹只學到了真理的一部分,累加的時候只累加一小部分,每次通過多學幾棵樹彌補不足。
-
本質上,Shrinkage為每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient並沒有關系。
-
The advantages of GBRT are:
-
Natural handling of data of mixed type (= heterogeneous features)
-
可以處理不同性質的屬性,數值特征與category特征,
-
數值特征需要進行數據的預處理
-
Predictive power
-
Robustness to outliers in output space (via robust loss functions)
The disadvantages of GBRT are:
- Scalability, due to the sequential nature of boosting it can hardly be parallelized.
- Boost是一個串行過程,不好並行化,而且計算復雜度高,同時不太適合高維稀疏特征。
隨機森林
- 是隨機的方式建立一個森林,森林里面有很多的決策樹組成,隨機森林的每一決策樹質檢是沒有關聯的。在得到隨機森林之后,當有一個新的樣本輸進的時候,就讓森林中的每一棵決策樹進行判斷,判斷樣本屬於哪一類,然后看哪一類被選擇最多,就預測這個樣本為這一類。
- 隨機采樣
-
隨機行采樣,采用有放回的方式,也就是在采樣得到的樣本集合中,可能有重復的樣本。
假如輸入的樣本為N個,那么采樣的樣本也是N個。這使得在訓練的時候,每棵樹的輸入的樣本都不是全部的樣本,使得相對不容易出現over-fitting。 -
隨機列采樣,從M個feature中,選擇m個(m<<M)。
對采樣之后的數據使用完全分裂的方式建立決策樹,這樣的決策樹的某個葉子節點要么無法繼續分裂,要么里面所有的樣本都是指向的同一分類。
-
- 隨機森林 中同樣有剪枝,限制決策樹的最大深度,以及最小的樣本分裂,最小的節點樣本數目,樣本分裂節點的信息增益或gini系數必須達到的閾值
- 隨機森林用於分類的話,划分標准是entropy或者gini系數
- 隨機森林用於回歸的話,划分標准是mse(mean squared error)或者mae(mean absolute error)
Why is it called random then?
- 假如我們的數據有1000行,30列,隨機森林的算法中,有兩個不同水平的隨機
- At row level
- 每棵樹隨機抽取了樣本 數據的一部分,每棵樹都是獨立訓練的,給出的預測結果也是獨立的
- At column level, feature random selection at node level of the decision tree
- 每棵樹在分支的時候,只使用了部分特征進行熵或者基尼系數的計算,比如說我們選擇了3個特征進行分支,樹的第一個分支的時候使用了第1,2,4個特征,然后計算這三個特征的指標(比如說Gini coefficients或者其他的一些指標來選擇最佳的節點),這三個特征中某個特征用來分支,第二個分支的時候,重復就行這個操作,這個時候的特征就可能是第7,9,10個特征,然后重新計算特征選擇的指標,然后尋找其中的最佳的特征進行分支
參考鏈接medium給出的解釋,random forest的其中的作者指出的錯誤https://medium.com/theboredhuman/random-forests-explained-intuitively-2cecb9e1a7b5
- 每棵樹在分支的時候,只使用了部分特征進行熵或者基尼系數的計算,比如說我們選擇了3個特征進行分支,樹的第一個分支的時候使用了第1,2,4個特征,然后計算這三個特征的指標(比如說Gini coefficients或者其他的一些指標來選擇最佳的節點),這三個特征中某個特征用來分支,第二個分支的時候,重復就行這個操作,這個時候的特征就可能是第7,9,10個特征,然后重新計算特征選擇的指標,然后尋找其中的最佳的特征進行分支
決策樹
-
ID3 信息增益:熵(數據的不確定性程度)的減少;一個屬性的信息增益量越大,這個屬性作為一棵樹的根節點就能使這棵樹更簡潔。
信息增益=分裂前的熵 – 分裂后的熵
面對類別較少的離散數據時效果較好,但如果面對連續的數據(如體重、身高、年齡、距離等),或者每列數據沒有明顯的類別之分(最極端的例子的該列所有數據都獨一無二),即每個值對應一類樣本 -
C4.5信息增益比:克服了ID3用信息增益選擇屬性時偏向選擇取值多的屬性的不足(某個屬性存在大量的不同值,在划分時將每個值分為一個結點)
-
CART 使用基尼系數進行分類
基尼指數Gini(D)表示集合D的不確定性,基尼指數Gini(D,A)表示經A=a分割后集合D的不確定性。基尼指數值越大,樣本集合的不確定性也就越大,這一點與熵相似。
-
分類與回歸樹(CART):二叉樹形式,分類時:根據Gini指數選擇划分特征
-
回歸時:Los為 平方損失函數,最小化均方誤差選擇划分特征,切分點(值)將數據切分成兩部分,用平方誤差最小的准則(最小二乘法)求解每個單元上的最優輸出值(每個葉子節點上的預測值為所有樣本的平均值)。
用選定的對(j,s)划分區域並決定相應的輸出值,每個葉子節點上的預測值為所有樣本的平均值:
-
決策樹的生成通常使用 信息增益最大、信息增益比最大或基尼指數最小作為特征選擇的准則。
[參考]:https://medium.com/theboredhuman/random-forests-explained-intuitively-2cecb9e1a7b5