起初以为在param里定义了就行,但屡屡报错,后来终于找到了方法。

首先是metric的写法:

def maxRecall(preds,dtrain): #preds是结果(概率值),dtrain是个带label的DMatrixlabels=dtrain.get_label() #提取labelpreds=1-predsprecision,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):
  • 思考
    • 正如下图所示,F1的值同时受到P、R的影响,单纯地追求P、R的提升并没有太大作用。在实际业务工程中,结合正负样本比,的确是一件非常有挑战的事。
    • 图像展示
    • 下面附上源码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cmfig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
x = np.linspace(0,1,100)
p,r = np.meshgrid(x,x)    #meshgrid函数创建一个二维的坐标网络
z = 2*p*r/(p+r)
ax.plot_surface(x,y,z,rstride=4,cstride=4,cmap=cm.YlGnBu_r)
ax.set_title('F1')  #标题
ax.set_xlabel('precision')   #x轴标签
ax.set_ylabel('recall')   #y轴标签
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2.ROC、AUC

  • 概念

    • TPR=TP/(TP+FN)=TP/actual positives
    • FPR=FP/(FP+TN)=FP/actual negatives
    • ROC是由点(TPR,FPR)组成的曲线,AUC就是ROC的面积。AUC越大越好。
    • 一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting
  • 图像展示
  • 附上代码
library(ROCR)
p=c(0.5,0.6,0.55,0.4,0.7)
y=c(1,1,0,0,1)
pred = prediction(p, y)
perf = performance(pred,"tpr","fpr")
plot(perf,col="blue",lty=3, lwd=3,cex.lab=1.5, cex.axis=2, cex.main=1.5,main="ROC plot")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • python版本计算AUC
from sklearn import metrics
def aucfun(act,pred):fpr, tpr, thresholds = metrics.roc_curve(act, pred, pos_label=1)return metrics.auc(fpr, tpr)
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
  • 直接利用AUC优化分类任务(R语言版)

    下面是代码
#生成训练数据
set.seed(1999)
x1 = rnorm(1000)
x2 = rnorm(1000)
z = 1 + 2*x1 + 3*x2
pr = 1/(1+exp(-z))
y = rbinom(1000,1,pr)     #使用logloss作为训练目标函数
df = data.frame(y=y,x1=x1,x2=x2)
glm.fit=glm( y~x1+x2,data=df,family="binomial")#下面使用auc作为训练目标函数
library(ROCR)CalAUC <- function(real,pred){rocr.pred=prediction(pred,real)rocr.perf=performance(rocr.pred,'auc')as.numeric(rocr.perf@y.values)
}
#初始值
beta0=c(1,1,1)loss <- function(beta){z=beta[1]+beta[2]*x1+beta[3]*x2pred=1/(1+exp(-z))-CalAUC(y,pred)
}res=optim(beta0,loss,method = "Nelder-Mead",control = list(maxit = 100))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3.PRC、ROC比较

  • AUC是ROC的积分(曲线下面积),是一个数值,一般认为越大越好,数值相对于曲线而言更容易当做调参的参照。
  • PR曲线会面临一个问题,当需要获得更高recall时,model需要输出更多的样本,precision可能会伴随出现下降/不变/升高,得到的曲线会出现浮动差异(出现锯齿),无法像ROC一样保证单调性。
  • 在正负样本分布得极不均匀(highly skewed datasets)的情况下,PRC比ROC能更有效地反应分类器的好坏。

4.mape平均绝对百分误差

  • 定义
  • 技巧
    • 在sklearn中,对于回归任务,一般都提供了mse损失函数(基于树的模型除外)。但有时我们会遇到sklearn中没有定义的损失函数,那么我们可以自定重写模型或者定义函数,下面以xgboost为模型,mape作为损失函数为例(grad、hess分别对应损失函数一阶导、二阶导)。
    • 代码
def mapeobj(preds,dtrain):gaps = dtrain.get_label()grad = np.sign(preds-gaps)/gapshess = 1/gapsgrad[(gaps==0)] = 0hess[(gaps==0)] = 0return grad,hess  def evalmape(preds, dtrain):gaps = dtrain.get_label()err = abs(gaps-preds)/gapserr[(gaps==0)] = 0err = np.mean(err)return 'error',err  

