受试者工作特征(Receiver Operating Characteristic,ROC)的基本知识
- ROC曲线可以用来评估分类器的输出质量。
- ROC曲线Y轴为真阳性率,X轴为假阳性率。这意味着曲线的左上角是“理想”点——假阳性率为0,真阳性率为1。
- 上述的理想情况实际中很难存在,但它确实表示面积下曲线(AUC)越大通常分类效率越好。
- ROC曲线的“陡度”也很重要,坡度越大,则越有降低假阳性率,升高真阳性率的趋势。
- ROC曲线通常用于二元分类中研究分类器的输出(也可在多分类中使用,需要对标签进行二值化【比如ABC三类,进行分类时将标签进行二值化处理[A(1)、BC(0)】、【B(1)、AC(0)】、【C(1)、AB(0)】,比如本文不作讨论)。
python 实现
- 绘制ROC曲线主要基于python 的sklearn库中的两个函数,roc_curv和auc两个函数。
- roc_curv 用于计算出fpr(假阳性率)和tpr(真阳性率)
- auc用于计算曲线下面积,输入为fpr、和tpr
roc_curv函数详解
- 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。
代码示例
# 导包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
# 计算
fpr, tpr, thread = roc_curve(y_test, y_score)
roc_auc[i] = auc(fpr, tpr)
# 绘图
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
lw=lw, label='ROC curve (area = %0.2f)' % roc_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.savefig('roc.png',)
plt.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
y_test 数据示例:
0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1
y_score:数据示例:
-0.763011 -0.202245 0.118015 -0.907809 -0.0111619 -0.604873 0.0228349 -0.610769 -0.375728
-0.470174 -0.422242 -0.335587 -0.227239 -0.0785673 -0.533834 0.121637 -0.713569 -0.551115
0.379913 -0.111076
更多SVM及ROC的介绍见文章:
python基于sklearn的SVM和留一法(LOOCV)进行二分类
python:Sklearn SVM使用留一法时如何绘制ROC曲线与计算AUC