假设您有一些训练有素的二元分类器A,B(B比随机猜测等差不多......)和一个由n个测试样本组成的测试集与所有这些分类器一起使用。由于针对所有n个样本计算精度和回忆,因此对应于分类器的那些点是有意义的。
现在有时人们谈论ROC曲线,我知道精度表示为召回函数或简单绘制精度(召回)。
我不明白这种可变性来自何处,因为您有一定数量的测试样本。您是否只选择测试集的一些子集并找到精度和调用以绘制它们,从而绘制许多离散值(或插值线)?
答案 0 :(得分:1)
对于将其输出表示为“得分”的二元分类器,ROC曲线是明确定义的。例如,得分可以是处于正类中的概率,或者也可以是两种可能结果中每一种的概率分布之间的概率差(或甚至对数比值比)。
通过在不同水平设置该分数的决策阈值并在给定阈值的情况下测量真阳性和假阳性率来获得曲线。
Wikipedia's "Receiver Operating Characteristic" page中有一个很好的例子:
例如,假设患病人群和健康人群的血液蛋白质水平通常分别为2 g / dL和1 g / dL。医学测试可以测量血液样品中某种蛋白质的水平,并将任何高于某一阈值的数字分类为指示疾病。实验者可以调整阈值(图中的黑色垂直线),这反过来会改变误报率。增加阈值将导致更少的误报(和更多的假阴性),对应于曲线上的向左移动。曲线的实际形状取决于两个分布的重叠程度。
如果代码更清楚地告诉你,这里是scikit中的代码 - 学习computes an ROC curve给出数据集中每个项目的一组预测。基本操作似乎是(direct link):
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
答案 1 :(得分:0)
ROC曲线只显示"如果将FPR增加一定量,您将获得多少灵敏度"。 TPR和FPR之间的权衡。可变性来自于改变分类器的一些参数(对于下面的逻辑回归情况 - 它是阈值)。
例如,逻辑回归给出了对象属于正类的概率([0..1]中的值),但它只是概率。它不是一个班级。因此,在一般情况下,您必须指定概率阈值,超过该阈值,您将对象分类为正数。您可以学习逻辑回归,从中获取集合中每个对象的正类概率,然后通过使用此阈值对您的概率进行阈值处理(在前一步骤中计算),您可以改变此阈值参数,步长从0到1您将获得每个对象的类标签,并从此标签计算TPR和FPR。因此,您将获得每个阈值的TPR和FPR。您可以在绘图上标记它们,并最终在计算所有阈值的(TPR,FPR)对后 - 通过它们画一条线。
对于线性二元分类器,您可以将此变化过程视为选择决策线与正(或负,如果需要)类集群之间的距离的过程。如果您将决策线远离正类 - 您将更多对象分类为正(因为您增加了正类空间),同时您将FPR增加了一些值(因为负类的空间减少)。