1.CART樹
1.1原理
Classification And Regression Tree(CART)是決策樹的一種,並且是非常重要的決策樹,屬於Top Ten Machine Learning Algorithm。顧名思義,CART算法既可以用於創建分類樹(Classification Tree),也可以用於創建回歸樹(Regression Tree)、模型樹(Model Tree),兩者在建樹的過程稍有差異。
創建分類樹遞歸過程中,CART每次都選擇當前數據集中具有最小Gini信息增益的特征作為結點划分決策樹。ID3算法和C4.5算法雖然在對訓練樣本集的學習中可以盡可能多地挖掘信息,但其生成的決策樹分支、規模較大,CART算法的二分法可以簡化決策樹的規模,提高生成決策樹的效率。對於連續特征,CART也是采取和C4.5同樣的方法處理。為了避免過擬合(Overfitting),CART決策樹需要剪枝。預測過程當然也就十分簡單,根據產生的決策樹模型,延伸匹配特征值到最后的葉子節點即得到預測的類別。
創建回歸樹時,觀察值取值是連續的、沒有分類標簽,只有根據觀察數據得出的值來創建一個預測的規則。在這種情況下,Classification Tree的最優划分規則就無能為力,CART則使用最小剩余方差(Squared Residuals Minimization)來決定Regression Tree的最優划分,該划分准則是期望划分之后的子樹誤差方差最小。創建模型樹,每個葉子節點則是一個機器學習模型,如線性回歸模型
CART算法的重要基礎包含以下三個方面:
1)二分(Binary Split):在每次判斷過程中,都是對觀察變量進行二分。
CART算法采用一種二分遞歸分割的技術,算法總是將當前樣本集分割為兩個子樣本集,使得生成的決策樹的每個非葉結點都只有兩個分枝。因此CART算法生成的決策樹是結構簡潔的二叉樹。因此CART算法適用於樣本特征的取值為是或非的場景,對於連續特征的處理則與C4.5算法相似。
2)單變量分割(Split Based on One Variable):每次最優划分都是針對單個變量。
3)剪枝策略:CART算法的關鍵點,也是整個Tree-Based算法的關鍵步驟。
剪枝過程特別重要,所以在最優決策樹生成過程中占有重要地位。有研究表明,剪枝過程的重要性要比樹生成過程更為重要,對於不同的划分標准生成的最大樹(Maximum Tree),在剪枝之后都能夠保留最重要的屬性划分,差別不大。反而是剪枝方法對於最優樹的生成更為關鍵。
1.2過程
CART假設決策樹是二叉樹,內部結點特征的取值為“是”和“否”,左分支是取值為“是”的分支,右分支是取值為“否”的分支。這樣的決策樹等價於遞歸地二分每個特征,將輸入空間即特征空間划分為有限個單元,並在這些單元上確定預測的概率分布,也就是在輸入給定的條件下輸出的條件概率分布。
CART算法由以下兩步組成:
1.決策樹生成:基於訓練數據集生成決策樹,生成的決策樹要盡量大; 決策樹剪枝:用驗證數據集對已生成的樹進行剪枝並選擇最優子樹,這時損失函數最小作為剪枝的標准。
2.CART決策樹的生成就是遞歸地構建二叉決策樹的過程。CART決策樹既可以用於分類也可以用於回歸。本文我們僅討論用於分類的CART。對分類樹而言,CART用Gini系數最小化准則來進行特征選擇,生成二叉樹。 CART生成算法如下:
輸入:訓練數據集D,停止計算的條件:
輸出:CART決策樹。
根據訓練數據集,從根結點開始,遞歸地對每個結點進行以下操作,構建二叉決策樹:
設結點的訓練數據集為D,計算現有特征對該數據集的Gini系數。此時,對每一個特征A,對其可能取的每個值a,根據樣本點對A=a的測試為“是”或 “否”將D分割成D1和D2兩部分,計算A=a時的Gini系數。
在所有可能的特征A以及它們所有可能的切分點a中,選擇Gini系數最小的特征及其對應的切分點作為最優特征與最優切分點。依最優特征與最優切分點,從現結點生成兩個子結點,將訓練數據集依特征分配到兩個子結點中去。
對兩個子結點遞歸地調用步驟l~2,直至滿足停止條件。
生成CART決策樹。
算法停止計算的條件是結點中的樣本個數小於預定閾值,或樣本集的Gini系數小於預定閾值(樣本基本屬於同一類),或者沒有更多特征。
2.XGB算法原理
算法思想就是不斷地添加樹,不斷地進行特征分裂來生長一棵樹,每次添加一個樹,其實是學習一個新函數,去擬合上次預測的殘差。當我們訓練完成得到k棵樹,我們要預測一個樣本的分數,其實就是根據這個樣本的特征,在每棵樹中會落到對應的一個葉子節點,每個葉子節點就對應一個分數,最后只需要將每棵樹對應的分數加起來就是該樣本的預測值。
注:w_q(x)為葉子節點q的分數,f(x)為其中一棵回歸樹
如下圖例子,訓練出了2棵決策樹,小孩的預測分數就是兩棵樹中小孩所落到的結點的分數相加。爺爺的預測分數同理。
3.損失函數
對於回歸問題,我們常用的損失函數是MSE,即:

