Hình dung hiệu chuẩn xác suất dự đoán của một mô hình


23

Giả sử tôi có một mô hình dự đoán tạo ra, cho mỗi trường hợp, một xác suất cho mỗi lớp. Bây giờ tôi nhận ra rằng có nhiều cách để đánh giá một mô hình như vậy nếu tôi muốn sử dụng các xác suất đó để phân loại (độ chính xác, thu hồi, v.v.). Tôi cũng nhận ra rằng một đường cong ROC và khu vực bên dưới nó có thể được sử dụng để xác định mô hình phân biệt tốt như thế nào giữa các lớp. Đó không phải là những gì tôi đang hỏi về.

Tôi quan tâm đến việc đánh giá hiệu chuẩn của mô hình. Tôi biết rằng một quy tắc tính điểm như điểm Brier có thể hữu ích cho nhiệm vụ này. Điều đó ổn, và tôi có thể sẽ kết hợp một cái gì đó dọc theo những dòng đó, nhưng tôi không chắc những số liệu như vậy sẽ trực quan như thế nào đối với người giáo dân. Tôi đang tìm kiếm một cái gì đó trực quan hơn. Tôi muốn người phiên dịch kết quả có thể biết liệu mô hình dự đoán điều gì đó có khả năng xảy ra 70% hay không mà nó thực sự xảy ra ~ 70% thời gian, v.v.

Tôi nghe nói về (nhưng không bao giờ sử dụng) các lô QQ , và lúc đầu tôi nghĩ đây là thứ tôi đang tìm kiếm. Tuy nhiên, dường như điều đó thực sự có ý nghĩa để so sánh hai phân phối xác suất . Đó không phải là những gì tôi có. Tôi có, trong một loạt các trường hợp, xác suất dự đoán của tôi và sau đó liệu sự kiện có thực sự xảy ra hay không:

Index    P(Heads)    Actual Result
    1          .4            Heads
    2          .3            Tails
    3          .7            Heads
    4         .65            Tails
  ...         ...              ...

Vì vậy, một cốt truyện QQ thực sự là những gì tôi muốn, hoặc tôi đang tìm kiếm một cái gì đó khác? Nếu một âm mưu QQ là những gì tôi nên sử dụng, cách chính xác để chuyển đổi dữ liệu của tôi thành phân phối xác suất là gì?

Tôi tưởng tượng tôi có thể sắp xếp cả hai cột theo xác suất dự đoán và sau đó tạo ra một số thùng. Đó có phải là loại việc tôi nên làm, hay tôi đang suy nghĩ ở đâu đó? Tôi quen thuộc với các kỹ thuật phân biệt khác nhau, nhưng có cách nào cụ thể để phân loại thành các thùng là tiêu chuẩn cho loại điều này không?

Câu trả lời:


19

Suy nghĩ của bạn là tốt.

John Tukey khuyến nghị nên chia theo hai nửa: chia dữ liệu thành hai nửa trên và dưới, sau đó chia hai nửa đó, sau đó chia đôi một nửa theo cách đệ quy. So với việc tạo độ rộng bằng nhau, điều này cho phép kiểm tra trực quan hành vi đuôi mà không dành quá nhiều yếu tố đồ họa cho phần lớn dữ liệu (ở giữa).

Đây là một ví dụ (sử dụng R) phương pháp của Tukey. (Nó không hoàn toàn giống nhau: anh ấy thực hiện mlettermột chút khác biệt.)

Trước tiên, hãy tạo một số dự đoán và một số kết quả phù hợp với các dự đoán đó:

set.seed(17)
prediction <- rbeta(500, 3/2, 5/2)
actual <- rbinom(length(prediction), 1, prediction)
plot(prediction, actual, col="Gray", cex=0.8)

Cốt truyện không có nhiều thông tin, vì tất nhiên tất cả các actualgiá trị là (không xảy ra) hoặc (đã xảy ra). (Nó xuất hiện dưới dạng nền của các vòng tròn mở màu xám trong hình đầu tiên bên dưới.) Cốt truyện này cần được làm mịn. Để làm như vậy, chúng tôi bin dữ liệu. Chức năng thực hiện chia tách một nửa. Đối số đầu tiên của nó là một mảng các cấp bậc giữa 1 và (đối số thứ hai). Nó trả về các định danh (số) duy nhất cho mỗi thùng:101mletterrn

mletter <- function(r,n) {
    lower <-  2 + floor(log(r/(n+1))/log(2))
    upper <- -1 - floor(log((n+1-r)/(n+1))/log(2))
    i <- 2*r > n
    lower[i] <- upper[i]
    lower
}

