ROC โค้งข้ามเส้นทแยงมุม


12

ฉันใช้ตัวจําแนกไบนารีในขณะนี้ เมื่อฉันพล็อตเส้นโค้ง ROC ฉันได้รับการยกที่ดีในตอนแรกมันเปลี่ยนทิศทางและข้ามเส้นทแยงมุมจากนั้นกลับขึ้นแน่นอนทำให้เส้นโค้งเป็นรูปตัว S เอียง

สิ่งที่สามารถตีความ / อธิบายถึงผลกระทบนี้?

ขอบคุณ


1
อะไรทำให้คุณสนใจโค้งของ ROC อะไรทำให้คุณเลือกลักษณนามแทนที่จะเป็นแบบจำลองความน่าจะเป็นโดยตรง
Frank Harrell

คำตอบ:


18

คุณจะได้พล็อต ROC แบบสมมาตรที่ดีก็ต่อเมื่อส่วนเบี่ยงเบนมาตรฐานสำหรับผลลัพธ์ทั้งสองเท่ากัน หากพวกเขาค่อนข้างแตกต่างจากนั้นคุณอาจได้รับผลลัพธ์ที่คุณอธิบาย

รหัส Mathematica ต่อไปนี้แสดงให้เห็นถึงสิ่งนี้ เราคิดว่าเป้าหมายให้การแจกแจงแบบปกติในพื้นที่ตอบสนองและเสียงดังกล่าวก็ให้การแจกแจงแบบปกติ แต่เป็นการแทนที่ พารามิเตอร์ ROC จะถูกกำหนดโดยพื้นที่ด้านล่างเส้นโค้ง Gaussian ไปทางซ้ายหรือขวาของเกณฑ์การตัดสินใจ การเปลี่ยนเกณฑ์นี้จะอธิบายเส้นโค้ง 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

เงื่อนไขที่คุณมีชุดของ 2m ครึ่งคะแนนซึ่งเป็นบวกและครึ่งหนึ่งเป็นลบ - ทั้งหมดที่มีคะแนนเดียวกันสำหรับแบบจำลองของคุณเป็นเรื่องยุ่งยาก หากในขณะที่เรียงลำดับคะแนนตามคะแนน (ขั้นตอนมาตรฐานในการวางแผน ROC) พบตัวอย่างเชิงลบทั้งหมดก่อนสิ่งนี้จะทำให้เส้นโค้ง ROC ของคุณคงที่และย้ายไปทางขวาบทความนี้พูดถึงวิธีการดูแลปัญหาดังกล่าว :

Fawcett | พล็อตเส้นโค้ง ROC


1

(คำตอบของ @Sjoerd C. de Vries และ @Hrishekesh Ganu นั้นถูกต้องฉันคิดว่าฉันยังสามารถเสนอความคิดในทางอื่นซึ่งอาจช่วยให้บางคน)


คุณสามารถรับ ROC แบบนั้นได้หากแบบจำลองของคุณถูกพลาด ลองพิจารณาตัวอย่างด้านล่าง (เขียนไว้ในR) ซึ่งดัดแปลงมาจากคำตอบของฉันที่นี่: วิธีใช้ boxplots เพื่อหาจุดที่ค่ามีแนวโน้มที่จะมาจากสภาพที่แตกต่างกันมากขึ้น?

## 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 curves มีลักษณะอย่างไรเมื่อวางแผนด้านล่าง

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

ป้อนคำอธิบายรูปภาพที่นี่

ขณะนี้เราสามารถเห็นได้ว่าสำหรับแบบจำลอง misspecified (สีแดง) เมื่ออัตราการบวกเป็นเท็จมากกว่าอัตราการบวกเท็จจะเพิ่มขึ้นเร็วกว่าอัตราการบวกที่แท้จริง เมื่อดูโมเดลด้านบนเราจะเห็นว่าจุดนั้นเป็นจุดที่เส้นสีแดงและสีน้ำเงินตัดกันที่ด้านล่างซ้าย 80%

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.