Visualisasi kalibrasi probabilitas prediksi model

23

Misalkan saya memiliki model prediktif yang menghasilkan, untuk setiap contoh, probabilitas untuk setiap kelas. Sekarang saya menyadari bahwa ada banyak cara untuk mengevaluasi model seperti itu jika saya ingin menggunakan probabilitas tersebut untuk klasifikasi (presisi, penarikan, dll.). Saya juga mengakui bahwa kurva ROC dan area di bawahnya dapat digunakan untuk menentukan seberapa baik model membedakan antara kelas. Bukan itu yang saya tanyakan.

Saya tertarik menilai kalibrasi model. Saya tahu bahwa aturan penilaian seperti skor Brier dapat berguna untuk tugas ini. Tidak apa-apa, dan saya mungkin akan memasukkan sesuatu di sepanjang garis itu, tapi saya tidak yakin seberapa intuitif metrik tersebut bagi orang awam. Saya mencari sesuatu yang lebih visual. Saya ingin orang yang menginterpretasikan hasil untuk dapat melihat apakah atau tidak ketika model memprediksi sesuatu adalah 70% kemungkinan terjadi itu benar-benar terjadi ~ 70% dari waktu, dll.

Saya mendengar tentang (tetapi tidak pernah menggunakan) plot QQ , dan pada awalnya saya pikir ini adalah apa yang saya cari. Namun, tampaknya itu benar-benar dimaksudkan untuk membandingkan dua distribusi probabilitas . Itu tidak secara langsung apa yang saya miliki. Saya memiliki, untuk beberapa contoh, probabilitas yang saya prediksi dan kemudian apakah peristiwa itu benar-benar terjadi:

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

Jadi apakah plot QQ benar-benar yang saya inginkan, atau saya mencari yang lain? Jika plot QQ adalah apa yang harus saya gunakan, apa cara yang benar untuk mengubah data saya menjadi distribusi probabilitas?

Saya membayangkan saya bisa mengurutkan kedua kolom dengan probabilitas yang diprediksi dan kemudian membuat beberapa sampah. Apakah itu jenis hal yang harus saya lakukan, atau apakah saya berpikir di suatu tempat? Saya akrab dengan berbagai teknik diskritisasi, tetapi adakah cara khusus untuk mendiskritisasi menjadi nampan yang merupakan standar untuk hal semacam ini?

Michael McGowan
sumber

Jawaban:

19

Pemikiranmu bagus.

John Tukey merekomendasikan binning dengan membagi dua: membagi data menjadi bagian atas dan bawah, kemudian membagi bagian itu, kemudian membagi bagian ekstrim secara rekursif. Dibandingkan dengan binning dengan lebar yang sama, ini memungkinkan inspeksi visual terhadap perilaku ekor tanpa mencurahkan terlalu banyak elemen grafis ke sebagian besar data (di tengah).

Berikut adalah contoh (menggunakan R) pendekatan Tukey. (Ini tidak persis sama: ia menerapkan mlettersedikit berbeda.)

Pertama, mari kita buat beberapa prediksi dan beberapa hasil yang sesuai dengan prediksi tersebut:

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

actual01mletterrn

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
}

Dengan menggunakan ini, kami menampar prediksi dan hasil serta rata-rata masing-masing dalam setiap bin. Sepanjang jalan, kami menghitung populasi 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

Untuk menyimbolkan plot secara efektif, kita harus membuat area simbol sebanding dengan jumlah bin. Akan sangat membantu untuk sedikit memvariasikan warna simbol, dari mana:

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

Dengan ini, kami sekarang meningkatkan plot sebelumnya:

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

Angka

Sebagai contoh prediksi yang buruk, mari kita ubah data:

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

Pengulangan analisis menghasilkan plot ini di mana penyimpangannya jelas:

Gambar 2

Model ini cenderung terlalu optimistis (hasil rata-rata untuk prediksi dalam kisaran 50% hingga 90% terlalu rendah). Dalam beberapa kasus di mana prediksi rendah (kurang dari 30%), modelnya terlalu pesimistis.

whuber
sumber
(+1) Sangat bagus, terima kasih. Saya pikir warnanya mungkin sedikit mengalihkan perhatian dari tujuannya, tetapi sisanya adalah ide yang bagus dan penjelasan yang sangat bagus.
Michael McGowan
Michael, saya menemukan bahwa beberapa warna diperlukan untuk membantu melihat lingkaran yang sangat kecil yang muncul di kedua ujungnya. Warna yang konstan akan mencapai ini, tentu saja. Cukup ganti col=colorsdengan warna yang Anda inginkan, seperti col="Red".
whuber
+1, ini sangat bagus. Namun, saya tidak cukup intuitif mengapa garis referensi garis 45 derajat sederhana, lurus, bukan garis regresi logistik yang tepat, atau loess? Saya harus berpikir itu akan menjadi referensi yang lebih tepat untuk menilai kualitas prediksi.
gung - Reinstate Monica
pp±[0,1]×[0,1]
whuber
p(1p)/npn
4

Pilihan lain adalah regresi isotonik. Ini mirip dengan jawaban whuber kecuali tempat sampah dihasilkan secara dinamis, bukan dengan membagi dua, dengan persyaratan bahwa output meningkat secara ketat.

Penggunaan utama regresi isotonik ini adalah untuk mengkalibrasi ulang probabilitas Anda jika mereka terbukti memiliki kalibrasi yang buruk, tetapi juga dapat digunakan untuk visualisasi. Pada dasarnya, jika garis regresi isotonik secara kasar mengikuti garis Y = X, maka probabilitas Anda dikalibrasi dengan benar.

Regresi isotonik pada probabilitas

Ini adalah Regresi Isotonik yang diterapkan pada masalah yang ditunjukkan oleh 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-regress/

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

Bscan
sumber