混淆矩阵-ROC曲线-PR曲线-二分类

关于机器学习的评估指标,在之前的学习中已经涉及了很多,大体可分为混淆矩阵、ROC曲线和PR曲线,也记录下很多相关的内容。虽然记录下这么多内容,但是大都是知其然不知所以然的状况,在实际分类算法的实践中,往往只是将准确率作为评判标准,这也可能是因为公开数据集大都是类别均衡的缘故吧。

最近涉及到度量学习领域,在完成模型计算后,很重要的一步就是对特征向量进行相似度分类,选取合适的分类阈值就很有必要。如何设置有效的分类阈值,关键在于如何对算法进行评判和分析。这个过程中重新对于混淆矩阵、ROC曲线和PR曲线进行了分析和思考。

在重新复习相关文档的过程中,还发现了有些基础概念理解错了(囧。。。)。这篇文章系统性的整理相关的概念,并且通过scikit库进行相应的实验。

注:仅涉及二分类实现,后续再扩展到多分类

相关实现位于:zjykzj/scikit-learn

混淆矩阵

混淆矩阵是分类任务的基础概念,通过矩阵形式展示预测类别和真实类别的差异。通过混淆矩阵计算,可以获取TP/FP/FN/TN大小,这样就可以进一步计算诸如准确率、精确率、召回率等评估指标。还可以在此基础上计算更综合指标,比如F1-score,它可以解释为精确度和召回率的加权平均值,相当于精确率和召回率的综合评价指标。

注意:上述这些评估指标的计算都是基于已经给出每个测试样本的预测标签情况下得到的,也就是说是一个确定值,无法改变。

相关的定义查看:

ROC曲线

ROC曲线是一个二维曲线图,其y轴表示TPRx轴表示FPR。通过在不同阈值条件下计算(FPR, TPR)数据对,绘制得到ROC曲线。TPR表示召回率,也就是预测为真的正样本占实际正样本集的比率;FPR表示误报率,也就是预测为假的负样本占实际负样本集的比率。

可以通过曲线下面积(AUC)来综合评判模型分类性能,它表示的是一个概率值:当随机给定一个正样本和一个负样本,分类器输出该正样本为正的概率值(召回率)比分类器输出该负样本为正的概率值(误报率)要大的可能性。也就是TPRFPR大的可能性。

注意一:因为需要调整阈值来计算(FPR, TPR)数据对,那么此时输出的结果不应该是固定的标签值,而是输出大小或者输出概率; 注意二:ROC曲线的绘图和阈值排序是不一致的,不同阈值条件下的(FPR, TPR)数据对大小不一,所以无法通过ROC曲线图观察得到最佳阈值。

理论上TPR越高越好,FPR越低越好,最好情况就是位于(0, 1)点,这个时候TRP大小为100%,而FPR大小为0%.对于ROC曲线而言,其存在最佳阈值点,只要能够得到不同阈值条件下的TPRFPR,计算之间的差值,结果值最大的就是最佳阈值。

1
2
thresh = thresholds[np.argmax(tpr - fpr)]
print(thresh)

相关的定义查看

PR曲线

PR曲线同样是一个二维曲线图,其y轴表示精度,x轴表示召回率,通过在不同阈值条件下计算(Recall, Precision)数据对,绘制得到PR曲线。Recall表示预测为真的正样本占实际正样本集的比率(查全率);Precision表示预测为真的正样本占预测正样本集的比率(查准率),两者都是针对预测为真的正样本集的理解和衡量。

可以通过曲线下面积(AP)来综合评判模型分类性能,它表示的是平均精度.同样的,因为需要调整阈值来计算(Recall, Precision)数据对,那么此时输出的结果不应该是固定的标签值,而是输出大小或者输出概率。

理论上RecallPrecision越高越好,所以最好情况位于(1, 1)点,此时整个预测正样本集均为真,同时预测正样本集等于实际正样本集.综合来看,最接近坐标(1,1)的点所对应的阈值就是最佳阈值。

1
best_th = threshold[np.argmax(precision + recall)]

在实际使用过程中,基于对检测精度和召回率的不同需求,可以考虑选择合适的阈值.尤其对于多分类模型而言,很可能无法实现(1, 1)的情况,那么就应该基于目前的需要进行阈值调整。比如需要预测结果包含更多的正样本,那么就应该降低精度阈值;如果需要更多正样本被正确预测,那么就应该降低召回率阈值。

相关的定义查看

后续思考

  1. 上述指标都是基于二分类数据集进行的,那么对于多分类数据集而言呢?
  2. 上述指标都是基于top1检测结果进行的,那么对于topN检测结果而言呢?