калибровка оценок классификатора: изотоническая регрессия
Я исследую подход изотонической регрессии для калибровки оценок с помощью классификатора.
Если я правильно понял, делаем следующее. Во-первых, мы получаем калибровочный график (или кривую надежности), который представляет собой средние предсказанные значения по сравнению с долей положительных результатов. Затем мы хотим, чтобы «доля положительных результатов» была неубывающей функцией «средних предсказанных значений», что осуществляется с помощью изотонической регрессии.
Вот мое замешательство: почему в некоторых случаях «доля положительных результатов» не является неубывающей функцией? Например, здесь: калиброванный корпус - это не возрастающая функция. Сюжет взят из
https://www.svds.com/classifiers2/
Можно найти и другие примеры с той же проблемой. Я прочитал оригинал статьи
Б. Задрозный и К. Элькан. Преобразование оценок классификатора в точные оценки вероятности нескольких классов.
В их результатах откалиброванная функция монотонна.

Ответы
Вы можете получить подобные расхождения, когда модель, используемая для подгонки, не точно отражает истинную модель.
Например, когда вы подбираете данные, которые следуют квадратичной зависимости с линейной кривой, тогда вы увидите, что график остатков показывает некоторую тенденцию к изменению переоценки / занижения. Нечто подобное может произойти с графиком вероятностей (который является своего рода графиком остатков предсказанного и наблюдаемого графика).
Затем мы хотим, чтобы «доля положительных результатов» была неубывающей функцией «средних предсказанных значений», что осуществляется с помощью изотонической регрессии.
Это неправильное представление изотонической регрессии.
В вашем случае изотонической регрессии также нет гарантии, что остатки следуют монотонному тренду. Это подогнанное значение вероятности, которое представляет собой монотонную возрастающую / убывающую функцию (как функцию некоторого параметра-предиктора).
Данные и никакие остатки не должны монотонно увеличиваться / уменьшаться. Кроме того, наблюдаемая функция подогнанного не обязательно должна быть монотонной функцией.
Например, если у вас уменьшение $p$ ближе к концу монотонная регрессия может переоценить эти последние значения (потому что это вызовет меньшую ошибку для других значений), и вы получите уменьшение графика наблюдаемого по сравнению с прогнозируемым.
(или представьте, как монотонная регрессия будет соответствовать синусоиде)
Мы можем проиллюстрировать это поведение на ясном примере.
Скажем, у нас есть распределенные данные Бернулли, где логит вероятности является квадратичной функцией. И скажем, что мы подгоняем этот логит линейной функцией вместо квадратичной.
Вы можете себе представить, что линейная кривая будет варьироваться с переоценкой и недооценкой параметра вероятности.
Для примера из кода ниже
$$p_{true} = \text{logistic}(8+6x+x^2) = \frac{1}{1+e^{-8-6x-x^2}} $$
это будет выглядеть так, когда мы выберем 10 тысяч точек с $-4<x<4$:

Здесь вы видите изменяющуюся картину переоценки / недооценки, когда мы подгоняем квадратичную кривую к прямой.
Не похоже, что нам подходит прямая линия, потому что это логистическая функция, примененная к прямой линии. Итак, здесь мы строим логит вероятностей:

Мы также можем построить кривую зависимости прогнозируемого параметра от истинного параметра вероятности.

Приведенный выше график не такой, как ваш, это не разделенные данные, но он показывает, что кривая может быть неубывающей.
В случае с биннированными наблюдаемыми данными, которые являются стохастическими, вы можете получить дополнительные вариации / шум, которые могут привести к тому, что кривая не будет уменьшаться.
### 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)