起初以为在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要加上,虽然不知道具体有什么用……
补充:
从大神那里学了一招,如果你需要自定义损失函数的话。先写你的损失函数,比如:
def custom_loss(y_pre,D_label): #别人的自定义损失函数
label=D_label.get_label()
penalty=2.0
grad=-label/y_pre+penalty*(1-label)/(1-y_pre) #梯度
hess=label/(y_pre**2)+penalty*(1-label)/(1-y_pre)**2 #2阶导
return grad,hess
bst=xgb.train(param,xg_train,n_round,watchlist,feval=maxRecall,obj=custom_loss,maximize=False)
只要再加上obj=custom_loss就可以了。
下面是一些常用的损失函数的定义
1.准确率P、召回率R、F1 值
- 定义
- 准确率(Precision):P=TP/(TP+FP)。通俗地讲,就是预测正确的正例数据占预测为正例数据的比例。
- 召回率(Recall):R=TP/(TP+FN)。通俗地讲,就是预测为正例的数据占实际为正例数据的比例
- F1值(F score):