zoukankan      html  css  js  c++  java
  • 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就可以了。

  • 相关阅读:
    基于MPI计算π值
    依赖倒转原则
    里氏代换原则
    开闭原则
    以太坊入门-solidity环境搭建
    【owner】today,last second day
    105-算法应用【N皇后问题】代码实现
    【Java小工具】节点选举Demo
    【加密算法】MD5、SHA算法加密工具类
    50-数据结构【原码、反码和补码】计算机数表示方法
  • 原文地址:https://www.cnblogs.com/silence-gtx/p/5812012.html
Copyright © 2011-2022 走看看