xgboost中自定义损失函数的使用方法相关推荐

  1. android sqlite自定义函数,Android中自定义一个View的方法详解

    本文实例讲述了Android中自定义一个View的方法.分享给大家供大家参考,具体如下: Android中自定义View的实现比较简单,无非就是继承父类,然后重载方法,即便如此,在实际编码中难免会遇到 ...

  2. Android中自定义view的onMeasure()方法详谈

    背景 理解MeasureSpec MeasureSpec 情况分析 结合图例分析 总结 A little bit of progress every day!Come on! 背景 首先关于自定义vi ...

  3. 教你三种Model(AR)中自定义验证规则的方法

    2019独角兽企业重金招聘Python工程师标准>>> 各位Yii2兄弟都知道Model的rules里面可以使用自己定义的验证规则,我们今天就把自定义规则做一个总结,进行一次彻底的知 ...

  4. 【eoe教程】Android中自定义视图的绘制方法

    原文链接 :http://android.eoe.cn/topic/ui 自定义视图最重要的部分是它的外观.你可以根据应用的需求简单或复杂的实现它. 这个教程包含了最常见的操作. 重写onDraw() ...

  5. PyTorch 中自定义数据集的读取方法

    显然我们在学习深度学习时,不能只局限于通过使用官方提供的MNSIT.CIFAR-10.CIFAR-100这样的数据集,很多时候我们还是需要根据自己遇到的实际问题自己去搜集数据,然后制作数据集(收集数据 ...

  6. finereport php,FineReport中自定义登录界面的方法

    在登录平台时,不希望使用FR默认的内置登录界面,想通过自定义登录界面实现登录操作,内置登录界面如下图: 登录界面,获取到用户名和密码的值,发送到报表系统,报表服务带着这两个参数访问认证地址进行认证. ...

  7. [机器学习] XGBoost 自定义损失函数-FocalLoss

    一.XGBoost损失函数 损失函数:损失函数描述了预测值和真实标签的差异,通过对损失函数的优化来获得对学习任务的一个近似求解方法 boosting类算法的损失函数的作用: Boosting的框架, ...

  8. python turtle 绘图_谈一下Pycharm中关联系统Python解释器的方法

    大家知道,PyCharm是一款著名的Python IDE开发工具,是拥有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,具备基本的调试.语法高亮.Project管理.代码跳转.智能提示 ...

  9. java 自定义xml_6.1 如何在spring中自定义xml标签

    dubbo自定义了很多xml标签,例如,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 1 packagecom.hulk.testdubbo.model ...

最新文章

  1. data数值设置 vue_怎么改变vue中data的数据
  2. Struts2源码阅读(五)_FilterDispatcher核心控制器
  3. 浅谈javascript数值类型转换
  4. kettle使用数据库来生成序列_kettle专题5:数据转换
  5. 7月国内手机出货量3419.9万部 5G手机果然还是很少!
  6. [转载] 使用python完成冒泡排序_使用python实现-冒泡排序
  7. 【PYTHON】基于tkinter的九型人格测试系统介绍
  8. 华硕主板破linux密码破解,华硕P8B75-M-LE老主板加持NVMe SSD bios(刷新软件和bios)...
  9. linux top命令 什么意思,Linux下的top命令、%cpu和cps(s)到底是什么意思呢!
  10. 公网Kamailio 代理 freeswitch 和做 sbc
  11. 作业1:小型考勤登记表
  12. 再次定义手机摄影:华为P40系列国内正式发布
  13. pycharm 如何配置主题背景色 墨绿色
  14. 常用分辨率设置,RGB与CMYK_几何途行_新浪博客
  15. win10系统分区方案教程
  16. LTspice使用教程笔记
  17. 高品质回音消除,噪音抑制语音处理芯片—ATH8806
  18. 如何设计一个PC客户端的架构
  19. 面向社交媒体的多模态属性级情感分析研究
  20. 51单片机(4)-------单片机开发板

热门文章

  1. 0099 MySQL02
  2. nginx安装配置、Nginx支持php
  3. 计算机网络,c语言,电子
  4. 常用的自动化管理工具
  5. Webstorm干货(开发效率快到飞起!!!)
  6. SpringBoot的国际化错误信息返回
  7. 腾讯蓝鲸智云SaaS作品计算机毕业设计征集小赛
  8. 操作系统之文件管理(二) ※
  9. HDUOJ 2048 - 神、上帝以及老天爷(错排公式)
  10. 物联网测试完整解决方案 | 为你的芯片、模块、终端保驾护航