Можно ли форсировать логистическую регрессию или другой классификатор по определенной вероятности?

У меня есть набор данных с двоичной переменной [Да / Нет] и непрерывной переменной (X). Я пытаюсь сделать модель для классификации [Да / Нет] X.

Из моего набора данных, когда Х = 0,5, 48% наблюдений да. Тем не менее, я знаю, что истинная вероятность Да должна составлять 50%, когда Х = 0,5. Когда я создаю модель с использованием логистической регрессии X = 0,5!= P[Да = 0,5].

Как я могу это исправить? Я предполагаю, что все вероятности должны быть немного недооценены, если это не соответствует истинной точке.

Правильно ли просто добавить несколько наблюдений в мою выборку, чтобы скорректировать пропорцию?

Не должно быть просто логистической регрессии, LDA, QDA и т. Д. Также представляют интерес.

Я искал переполнение стека, но нашел только темы, касающиеся линейной регрессии.

2 ответа

Решение

Я считаю, что в R (при условии, что вы используете glm из базы R) вам просто нужно

glm(y~I(x-0.5)-1,data=your_data,family=binomial)

I(x-0.5) повторяет ковариату в 0,5, -1 подавляет перехват (intercept = 0 при x=0.5 -> вероятность = 0,5 при x=0.5).

Например:

set.seed(101)
dd <- data.frame(x=runif(100,0.5,1),y=rbinom(100,size=1,prob=0.7))
m1 <- glm(y~I(x-0.5)-1,data=dd,family=binomial)
predict(m1,type="response",newdata=data.frame(x=0.5)) ## 0.5

ОП написал:

Как я могу это исправить? Я предполагаю, что все вероятности должны быть немного недооценены, если это не соответствует истинной точке.

Это неправда. Вполне возможно недооценить некоторые значения (например, перехват) и переоценить другие.

Пример, следующий за вашей ситуацией:

Истинные вероятности:

set.seed(444)

true_prob <- function(x) {

  # logit probabilities
  lp <- (x - 0.5)

  # true probabilities
  p <- 1 / (1 + exp(-lp))
  p

}

true_prob(x = 0.5)
[1] 0.5

Но если вы имитируете данные и подгоняете модель, перехват может быть недооценен, а другие значения переоценены:

n <- 100
# simulated predictor
x <- runif(n, 0, 1)
probs <- true_prob(x)

# simulated binary response
y <- as.numeric(runif(n) < probs)

Теперь подберите модель и сравните истинные вероятности с подобранными:

> true_prob(0.5)
[1] 0.5
> predict(m, newdata = data.frame(x = 0.5), type = "response")
       1 
0.479328 
> true_prob(2)
[1] 0.8175745
> predict(m, newdata = data.frame(x = 2), type = "response")
        1 
0.8665702 

Таким образом, в этом примере модель недооценивает при х = 0,5 и завышает при х = 2

Другие вопросы по тегам