kalibrasi skor pengklasifikasi: regresi isotonik
Saya menyelidiki pendekatan regresi isotonik untuk mengkalibrasi skor dari pengklasifikasi.
Jika saya mengerti dengan benar, kami melakukan hal berikut. Pertama, kita mendapatkan plot kalibrasi (atau kurva reliabilitas), yang merupakan nilai prediksi rata-rata vs. pecahan positif. Kemudian, kami ingin "pecahan positif" menjadi fungsi non-penurunan dari "nilai prediksi rata-rata", yang dilakukan dengan regresi isotonik.
Inilah kebingungan saya: mengapa dalam beberapa kasus "fraksi positif" bukan fungsi yang tidak menurun? Misalnya, di sini: kasing yang dikalibrasi tidak meningkatkan fungsi. Plotnya diambil dari
https://www.svds.com/classifiers2/
Seseorang dapat menemukan contoh lain dengan masalah yang sama. Saya telah membaca koran aslinya
B. Zadrozny dan C. Elkan. Mengubah skor pengklasifikasi menjadi perkiraan probabilitas multikelas yang akurat.
Dalam hasil mereka, fungsi yang dikalibrasi bersifat monoton.

Jawaban
Anda mungkin mendapatkan ketidaksesuaian seperti ini jika model yang digunakan untuk pemasangan tidak menangkap model yang sebenarnya secara akurat.
Misalnya ketika Anda menyesuaikan data yang mengikuti hubungan kuadrat dengan kurva linier, maka Anda akan mendapatkan bahwa plot residual menunjukkan beberapa tren variasi over / underestimating. Hal serupa dapat terjadi dengan plot probabilitas (yang merupakan semacam plot sisa dari plot yang diprediksi versus plot yang diamati).
Kemudian, kami ingin "pecahan positif" menjadi fungsi non-penurunan dari "nilai prediksi rata-rata", yang dilakukan dengan regresi isotonik.
Ini bukan representasi yang benar dari regresi isotonik.
Dalam kasus Anda, regresi isotonik, sama-sama tidak ada jaminan bahwa residu mengikuti tren monotonik. Ini adalah nilai probabilitas yang dipasang yang merupakan fungsi kenaikan / penurunan monotonik (sebagai fungsi dari beberapa parameter prediktor).
Data dan tidak ada residu yang perlu dinaikkan / diturunkan secara monotonik. Juga diamati sebagai fungsi yang dipasang tidak perlu menjadi fungsi yang monoton.
Misalnya, jika Anda mengalami penurunan $p$ menjelang akhir, maka regresi monotonik mungkin melebih-lebihkan nilai terakhir tersebut (karena akan menyebabkan kesalahan yang lebih rendah untuk nilai lainnya), dan Anda akan mendapatkan penurunan dalam plot yang diamati versus yang diprediksi.
(atau bayangkan bagaimana regresi monotonik akan cocok dengan kurva sinus)
Kami dapat mengilustrasikan perilaku ini dengan contoh yang jelas.
Katakanlah kita memiliki data terdistribusi Bernoulli di mana logit probabilitasnya adalah fungsi kuadrat. Dan katakanlah kita menyesuaikan logit ini dengan fungsi linier, bukan fungsi kuadrat.
Anda dapat membayangkan bahwa kurva linier akan memberikan variasi overestimating dan meremehkan parameter probabilitas.
Misalnya dari kode di bawah ini
$$p_{true} = \text{logistic}(8+6x+x^2) = \frac{1}{1+e^{-8-6x-x^2}} $$
itu akan terlihat seperti ini ketika kita mengambil sampel 10k poin dengan $-4<x<4$:

Di sini Anda melihat berbagai pola over / under-estimasi ketika kita menyesuaikan kurva kuadrat dengan garis lurus.
Sepertinya kita tidak cocok dengan garis lurus karena ini adalah fungsi logistik yang diterapkan pada garis lurus. Jadi di sini kami memplot logit dari probabilitas:

Kami juga dapat memplot kurva dari parameter prediksi versus probabilitas sebenarnya.

Plot di atas tidak sama dengan milik Anda, ini bukan data yang dikelompokkan, tetapi menunjukkan bahwa kurva dapat menjadi nondecreasing.
Dalam kasus dengan data pengamatan binned, yaitu stokastik, Anda mungkin mendapatkan variasi / noise tambahan, yang dapat menyebabkan kurva menjadi tidak menurun.
### logistic function
flogistic <- function(x) {
1/(1+exp(-x))
}
### generate bernoulli distributed data
### the probability is modeled with a QUADRATIC funcion
set.seed(1)
x <- runif(10^3,-4,4)
p <- flogistic((x+4)*(x+2))
y <- rbinom(10^3,size = 1, prob=p)
### fit with LINEAR function
mod <- glm(y~x, family = binomial(link = "logit"))
mod
### plotting observations
xs <- seq(-4,4,0.001)
plot(x,y, pch = 21, col = rgb(0,0,0,0.2), bg = rgb(0,0,0,0.2), cex = 0.7, ylab = "p" )
### this is the true model
lines(xs,flogistic((xs+4)*(xs+2)))
### this is the fitted model
lines(xs,flogistic(mod$coefficients[1]+mod$coefficients[2]*xs), lty = 2)
legend(-4,0.9, c("data","true model", "fitted model"),
lty = c(NA,1,2), pch = c(21,NA,NA), col = 1, pt.bg=rgb(0,0,0,0.2))
### plotting logit
xs <- seq(-4,4,0.001)
plot(-100,-100, pch = 21, col = rgb(0,0,0,0.2), bg = rgb(0,0,0,0.2), cex = 0.7,
xlim = c(-4,4), ylim = c(-4,4), xlab = "x", ylab = "logit(p)")
### this is the true model
lines(xs,(xs+4)*(xs+2))
### this is the fitted model
lines(xs,(mod$coefficients[1]+mod$coefficients[2]*xs), lty = 2)
legend(-4,4, c("logit(p) true model", "logit(p) fitted model"),
lty = c(1,2), pch = c(NA,NA), col = 1, pt.bg=rgb(0,0,0,0.2))
###
plot(flogistic(mod$coefficients[1]+mod$coefficients[2]*xs),flogistic((xs+4)*(xs+2)),
type = "l", xlab = "predicted p", ylab = "true p",
xlim = c(0,1),ylim=c(0,1))
lines(c(0,1),c(0,1), lty = 2)