二分类模型评估之 ROC曲线和PR曲线

时间:2022-12-07 12:57:43

1、二分模型

考虑一个二分问题,即将实例分成正类(Positive)或负类(Negative)。对一个二分问题来说,会出现四种情况:
TP: 如果一个实例是正类并且也被预测成正类,即为真正类(True Positive);
FP: 如果一个实例是负类而被预测成正类,即为假正类(False Positive);
TN: 如果一个实例是负类并且也被预测成负类,即为真负类(True Negative);
FN: 如果一个实例是正类而被预测成负类,即为假负类(False Negative)。

二分类模型评估之 ROC曲线和PR曲线

2、ROC曲线

ROC曲线:ROC曲线一系列根据不同的二分类方式(阈值或分界值),以真阳性率TPR(灵敏度)为纵坐标,假阳性率FPR(1-特异度)为横坐标绘制的曲线。

TPR: 在所有实际为阳性的样本中,被正确地判断为阳性的比率 TRP = TP / (TP + FN)。TPR也被称为正样本的召回率,或者覆盖率。
FPR: 在所有实际为阴性的样本中,被错误地判断为阳性的比率 FPR = FP / (FP + TN)。FPR也被称为负样本的召回率,或者取伪率。

举例:
给定一个二元分类模型和它的阈值,就能从所有样本的真实值和预测值计算出一个坐标点。
样本的真实类别y_true = [1, 1, 0, 0, 1]
y_score = [0.5, 0.6, 0.55, 0.4, 0.7 ]
现在分别选择阈值(0.4、0.5、0.55、0.6、0.7),如果大于等于选定阈值则归为类别1,如果小于选定则归为类别0.

Threhold y_pred TP FP TN FN TPR FPR
0.4 [1, 1, 1, 1,] 3 2 0 0 1 1
0.5 [0, 1, 1, 1,] 3 1 1 0 1 0.5
0.55 [0, 0, 1, 1,] 2 1 1 1 0.67 0.5
0.6 [0, 0, 0, 1,] 2 0 2 1 0.67 0
0.7 [0, 0, 0, 1,] 1 0 2 2 0.33 0

以这FPR和TPR分别作为x值和y值,作散点图,得到ROC曲线如下:

二分类模型评估之 ROC曲线和PR曲线

顺便把Python代码附上:

import numpy as np
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score
from matplotlib import pyplot as plt

y_true = np.array([1, 1, 0, 0, 1])
y_score = np.array([0.5, 0.6, 0.55, 0.4, 0.7 ])
fpr, tpr, thresholds = roc_curve(y_true, y_score, pos_label=1)
AUC_ROC = roc_auc_score(y_true, y_score)

roc_curve =plt.figure()
plt.plot(fpr,tpr,'-',label='Area Under the Curve (AUC = %0.4f)' % AUC_ROC)
plt.title('ROC curve')
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.legend(loc="lower right")

3、PR曲线


待续