Bir model için öngörülen olasılık kalibrasyonunun görselleştirilmesi


23

Her sınıf için her sınıf için bir olasılık üreten öngörücü bir modelim olduğunu varsayalım. Şimdi, sınıflandırma için bu olasılıkları kullanmak istersem böyle bir modeli değerlendirmenin pek çok yolu olduğunu kabul ediyorum (hassasiyet, hatırlama, vb.). Ayrıca, bir ROC eğrisinin ve altındaki alanın, modelin sınıflar arasında ne kadar iyi farklılaştığını belirlemek için kullanılabileceğini de biliyorum. Bunlar benim istediğim şey değil.

Modelin kalibrasyonunu değerlendirmekle ilgileniyorum . Bildiğim bir o puanlama kuralı gibi Brier puanı bu görev için yararlı olabilir. Sorun değil ve büyük olasılıkla bu satırlar boyunca bir şeyler ekleyeceğim, ancak bu tür ölçümlerin uzman olmayan kişi için ne kadar sezgisel olacağından emin değilim. Daha görsel bir şey arıyorum. Sonuçları yorumlayan kişinin, modelin bir şeyi öngördüğü zaman, gerçekte zamanın ~% 70'ine, vb.

QQ grafiklerini duydum (ama hiç kullanmadım) ve ilk önce aradığım şeyin bu olduğunu düşündüm. Bununla birlikte, iki olasılık dağılımını karşılaştırmak için gerçekten bir araç olduğu anlaşılıyor . Doğrudan sahip olduğum şey bu değil. Bir kaç örnek için tahmin edilen olasılığım ve olayın gerçekten gerçekleşip gerçekleşmediğine sahibim:

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

Peki QQ grafiği gerçekten istediğim şey mi, yoksa başka bir şey mi arıyorum? QQ grafiği, kullanmam gereken şeyse, verilerimi olasılık dağılımına dönüştürmenin doğru yolu nedir?

Her iki sütunu da tahmin edilen olasılıklara göre sıralayabileceğimi ve sonra da bazı kutular oluşturabileceğimi hayal ediyorum. Yapmam gereken şey bu mu, yoksa başka bir yerde mi düşünüyorum? Çeşitli ayrıklaştırma tekniklerine aşinayım, ancak bu tür şeyler için standart olan depolara ayrılmanın özel bir yolu var mı?

Yanıtlar:


19

Düşünceniz iyi.

John Tukey, yarıya kadar binmeyi tavsiye etti: verileri üst ve alt yarılara ayırın, sonra bu yarıları bölün, ardından aşırı yarıları tekrar tekrar bölün. Eşit genişlikte gölgelemeye kıyasla, bu, verilerin çoğuna (ortada) çok fazla grafik eleman ayırmadan kuyruk davranışının görsel olarak denetlenmesini sağlar.

İşte Tukey'in yaklaşımının bir örneği (R kullanarak). (Tamamen aynı değil: mletterbiraz farklı uyguladı .)

İlk olarak, bu tahminlere uyan bazı tahminler ve bazı sonuçlar yaratalım:

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
}

Bunu kullanarak, tahminleri ve sonuçları ortaya çıkarırız ve her bir kutudaki her birini ortalamaya çeviririz. Yol boyunca, bin popülasyonlarını hesaplıyoruz:

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

Grafiği etkili bir şekilde sembolize etmek için sembol alanlarını çöp kutusu sayımlarıyla orantılı hale getirmeliyiz . Bu nedenle, sembol renklerini de biraz değiştirmek yararlı olabilir:

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

Bunları elimizde kullanarak, şimdi önceki arsayı geliştiriyoruz:

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

şekil

Zayıf bir tahmin örneği olarak, verileri değiştirelim:

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

Analizin tekrarlanması, sapmaların açık olduğu bu arsa üretir:

şekil 2

Bu model aşırı kapsamlı olma eğilimindedir (% 50 ila% 90 aralığında tahminler için ortalama sonuç çok düşük). Tahminin düşük olduğu birkaç durumda (% 30'dan az), model çok karamsardır.


(+1) Çok hoş, teşekkürler. Renklerin amaçtan biraz rahatsız edici olabileceğini düşünüyorum, ama gerisi güzel bir fikir ve çok güzel bir açıklamaydı.
Michael McGowan

Michael, bulundu , bazı renk ya sonunda görünen çok küçük daireler görmek yardımcı olmak için gerekliydi. Elbette sabit bir renk bunu başarabilirdi. Sadece col=colorsistediğiniz gibi rengini değiştirin col="Red".
whuber

+1, bu çok hoş. Bununla birlikte, referans çizgisinin neden uygun lojistik regresyon çizgisi yerine basit bir düz 45 derecelik bir çizgi veya bir görevsizlik olduğunu düşünmüyorum? Bunların tahminlerin kalitesini değerlendirmek için daha uygun referanslar olacağını düşünmeliyim.
dediklerinin - Eski Monica

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

@gung (Take 2) Aklınızda olabileceğini düşündüğüm şey, artıklarda beklenen farklılıkları hesaba katacak görselleştirmeyi geliştirmek. Bu varyasyon ile orantılı olmalıdırp(1-p)/npn

4

Başka bir seçenek izotonik regresyondur. Kutuların yarıya bölünmek yerine dinamik olarak üretilmesi dışında çıktıların kesin olarak artması şartıyla whuber'in cevabına benzer.

İzotonik regresyonun bu birincil kullanımı, kötü kalibre edildikleri gösteriliyorsa, olasılıklarınızı yeniden kalibre etmektir, ancak görselleştirme için de kullanılabilir. Temel olarak, izotonik regresyon çizgisi kabaca Y = X çizgisini takip ederse, olasılıklarınız doğru şekilde kalibre edilir.

Olasılıklarda İzotonik Regresyon

Whuber tarafından gösterilen soruna uygulanan İzotonik Regresyon.

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


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.