一、介绍:
在机器学习中,我们经常使用PR曲线(Precision-Recall Curve)和ROC曲线(Receiver Operating Characteristic Curve)来评估模型的性能。这两种曲线都可以提供有关分类器性能的重要信息。
二、PR曲线:
PR曲线是精确度(Precision)和召回率(Recall)之间的关系图。精确度是指预测为正例的样本中真正为正例的比例,而召回率是指真正为正例的样本中被预测为正例的比例。
PR曲线的横坐标是召回率,纵坐标是精确度。PR曲线越接近右上角,分类器的性能越好。如果一个PR曲线被另一条PR曲线包围,则后者的性能肯定优于前者。
用途
主要用于评估分类模型的性能,尤其是在数据不平衡的情况下。它可以帮助我们理解模型在不同的阈值下精确度和召回率之间的权衡。通过观察PR曲线,我们可以选择一个适合我们需求的阈值,以达到我们期望的精确度和召回率。
计算公式
精确率(Precision):预测结果中真正的正例的比例
召回率(Recall) :所有正例中被正确预测出来的比例
绘制
先将模型对测试集的预测结果按照预测为正类的概率值进行排序,然后设定一个阈值(一般先设为1),逐渐降低,每取一个阈值都能获得一组相对应的精确率与召回率。经过计算后,以召回率为横坐标,精确率为纵坐标,在坐标系中绘制点,将所有点连成一条曲线,即可得到PR曲线。
示例:
使用Python绘制PR曲线的示例。这个示例中,使用一个简单的数据集,并使用一个基础的分类器进行预测。然后,手动计算精确率和召回率,并绘制PR曲线。
1.设置真实的标签与置信度
y_true = [0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0 , 1, 1, 0]
y_scores = [0.1, 0.35, 0.4, 0.8, 0.65, 0.9, 0.5, 0.15, 0.85, 0.7,0.25,0.33,0.2,0.35,0.5,0.1,0.8,0.9,0.9,0.6]
2.将标签和置信度对应从高到低依次排序
sorted_scores, sorted_true = zip(*sorted(zip(y_scores, y_true), reverse=True))
3.计算精确率和召回率,在此之前需要初始化精确率和召回率列表
for i in range(len(sorted_scores)):
tp = sum(sorted_true[:i+1]) # 真正例数量
fp = (i+1) - tp # 假正例数量
fn = sum(sorted_true) - tp # 假负例数量
precision.append(tp / (tp + fp))
recall.append(tp / (tp + fn))
4.绘制PR曲线,调用matplotlib函数
plt.plot(recall, precision)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.show()
5.结果
三、ROC曲线
ROC曲线是真正例率(True Positive Rate,TPR)和假正例率(False Positive Rate,FPR)之间的关系图。TPR也就是召回率,FPR是预测为正例但实际为负例的样本占所有负例样本的比例。
ROC曲线的横坐标是FPR,纵坐标是TPR。ROC曲线越接近左上角,分类器的性能越好。ROC曲线下的面积被称为AUC(Area Under Curve),AUC值越大,分类器的性能越好。
用途
和PR曲线类似,ROC曲线(Receiver Operating Characteristic Curve)是一种用于评估分类模型性能的工具。它可以帮助我们理解模型在不同阈值下真正例率(True Positive Rate,TPR)和假正例率(False Positive Rate,FPR)之间的权衡。通过观察ROC曲线,我们可以选择一个适合我们需求的阈值,以达到我们期望的TPR和FPR。
计算公式
假正例率: 分类器预测中实际负实例占所有负实例的比例
真正例率:分类器预测的正类中实际正实例占所有正实例的比例
绘制
先将模型对测试机的预测结果排序,再设定阈值,从1开始逐渐降低,每取一个阈值,即可对所有输出图像算得一组相对应的真阳性率(True Positive Rate,TPR)和假阳性率(False Positive Rate,FPR)。计算后,以FDR 为横坐标,TDR为纵坐标,把绘制的点连接成曲线,即得到ROC曲线。
AUC
AUC (Area under Curve):ROC曲线下的面积,介于0.1和1之间,作为数值可以直观的评价分类器的好坏,值越大越好。
AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值
示例
与以上PR曲线相似
1.设置真实的标签与置信度
y_true = [0, 1, 1, 0, 1, 1, 0, 0, 1, 1,1,1,1,0,0,1,0,1,1,0,0,0,1,1,0,1,0,0,1,1,0]
y_scores = [0.1, 0.35, 0.4, 0.8, 0.65, 0.9, 0.5, 0.15, 0.85, 0.7,0.7,0.6,0.85,0.7,0.6,0.15,0.1,0.3,0.35,0.5,0.8]
2. 将标签和置信度对应从高到低依次排序
sorted_scores, sorted_true = zip(*sorted(zip(y_scores, y_true), reverse=True))
3.计算真阳性率和假阳性率,在此之前需要初始化真阳性率和假阳性率列表
for i in range(len(sorted_scores)):
tp = sum(sorted_true[:i+1]) # 真正例数量
fp = (i+1) - tp # 假正例数量
fn = sum(sorted_true) - tp # 假负例数量
tn = len(y_true) - tp - fp - fn # 真负例数量
tpr.append(tp / (tp + fn))
fpr.append(fp / (fp + tn))
4.ROC 曲线绘制
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
5.结果
四、总结
其实PR曲线和ROC曲线的选择还是要根据实际情况做出选择,当正负样本比例相近时,ROC曲线通常能够给出稳健的性能评估,。当正负样本比例严重不平衡时,PR曲线通常更为实用。在这种情况下,ROC曲线可能会给出过于乐观的结果,因为它把真负例考虑在内了,而真负例在数据不平衡时通常数量庞大,会掩盖模型在正例上的表现,如信用卡欺诈检测实例,典型的不平衡分类问题,这种情况下,PR曲线往往能够提供更多信息。
以上就是此次博客的所有内容。