Đường cong ROC qua đường chéo


12

Tôi đang chạy một phân loại nhị phân tại thời điểm này. Khi tôi vẽ đường cong ROC, tôi nhận được một lực nâng tốt ngay từ đầu, sau đó nó thay đổi hướng và vượt qua đường chéo sau đó tất nhiên là sao lưu, làm cho đường cong có hình dạng S nghiêng.

Điều gì có thể là một giải thích / giải thích cho hiệu ứng này?

Cảm ơn


1
Điều gì khiến bạn quan tâm đến một đường cong ROC? Điều gì khiến bạn chọn một bộ phân loại thay vì mô hình xác suất trực tiếp?
Frank Mitchell

Câu trả lời:


18

Bạn nhận được một biểu đồ ROC đối xứng đẹp chỉ khi độ lệch chuẩn cho cả hai kết quả là như nhau. Nếu chúng khá khác nhau thì bạn có thể nhận được chính xác kết quả mà bạn mô tả.

Các mã Mathicala sau đây chứng minh điều này. Chúng tôi giả định rằng một mục tiêu mang lại phân phối bình thường trong không gian đáp ứng và tiếng ồn đó cũng mang lại phân phối bình thường, nhưng phân phối thay thế. Các tham số ROC được xác định bởi khu vực bên dưới các đường cong Gaussian ở bên trái hoặc bên phải của một tiêu chí quyết định. Thay đổi tiêu chí này mô tả đường cong 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"}]

Đây là với độ lệch chuẩn bằng nhau: nhập mô tả hình ảnh ở đây

Đây là với những người khá khác biệt:

nhập mô tả hình ảnh ở đây

hoặc có thêm một vài thông số để chơi với:

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

nhập mô tả hình ảnh ở đây


1

Có một chuỗi các trường hợp tiêu cực trong một phần của đường cong có FPR cao có thể tạo ra loại đường cong này. Điều này là ổn miễn là bạn đang sử dụng đúng thuật toán để tạo đường cong ROC.

Điều kiện mà bạn có một tập hợp 2m điểm một nửa trong số đó là dương và một nửa là âm - tất cả đều có cùng số điểm cho mô hình của bạn là khó khăn. Nếu trong khi sắp xếp các điểm dựa trên điểm số (quy trình chuẩn trong vẽ sơ đồ ROC), tất cả các ví dụ tiêu cực đều gặp phải trước tiên, thì điều này sẽ khiến đường cong ROC của bạn đứng thẳng và di chuyển sang phải. Bài viết này nói về cách xử lý các vấn đề đó :

Fawcett | Vẽ đường cong ROC


1

(Câu trả lời của @Sjoerd C. de Vries và @Hrishekesh Ganu là chính xác. Tôi nghĩ dù sao tôi cũng có thể trình bày ý tưởng theo cách khác, có thể giúp một số người.)


Bạn có thể nhận được một ROC như thế nếu mô hình của bạn bị sai. Hãy xem xét ví dụ dưới đây (được mã hóa R), được điều chỉnh từ câu trả lời của tôi ở đây: Làm thế nào để sử dụng các ô vuông để tìm điểm mà các giá trị có nhiều khả năng đến từ các điều kiện khác nhau?

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

nhập mô tả hình ảnh ở đây

Thật dễ dàng để thấy rằng mô hình màu đỏ đang thiếu cấu trúc của dữ liệu. Chúng ta có thể thấy các đường cong ROC trông như thế nào khi được vẽ dưới đây:

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

nhập mô tả hình ảnh ở đây

Bây giờ chúng ta có thể thấy rằng, đối với mô hình sai (màu đỏ), khi tỷ lệ dương tính giả trở nên lớn hơn 80%, tỷ lệ dương tính giả tăng nhanh hơn tỷ lệ dương thực sự. Nhìn vào các mô hình trên, chúng ta thấy rằng điểm đó là nơi các đường màu đỏ và màu xanh giao nhau ở phía dưới bên trái.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.