Sử dụng điều này, chúng tôi bin cả dự đoán và kết quả và trung bình mỗi dự án trong mỗi thùng. Trên đường đi, chúng tôi tính toán các quần thể bin:

classes <- mletter(rank(prediction), length(prediction))
pgroups <- split(prediction, classes)
agroups <- split(actual, classes)
bincounts <- unlist(lapply(pgroups, length)) # Bin populations
x <- unlist(lapply(pgroups, mean))           # Mean predicted values by bin
y <- unlist(lapply(agroups, mean))           # Mean outcome by bin

Để tượng trưng cho cốt truyện một cách hiệu quả, chúng ta nên làm cho các khu vực biểu tượng tỷ lệ thuận với số lượng thùng. Cũng có thể hữu ích để thay đổi màu sắc biểu tượng một chút, từ đâu:

binprop <- bincounts / max(bincounts)
colors <- -log(binprop)/log(2)
colors <- colors - min(colors)
colors <- hsv(colors / (max(colors)+1))

Với những thứ này trong tay, giờ đây chúng tôi nâng cao cốt truyện trước:

abline(0,1, lty=1, col="Gray")                           # Reference curve
points(x,y, pch=19, cex = 3 * sqrt(binprop), col=colors) # Solid colored circles
points(x,y, pch=1, cex = 3 * sqrt(binprop))              # Circle outlines

Nhân vật

Để làm ví dụ cho dự đoán kém, hãy thay đổi dữ liệu:

set.seed(17)
prediction <- rbeta(500, 5/2, 1)
actual <- rbinom(length(prediction), 1, 1/2 + 4*(prediction-1/2)^3)

Lặp lại phân tích tạo ra âm mưu này trong đó các sai lệch là rõ ràng:

Hình 2

Mô hình này có xu hướng quá mức (kết quả trung bình cho các dự đoán trong phạm vi 50% đến 90% là quá thấp). Trong một số ít trường hợp dự đoán thấp (dưới 30%), mô hình quá bi quan.


(+1) Rất đẹp, cảm ơn. Tôi nghĩ rằng màu sắc có thể làm mất tập trung một chút khỏi mục đích, nhưng phần còn lại là một ý tưởng hay và giải thích rất hay.
Michael McGowan

Michael, tôi thấy rằng một số màu là cần thiết để giúp nhìn thấy các vòng tròn rất nhỏ xuất hiện ở hai đầu. Một màu không đổi sẽ làm điều này, tất nhiên. Chỉ cần thay thế col=colorsbằng màu bạn muốn, chẳng hạn như col="Red".
whuber

+1, điều này rất hay. Tuy nhiên, tôi không hoàn toàn hiểu tại sao dòng tham chiếu là một dòng 45 độ đơn giản, thay vì dòng hồi quy logistic thích hợp, hay một hoàng thổ? Tôi nên nghĩ rằng đó sẽ là những tài liệu tham khảo phù hợp hơn để đánh giá chất lượng của các dự đoán.
gung - Phục hồi Monica

pp±[0,1]×[0,1]
whuber

p(1-p)/npn

4

Một lựa chọn khác là hồi quy đẳng hướng. Nó tương tự như câu trả lời của người đánh máy ngoại trừ các thùng được tạo ra một cách linh hoạt thay vì chia làm hai nửa, với yêu cầu là đầu ra đang tăng nghiêm ngặt.

Cách sử dụng chính này của hồi quy đồng vị là để hiệu chỉnh lại xác suất của bạn nếu chúng được chứng minh là hiệu chuẩn kém, nhưng nó cũng có thể được sử dụng để trực quan hóa. Về cơ bản, nếu đường hồi quy đẳng hướng gần như theo đường Y = X, thì xác suất của bạn được hiệu chỉnh đúng.

Hồi quy đẳng hướng về xác suất

Đây là hồi quy đẳng hướng được áp dụng cho vấn đề được hiển thị bởi Whuber.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.isotonic import IsotonicRegression

prediction = np.random.beta(3.0/2.0, 5.0/2.0, size=500)
actual = np.random.binomial(1,prediction, len(prediction))
plt.scatter(prediction, actual,  facecolors='none', edgecolors=[0.3,0.3,0.3], label='Data')

ir = IsotonicRegression()
isotonic = ir.fit_transform(prediction, actual)
plt.plot(prediction, isotonic,'ok', label='Isotonic Fit')

plt.xlabel('Prediction')
plt.ylabel('Actual')
plt.plot([0,1],[0,1], '--k', label='y=x line')
plt.legend(loc = 'center left')

http://fa.bianp.net/blog/2013/isotonic-regression/

http://stat.wikia.com/wiki/Isotonic_regression


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.