對於分類問題,我們常用的損失函數是對數損失函數:

XGBoost目標函數定義為:
目標函數由兩部分構成,第一部分用來衡量預測分數和真實分數的差距,另一部分則是正則化項。正則化項同樣包含兩部分,T表示葉子結點的個數,w表示葉子節點的分數。γ可以控制葉子結點的個數,λ可以控制葉子節點的分數不會過大,防止過擬合。
正如上文所說,新生成的樹是要擬合上次預測的殘差的,即當生成t棵樹后,預測分數可以寫成:
同時,可以將目標函數改寫成:
很明顯,我們接下來就是要去找到一個f_t能夠最小化目標函數。XGBoost的想法是利用其在f_t=0處的泰勒二階展開近似它。所以,目標函數近似為:
其中g_i為一階導數,h_i為二階導數:
由於前t-1棵樹的預測分數與y的殘差對目標函數優化不影響,可以直接去掉。簡化目標函數為:
上式是將每個樣本的損失函數值加起來,我們知道,每個樣本都最終會落到一個葉子結點中,所以我們可以將所以同一個葉子結點的樣本重組起來,過程如下圖:
因此通過上式的改寫,我們可以將目標函數改寫成關於葉子結點分數w的一個一元二次函數,求解最優的w和目標函數值就變得很簡單了,直接使用頂點公式即可。因此,最優的w和目標函數公式為
4.分裂結點算法
在上面的推導中,我們知道了如果我們一棵樹的結構確定了,如何求得每個葉子結點的分數。但我們還沒介紹如何確定樹結構,即每次特征分裂怎么尋找最佳特征,怎么尋找最佳分裂點。
正如上文說到,基於空間切分去構造一顆決策樹是一個NP難問題,我們不可能去遍歷所有樹結構,因此,XGBoost使用了和CART回歸樹一樣的想法,利用貪婪算法,遍歷所有特征的所有特征划分點,不同的是使用上式目標函數值作為評價函數。具體做法就是分裂后的目標函數值比單子葉子節點的目標函數的增益,同時為了限制樹生長過深,還加了個閾值,只有當增益大於該閾值才進行分裂。
5.正則化
xgboost使用了如下的正則化項:

注意:這里出現了γ和λ,這是xgboost自己定義的,在使用xgboost時,你可以設定它們的值,顯然,γ越大,表示越希望獲得結構簡單的樹,因為此時對較多葉子節點的樹的懲罰越大。λ越大也是越希望獲得結構簡單的樹。
為什么xgboost要選擇這樣的正則化項?很簡單,好使!效果好才是真的好。
6.對缺失值處理
xgboost模型卻能夠處理缺失值,模型允許缺失值存在。
7.優缺點
優點:
1) xgBoosting支持線性分類器,相當於引入L1和L2正則化項的邏輯回歸(分類問題)和線性回歸(回歸問題);
2) xgBoosting對代價函數做了二階Talor展開,引入了一階導數和二階導數;
3)當樣本存在缺失值是,xgBoosting能自動學習分裂方向;
4)xgBoosting借鑒RF的做法,支持列抽樣,這樣不僅能防止過擬合,還能降低計算;
5)xgBoosting的代價函數引入正則化項,控制了模型的復雜度,正則化項包含全部葉子節點的個數,每個葉子節點輸出的score的L2模的平方和。從貝葉斯方差角度考慮,正則項降低了模型的方差,防止模型過擬合;
6)xgBoosting在每次迭代之后,為葉子結點分配學習速率,降低每棵樹的權重,減少每棵樹的影響,為后面提供更好的學習空間;
7)xgBoosting工具支持並行,但並不是tree粒度上的,而是特征粒度,決策樹最耗時的步驟是對特征的值排序,xgBoosting在迭代之前,先進行預排序,存為block結構,每次迭代,重復使用該結構,降低了模型的計算;block結構也為模型提供了並行可能,在進行結點的分裂時,計算每個特征的增益,選增益最大的特征進行下一步分裂,那么各個特征的增益可以開多線程進行;
8)可並行的近似直方圖算法,樹結點在進行分裂時,需要計算每個節點的增益,若數據量較大,對所有節點的特征進行排序,遍歷的得到最優分割點,這種貪心法異常耗時,這時引進近似直方圖算法,用於生成高效的分割點,即用分裂后的某種值減去分裂前的某種值,獲得增益,為了限制樹的增長,引入閾值,當增益大於閾值時,進行分裂;
缺點:
1)xgBoosting采用預排序,在迭代之前,對結點的特征做預排序,遍歷選擇最優分割點,數據量大時,貪心法耗時,LightGBM方法采用histogram算法,占用的內存低,數據分割的復雜度更低;
2)xgBoosting采用level-wise生成決策樹,同時分裂同一層的葉子,從而進行多線程優化,不容易過擬合,但很多葉子節點的分裂增益較低,沒必要進行跟進一步的分裂,這就帶來了不必要的開銷;LightGBM采用深度優化,leaf-wise生長策略,每次從當前葉子中選擇增益最大的結點進行分裂,循環迭代,但會生長出更深的決策樹,產生過擬合,因此引入了一個閾值進行限制,防止過擬合.
8.sklearn參數
1. eta [默認 0.3]
和 GBM 中的 learning rate 參數類似。 通過減少每一步的權重,可以提高模型的穩定性。 典型值為 0.01-0.2。
2. min_child_weight [默認 1]
決定最小葉子節點樣本權重和。和 GBM 的 min_child_leaf 參數類似,但不完全一樣。XGBoost 的這個參數是最小樣本權重的和,而 GBM 參數是最小樣本總數。這個參數用於避免過擬合。當它的值較大時,可以避免模型學習到局部的特殊樣本。但是如果這個值過高,會導致欠擬合。這個參數需要使用 CV 來調整。
3. max_depth [默認 6]
和 GBM 中的參數相同,這個值為樹的最大深度。這個值也是用來避免過擬合的。max_depth 越大,模型會學到更具體更局部的樣本。需要使用 CV 函數來進行調優。 典型值:3-10
4. max_leaf_nodes
樹上最大的節點或葉子的數量。 可以替代 max_depth 的作用。因為如果生成的是二叉樹,一個深度為 n 的樹最多生成 n2 個葉子。 如果定義了這個參數,GBM 會忽略 max_depth 參數。
5. gamma [默認 0]
在節點分裂時,只有分裂后損失函數的值下降了,才會分裂這個節點。Gamma 指定了節點分裂所需的最小損失函數下降值。 這個參數的值越大,算法越保守。這個參數的值和損失函數息息相關,所以是需要調整的。
6、max_delta_step[默認 0]
這參數限制每棵樹權重改變的最大步長。如果這個參數的值為 0,那就意味着沒有約束。如果它被賦予了某個正值,那么它會讓這個算法更加保守。 通常,這個參數不需要設置。但是當各類別的樣本十分不平衡時,它對邏輯回歸是很有幫助的。 這個參數一般用不到,但是你可以挖掘出來它更多的用處。
7. subsample [默認 1]
和 GBM 中的 subsample 參數一模一樣。這個參數控制對於每棵樹,隨機采樣的比例。 減小這個參數的值,算法會更加保守,避免過擬合。但是,如果這個值設置得過小,它可能會導致欠擬合。 典型值:0.5-1
8. colsample_bytree [默認 1]
和 GBM 里面的 max_features 參數類似。用來控制每棵隨機采樣的列數的占比 (每一列是一個特征)。 典型值:0.5-1
9. colsample_bylevel [默認 1]
用來控制樹的每一級的每一次分裂,對列數的采樣的占比。 我個人一般不太用這個參數,因為 subsample 參數和 colsample_bytree 參數可以起到相同的作用。但是如果感興趣,可以挖掘這個參數更多的用處。
10. lambda [默認 1]
權重的 L2 正則化項。(和 Ridge regression 類似)。 這個參數是用來控制 XGBoost 的正則化部分的。雖然大部分數據科學家很少用到這個參數,但是這個參數在減少過擬合上還是可以挖掘出更多用處的。
11. alpha [默認 1]
權重的 L1 正則化項。(和 Lasso regression 類似)。 可以應用在很高維度的情況下,使得算法的速度更快。
12. scale_pos_weight [默認 1]
在各類別樣本十分不平衡時,把這個參數設定為一個正值,可以使算法更快收斂。
學習目標參數
這個參數用來控制理想的優化目標和每一步結果的度量方法。
1. objective [默認 reg:linear]
這個參數定義需要被最小化的損失函數。最常用的值有:
binary:logistic 二分類的邏輯回歸,返回預測的概率 (不是類別)。 multi:softmax 使用 softmax 的多分類器,返回預測的類別 (不是概率)。
在這種情況下,你還需要多設一個參數:num_class(類別數目)。 multi:softprob 和 multi:softmax 參數一樣,但是返回的是每個數據屬於各個類別的概率。
2. eval_metric [默認值取決於 objective 參數的取值]
對於有效數據的度量方法。對於回歸問題,默認值是 rmse,對於分類問題,默認值是 error。 典型值有:
rmse 均方根誤差、mae 平均絕對誤差、logloss 負對數似然函數值、error 二分類錯誤率 (閾值為 0.5)、merror 多分類錯誤率、mlogloss 多分類 logloss 損失函數、auc 曲線下面積
3. seed [默認 0]
隨機數的種子設置它可以復現隨機數據的結果,也可以用於調整參數。
參考:
https://www.jianshu.com/p/8346d4f80ab0
https://blog.csdn.net/u013363120/article/details/80195471
https://www.jianshu.com/p/5b8fbbb7e754
https://www.jianshu.com/p/7467e616f227