ROC кривая пересекает диагональ


12

Я запускаю двоичный классификатор в данный момент. Когда я строю кривую ROC, вначале я получаю хороший подъем, затем он меняет направление и пересекает диагональ, затем, конечно, обратно, делая кривую наклонной S-образной формы.

Что может быть интерпретацией / объяснением этого эффекта?

Благодарность


1
Что заставило вас заботиться о кривой ROC? Что заставило вас выбрать классификатор вместо модели прямой вероятности?
Фрэнк Харрелл

Ответы:


18

Вы получите хороший симметричный график 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"}]

введите описание изображения здесь


1

Наличие строки отрицательных экземпляров в части кривой с высоким FPR может создать этот вид кривой. Это нормально, если вы используете правильный алгоритм для создания кривой ROC.

Условие, при котором у вас есть набор из 2 млн. Баллов, половина из которых положительная, а половина отрицательная, все с одинаковым баллом для вашей модели, сложно. Если при сортировке точек на основе оценки (стандартная процедура построения ROC) все отрицательные примеры встречаются первыми, это приведет к тому, что кривая ROC останется ровной и переместится вправо. В этой статье рассказывается о том, как позаботиться о таких проблемах. :

Фосетт | Построение кривых ROC


1

(Ответы @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"))

введите описание изображения здесь

80%

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.