模型性能评价是每一位机器学习工作者都需要掌握的一项技能,除了最常见的损失函数比较,今天再向大家介绍一种稍微高明一点儿的方法 ROC与AUC
在正式介绍ROC曲线之前,我们还需要介绍一些额外的知识:分类结果混淆矩阵
对于二分类问题,可将样本根据真实类别与学习器预测类别的组合划分为真正例(TP)、假正例(FP)、真反例(TN)、假反例(FN),则显然有了
T
P
+
F
P
+
T
N
+
F
N
=
样
本
总
数
TP+FP+TN+FN=样本总数
TP+FP+TN+FN=样本总数
很多学习器是为测试样本产生一个预测概率,然后将这个预测值与一个分类阈值进行比较,若大于阈值则分为正类,否则为反类。例如,神经网络在一般情形下是对每一个测试样本预测出一个0~1之间的预测概率,然后将这个值与0.5比较,大于0.5则判为正例,否则为反例。这个预测概率的好坏直接决定了学习器的泛化能力。实际上,根据这个预测结果,我们可以将测试样本进行排序,“最可能“是正例的排在前面,“最不可能“是正例的排在最后面。这样,分类过程就相当于在这个排序中以某个“截断点“将样本分类两部分,前一部分判定为正例,后一部分判定为反例。这便是ROC曲线的应用背景,从这里我们应该知道ROC曲线适用于模型处理二分类问题的情形。
在不同的应用任务中,我们可以根据任务需求来采用不同的截断点,例如若我们更重视“查准率“,则可选择排序中靠前的位置进行截断;若更重视“查全率“,则可以选择排序中靠后的位置进行截断。因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能“的好坏。ROC曲线则是从这个角度出发来研究学习器泛化性能的有力工具。
ROC全称是“受试者工作特征“曲线,它源于“二战“中用于敌机检测的雷达信号分析技术。我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,没吃计算出两个重要量的值,分别以它们为横纵坐标作图,就得到了“ROC“曲线。ROC曲线的纵坐标是“真正利率“(TPR),横轴是“假正例率“(FPR),两者分别定义为
显示ROC曲线的图称为ROC图。在进行学习器比较时,若一个学习器的ROC曲线被另一个学习器的曲线完全包住,则可断言后者的性能优于前者;若两个学习器的ROC曲线发生交叉,则难以一般性的断言两者孰优孰劣。此时若一定要进行比较,则较为合理的判据是比较ROC曲线下的面积,即AUC(Area under ROC Curve)。
python的sklearn中计算ROC与AUC的函数
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
fpr,tpr,threshold = roc_curve(y_test, y_score) ###计算真正率和假正率
roc_auc = auc(fpr,tpr) ###计算auc的值
plt.figure()
lw = 2
plt.figure(figsize=(10,10))
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.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.show()
参考文献
[1] 周志华. 机器学习
[2] https://blog.csdn.net/lz_peter/article/details/78054914
更多资源下载
微信搜索“老和山算法指南”获取更多下载链接与技术交流群
有问题可以私信博主,点赞关注的一般都会回复,一起努力,谢谢支持。