機器學習BOOST總結

XGBOOST算法基礎

其核心規則是迴歸樹,與決策樹類似,區別在於迴歸樹預測實數值,決策樹是類標籤,也就是迴歸樹的每一個葉節點是實數,最終結果是實數的累加,如果分到葉子結點的訓練樣本預測值不唯一的時候,以所有樣本預測值的均值作爲葉子結點輸出的預測值。迴歸樹解決分類問題時,也是基於迴歸樹,而不是決策樹。

http://upload-images.jianshu.io/upload_images/3268630-a9309ab536a0a5bb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

在迴歸樹(base learner)的基礎上,通過數增強(Tree Ensemble)的方式來加強模型的預測能力,比如gbdt、rf等都是基於這種理論,使得模型對特徵不敏感,無需對特徵進行歸一化處理。

http://upload-images.jianshu.io/upload_images/3268630-7a62cbc636e82505.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

可以把迴歸樹當做一個從特徵空間到預測值的映射函數。將問題簡化爲,如何調整到適合的參數,並設計優化目標,使得預測結果最佳。xgboost裏引入了泰勒展開來近似和簡化優化目標。

對於每一輪迭代即每一棵樹,如何找到該輪迭代的最優的樹結構,找到這一輪的參數呢,我們採用一種貪心算法。

1 初始:從樹只有一個結點,不分裂開始

2 迭代:對於每一個葉結點,根據增益分裂結點。

在分裂結點的時候,如何找到該次分裂最佳的分割點呢?實現方法是:遍歷所有特徵,對每個特徵將樣本按這個特徵排好序,從左向右,依次遍歷。每次遍歷,向左邊加入一個結點,向右邊減掉這個結點,然後計算此時的gain。最後選擇gain最大的特徵的最佳分割點作爲該次分裂的分割點。

gain可能爲負。即當訓練損失的下降小於正則項的時候。

這時候有兩種策略:pre_stopping和post_pruning:

pre_stopping:當gain<0時,停止分裂。但是這有一個問題,即這一個結點分裂gain是負的,下一層的分裂gain就是正的了。這種情況pre_stopping不能避免。

post_prunning:讓樹分裂達到設定的max_depth,然後遞歸的合併那些是負gain的結點。

 

從cart樹到xgboost

cart樹(classification and regression tree)是一種分類迴歸決策樹,可以同時處理分類和迴歸兩類問題,它處理分類問題時使用基尼指數作爲目標函數,處理迴歸問題時用均方誤差作爲目標函數。

模型的誤差Error = Bias + Variance + Noise,一般而言我們只考慮前兩項。簡單模型具有大的Bias和小的Variance,模型比較穩定;複雜模型具有小的Bias和大的Variance,模型不穩定,在不同的數據集上預測結果差異較大,也就是通常所說的過擬合。

Bias衡量的是學習模型f_hat和最優模型f之間的差別,Variance衡量的是學習的模型f_hat自身的泛化能力。

Boosting

https://f11.baidu.com/it/u=3875924689,3352941338&fm=170&s=23D1AB6A97F4B1D254F9FD1A030080C1&w=639&h=260&img.PNG&access=215967316

通過boosting可以有效的降低Bias,從而獲得更好的性能。

gradient boosting

屬於boosting算法的一種,每次模型都建立在前一個模型損失函數梯度的方向,沿梯度下降最快。

gbdt

Gbdt(gradient boosting decision tree)建立在gradient boosting框架下,使用的模型是樹模型,通常是cart樹。使用logit作爲損失函數處理分類問題,使用均方誤差作爲損失函數處理迴歸問題。

xgboost

Xgboost是對gbdt的一種高效、分佈式的實現。主要解決了兩個問題,

1.葉子節點的函數值;

使用泰勒展開將損失函數轉換後,通過最小二乘法得到最優函數;

2.中間節點的特徵選取和分裂數值。 同時爲了分佈式實現,對均損失函數進行二階泰勒展開,利用了函數的二階導數信息。

使用貪心算法枚舉所有特徵的所有可能值,計算出信息增益最大的特徵組合;

將每一個維度的特徵進行排序,計算數據分佈的百分比,選出最優的分裂值;

此外xgboost的實現還有很多的優化,比如

1)同時支持CART和支持線性分類器作爲基本分離器,。

2)支持自定義代價函數,要求函數二階可導。

3)xgboost在代價函數里加入了正則項,用於控制模型的複雜度。正則項降低了模型的variance,防止過擬合。

4)Shrinkage(縮減),在進行完一次迭代後,會將葉子節點的權重乘上該係數,主要是爲了削弱每棵樹的影響,讓後面有更大的學習空間。

5) column subsampling,從實踐上看效果要優於使用全部的特徵。

對缺失值的處理。對於特徵的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。

6)對缺失值、category值,稀疏數值的處理,從其餘特徵中學到default分類方向。

XGBOOST以正則化提升技術而聞名,正則化可以有效減少過擬合;

XGBOOST可以支持並行算法;

XGBOOST允許自定義目標函數和損失函數;

XGBOOST可以內置缺失值的處理方法,在不同結點選擇不同的缺失值處理方法;

