测试集上的接收者操作特征曲线(ROC)

3
以下图片对我来说肯定有意义。 enter image description here 假设您有几个经过训练的二进制分类器A、B(B的效果不如随机猜测等等……),以及一个由n个测试样本和所有这些分类器一起使用的测试集。由于精度和召回率是为所有n个样本计算的,因此与分类器相对应的那些点是有意义的。
现在有时人们会谈论ROC曲线,我理解精度是作为召回率的函数来表示的,或者仅仅绘制了Precision(Recall)。
我不明白这种变异性来自何处,因为您有一定数量的测试样本。您只是选择测试集的一些子集,并找到精度和召回率以便绘制它们,从而获得许多离散值(或插值线)吗?

这可能是一个很好的问题,可以在http://stats.stackexchange.com上提问 - 那里更专注于统计学等方面。 - lmjohns3
2个回答

1
ROC曲线适用于表达其输出为“分数”的二元分类器。该得分可以是正类的概率,也可以是两种可能结果之一的每个概率分布之间的概率差(甚至是对数几率比)。通过在不同级别处设置此得分的决策阈值并测量真正阳性和假正阳性率来获得曲线。在维基百科“接收者操作特征”页面中有一个很好的示例说明了这个过程。
如果您更喜欢代码,这里是使用scikit-learn计算每个数据集项的预测结果并生成ROC曲线的代码。基本操作似乎是(直接链接):
desc_score_indices = np.argsort(y_score, kind="mergesort")[::-1]
y_score = y_score[desc_score_indices]
y_true = y_true[desc_score_indices]

# accumulate the true positives with decreasing threshold
tps = y_true.cumsum()
fps = 1 + list(range(len(y_true))) - tps
return fps, tps, y_score

基本上,真实标签按分类器分配给它们的得分以降序排序,然后计算它们的累积和,从而得出分类器分配的得分作为真正阳性率的函数。
以下是一个示例,展示了如何使用此方法:http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html

这条曲线是通过在不同级别上设置得分的决策阈值并测量真正阳性率和假阳性率而获得的,考虑到该阈值。这意味着完全参数化分类器没有ROC曲线,但是由坐标(精确度,1-召回率)组成的ROC的单个点。这意味着仅将特征映射到类成员身份的算法才有ROC曲线,对吧? - valentin
是的,那是我对它的理解。 - lmjohns3
就像是一种思维练习,假设分类器已经固定且阈值已经设置好(例如svm),如果你开始以这样的假设在小而独立的块中探索测试集,并且每次绘制(精确度,1-召回率)点……我想知道……它是否应该类似于离散的ROC曲线:D - valentin
是的,我认为你所说的可以做到,就是从测试集子样本中估计P/R值;我只是认为这种方法并不经常使用。但对我来说,这有点像用自助法进行置信度估计。你可以在http://stats.stackexchange.com上询问更多相关信息。 - lmjohns3

0

ROC曲线只是显示“如果您增加FPR一定量,您将获得多少灵敏度”。TPR和FPR之间的权衡。变异性来自分类器的某个参数的变化(对于下面的逻辑回归案例,它是阈值)。

例如,逻辑回归会给出对象属于正类的概率(值在[0..1]中),但这只是概率。它不是一个类。因此,在一般情况下,您必须为概率指定阈值,超过该阈值,您将将对象分类为正类。您可以学习逻辑回归,为您的集合中的每个对象获取正类的概率,然后您只需通过使用从0到1的某些步骤来改变此阈值参数来阈值化您的概率(在上一步计算的概率),您将获得每个阈值的TPR和FPR。因此,您将获得每个阈值的TPR和FPR。您可以在图表上标记它们,并最终在计算所有阈值的(TPR,FPR)对之后,通过它们绘制一条线。

对于线性二元分类器,您可以将这个变化过程看作是选择决策线和正(或负,如果您愿意)类簇之间距离的过程。如果您将决策线远离正类 - 您将把更多的对象分类为正类(因为您增加了正类空间),同时您也增加了某个值的假阳性率(因为负类空间减少了)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接