xgboost中自定义损失函数的使用方法_第1页
xgboost中自定义损失函数的使用方法_第2页
xgboost中自定义损失函数的使用方法_第3页
xgboost中自定义损失函数的使用方法_第4页
xgboost中自定义损失函数的使用方法_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、xgboost中自定义损失函数的使用方法起初以为在param里定义了就行,但屡屡报错,后来终于找到了方法。首先是metric的写法:defmaxRecall(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

2、)returnMaxRecall:,prpr.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要加上,虽然不知道具体有什么用补充:从大神那里学了一招,如果你需要自定义损失函

3、数的话。先写你的损失函数,比如:defcustomoss(y_pre,D_label):#别人的自定义损失函数label=D_label.get_label()penalty=2.0grad=-label/y_pre+penalty*(1-label)/(1-y_pre)#梯度hess=label/(y_pre*2)+penalty*(1-label)/(1-y_pre)*2#2阶导returngrad,hessbst=xgb.train(param,xg_train,n_round,watchlist,feval=maxRecall,obj=custom_loss,maximize=Fals

4、e)只要再加上obj=custom_loss就可以了。下面是一些常用的损失函数的定义准确率P、召回率R、F1值定义准确率(Precision):P=TP/(TP+FP)。通俗地讲,就是预测正确的正例数据占预测为正例数据的比例。召回率(Recall):R=TP/(TP+FN)。通俗地讲,就是预测为正例的数据占实际为正例数据的比例F1值(Fscore):思考*正如下图所示,F1的值同时受到P、R的影响,单纯地追求P、R的提升并没有太大作用。在实际业务工程中,结合正负样本比,的确是一件非常有挑战的事。图像展示Fl123456789101112131415下面附上源码importnumpyasnpim

5、portmatplotlib.pyplotaspltfrommpl_toolkits.mplot3dimportAxes3Dfrommatplotlibimportcmfig=plt.figure()ax=fig.add_subplot(111,projection=3d)x=npinspace(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_xla

6、bel(precision)#x轴标签ax.set_ylabel(reca)#y轴标签plt.show()ROC、AUC概念+1-1+JTPR=TP/(TP+FN)=TP/actualpositivesFPR=FP/(FP+TN)=FP/actualnegativesROC是由点(TPR,FPR)组成的曲线,AUC就是ROC的面积AUC越大越好。一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting图像展示1234561234FilesPlobIPackasesHdpVFer=O1尼fZoom列却口“0211PtftrtEhROCCDcooJ_C(Droniir10.0

7、0.2040.60010-HIL|-MB-JbB!BV-BBb附上代码library(ROCR)p=c(0.5,0.6,0.55,0.4,0.7)y=c(1,1,0,0,1)pred=prediction,y)perf=performance(pred,tpr,fpr)plot(perf,col=blue,lty=3,lwd=3,cexab=1.5,cex.axis=2,cex.main=1.5,main=R0Cplot)python版本计算AUCfromsklearnimportmetricsdefaucfun(act,pred):fpr,tpr,thresholds=metrics.roc

8、_curve(act,pred,pos_label=1)returnmetrics.auc(fpr,tpr)直接利用AUC优化分类任务(R语言版)ItSAUC训兼:0-9335833jiiJ丄t.r.!I:njrij下面是代码12345678#生成训练数据set.seed(1999)x1=rnorm(IOOO)x2=rnorm(IOOO)z=1+2*x1+3*x2pr=1/(1+exp(-z)y=rbinom(1000,1,pr)9101112#使用logloss作为训练目标函数df=data.frame(y=y,x1=x1,x2=x2)glm.fit=glm(yx1+x2,data=df,f

9、amily=binomial)1314151617181920212223#下面使用auc作为训练目标函数library(ROCR)CalAUC-function(real,pred)rocr.pred=prediction(pred,real)rocr.perf=performance(rocr.pred,auc)as.numeric(rocr.perfy.values)#初始值beta0=c(1,1,1)242526272829loss-function(beta)z=beta1+beta2*x1+beta3*x2pred=1/(1+exp(-z)-CalAUC(y,pred)30res=

10、optim(beta0,loss,method=Nelder-Mead,control=list(maxit=100)3.PRC、ROC比较AUC是ROC的积分(曲线下面积),是一个数值,一般认为越大越好,数值相对于曲线而言更容易当做调参的参照。PR曲线会面临一个问题,当需要获得更高recall时,modeI需要输出更多的样本,precision可能会伴随出现下降/不变/升高,得到的曲线会出现浮动差异(出现锯齿),无法像ROC一样保证单调性。在正负样本分布得极不均匀(highlyskeweddatasets)的情况下,PRC比ROC能更有效地反应分类器的好坏。4.mape平均绝对百分误差在sklearn中,对于回归任务,一般都提供了mse损失函数(基于树的模型除外)。但有时我们会遇到sklearn中没有定义的损失函数,那么我们可以自定重写模型或者定义函数,下面以xgboost为模型,mape作为损失函数为例(grad、hess分别对应损失函数一阶导、二阶导)。代码defmapeobj(preds,dtrain):gaps=dtrain.get_label()grad=np.sign(preds-gaps)/gapshe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论