Kurva ROC melintasi diagonal

12

Saya menjalankan classifier biner saat ini. Ketika saya memplot kurva ROC saya mendapatkan tumpangan yang baik di awal kemudian ia mengubah arah dan melintasi diagonal kemudian tentu saja kembali, membuat kurva bentuk S seperti miring.

Apa yang bisa menjadi interpretasi / penjelasan untuk efek ini?

Terima kasih

Cagdas Ozgenc
sumber
1
Apa yang membuat Anda peduli tentang kurva ROC? Apa yang membuat Anda memilih classifier daripada model probabilitas langsung?
Frank Harrell

Jawaban:

18

Anda mendapatkan plot ROC simetris yang bagus hanya ketika standar deviasi untuk kedua hasil adalah sama. Jika mereka agak berbeda maka Anda mungkin mendapatkan hasil yang Anda jelaskan.

Kode Mathematica berikut menunjukkan ini. Kami berasumsi bahwa target menghasilkan distribusi normal di ruang respons, dan noise itu juga menghasilkan distribusi normal, tetapi yang dipindahkan. Parameter ROC ditentukan oleh area di bawah kurva Gaussian di sebelah kiri atau kanan kriteria keputusan. Memvariasikan kriteria ini menggambarkan kurva 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"}]

Ini dengan standar deviasi yang sama: masukkan deskripsi gambar di sini

Ini dengan yang agak berbeda:

masukkan deskripsi gambar di sini

atau dengan beberapa parameter untuk dimainkan:

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"}]

masukkan deskripsi gambar di sini

Sjoerd C. de Vries
sumber
1

Memiliki serangkaian instance negatif di bagian kurva dengan FPR tinggi dapat membuat kurva semacam ini. Ini ok selama Anda menggunakan algoritma yang tepat untuk menghasilkan kurva ROC.

Kondisi di mana Anda memiliki satu set 2m poin setengah dari yang positif dan setengah negatif-semua memiliki skor yang persis sama untuk model Anda rumit. Jika saat menyortir poin berdasarkan skor (prosedur standar dalam memplot ROC) semua contoh negatif ditemui terlebih dahulu, ini akan menyebabkan kurva ROC Anda tetap datar dan bergerak ke kanan. Makalah ini membahas tentang cara menangani masalah tersebut :

Fawcett | Merencanakan kurva ROC

wabbit
sumber
1

(Jawaban oleh @Sjoerd C. de Vries dan @Hrishekesh Ganu benar. Saya pikir saya masih bisa menyajikan ide-ide dengan cara lain, yang dapat membantu beberapa orang.)


Anda bisa mendapatkan ROC seperti itu jika model Anda tidak ditentukan secara spesifik. Pertimbangkan contoh di bawah ini (diberi kode dalam R), yang diadaptasi dari jawaban saya di sini: Bagaimana cara menggunakan boxplots untuk menemukan titik di mana nilai lebih cenderung berasal dari kondisi yang berbeda?

## 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"))

masukkan deskripsi gambar di sini

Sangat mudah untuk melihat bahwa model merah tidak memiliki struktur data. Kita bisa melihat seperti apa kurva ROC ketika diplot di bawah ini:

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"))

masukkan deskripsi gambar di sini

Kita sekarang dapat melihat bahwa, untuk model yang salah ditentukan (merah), ketika tingkat positif palsu menjadi lebih besar dari , tingkat positif palsu meningkat lebih cepat daripada tingkat positif sejati. Melihat model-model di atas, kita melihat bahwa titik itu adalah di mana garis merah dan biru bersilangan di kiri bawah. 80%

gung - Pasang kembali Monica
sumber