XGBoost引數調優

2021-07-26 22:57:07 字數 4707 閱讀 6114

xgboost(extreme gradient boosting)是gradient boosting演算法的乙個優化的版本。xgboost演算法可以給**模型帶來能力的提公升。當我對它的表現有更多了解的時候,當我對它的高準確率背後的原理有更多了解的時候,我發現它具有很多優勢:

標準gbm的實現沒有像xgboost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。 實際上,xgboost以「正則化提公升(regularized boosting)」技術而聞名。xgboost可以實現並行處理,相比gbm有了速度的飛躍。 不過,眾所周知,boosting演算法是順序處理的,它怎麼可能並行呢?每一課樹的構造都依賴於前一棵樹,那具體是什麼讓我們能用多核處理器去構造乙個樹呢?我希望你理解了這句話的意思。 xgboost 也支援hadoop實現。xgboost 允許使用者定義

自定義優化目標和評價標準

它對模型增加了乙個全新的維度,所以我們的處理不會受到任何限制。xgboost內建處理缺失值的規則。 使用者需要提供乙個和其它樣本不同的值,然後把它作為乙個引數傳進去,以此來作為缺失值的取值。xgboost在不同節點遇到缺失值時採用不同的處理方法,並且會學習未來遇到缺失值時的處理方法。當**時遇到乙個負損失時,gbm會停止**。因此gbm實際上是乙個

貪心演算法

。 xgboost會一直**到指定的最大深度(max_depth),然後回過頭來剪枝。如果某個節點之後不再有正值,它會去除這個**。 這種做法的優點,當乙個負損失(如-2)後面有個正損失(如+10)的時候,就顯現出來了。gbm會在-2處停下來,因為它遇到了乙個負值。但是xgboost會繼續**,然後發現這兩個**綜合起來會得到+8,因此會保留這兩個**。xgboost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。 而gbm使用網格搜尋,只能檢測有限個值。xgboost可以在上一輪的結果上繼續訓練。這個特性在某些特定的應用上是乙個巨大的優勢。 sklearn中的gbm的實現也有這個功能,兩種演算法在這一點上是一致的。

xgboost的作者把所有的引數分成了三類:

1、通用引數:巨集觀函式控制。

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

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

在這裡我會模擬gbm來講解,所以作為一種基礎知識。

這些引數用來控制xgboost的巨集觀功能。

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

gbtree:基於樹的模型

gbliner:線性模型當這個引數值為1時,靜默模式開啟,不會輸出任何資訊。 一般這個引數就保持預設的0,因為這樣能幫我們更好地理解模型。這個引數用來進行多執行緒控制,應當輸入

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

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

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

和gbm中的 learning rate 引數類似。 通過減少每一步的權重,可以提高模型的魯棒性。 典型值為0.01-0.2。決定最小葉子節點樣本權重和。 和gbm的 min_child_leaf 引數類似,但不完全一樣。xgboost的這個引數是最小

樣本權重的和

,而gbm引數是最小

樣本總數

。 這個引數用於避免過擬合。當它的值較大時,可以避免模型學習到區域性的特殊樣本。 但是如果這個值過高,會導致欠擬合。這個引數需要使用cv來調整。和gbm中的引數相同,這個值為樹的最大深度。 這個值也是用來避免過擬合的。max_depth越大,模型會學到更具體更區域性的樣本。 需要使用cv函式來進行調優。 典型值:3-10樹上最大的節點或葉子的數量。 可以替代max_depth的作用。因為如果生成的是二叉樹,乙個深度為n的樹最多生成

