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要加上,雖然不知道具體有什么用……

 

補充:

從大神那里學了一招,如果你需要自定義損失函數的話。先寫你的損失函數,比如:

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就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM