xgboost如何自定義誤差衡量方法為F1?
最近在用xgboost解決分類問題,想以f1作為誤差衡量方法。但在官方文檔中,eval_metric可以設置的值不包含f1:
XGBoost Parameters請問大家有過用f1值作為xgboost的誤差衡量方法么?有的話是怎麼用的呢?謝謝啦
這位同學,xgboost的官方例子就有 xgboost/custom_objective.py at master · dmlc/xgboost · GitHub 把evalerror按照f1 score的公式照著寫就行了。
順便分享一些人森經驗,遇到技術問題一般走這幾個步驟:
1. 上谷歌尋找相關問題的答案。2. 如果不能解決,上github看官方的例子
3. 如果不能解決,上github發issues問4. 上知乎問。以上各步得到回答的速度指數遞減,如果不會翻牆上谷歌可以考慮用Bing。解決方法兩個
1、自己自定義F1的cost function;
2、用auc來評估,這兩個結果差異不大:建議用系統自帶的的evalmetric, 速度更快,我們嘗試使用過自定義的evaluate metric,但是速度比較慢。並且整體來說,我們試驗下來的結果是:換cost functoin的結果讓模型的最後結果差異不大,你可以自己嘗試一下。在R裡面通過自定義函數使用F1-score 作為 xgboost的eval_metric,具體代碼如下(印象中是在kaggle學習來的),供參考:
library(xgboost)
#library(MLmetrics)
f1_metric &<- function(prob, dtrain) {
preds = as.integer((prob&>0.05)*1)
labels &<- getinfo(dtrain, "label") # Get information of an xgb.DMatrix object
recall = sum(preds==1 labels==1) / sum(labels)
precise = sum(preds==1 labels==1) / sum(preds)
f1 &<- 2 * recall * precise / (recall + precise)
#f1 = F1_Score(y_pred = preds, y_true = labels, positive = "1")
return(list(metric = "f1", value = f1))
}
把eval_metric變成rmsle的例子:
dtrain=xgb.DMatrix(train_x,train_y)
dtest=xgb.DMatrix(test_x,test_y_real)
watchlist=[(dtrain,"train"),(dtest,"test")]
#############
def evalerror(preds, dtrain): # written by myself
labels = dtrain.get_label()
# return a pair metric_name, result
# since preds are margin(before logistic transformation, cutoff at 0)
return "error", math.sqrt(mean_squared_log_error(preds,labels))
#############
params = {
"objective": "reg:gamma",
"eta": 0.1,
"seed": 0,
#"eval_metric": "rmse", # if it is useless, delete it
"missing": -999,
"silent" : 1,
"gamma" : 1,
"subsample" : 0.5,
"alpha" : 1,
"max_depth":10,
"min_child_weight":1
}
num_rounds=500
clf=xgb.train(params,dtrain,num_rounds,watchlist, feval=evalerror)
(上面代碼參數我都可以改花了)
這樣就可以啦,關鍵就是『feval=』,在xgb.train內的實參是叫feval,不是叫eval_metric !!!
你沒猜錯,我確實是個小白~
^_^
推薦閱讀: