GBDT和Xgboost模型對比總結
一.GBDT有哪些引數,如何確定樹的深度,學習率怎樣確定。
答:本題答案引自http://www.07net01.com/2016/12/1742073.html
在sk-learn中,GradientBoostingClassifier為GBDT的分類類,GradientBoostingRegressor為GBDT的迴歸類,兩者的引數型別相同,我們把引數分為兩類,第一類是Boosting框架的重要引數,第二類是弱學習器(Cart樹)的重要引數。
Boosting框架的引數:
1. n_estimators: 也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數。一般來說n_estimators太小,容易欠擬合,n_estimators太大,又容易過擬合,一般選擇一個適中的數值。預設是100。在實際調參的過程中,我們常常將n_estimators和下面介紹的引數learning_rate一起考慮
2. learning_rate: 即每個弱學習器的權重縮減係數,也稱作步長。對於同樣的訓練集擬合效果,較小的學習率意味著我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定演算法的擬合效果。所以這兩個引數n_estimators和learning_rate要一起調參。一般來說,可以從一個小一點的學習率開始調參,預設是0.1。
3. subsample:無放回取樣,取值為(0,1]。注意這裡的子取樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這裡是不放回抽樣。如果取值為1,則全部樣本都使用,等於沒有使用子取樣。如果取值小於1,則只有一部分樣本會去做GBDT的決策樹擬合。選擇小於1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低。推薦在[0.5, 0.8]之間,預設是1.0,即不使用子取樣。
4. Init: 即我們的初始化的時候的弱學習器,如果不輸入,則用訓練集樣本來做樣本集的初始化分類迴歸預測。否則用init引數提供的學習器做初始化分類迴歸預測。一般用在我們對資料有先驗知識,或者之前做過一些擬合的時候,如果沒有的話就不用管這個引數了。
5. loss: 即我們GBDT演算法中的損失函式。分類模型和迴歸模型的損失函式是不一樣的。對於分類模型,有對數似然損失函式”deviance”和指數損失函式”exponential”兩者輸入選擇。預設是對數似然損失函式”deviance”。一般來說,推薦使用預設的”deviance”。它對二元分離和多元分類各自都有比較好的優化。
6. alpha:這個引數只有GradientBoostingRegressor有,當我們使用Huber損失”huber”和分位數損失“quantile”時,需要指定分位數的值。預設是0.9,如果噪音點較多,可以適當降低這個分位數的值。
弱分類器引數:
1. max_features: 劃分時考慮的最大特徵數, 可以使用很多種型別的值,預設是”None”,意味著劃分時考慮所有的特徵數;如果是”log2”意味著劃分時最多考慮log_2N個特徵;如果是”sqrt”或者”auto”意味著劃分時最多考慮sqrt{N}個特徵。如果是整數,代表考慮的特徵絕對數。如果是浮點數,代表考慮特徵百分比,即考慮(百分比N)取整後的特徵數。其中N為樣本總特徵數。一般來說,如果樣本特徵數不多,比如小於50,我們用預設的”None”就可以了,如果特徵數非常多,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。
2. max_depth:控制決策樹最大深度,預設不輸入,一般來說,資料少或者特徵少的時候不用考慮。如果模型樣本量多,特徵也多的情況下,推薦限制最大深度,常用的取值10-100之間。假設樹的深度為N,樹為完全二叉樹,則樹有2**N個葉子節點。
3. min_samples_leaf:葉子節點最少樣本數,這個值限制了葉子結點最少的樣本數,如果葉子節點數目小於該值,則會和兄弟節點一起被剪枝,預設是1,可以輸入最少的樣本數的證書,或者最少樣本數佔樣本總數的百分比,如果樣本量不大,則不需要考慮這個值,如果樣本資料集非常大,則推薦增大這和值。
4. min_samples_split:內部節點再劃分所需最小樣本數,這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於,min_saples_split,則不會繼續再嘗試最優特徵來進行劃分。預設是2.如果樣本數量不大,不需要考慮該值。
5. min_weight_fraction_leaf:葉子節點最小的樣本權重,這個值限制了葉子節點所有樣本權重和的最小值,若果小於這個值,就會和兄弟節點一起唄剪枝,預設是0,即不考慮權重問題,一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分佈類別偏差很大,就會引入樣本權重,這時我們就要注意這個值。
6. max_leaf_nodes;最大葉子節點數,通過限制最大葉子結點數,可以防止過擬合,預設是None,即不限制。如果加了限制,演算法就會建議在最大葉子節點數內最優的決策樹。如果特徵不多,不用考慮這個值,但是特徵分成多的話,可以通過交叉驗證獲得該值。
7. min_impurity_split:節點劃分最小不純度,這個值限制了決策樹的增長,如果節點的不純度(基尼係數,均方差)小於這個閾值,則該節點不再生成子節點,即為葉子節點,預設值1e-7。
二. 隨機森林、GBDT、Xgboost區別,以及Xgboost為何用到二階導?
回答這個問題,首先需要理解下bagging和boosting取樣的區別。
這個問題的原文地址:http://blog.csdn.net/chuanda112233/article/details/51913434
一句話的解釋,來自周志華老師的機器學習教科書( 機器學習-周志華):Boosting主要關注降低偏差,因此Boosting能基於泛化效能相當弱的學習器構建出很強的整合;Bagging主要關注降低方差,因此它在不剪枝的決策樹、神經網路等學習器上效用更為明顯。偏差指的是演算法的期望預測與真實預測之間的偏差程度,反應了模型本身的擬合能力;方差度量了同等大小的訓練集的變動導致學習效能的變化,刻畫了資料擾動所導致的影響。
隨機森林使用Bagging策略為每個分類器隨機選擇樣本做放回的取樣,然後分別在這些樣本上訓練分類器,通過投票的策略生成結果。而GBDT,Xgboost,Adaboost則採用boosting策略無放回取樣,通過迭代地訓練一系列的分類器,每個分類器採用的樣本分佈和上一輪的學習結果有關。
對於Bagging演算法來說,由於我們會並行地訓練很多不同的分類器的目的就是降低這個方差(variance) ,因為採用了相互獨立的基分類器多了以後,值自然就會靠近.所以對於每個基分類器來說,目標就是如何降低這個偏差(bias),所以我們會採用深度很深甚至不剪枝的決策樹。
對於Boosting來說,每一步我們都會在上一輪的基礎上更加擬合原資料,所以可以保證偏差(bias),所以對於每個基分類器來說,問題就在於如何選擇variance更小的分類器,即更簡單的分類器,所以我們選擇了深度很淺的決策樹。
接下來談一談GBDT和Xgboost的區別:
區別引自知乎:https://www.zhihu.com/question/41354392/answer/98658997
• 傳統GBDT以CART作為基分類器,xgboost還支援線性分類器,這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題)。
• 傳統GBDT在優化時只用到一階導數資訊,xgboost則對代價函式進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支援自定義代價函式,只要函式可一階和二階求導。
• xgboost在代價函式里加入了正則項,用於控制模型的複雜度。正則項裡包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
• 列抽樣(column subsampling)。xgboost借鑑了隨機森林的做法,支援列抽樣,不僅能降低過擬合,還能減少計算,這也是xgboost異於傳統gbdt的一個特性。
• 對缺失值的處理。對於特徵的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。
• xgboost工具支援並行。boosting不是一種序列的結構嗎?怎麼並行的?注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函式裡包含了前面t-1次迭代的預測值)。xgboost的並行是在特徵粒度上的。我們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對資料進行了排序,然後儲存為block結構,後面的迭代中重複地使用這個結構,大大減小計算量。這個block結構也使得並行成為了可能,在進行節點的分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多執行緒進行。
• 可並行的近似直方圖演算法。樹節點在進行分裂時,我們需要計算每個特徵的每個分割點對應的增益,即用貪心法列舉所有可能的分割點。當資料無法一次載入記憶體或者在分散式情況下,貪心演算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖演算法,用於高效地生成候選的分割點。
Xgboost使用泰勒展開式二階導函式能夠加快收斂速度。
三、LR,gbdt,libfm三個模型各適用於處理什麼型別的特徵?
答案來自知乎:https://www.zhihu.com/question/35821566/answer/91208044
• LR, FM都比較適用於高維稀疏特徵, gbdt不適合. FM能夠得到特徵分量之間的關係(通常是兩兩特徵), LR常用於線性問題,對於非線性問題需要定義非線性函式對特徵進行對映, GBDT對線性/非線性問題基本上都通吃..而且效果很好. 取得好的效果嘛..建議gbdt+LR或者gbdt+FM啦, 即gbdt的輸出作為LR或者FM的輸入, 原始特徵經過gbdt轉變成高維稀疏特徵, 簡單來說, gbdt的輸出相當於對原始特徵進行了特徵組合得到高階屬性或者說是非線性對映.