Label
經典決策樹:單棵樹的ID3、C4.5、CART
決策樹組合:基於bagging與boosting思想,出現了
隨機森林(random forest)
極端隨機樹(ET)
梯度提升決策樹(Gradient Boosting decision tree,GBDT)
XGB
LGB
最初的決策樹(單棵,根節點+內部節點+葉節點,不斷細分)
eg.以大米種類的分類問題為例
每一條從根節點到葉節點的路徑均對應了一種可能的樣本
上面的內部節點有三個——”米色“、”黏稠“、”米粒長度“,上面的順序是一個例子,但也可以有其他的判斷順序。問題來了,這些內部節點中,先判斷哪個再判斷哪個怎么定才能實現最佳的效果(快速、判得准)。抽象化,就是決策樹怎么生長的問題。
一般地,決策樹的學習過程分為3個部分
1、特征選擇
特征選擇是指從訓練數據中眾多的特征中選擇一個特征作為當前節點的分裂標准,如何選擇特征有着很多不同量化評估標准,從而衍生出不同的決策樹算法。
2、決策樹生成
根據選擇的特征評估標准,從上至下遞歸地生成子節點,直到數據集不可分則停止決策樹停止生長。 樹結構來說,遞歸結構是最容易理解的方式。
3、剪枝
決策樹容易過擬合,一般來需要剪枝,縮小樹結構規模、緩解過擬合。剪枝技術有預剪枝和后剪枝兩種。
對於單棵樹,按照特征選擇的評估標准的不同有不同的算法,經典的有ID3、C4.5、CART三種,這三種算法都是基於信息論的。
ID3:
先引入信息熵與信息增益。
信息熵就是香農熵(自信息),針對分類系統而言
Shannon Entropy =
上面,N是最終的類別數目,pi是第i類別的概率。
信息增益是針對某個特征而言的:對於一個特征k∈[1~M],有ta沒ta時系統的香農熵之差即為該特征的信息增益。(一個實例:https://blog.csdn.net/fly_time2012/article/details/70210725)
注:除去某個特征,樣本集分為m個(m是該特征可能取值數),計算各個子集的香農熵,再加權平均即為除去該特征之后樣本的香農熵。
而ID3的思想就是每次選擇當前特征時,計算所有特征的信息增益,然后選擇信息增益最大的特征作為當前節點的特征。(等價於選取刪去后子樣本集的香農熵最小的特征,香農熵越小說明樣本集越純)
C4.5:
ID3有個缺點,就是當某個特征取值很多時,那么每個特征對應的樣本數可能很少,此時該特征增益會很大,ID3會認為這個特征很適合作為節點,但實際上該節點分支太多,模型的泛化能力有限,不適合作為判斷的節點。
為解決這個問題,C4.5算法提出了新的指標——信息增益率,即信息增益與分裂信息值之比。(類似標幺化的概念)
和ID3的不同就在於,每個節點處按照信息增益率最大選取特征。
CART:
C4.5解決了一個問題,但是還是要注意到①C4.5、ID3的計算過程涉及到對數運算,相比多項式計算的計算量要大很多。
CART引入了基尼系數這個概念。(基尼系數可以看作是對熵的一個近似)
基尼系數:從某個樣本集中隨機取出某個類別樣本並將其錯誤歸類的概率。
Gini = Σpi(1-pi),i∈(1,N),N為類別數。pi為隨機從樣本集中抽取一個樣本,該樣本為i類別的概率。
CART算法的思想就是,在每一個節點,看哪一個特征去掉后樣本集的基尼系數最小,就選哪個特征作為當前節點的判斷依據。(基尼系數越小則樣本集越純)
另一方面,CART樹是二叉樹,不同於ID3、C4.5是多叉樹。舉個例子,有個特征有(A\B\C)三種可能,則ID3、C4.5算法會在某個節點分出A、B、C三條樹枝,而CART算法則會先在A、BC/B、AC/C、AB三種可能中進行選擇,假設選了A、BC,則下一個節點再形成B、C的二叉樹,即一個特征用多個節點來進行描述,每個節點是二叉樹。
在計算機中,二叉樹的運算效率要高很多。
算法 |
支持模型 |
樹結構 |
特征選擇 |
連續值處理 |
缺失值處理 |
剪枝 |
ID3 |
分類 |
多叉樹 |
信息增益 |
不支持 |
不支持 |
不支持 |
C4.5 |
分類 |
多叉樹 |
信息增益比 |
支持 |
支持 |
支持 |
CART |
分類,回歸 |
二叉樹 |
基尼系數,均方差 |
支持 |
支持 |
支持 |
單棵的決策樹容易出現過擬合的現象,泛化能力有限。這時就出現了集成學習(從一顆決策樹擴展到一群決策樹,后者中單獨一顆效果可能不咋地,但是合起來的組合效果要勝過單棵決策樹)。大白話就是三個臭皮匠頂一個諸葛亮。
根據組合算法的不同就形成了不同的決策樹類算法,常用的包括RF(random forest,隨機森林)、ET(extremely randomized tree,極端隨機樹)、GBDT(gradient boost decision tree,梯度提升決策樹)、XGB(extreme gradient boost)和LGB(light gradient boost)等。
組合的算法各種各樣,其基本思想主要為bagging和boosting兩類。
/*(集成學習的范疇,集成學習的思想主要有bagging、boosting、stacking三種
bagging:從訓練集從進行子抽樣組成每個基模型所需要的子訓練集,對所有基模型預測的結果進行綜合產生最終的預測結果。
boosting:訓練過程為階梯狀,基模型按次序一一進行訓練(實現上可以做到並行),基模型的訓練集按照某種策略每次都進行一定的轉化。對所有基模型預測的結果進行線性綜合產生最終的預測結果。
stacking:將訓練好的所有基模型對訓練基進行預測,第j個基模型對第i個訓練樣本的預測值將作為新的訓練集中第i個樣本的第j個特征值,最后基於新的訓練集進行訓練。)*/
bagging,有放回、等權重地均勻采樣
boosting,每一輪迭代的訓練集不變,但是采樣權重回根據上一輪預測結果發生改變。分類誤差越大則下一輪迭代的采樣權重越大。(即重點學習上一次錯誤分類的樣本)
一句行話:bagging可以減小variance,boosting可以減小bias。
關於bias和variance 的解釋:
bias:訓練出來的模型在測試集上的准確度。
variance:訓練集與測試集的分布上的差異。
bagging是均勻采樣,那么有,因為Xi與X同分布。減小方差的實質是通過拉近訓練集與驗證集的分布來減小過擬合的程度。可以並行生成隨機樹,速度快。
boosting是有選擇地重點采樣,抽取的樣本不獨立,故無法減小方差,其本質是用貪心算法來不斷減小損失函數(即預測結果與實際結果的距離)從而減小偏差。減小偏差的具體體現就是減小欠擬合的程度。理論上boosting只能串行生成,因為本次權重依賴於上一次結果。
bagging策略的典型代表就是random forest,該算法同時對樣本和特征進行bagging得到若干決策樹,最后將各決策樹組合到一起。
p.s.隨機森林的生成過程
~從原始樣本中采用有放回抽樣的方法選取n個樣本;
~對n個樣本選取a個特征中的隨機k個,用建立決策樹的方法獲得最佳分割點;
~重復m次,獲得m個決策樹;
~對輸入樣例進行預測時,每個子樹都產生一個結果,采用多數投票機制輸出。
與之類似的是ET,也有隨機的味道,但不是bagging的隨機采樣,該算法取所有樣本與特征,但不同於ID3、C4.5、CART等對決策順序進行最優排序,而是隨機生成決策順序得到若干決策樹並組合。
boosting策略的典型代表是gbdt,每一輪迭代中樣本的選擇權重是不均勻的,取決於上一輪迭代的預測結果。
xgb是對gbdt的優化改進:1、目標函數中加入了正則項來控制模型的復雜度,替代原來的剪枝方法。2、利用了one-hot編碼等情況中的特征稀疏性。(僅對特征值為非缺失值的樣本的特征進行遍歷)3、支持列抽樣(同random forest)。4、數據事先排序並按block結構保存,有利於並行運算(樹的生成還是串行的,這里說的並行計算指並行計算各個特征的增益或是基尼系數)。除此之外,xgb還通過一種可並行的近似直方圖算法來高效生成候選的分割點。5、對損失函數進行了優化,gbdt只用到了其一階導數信息,而xgb同時用到其一階導與二階導。
lgb則是在xgb基礎上進一步改進,加快了訓練速度(非常快),減小了內存的使用量。
1、內存需求小:xgb使用基於pre-sorted的決策樹算法,而lgb使用基於histogram的決策樹算法。histogram算法占用的內存很小:pre-sorted需要兩倍數據大小的內存空間,一半用於數據(float32),一半用於存放排好序的索引,而histogram不需要存放索引,且特征值只需要存放離散后的值,用uint8即可,故內存需求僅為pre-sorted的1/8。
2、計算速度快:決策樹算法的主要操作包括“尋找分割點”與“數據分割”兩步,pre-sorted算法和histogram算法在“尋找分割點”上的時間復雜度是一致的;但是在“數據分割”上histogram要快,histogram所有特征共享一張索引,而pre-sorted一個特征對應一張索引,若集合level-wise,pre-sorted也可以共用一張索引,但是會帶來很多隨機訪問的問題,速度仍不及histogram。此外,histogram算法還減少了計算分割點增益的次數。
3、通信代價小:histogram算法的通信代價遠遠小於pre-sorted,可用於分布式計算。
但是,histogram不能找到很精確的分割點,訓練誤差不如pre-sorted算法,可以說是犧牲一定精度來換取速度。需要指出的是,這種粗獷的分割相當於自帶正則效果,所以測試集的誤差兩種決策樹算法差距不大。
4、除此之外,lgb使用帶最大深度限制的leaf-wise(按葉子生長)來替代leval-wise(按層生長)策略,由原來的對一層中所有葉子進行分裂變為對一層中分裂增益最大的葉子進行分裂。leaf-wise易發生過擬合,需要限制最大深度配合。
5、lgb還使用了直方圖做差加速。(一個葉子的直方圖可以由其父節點直方圖與兄弟的直方圖做差得到)。