前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >模型评价指标—ROC曲线

模型评价指标—ROC曲线

作者头像
阿黎逸阳
发布2023-08-21 18:56:36
7110
发布2023-08-21 18:56:36
举报

对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、F1值、KS曲线、ROC曲线、AUC面积等。

也可以自己定义函数,把模型结果分割成n(100)份,计算top1的准确率、覆盖率。

之前阐述了混淆矩阵KS曲线F1值,本文阐述ROC曲线的原理和Python实现实例,其它指标会在后续文章中详尽阐述,敬请期待

一、详细介绍ROC曲线

1 什么是ROC曲线

ROC曲线又称为受试者特征曲线(Receiver Operating Characteristic Curve):是分类问题的一个衡量指标。

它是以假阳性率FPR(False Positive Rate)为横轴,真阳性率TPR(True Positive Rate)为纵轴,调整不同阈值绘制的一条曲线。

ROC曲线越靠近左上角说明模型预测效果越好,至于原因详见后文。

2 理解ROC曲线的一个小例子

假设1代表涉赌涉诈账户,0代表非涉赌涉诈的正常账户。

T:正确预测,F:错误预测,P:1,N:0。

  • 1. TP(True Positive):模型正确预测为1的数量,即真实值是1,模型预测为1的数量。
  • 2. FN(False Negative):模型错误预测为0的数量,即真实值是1,模型预测为0的数量。
  • 3. FP(False Positive):模型错误预测为1的数量,即真实值是0,模型预测为1的数量。
  • 4.TN(True Negative):模型正确预测为0的数量,即真实值是0,模型预测为0的数量。

真阳性率TPR:实际是1的样本中,被模型预测为1的样本占比。即在该例中表示,实际涉赌涉诈客户被模型预测出来的客户数占比,计算公式如下:

TPR=TP/(TP+FN)

假阳性率FPR:实际是0的样本中,被模型预测为1的样本占比。即在该例中表示,正常客户被模型预测成涉赌涉诈客户数占比,计算公式如下:

FPR=FP/(FP+TN)

假设有10个样本,其中5个客户账户涉赌涉诈,5个客户账户是正常的。现在用逻辑回归模型进行预测,结果如下:

那么根据不同的阈值进行划分,对应的FPR和TPR值如下:

把点绘制到图上,即可得到对应的ROC曲线。

当客户数很多时,对阈值进行更细的划分,就可以得到更光滑的ROC曲线了。

更进一步,ROC曲线和x轴所围成的面积就是AUC的值。

二、用Python如何绘制ROC曲线

用Python绘制ROC曲线,主要基于sklearn库中的roc_curve和auc两个函数。

roc_curve函数用于计算FPR和TPR,auc函数用于计算曲线下面积。

1 roc_curve函数详解

首先看下roc_curve函数的调用语句:

代码语言:javascript
复制
roc_curve(y_true, y_score, *, pos_label=None, sample_weight=None, drop_intermediate=True)

入参详解:‍

y_true:样本真实标签,是一个和样本数量一致的一维向量,一般是二元的。如果标签不是{-1,1}或{0,1},则可以显式指定pos_label。

y_score:模型预测分数,可以是阳性类的概率估计、置信度值或决策的非阈值度量(在某些分类器上由“decision_function”返回,比如SVM),也是和样本数量一致的一维向量。简单的理解就是对测试集进行分类后得到的一个用于衡量该类是阳性还是阴性的分数度量。

pos_label:如果y_true不满足{0,1},{-1,1}标签时,则需通过该参数指定哪些样本是阳性,其余为阴性,默认不输入。

sample_weight:与样本数量一致的一维向量,指定每个样本的权重,默认不输入。

drop_intermediate:为true时(默认True)会删除一些不会出现在ROC曲线上的次优阈值。

返回值详解:

fpr:假阳性率序列,是与thread数量一致的一维向量。

tpr:真阳性率序列,是与thread数量一致的一维向量。

thread:该序列是一个递减序列,在每一个阈值下对y_score进行划分,大于的视为阳性,小于的视为阴性,从而计算出该阈值对应的fpr和tpr。

2 画ROC曲线的具体实例

为了便于理解,就把我们第一章的例子作为输入参数绘制ROC曲线,代码如下:

代码语言:javascript
复制
import os
import pandas as pd
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False
#处理图像显示中文的问题
import seaborn as sns
sns.set(font= "Kaiti",style="ticks",font_scale=1.4)
from sklearn.metrics import *

y_pred = [0.9, 0.8, 0.3, 0.7, 0.5, 0.6, 0.4, 0.3, 0.1, 0.2]
#预测值
y_true = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
#实际值
fpr_Nb, tpr_Nb, _ = roc_curve(y_true, y_pred)
aucval = auc(fpr_Nb, tpr_Nb)    # 计算auc的取值
plt.figure(figsize=(10,8))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr_Nb, tpr_Nb,"r",linewidth = 3)
plt.grid()
plt.xlabel("假正率FPR")
plt.ylabel("真正率TPR")
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.title("ROC曲线")
plt.text(0.15,0.9,"AUC = "+str(round(aucval,4)))
plt.show()

得到结果如下:

可以发现,绘制结果和我们手动画的差别不大。‍

至此,ROC曲线的绘制原理和Python实现实例已讲解完毕,感兴趣的同学可以自己尝试实现一下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 阿黎逸阳的代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档