калибровка оценок классификатора: изотоническая регрессия

Aug 19 2020

Я исследую подход изотонической регрессии для калибровки оценок с помощью классификатора.

Если я правильно понял, делаем следующее. Во-первых, мы получаем калибровочный график (или кривую надежности), который представляет собой средние предсказанные значения по сравнению с долей положительных результатов. Затем мы хотим, чтобы «доля положительных результатов» была неубывающей функцией «средних предсказанных значений», что осуществляется с помощью изотонической регрессии.

Вот мое замешательство: почему в некоторых случаях «доля положительных результатов» не является неубывающей функцией? Например, здесь: калиброванный корпус - это не возрастающая функция. Сюжет взят из

https://www.svds.com/classifiers2/

Можно найти и другие примеры с той же проблемой. Я прочитал оригинал статьи

Б. Задрозный и К. Элькан. Преобразование оценок классификатора в точные оценки вероятности нескольких классов.

В их результатах откалиброванная функция монотонна.

Ответы

1 SextusEmpiricus Aug 21 2020 at 15:13

Вы можете получить подобные расхождения, когда модель, используемая для подгонки, не точно отражает истинную модель.

Например, когда вы подбираете данные, которые следуют квадратичной зависимости с линейной кривой, тогда вы увидите, что график остатков показывает некоторую тенденцию к изменению переоценки / занижения. Нечто подобное может произойти с графиком вероятностей (который является своего рода графиком остатков предсказанного и наблюдаемого графика).

Затем мы хотим, чтобы «доля положительных результатов» была неубывающей функцией «средних предсказанных значений», что осуществляется с помощью изотонической регрессии.

Это неправильное представление изотонической регрессии.

В вашем случае изотонической регрессии также нет гарантии, что остатки следуют монотонному тренду. Это подогнанное значение вероятности, которое представляет собой монотонную возрастающую / убывающую функцию (как функцию некоторого параметра-предиктора).

Данные и никакие остатки не должны монотонно увеличиваться / уменьшаться. Кроме того, наблюдаемая функция подогнанного не обязательно должна быть монотонной функцией.

Например, если у вас уменьшение $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)