n2個葉子。 如果定義了這個引數,gbm會忽略max_depth引數。在節點**時,只有**後損失函式的值下降了,才會**這個節點。gamma指定了節點**所需的最小損失函式下降值。 這個引數的值越大,演算法越保守。這個引數的值和損失函式息息相關,所以是需要調整的。這引數限制每棵樹權重改變的最大步長。如果這個引數的值為0,那就意味著沒有約束。如果它被賦予了某個正值,那麼它會讓這個演算法更加保守。 通常,這個引數不需要設定。但是當各類別的樣本十分不平衡時,它對邏輯回歸是很有幫助的。 這個引數一般用不到,但是你可以挖掘出來它更多的用處。和gbm中的subsample引數一模一樣。這個引數控制對於每棵樹,隨機取樣的比例。 減小這個引數的值,演算法會更加保守,避免過擬合。但是,如果這個值設定得過小,它可能會導致欠擬合。 典型值:0.5-1和gbm裡面的max_features引數類似。用來控制每棵隨機取樣的列數的佔比(每一列是乙個特徵)。 典型值:0.5-1用來控制樹的每一級的每一次**,對列數的取樣的佔比。 我個人一般不太用這個引數,因為subsample引數和colsample_bytree引數可以起到相同的作用。但是如果感興趣,可以挖掘這個引數更多的用處。權重的l2正則化項。(和ridge regression類似)。 這個引數是用來控制xgboost的正則化部分的。雖然大部分資料科學家很少用到這個引數,但是這個引數在減少過擬合上還是可以挖掘出更多用處的。權重的l1正則化項。(和lasso regression類似)。 可以應用在很高維度的情況下,使得演算法的速度更快。在各類別樣本十分不平衡時,把這個引數設定為乙個正值,可以使演算法更快收斂。

這個引數用來控制理想的優化目標和每一步結果的度量方法。

這個引數定義需要被最小化的損失函式。最常用的值有:

binary:logistic 二分類的邏輯回歸,返回**的概率(不是類別)。 multi:softmax 使用softmax的多分類器,返回**的類別(不是概率)。

在這種情況下,你還需要多設乙個引數:num_class(類別數目)。 multi:softprob 和multi:softmax引數一樣,但是返回的是每個資料屬於各個類別的概率。對於有效資料的度量方法。 對於回歸問題,預設值是rmse,對於分類問題,預設值是error。 典型值有:

rmse 均方根誤差(

∑ni=1?2n??????√

) mae 平均絕對誤差(

∑ni=1|?|n

) logloss 負對數似然函式值 error 二分類錯誤率(閾值為0.5) merror 多分類錯誤率 mlogloss 多分類logloss損失函式 auc 曲線下面積隨機數的種子 設定它可以復現隨機資料的結果,也可以用於調整引數

如果你之前用的是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』引數傳入。

資料來自kaggle->titanic

建立乙個modelfit函式幫助建立模型

target='survived'

idcol='passengerid'

def modelfit(alg,dtrain,predictors,usetraincv=true,cv_folds=5,early_stopping_rounds=50):

if usetraincv:

xgb_param=alg.get_xgb_params()

xgtrain=xgb.dmatrix(dtrain[predictors].values,label=dtrain[target].values)

cvresult=xgb.cv(xgb_param,xgtrain,num_boost_round=alg.get_xgb_params()['n_estimators'],nfold=cv_folds,

metrics='auc',early_stopping_rounds=early_stopping_rounds)

alg.set_params(n_estimators=cvresult.shape[0])

alg.fit(dtrain[predictors],dtrain['survived'],eval_metric='auc')

dtrain_predictions=alg.predict(dtrain[predictors])

dtrain_predprob=alg.predict_proba(dtrain[predictors])[:,1]

print "\nmodel report"

print "accuracy : %.4g"%metrics.accuracy_score(dtrain['survived'].values,dtrain_predictions)

print "auc score (train): %f"%metrics.roc_auc_score(dtrain['survived'],dtrain_predprob)

feat_imp=pd.series(alg.booster().get_fscore()).sort_values(ascending=false)

feat_imp.plot(kind='bar',title='feature importances')

plt.ylabel('feature importance score')

XGBoost引數調優

xgboost extreme gradient boosting 是gradient boosting演算法的乙個優化的版本。xgboost演算法可以給 模型帶來能力的提公升。當我對它的表現有更多了解的時候,當我對它的高準確率背後的原理有更多了解的時候,我發現它具有很多優勢 標準gbm的實現沒有像...

MySQL引數調優

l 通用類 key buffer size 含義 用於索引塊的緩衝區大小,增加它可得到更好處理的索引 對所有讀和多重寫 影響 對於myisam 表的影響不是很大,myisam 會使用系統的快取來儲存資料,所以大量使用 myisam 表的機器記憶體很快就會耗盡。但是,如果你將該值設得過大 例如,大於總...

mysql引數調優

l max connect errors max connect errors預設值為10,也即mysqld執行緒沒重新啟動過,一台物理伺服器只要連線 異常中斷累計超過10次,就再也無法連線上mysqld服務,為此建議大家設定此值至少大於等於10w 若異常中斷累計超過引數設定的值,有二種解決辦法,執...