我目前正在运行一个二元分类器。当我绘制 ROC 曲线时,我在开始时得到了很好的提升,然后它改变方向并穿过对角线,然后当然又向上,使曲线成为倾斜的 S 形。
对此效果的解释/解释是什么?
谢谢
我目前正在运行一个二元分类器。当我绘制 ROC 曲线时,我在开始时得到了很好的提升,然后它改变方向并穿过对角线,然后当然又向上,使曲线成为倾斜的 S 形。
对此效果的解释/解释是什么?
谢谢
只有当两个结果的标准差相同时,您才会得到一个漂亮的对称 ROC 图。如果它们完全不同,那么您可能会得到您所描述的结果。
下面的 Mathematica 代码演示了这一点。我们假设一个目标在响应空间中产生一个正态分布,并且噪声也产生一个正态分布,但是一个移位的分布。ROC 参数由决策标准左侧或右侧的高斯曲线下方的区域确定。改变这个标准描述了 ROC 曲线。
Manipulate[
ParametricPlot[{CDF[NormalDistribution[4, \[Sigma]], c],
CDF[NormalDistribution[0, 3], c]
}, {c, -10, 10},
Frame -> True,
Axes -> None, PlotRange -> {{0, 1}, {0, 1}},
Epilog -> Line[{{0, 0}, {1, 1}}]],
{{\[Sigma], 3}, 0.1, 10, Appearance -> "Labeled"}]
这是具有相等的标准偏差:
这是相当不同的:
或使用更多参数:
Manipulate[
ParametricPlot[{CDF[NormalDistribution[\[Mu]1, \[Sigma]1], c],
CDF[NormalDistribution[\[Mu]2, \[Sigma]2], c]}, {c, -100, 100},
Frame -> True, Axes -> None, PlotRange -> {{0, 1}, {0, 1}},
Epilog -> Line[{{0, 0}, {1, 1}}]], {{\[Mu]1, 0}, 0, 10,
Appearance -> "Labeled"},
{{\[Sigma]1, 4}, 0.1, 20, Appearance -> "Labeled"},
{{\[Mu]2, 5}, 0, 10, Appearance -> "Labeled"},
{{\[Sigma]2, 4}, 0.1, 20, Appearance -> "Labeled"}]
(@Sjoerd C. de Vries 和@Hrishekesh Ganu 的回答是正确的。我想我仍然可以用另一种方式提出这些想法,这可能会对某些人有所帮助。)
如果您的模型指定错误,您可以获得这样的 ROC。考虑下面的示例(编码为R
),该示例改编自我在此处的回答:如何使用箱线图来找到值更有可能来自不同条件的点?
## data
Cond.1 = c(2.9, 3.0, 3.1, 3.1, 3.1, 3.3, 3.3, 3.4, 3.4, 3.4, 3.5, 3.5, 3.6, 3.7, 3.7,
3.8, 3.8, 3.8, 3.8, 3.9, 4.0, 4.0, 4.1, 4.1, 4.2, 4.4, 4.5, 4.5, 4.5, 4.6,
4.6, 4.6, 4.7, 4.8, 4.9, 4.9, 5.5, 5.5, 5.7)
Cond.2 = c(2.3, 2.4, 2.6, 3.1, 3.7, 3.7, 3.8, 4.0, 4.2, 4.8, 4.9, 5.5, 5.5, 5.5, 5.7,
5.8, 5.9, 5.9, 6.0, 6.0, 6.1, 6.1, 6.3, 6.5, 6.7, 6.8, 6.9, 7.1, 7.1, 7.1,
7.2, 7.2, 7.4, 7.5, 7.6, 7.6, 10, 10.1, 12.5)
dat = stack(list(cond1=Cond.1, cond2=Cond.2))
ord = order(dat$values)
dat = dat[ord,] # now the data are sorted
## logistic regression models
lr.model1 = glm(ind~values, dat, family="binomial") # w/o a squared term
lr.model2 = glm(ind~values+I(values^2), dat, family="binomial") # w/ a squared term
lr.preds1 = predict(lr.model1, data.frame(values=seq(2.3,12.5,by=.1)), type="response")
lr.preds2 = predict(lr.model2, data.frame(values=seq(2.3,12.5,by=.1)), type="response")
## here I plot the data & the 2 models
windows()
with(dat, plot(values, ifelse(ind=="cond2",1,0),
ylab="predicted probability of condition2"))
lines(seq(2.3,12.5,by=.1), lr.preds1, lwd=2, col="red")
lines(seq(2.3,12.5,by=.1), lr.preds2, lwd=2, col="blue")
legend("bottomright", legend=c("model 1", "model 2"), lwd=2, col=c("red", "blue"))
很容易看出红色模型缺少数据的结构。我们可以看到 ROC 曲线如下图所示:
library(ROCR) # we'll use this package to make the ROC curve
## these are necessary to make the ROC curves
pred1 = with(dat, prediction(fitted(lr.model1), ind))
pred2 = with(dat, prediction(fitted(lr.model2), ind))
perf1 = performance(pred1, "tpr", "fpr")
perf2 = performance(pred2, "tpr", "fpr")
## here I plot the ROC curves
windows()
plot(perf1, col="red", lwd=2)
plot(perf2, col="blue", lwd=2, add=T)
abline(0,1, col="gray")
legend("bottomright", legend=c("model 1", "model 2"), lwd=2, col=c("red", "blue"))
我们现在可以看到,对于错误指定的(红色)模型,当误报率大于,假阳性率比真阳性率增加得更快。查看上面的模型,我们看到该点是红线和蓝线在左下方交叉的位置。
在具有高 FPR 的曲线部分具有一串负实例可以创建这种曲线。只要您使用正确的算法来生成 ROC 曲线,就可以了。
如果你有一组 2m 点,其中一半是正数,一半是负数——对于你的模型来说,所有分数都完全相同是很棘手的。如果在根据分数(绘制 ROC 的标准程序)对点进行排序时,首先遇到所有负样本,这将导致您的 ROC 曲线保持平坦并向右移动。本文讨论如何处理此类问题: