模型评价指标—ROC曲线

对于分类模型,在建立好模型后,我们想对模型进行评价,常见的指标有混淆矩阵、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。
  
TP(True Positive):模型正确预测为1的数量,即真实值是1,模型预测为1的数量。
  
FN(False Negative):模型错误预测为0的数量,即真实值是1,模型预测为0的数量。
  
FP(False Positive):模型错误预测为1的数量,即真实值是0,模型预测为1的数量。
  
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函数的调用语句:

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曲线,代码如下:

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实现实例已讲解完毕,感兴趣的同学可以自己尝试实现一下。

  
你可能感兴趣:
用Python绘制皮卡丘
用Python绘制词云图
用Python绘制520永恒心动
Python人脸识别—我的眼里只有你
Python画好看的星空图(唯美的背景)
【Python】情人节表白烟花(带声音和文字)
用Python中的py2neo库操作neo4j,搭建关联图谱
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)

猜你喜欢

转载自blog.csdn.net/qq_32532663/article/details/129772801