xgboost中如何自定义metric(python中)
Posted SilenceGTX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xgboost中如何自定义metric(python中)相关的知识,希望对你有一定的参考价值。
正好在参加携程的比赛,用的xgboost的算法,但携程比赛的测评函数比较奇怪,不是传统的那些,而是取precision≥0.97的情况下,recall的最大值。那无疑这个测评函数是要自己写的(官方没给),可是我怎么把它放进xgboost里呢?这样我设置silent=1时,我每一步都能看到train和eval上的结果。
起初以为在param里定义了就行,但屡屡报错,后来终于找到了方法。
首先是metric的写法(直接拿携程比赛那个来说吧):
def maxRecall(preds,dtrain): #preds是结果(概率值),dtrain是个带label的DMatrix labels=dtrain.get_label() #提取label preds=1-preds precision,recall,threshold=precision_recall_curve(labels,preds,pos_label=0) pr=pd.DataFrame({‘precision‘:precision,‘recall‘:recall}) return ‘Max Recall:‘,pr[pr.precision>=0.97].recall.max()
参数和轮数就按一般设置,然后watchlist不能少,不然就不会输出东西了,比如watchlist=[(xgb_train,‘train‘), (xgb_test,‘eval‘)]
最后就是xgb.train中的内容了,写成:
bst=xgb.train(param,xg_train,n_round,watchlist,feval=maxRecall,maximize=False)
就行了。feval就是你的metric,maximize要加上,虽然不知道具体有什么用……
以上是关于xgboost中如何自定义metric(python中)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 XGboost 针对不同的“eval_metric”优化 sklearn 管道?
如何在 python 中为 xgboost 编写自定义评估指标?