Крива 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 залишатиметься рівною та рухається вправо. Цей документ розповідає про те, як подбати про такі проблеми :

Fawcett | Побудова кривих 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.