Diyagonal geçiş ROC eğrisi


12

Şu anda bir ikili sınıflandırıcı çalıştırıyorum. ROC eğrisini çizdiğimde, başlangıçta iyi bir kaldırma elde ederim, sonra yönü değiştirir ve diyagonalden sonra elbette yukarı doğru çaprazlanır ve eğriyi eğimli bir S şekline dönüştürür.

Bu etki için bir yorum / açıklama ne olabilir?

Teşekkürler


1
Sizi bir ROC eğrisine önem veren nedir? Doğrudan olasılık modeli yerine sınıflandırıcı seçmenizi sağlayan şey nedir?
Frank Harrell

Yanıtlar:


18

Sadece her iki sonuç için standart sapmalar aynı olduğunda güzel bir simetrik ROC grafiği elde edersiniz. Eğer oldukça farklılarsa, tam olarak tarif ettiğiniz sonucu elde edebilirsiniz.

Aşağıdaki Mathematica kodu bunu göstermektedir. Bir hedefin tepki alanında normal bir dağılım sağladığını ve gürültünün de normal bir dağılım, ancak yer değiştirmiş bir dağılım verdiğini varsayıyoruz. ROC parametreleri, bir karar ölçütünün solunda veya sağında Gauss eğrilerinin altındaki alan tarafından belirlenir. Bu kriterin değiştirilmesi ROC eğrisini açıklar.

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

Bu eşit standart sapmalarla: resim açıklamasını buraya girin

Bu oldukça farklı olanlarla:

resim açıklamasını buraya girin

ya da oynamak için birkaç parametre ile:

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

resim açıklamasını buraya girin


1

Yüksek FPR'ye sahip eğrinin bir kısmında negatif örneklerin dizisi olması, bu tür bir eğri oluşturabilir. ROC eğrisini oluşturmak için doğru algoritmayı kullandığınız sürece bu sorun olmaz.

Yarısı pozitif ve yarısı negatif olan 2m puan kümeniz olması koşulu, modeliniz için tamamen aynı puana sahip olmak zor. Puanları puana göre sıralarken (ROC çiziminde standart prosedür) önce tüm olumsuz örneklerle karşılaşılırsa, bu ROC eğrisinizin düz kalmasına ve sağa hareket etmesine neden olur. :

Fawcett | ROC eğrilerini çizme


1

(@Sjoerd C. de Vries ve @Hrishekesh Ganu'nun cevapları doğrudur. Yine de bazı insanlara yardımcı olabilecek fikirleri başka bir şekilde sunabileceğimi düşündüm.)


Modeliniz yanlış tanımlanmışsa böyle bir ROC alabilirsiniz. Aşağıdaki cevabımdanR uyarlanan aşağıdaki örneği (kodlanmış ) ele alalım : Değerlerin farklı koşullardan gelme olasılığının daha yüksek olduğu noktayı bulmak için kutu grafikleri nasıl kullanılı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"))

resim açıklamasını buraya girin

Kırmızı modelin verilerin yapısında eksik olduğunu görmek kolaydır. Aşağıda çizildiğinde ROC eğrilerinin nasıl göründüğünü görebiliriz:

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

resim açıklamasını buraya girin

Şimdi, yanlış tanımlanmış (kırmızı) model için yanlış pozitif oran den daha büyük olduğunda , yanlış pozitif oranın gerçek pozitif orandan daha hızlı arttığını görebiliriz. Yukarıdaki modellere baktığımızda, bu noktanın kırmızı ve mavi çizgilerin sol altta kesiştiği nokta olduğunu görüyoruz. 80%

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.