1. 程式人生 > >XGBoost自定義評價函式(feval)

XGBoost自定義評價函式(feval)

最近參加了一個機器學習比賽,裡面的評價函式比較特別,是這樣的:
評價函式

其實也並不特別,就是在均方誤差(MSE)的基礎上再乘了一個0.5
但是眾所周知,XGBoost中的評價函式(eval_metric)只提供了一下幾種選值:

rmse 均方根誤差
mae 平均絕對誤差
logloss 負對數似然函式值
error 二分類錯誤率
merror 多分類錯誤率
mlogloss 多分類logloss損失函式
auc 曲線下面積

所以,為了在XGBoost訓練時能夠能準確,只能自己定義一個評價函數了:

def myFeval(preds, xgbtrain):
    label = xgbtrain.get_label()
    score = mean_squared_error(label,preds)*0.5
return 'myFeval',score

這個函式有兩個輸入,需要注意的是第二個輸入xgbtrain,這個輸入是和你定義的xgb的訓練集的命名有關的,我在這裡的命名是這樣的:

xgbtrain = xgb.DMatrix(X_train,y_train)

所以,我的函式的第二個輸入是xgbtrain

然後函式返回兩個值,一個是這個評價函式的名字,是一個字串形式,另一個就是你自己定的評價函式的值。函式自定義完畢之後如何應用呢?

model = xgb.train(params, xgbtrain, num_rounds, watchlist, early_stopping_rounds=25
,feval = myFeval)

在xgb.train中加上一個引數feval = myFeval就ok了

最後的執行結果:
執行結果