Skip to content

Instantly share code, notes, and snippets.

@iphysresearch
Created August 13, 2019 15:04
Show Gist options
  • Save iphysresearch/eac5e7bd28bb4e7f99addbf25737a258 to your computer and use it in GitHub Desktop.
Save iphysresearch/eac5e7bd28bb4e7f99addbf25737a258 to your computer and use it in GitHub Desktop.

ROC 全称是“受试者工作特征”(Receiver Operating Characteristic)曲线。体现了不同算法在不同任务下“期望泛化性能”的好坏。

ROC 曲线与画 P-R 曲线的方法完全一样,唯一的区别排序计算的坐标轴改为了“真正例率”(True Postitve Rate,TPR) 和“假正例率”(False Positive Rate,FPR):


真实情况 预测结果 预测结果
正例 反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN(真反例)

$$ TPR = \frac{TP}{TP+FN}\\ FPR = \frac{FP}{TN+FP} $$

  • 同 P-R 曲线的分析一样,要先搞清楚极端情况:

    • 最完美的模型算法是存在某种阈值(ROC 曲线上某点)经过(0,1)这一点(FN=0,FP=0),也就是 ROC 图像的左上角。
    • ROC 曲线是一定经过(0,0)和(1,1)两点的,分别对应了排序后的样本全部取预测值为反例(TP=0,FP=0)和正例(FN=0,TN=0)。
    • 对角线对应的是TPR=FPR,其代表的是一个“随机乱猜”的算法模型。算法预测正反例的概率各占1/2,那么经过所谓的样本排序后,其上的真实标签是均匀规律交替出现的(如(1,0,1,0,1...)),所以算得的所有混淆矩阵里 TP/FN 和 FP/TN 的比例总是相同的。
  • ROC 曲线上判断算法模型的好坏:

    • 能包住其他算法模型的,性能更优
    • 曲线下面积(AUC)更大者,性能更优
  • 举个例子:

5个样本(a, b, c, d, e)的真值是(0, 1, 1, 0 ,0)

预测结果是 (0, 1, 0, 0, 1) ,

对应的预测概率分别是(0.1, 0.7, 0.3, 0.2, 0.9 )

"排序"就是说把五个样本按照预测概率排序, 就有:

(e, b, c, d, a)

(1, 1, 0, 0, 0) (这是预测结果) (0.9, 0.7, 0.3, 0.2, 0.1) (这是预测概率)

(0, 1, 1, 0, 0) (这是真值)

然后开始算6遍(样本数+1):

  1. 假如我们取预测若是如下结果(全是反例),对比对应的真值:

(0, 0, 0, 0, 0) (假如如此预测的结果No.1)

(0, 1, 1, 0, 0) (这是真值)

  可以算出  FPR = 0/3,  TPR = 0/3, 对应图上(0, 0)点。
  1. 假如我们取预测若是如下结果,对比对应的真值:

(1, 0, 0, 0, 0) (假如如此预测的结果No.2)

(0, 1, 1, 0, 0) (这是真值)

  可以算出  FPR = 1/3,TPR = 0/2,  对应图上(1/3, 0)点。
  1. 假如我们取预测若是如下结果,对比对应的真值:

(1, 1, 0, 0, 0) (假如如此预测的结果No.3)

(0, 1, 1, 0, 0) (这是真值)

  可以算出  FPR = 1/3,TPR = 1/2,  对应图上(1/3, 1/2)点。
  1. 假如我们取预测若是如下结果,对比对应的真值:

(1, 1, 1, 0, 0) (假如如此预测的结果No.4)

(0, 1, 1, 0, 0) (这是真值)

  可以算出  FPR = 1/3,TPR = 2/2,  对应图上(1/3, 1)点。
  1. 假如我们取预测若是如下结果,对比对应的真值:

(1, 1, 1, 1, 0) (假如如此预测的结果No.5)

(0, 1, 1, 0, 0) (这是真值)

  可以算出  FPR = 2/3,TPR = 2/2,  对应图上(2/3, 1)点。
  1. 假如我们取预测若是如下结果(全是正例),对比对应的真值:

(1, 1, 1, 1, 1) (假如如此预测的结果No.6)

(0, 1, 1, 0, 0) (这是真值)

  可以算出  ,FPR = 3/3, TPR = 2/2,   对应图上(1, 1)点。

from sklearn.metrics import roc_curve, auc
fpr, tpr, _ = roc_curve(y_true=[0,1,1,0,0], y_score=[0.1, 0.7, 0.3, 0.2, 0.9], 
                        pos_label=1,drop_intermediate=False)
plt.figure(figsize=(5,5))
plt.plot(fpr, tpr, 'r*')
print(auc(fpr, tpr))
# 0.66666666666666674

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment