ROC曲线
2020-07-25 本文已影响0人
whisper0710
在正负样本不均匀的情况下,ROC曲线是一个能更加稳定反应模型好坏的指标。
1.理论
1.1 用途
反应分类模型在选取不同阈值时候的敏感性(sensitivity,FPR)和精确性(specificity, TPR)。
1.2 定义
ROC: Receiver Operating Characteristic Curve(受试者工作曲线)
image其中横坐标是FPR(False Positive Rate) = FP/N = FP/(FP+TN)
纵坐标是TPR(True Positive Rate) = TP/P = TP/(TP+FN)
imageP-R曲线
Precision(查准率):P=TP/(TP+FP),即预测结果为正中正例出现的概率。
Recall(查全率) :R=TP/(TP+FN),即正例被正确预测出来的概率。
PR曲线,横坐标是Recall,纵坐标是precision。P-R曲线的横轴是召回率,纵轴是精确率。
2.ROC曲线的绘制
直观的绘制ROC曲线的方法,这边简单提一下。就是把横轴的刻度间隔设为1/N,纵轴的刻度间隔设为1/P
,N,P分别为负样本与正样本数量。然后再根据模型的输出结果降序排列,依次遍历样本,从0开始绘制ROC曲线,每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,遍历完所有样本点以后,曲线也就绘制完成了。究其根本,其最大的好处便是不需要再去指定阈值寻求关键点了,每一个样本的输出概率都算是一个阈值了。当然,无论是工业界还是学术界的实现,都不可能手动去绘制,下面就来讲一下如何用Python高效绘制ROC曲线。
from sklearn.metrics import roc_curve, auc
import numpy as np
from sklearn import metrics
#设定预测结果
y = np.array([1,1,2,2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
#roc_curve的输入为
#y:样本标签
#scores:模型对于样本属于正例的概率输出
#pos_label:标记为正例的标签,本例中标记为2的即为正例
fpr,tpr,thresholds = metrics.roc_curve(y, scores, pos_label = 2)
#输出假阳概率
fpr
#输出真阳概率
tpr
#输出阈值
thresholds
#计算auc 输入为fpr,tpr
auc = metrics.auc(fpr,tpr)
auc
#绘制ROC曲线
import matplotlib.pyplot as plt
plt.figure()
lw=2 #线条粗细
#plt.plot(fpr,tpr,color='darkorange',lw=lw, lable='ROC Curve (area = %0.2f)' % auc)
plt.plot(fpr,tpr,color='darkorange',lw=lw,label='ROC Curve (area = %0.2f)' % auc)
plt.plot([0,1],[0,1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc='lower right')
plt.show()
ROC曲线示例
参考文献
【1】机器学习基础(1)- ROC曲线理解