之前阐述了混淆矩阵、KS曲线和F1值,本文阐述ROC曲线的原理和Python实现实例,其它指标会在后续文章中详尽阐述,敬请期待
。
详细介绍ROC曲线
1.1 什么是ROC曲线
1.2 理解ROC曲线的一个小例子
用Python如何绘制ROC曲线
2.1 roc_curve函数详解
2.2 画ROC曲线的具体实例

ROC曲线又称为受试者特征曲线(Receiver Operating Characteristic Curve):是分类问题的一个衡量指标。
它是以假阳性率FPR(False Positive Rate)为横轴,真阳性率TPR(True Positive Rate)为纵轴,调整不同阈值绘制的一条曲线。
ROC曲线越靠近左上角说明模型预测效果越好,至于原因详见后文。
假设1代表涉赌涉诈账户,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的数量。



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

用Python绘制ROC曲线,主要基于sklearn库中的roc_curve和auc两个函数。
roc_curve函数用于计算FPR和TPR,auc函数用于计算曲线下面积。
=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。
为了便于理解,就把我们第一章的例子作为输入参数绘制ROC曲线,代码如下:
import osimport pandas as pdimport matplotlibmatplotlib.rcParams['axes.unicode_minus']=False#处理图像显示中文的问题import seaborn as snssns.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实现实例已讲解完毕,感兴趣的同学可以自己尝试实现一下。
往期回顾:


扫一扫关注我
13162366985
投稿微信号、手机