在机器学习领域,评估分类器性能是一个重要的环节。常用的评估指标包括接收者操作特征(Receiver Operating Characteristic,简称ROC)曲线和检测误差权衡(Detection Error Tradeoff,简称DET)曲线。本文将介绍如何使用这两种曲线来比较两个不同分类器在同一分类任务上的性能。
ROC曲线以真正例率(True Positive Rate,简称TPR)为纵轴,假正例率(False Positive Rate,简称FPR)为横轴。这意味着在图表的左上角是“理想”点——FPR为零,TPR为一。而DET曲线则是ROC曲线的一种变体,它将假负例率(False Negative Rate,简称FNR)绘制在纵轴上,而不是TPR。在这种情况下,原点(左下角)是“理想”点。
为了进一步了解ROC曲线,可以参考sklearn.metrics.roc_curve
,而对于DET曲线的详细信息,可以查看sklearn.metrics.det_curve
。本文的示例是基于“分类器比较”示例进行的。此外,还可以参考“带有交叉验证的接收者操作特征(ROC)”示例,以估计ROC曲线和ROC-AUC的方差。
首先,需要生成合成数据。这里使用sklearn.datasets.make_classification
函数来生成具有1000个样本、2个特征的数据集,其中2个特征是有信息的,没有冗余特征,每个类别有一个簇。然后,使用train_test_split
函数将数据集分为训练集和测试集,测试集的大小为40%。
接下来,定义两个不同的分类器。目标是使用ROC和DET曲线在不同阈值下直观地比较它们的统计性能。选择这些分类器没有特别的原因,scikit-learn中还有许多其他可用的分类器。
使用matplotlib.pyplot
和sklearn.metrics.RocCurveDisplay
、DetCurveDisplay
来绘制ROC和DET曲线。DET曲线通常在正态偏差尺度上绘制。为了实现这一点,DET显示将使用scipy.stats.norm
转换det_curve
返回的错误率和轴尺度。
在绘制ROC和DET曲线时,可以看到,使用DET曲线比使用ROC曲线更容易直观地评估不同分类算法的整体性能。由于ROC曲线在线性尺度上绘制,不同分类器在图表的大部分区域通常看起来相似,差异最大的地方在图表的左上角。另一方面,由于DET曲线在正态偏差尺度上表示为直线,它们通常在整个图表上都是可区分的,感兴趣的区域覆盖了图表的大部分区域。
DET曲线直接反馈了检测误差权衡,有助于操作点分析。用户可以决定他们愿意接受的FNR,以换取FPR(或反之亦然)。
脚本的总运行时间为:(0分钟0.180秒)