1、二分模型
考虑一个二分问题,即将实例分成正类(Positive)或负类(Negative)。对一个二分问题来说,会出现四种情况:
TP: 如果一个实例是正类并且也被预测成正类,即为真正类(True Positive);
FP: 如果一个实例是负类而被预测成正类,即为假正类(False Positive);
TN: 如果一个实例是负类并且也被预测成负类,即为真负类(True Negative);
FN: 如果一个实例是正类而被预测成负类,即为假负类(False Negative)。
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曲线如下:
顺便把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曲线
待续