XGBoost自定義評價函式(feval)
阿新 • • 發佈:2019-02-18
最近參加了一個機器學習比賽,裡面的評價函式比較特別,是這樣的:
其實也並不特別,就是在均方誤差(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了
最後的執行結果: