正好在参加携程的比赛,用的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要加上,虽然不知道具体有什么用……
时间: 2024-10-22 23:06:11