GBM分裂時遇到負值會停止分裂,XGBOOST會繼續分裂直到達到指定的最大深度(MAX_DEPTH),再回過頭來剪枝,剪枝的方法是去除後面不再有正值的枝,這樣可以保留出現負值後又分裂出正值這一類的枝條;

GBM使用網格搜索,XGBOOST允許在每次迭代中使用交叉驗證,可以有效獲得最優迭代次數;

GBM和XGBOOST允許在上一輪結果上繼續訓練。

 

XGBoost的參數

XGBoost的作者把所有的參數分成了三類:

1、通用參數:宏觀函數控制。

2、Booster參數:控制每一步的booster(tree/regression)。

3、學習目標參數:控制訓練目標的表現。

在這裏我會類比GBM來講解,所以作爲一種基礎知識。

通用參數

這些參數用來控制XGBoost的宏觀功能。

1、booster[默認gbtree]

選擇每次迭代的模型,有兩種選擇:

gbtree:基於樹的模型

gbliner:線性模型

2、silent[默認0]

當這個參數值爲1時,靜默模式開啓,不會輸出任何信息。 一般這個參數就保持默認的0,因爲這樣能幫我們更好地理解模型。

3、nthread[默認值爲最大可能的線程數]

這個參數用來進行多線程控制,應當輸入系統的核數。 如果你希望使用CPU全部的核,那就不要輸入這個參數,算法會自動檢測它。

還有兩個參數,XGBoost會自動設置,目前你不用管它。接下來咱們一起看booster參數。

booster參數

儘管有兩種booster可供選擇,我這裏只介紹tree booster,因爲它的表現遠遠勝過linear booster,所以linear booster很少用到。

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 均方根誤差(∑Ni=1?2N??????√) mae 平均絕對誤差(∑Ni=1|?|N) logloss 負對數似然函數值 error 二分類錯誤率(閾值爲0.5) merror 多分類錯誤率 mlogloss 多分類logloss損失函數 auc 曲線下面積

3、seed(默認0)

隨機數的種子 設置它可以復現隨機數據的結果,也可以用於調整參數

如果你之前用的是Scikit-learn,你可能不太熟悉這些參數。但是有個好消息,python的XGBoost模塊有一個sklearn包,XGBClassifier。這個包中的參數是按sklearn風格命名的。會改變的函數名是:

1、eta ->learning_rate

2、lambda->reg_lambda

3、alpha->reg_alpha

你肯定在疑惑爲啥咱們沒有介紹和GBM中的’n_estimators’類似的參數。XGBClassifier中確實有一個類似的參數,但是,是在標準XGBoost實現中調用擬合函數時,把它作爲’num_boosting_rounds’參數傳入。

 

 

 

參數調優的一般方法。

我們會使用和GBM中相似的方法。需要進行如下步驟:

1. 選擇較高的學習速率(learning rate)。一般情況下,學習速率的值爲0.1。但是,對於不同的問題,理想的學習速率有時候會在0.05到0.3之間波動。選擇對應於此學習速率的理想決策樹數量。XGBoost有一個很有用的函數“cv”,這個函數可以在每一次迭代中使用交叉驗證,並返回理想的決策樹數量。

2. 對於給定的學習速率和決策樹數量,進行決策樹特定參數調優(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在確定一棵樹的過程中,我們可以選擇不同的參數。

3. xgboost的正則化參數的調優。(lambda, alpha)。這些參數可以降低模型的複雜度,從而提高模型的表現。

4. 降低學習速率(learning rate),確定理想參數,重複上述的調優過程。

 

參數調優順序

1、max_depth = 5 :這個參數的取值最好在3-10之間。

2、min_child_weight = 1:在這裏選了一個比較小的值,因爲這是一個極不平衡的分類問題。因此,某些葉子節點下的值會比較小。

3、gamma = 0: 起始值也可以選其它比較小的值,在0.1到0.2之間就可以。這個參數後繼也是要調整的。

4、subsample,colsample_bytree = 0.8: 這個是最常見的初始值了。典型值的範圍在0.5-0.9之間。

5、scale_pos_weight = 1: 這個值是因爲類別十分不平衡。

注意哦,上面這些參數的值只是一個初始的估計值,後繼需要調優。這裏把學習速率learning rate就設成默認的0.1,然後用xgboost中的cv函數來確定最佳的決策樹數量。GridSearchCV()

依次按上述步驟對參數進行調優,調一個參數時保持其他參數值不變。

上述參數調整好後,應用正則化來降低過擬合,即調整’reg_alpha’參數,和’reg_lambda’參數。

最後,我們使用較低的學習速率,以及使用更多的決策樹。重複上述過程。

總結

1、僅僅靠參數的調整和模型的小幅優化,想要讓模型的表現有個大幅度提升是不可能的。GBM的最高得分是0.8487,XGBoost的最高得分是0.8494。確實是有一定的提升,但是沒有達到質的飛躍。

2、要想讓模型的表現有一個質的飛躍,需要依靠其他的手段,諸如,特徵工程(feature egineering) ,模型組合(ensemble of model),以及堆疊(stacking)等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章