模型融合---Xgboost調參總結


一、xgboost簡介:

  • 全稱:eXtreme Gradient Boosting
  • 作者:陳天奇(華盛頓大學博士)
  • 基礎:GBDT
  • 所屬:boosting迭代型、樹類算法。
  • 適用范圍:分類、回歸
  • 優點:速度快、效果好、能處理大規模數據、支持多種語言、支持自定義損失函數等等。
  • 缺點:算法參數過多,調參負責,對原理不清楚的很難使用好XGBoost。不適合處理超高維特征數據。
  • 項目地址:https://github.com/dmlc/xgboost

二、參數速查

參數分為三類:

  • 通用參數:宏觀函數控制。
  • Booster參數:控制每一步的booster(tree/regression)。
  • 學習目標參數:控制訓練目標的表現。

參數詳細解釋

 

二、回歸

from xgboost.sklearn import XGBRegressor
from sklearn.model_selection import ShuffleSplit
import xgboost as xgb

xgb_model_ = XGBRegressor(n_thread=8)
cv_split = ShuffleSplit(n_splits = 6,train_size=0.7,test_size=0.2)
xgb_params={'max_depth':[4,5,6,7],
           'learning_rate':np.linspace(0.03,0.3,10),
           'n_estimators':[100,200]}

xgb_search = GridSearchCV(xgb_model_,
                          param_grid=xgb_params,
                          scoring='r2',
                          iid=False,
                          cv=5)
xgb_search.fit(gbdt_train_data,gbdt_train_label)

print(xgb_search.grid_scores_)
print(xgb_search.best_params_)
print(xgb_search.best_score_)

 

1.xgboost不支持MAE的解決方法

xgboost支持自定義目標函數,但是要求目標函數必須二階可到,我們必須顯示給出梯度(一階導)和海瑟矩陣(二階導),但是MAE不可導,

(1)xgboost自帶的MSE與MAE相距較遠。比較接近的損失有Huber Loss 以及 Fair Loss。

  • MSE
  • Huber Loss
  • Fair Loss:$c^2(\frac{|x|}{c}-ln(\frac{|x|}{c}+1))$
  • Psuedo-Huber loss

  

 

Fair Loss代碼:代碼來自solution in the Kaggle Allstate Challenge.

def fair_obj(preds, dtrain):
    """y = c * abs(x) - c**2 * np.log(abs(x)/c + 1)"""
    x = preds - dtrain.get_labels()
    c = 1
    den = abs(x) + c
    grad = c*x / den
    hess = c*c / den ** 2
    return grad, hess

  

Psuedo-Huber loss代碼:

import xgboost as xgb

dtrain = xgb.DMatrix(x_train, label=y_train)
dtest = xgb.DMatrix(x_test, label=y_test)

param = {'max_depth': 5}
num_round = 10

def huber_approx_obj(preds, dtrain):
    d = preds - dtrain.get_labels() #remove .get_labels() for sklearn
    h = 1  #h is delta in the graphic
    scale = 1 + (d / h) ** 2
    scale_sqrt = np.sqrt(scale)
    grad = d / scale_sqrt
    hess = 1 / scale / scale_sqrt
    return grad, hess

bst = xgb.train(param, dtrain, num_round, obj=huber_approx_obj) 

具體可參考:kaggle 討論 | Xgboost-How to use “mae” as objective function?

 

(2)自定義近似MAE導數:直接構造MAE的導數

  • Log-Cosh Loss function:$\left.log(cosh(h(\mathbf{x}_{i})-y_{i}))\right.$,$\left.cosh(x)=\frac{e^{x}+e^{-x}}{2}\right.$

 

Log-cosh代碼如下:

def log_cosh_obj(preds, dtrain):
    x = preds - dtrain.get_labels()
    grad = np.tanh(x)
    hess = 1 / np.cosh(x)**2
    return grad, hess  

具體參考:kaggle 討論

 

三、分類

 前提:已經處理完所有數據,現在開始訓練.

#Import libraries:
import pandas as pd
import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn import cross_validation, metrics   #Additional     scklearn functions
from sklearn.grid_search import GridSearchCV   #Perforing grid search

import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 12, 4

train = pd.read_csv('train_modified.csv')
target = 'Disbursed'
IDcol = 'ID'

兩種XGBoost:

  • xgb - 直接引用xgboost。接下來會用到其中的“cv”函數。
  • XGBClassifier - 是xgboost的sklearn包。這個包允許我們像GBM一樣使用Grid Search 和並行處理。
test_results = pd.read_csv('test_results.csv')
def modelfit(alg, dtrain, dtest, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
    '''
   功能:訓練,測試,輸出AUC,畫出重要特征的功能 參數:alg是分類器,dtrain是訓練集(包括label),dtest是測試集(不包括label),predictors是要參與訓練的特征(不包括label), useTrainCV是是否要交叉驗證,cv_folds是交叉驗證的折數,early_stopping_rounds是到指定次數就停止繼續迭代
''' if useTrainCV: xgb_param = alg.get_xgb_params() xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values) xgtest = xgb.DMatrix(dtest[predictors].values) cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds, metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False) alg.set_params(n_estimators=cvresult.shape[0]) #訓練 alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc') #預測 dtrain_predictions = alg.predict(dtrain[predictors]) dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1] #輸出accuracy、AUC分數 print "\nModel Report" print "Accuracy : %.4g" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions) print "AUC Score (Train): %f" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob) #預測測試集,輸出測試集的AUC分數 dtest['predprob'] = alg.predict_proba(dtest[predictors])[:,1] results = test_results.merge(dtest[['ID','predprob']], on='ID') print 'AUC Score (Test): %f' % metrics.roc_auc_score(results['Disbursed'], results['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的sklearn包沒有“feature_importance”這個量度,但是get_fscore()函數有相同的功能。

調參步驟:

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

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

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

  • 降低學習速率,確定理想參數。

初始參數設置:
  • max_depth = 5 :這個參數的取值最好在3-10之間。我選的起始值為5,但是你也可以選擇其它的值。起始值在4-6之間都是不錯的選擇。
  • min_child_weight = 1:在這里選了一個比較小的值,因為這是一個極不平衡的分類問題。因此,某些葉子節點下的值會比較小。
  • gamma = 0: 起始值也可以選其它比較小的值,在0.1到0.2之間就可以。這個參數后繼也是要調整的。
  • subsample, colsample_bytree = 0.8: 這個是最常見的初始值了。典型值的范圍在0.5-0.9之間。
  • scale_pos_weight = 1: 這個值是因為類別十分不平衡。 
  • 注意,上面這些參數的值只是一個初始的估計值,后繼需要調優。這里把學習速率就設成默認的0.1。然后用xgboost中的cv函數來確定最佳的決策樹數量。前文中的函數可以完成這個工作。

 

  

參考文獻:

【1】XGBoost python調參示例

【2】Complete Guide to Parameter Tuning in XGBoost (with codes in Python)

【3】xgboost調參(很全)

【4】XGBoost參數調優完全指南(附Python代碼)

【5】機器學習算法之XGBoost(非常詳細)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM