1. 程式人生 > >機器學習演算法總結之XGBoost(下) 實戰與調參

機器學習演算法總結之XGBoost(下) 實戰與調參

寫在前面

當時想學習XGBoost這個演算法就是因為研究生課題需要,現在終於可以試一試啦,希望真的像大家說的那麼強(據說是很多資料科學家的ultimate weapon)。XGBoost原理已在前一篇有過說明:機器學習演算法總結之XGBoost(上)

1. XGBoost模型概述

XGBoost的作者把所有的引數分成了三類:  1、通用引數:巨集觀函式控制。  2、Booster引數:控制每一步的booster(tree/regression)。 

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

2. XGBoost通用引數

(1)booster(預設gbtree):

         選擇每次迭代的模型,有兩種選擇:gbtree(基於樹的模型)和gbliner(線性模型)

(2)silent(預設0):

        當這個引數值為1時,靜默模式開啟,不會輸出任何資訊。

        一般這個引數就保持預設的0,因為這樣能幫我們更好地理解模型。

(3)nthread(預設為最大可能的執行緒數):

        這個引數用來進行多執行緒控制,應當輸入系統的核數。

        如果你希望使用CPU全部的核,那就不要輸入這個引數,演算法會自動檢測它。

此外還有兩個引數num_pbuffer和num_feature,由xgboost自動設定,使用者不用管。

3.Booster引數

前面提及有兩種booster可選,但是實踐表明tree的模型效果更好,linear很少用到。

(1)eta(預設0.3):

        和GBDT中的 learning rate 引數類似。通過減少每一步的權重,可以提高模型的魯棒性。

        典型值為0.01-0.2。

(2)min_child_weight(預設1):

        決定最小葉子節點樣本權重和。和GBDT的 min_child_leaf 引數類似,但不完全一樣。

        XGBoost的這個引數是最小樣本權重的和,而GBDT引數是最小樣本總數。

        這個引數用於避免過擬合。當它的值較大時,可以避免模型學習到區域性的特殊樣本。

        但是如果這個值過高,會導致欠擬合。這個引數需要使用CV來調整。

(3)max_depth(預設6):

        和GBM中的引數相同,這個值為樹的最大深度。

        這個值也是用來避免過擬合的。max_depth越大,模型會學到更具體更區域性的樣本。

        需要使用CV函式來進行調優。

        典型值:3-10

(4)max_leaf_nodes:

        樹上最大的節點或葉子的數量。

        可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n方個葉子。

        如果定義了這個引數,GBM會忽略max_depth引數。

(5)gamma(預設0):

        在節點分裂時,只有分裂後損失函式的值下降了,才會分裂這個節點。

        Gamma指定了節點分裂所需的最小損失函式下降值。

        這個引數的值越大,演算法越保守。這個引數的值和損失函式息息相關,所以是需要調整的

(6)max_delta_step(預設0):

        這引數限制每棵樹權重改變的最大步長。

        如果這個引數的值為0,那就意味著沒有約束。如果它被賦予了某個正值,那麼它會讓這個演算法更加保守。

        通常,這個引數不需要設定。但是當各類別的樣本十分不平衡時,它對邏輯迴歸是很有幫助的。

        這個引數一般用不到,但是你可以挖掘出來它更多的用處。

(7)subsample(預設1):

        和GBM中的subsample引數一模一樣。這個引數控制對於每棵樹,隨機取樣的比例。

        減小這個引數的值,演算法會更加保守,避免過擬合。但是,如果這個值設定得過小,它可能會導致欠擬合。

        典型值:0.5-1

(8)colsample_bylevel(預設1):

        用來控制樹的每一級的每一次分裂,對列數的取樣的佔比。

        典型值:0.5-1

(9)colsample_bytree(預設1):

        和GBM裡面的max_features引數類似。用來控制每棵隨機取樣的列數的佔比(每一列是一個特徵)

        典型值:0.5-1

(10)lambda(預設1):

        權重的L2正則化項。(和Ridge regression類似)。

        這個引數是用來控制XGBoost的正則化部分的,增大這個值會使得模型更為保守

(11)alpha(預設0):

        權重的L1正則化項。(和Lasso regression類似),增大這個值會使得模型更為保守

        可以應用在很高維度的情況下,使得演算法的速度更快。

(12)scale_pos_weight(預設1):

        在各類別樣本十分不平衡時,把這個引數設定為一個正值,可以使演算法更快收斂。

4.學習目標引數

(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)

        隨機數的種子

        設定它可以復現隨機資料的結果,也可以用於調整引數

5.XGBoost調參例項

接下來繼續接著上次GBDT的資料集調參,希望能在前一次嘗試上得分更高。