Почему predict.glmnet не предсказывает вероятности?

Я работаю над моделью, чтобы предсказать вероятность того, что бейсболисты из колледжа попадут в высшую лигу. В моем наборе данных 633 наблюдения и 13 предикторов с двоичным ответом. Приведенный ниже код генерирует более мелкие воспроизводимые примеры наборов данных для обучения и тестирования:

set.seed(1)
OBP <- rnorm(50, mean=1, sd=.2)
HR.PCT <- rnorm(50, mean=1, sd=.2)
AGE <- rnorm(50, mean=21, sd=1)
CONF <- sample(c("A","B","C","D","E"), size=50, replace=TRUE)
CONF <- factor(CONF, levels=c("A","B","C","D","E"))
df.train <- data.frame(OBP, HR.PCT, AGE, CONF)
df.train <- df.train[order(-OBP),]
df.train$MADE.MAJORS <- 0
df.train$MADE.MAJORS[1:10] <- 1

OBP <- rnorm(10, mean=1, sd=.2)
HR.PCT <- rnorm(10, mean=1, sd=.2)
AGE <- rnorm(10, mean=21, sd=1)
CONF <- sample(c("A","B","C","D","E"), size=10, replace=TRUE)
CONF <- factor(CONF, levels=c("A","B","C","D","E"))
MADE.MAJORS <- sample(0:1, size=10, replace=TRUE, prob=c(0.8,0.2))
df.test <- data.frame(OBP, HR.PCT, AGE, CONF, MADE.MAJORS)

Затем я использовал glmnet для выполнения лассо с логистической регрессией и создания прогнозов. Я хочу, чтобы прогнозы были в форме вероятностей (то есть от 0 до 1).

library(glmnet)
train.mtx <- with(df.train, model.matrix(MADE.MAJORS ~ OBP + HR.PCT + AGE + CONF)[,-1])
glmmod <- glmnet(x=train.mtx, y=as.factor(df.train$MADE.MAJORS), alpha=1, family="binomial")
cv.glmmod <- cv.glmnet(x=train.mtx, y=df.train$MADE.MAJORS, alpha=1)

test.mtx <- with(df.test, model.matrix(MADE.MAJORS ~ OBP + HR.PCT + AGE + CONF)[,-1])
preds <- predict.glmnet(object=glmmod, newx=test.mtx, s=cv.glmmod$lambda.min, type="response")
cv.preds <- predict.cv.glmnet(object=cv.glmmod, newx=test.mtx, s="lambda.min")

Вот прогнозы:

> preds
            1
1  -3.2589440
2  -0.4435265
3   3.9646670
4   0.3772816
5   0.9952887
6  -7.3555661
7   0.2283675
8  -2.3871317
9  -8.1632749
10 -1.3563051

> cv.preds
            1
1   0.1568839
2   0.3630938
3   0.7435941
4   0.4808428
5   0.5261076
6  -0.1431655
7   0.4123054
8   0.2207381
9  -0.1446941
10  0.2962391

У меня есть несколько вопросов по поводу этих результатов. Не стесняйтесь отвечать на любой из них или на все (или ни на одно). Меня больше всего интересует ответ на первый вопрос.

  1. Почему прогнозы от predict.glmnet (вектора preds) не представлены в форме вероятностей? Я пропустил preds значений через функцию обратного логита и получил разумные вероятности. Это было правильно?

  2. Прогнозы от predict.cv.glmnet (вектора cv.preds) в основном выглядят как вероятности, но некоторые из них отрицательны. Почему это?

  3. Когда я использую функцию glmnet для создания объекта glmmod, я включаю аргумент family="binomial", чтобы указать, что я использую логистическую регрессию. Однако, когда я использую функцию cv.glmnet для поиска наилучшего значения лямбда, я не могу указать логистическую регрессию. Действительно ли я получаю наилучшее значение лямбда, если перекрестная проверка не использует логистическую регрессию?

  4. Точно так же, когда я использую функцию predict.cv.glmnet, я не могу указать логистическую регрессию. Производит ли эта функция те прогнозы, которые мне нужны?


person gasbag_1    schedule 27.08.2016    source источник
comment
Это принадлежит CrossValidated.   -  person IRTFM    schedule 27.08.2016
comment
Спасибо. Как я могу переместить его на CrossValidated?   -  person gasbag_1    schedule 27.08.2016
comment
Вы можете отметить это или подождать, пока со мной согласятся еще два человека. Это то, что будет делать закрытое голосование.   -  person IRTFM    schedule 27.08.2016
comment
@ 42-, мне все это кажется скорее вопросами кодирования, чем вопросами интерпретации. ТАК кажется подходящим местом для этого.   -  person eipi10    schedule 27.08.2016
comment
Мне казалось, что все они были о непонимании основных принципов функций обобщенной регрессии.   -  person IRTFM    schedule 27.08.2016
comment
@ 42, я думаю, что ОП правильно, я думаю, это вопрос кодирования.   -  person Gene Burinsky    schedule 27.08.2016
comment
Тем не менее, вопросы о том, как заставить predict предоставлять вероятности и как гарантировать, что cv.glmnet использует logit функцию ссылки, которые, по сути, являются вопросами кодирования.   -  person eipi10    schedule 27.08.2016


Ответы (1)


Я не уверен на 100% в следующем, потому что, как вы заметили, пакет действительно работает вопреки документации, но он может дать некоторое указание на правильность вашего мышления.

Вопрос 1

Да, ты прав. Обратите внимание, что,

> predict.glmnet(object=glmmod, newx=test.mtx, s=cv.glmmod$lambda.min, type="link")
            1
1  -3.2589440
2  -0.4435265
3   3.9646670
4   0.3772816
5   0.9952887
6  -7.3555661
7   0.2283675
8  -2.3871317
9  -8.1632749
10 -1.3563051

это тот же результат, что и type="response". Таким образом, использование функции обратного логита было бы правильным способом получить вероятности. Что касается того, почему это происходит, я не понимаю - возможно, это ошибка.

Вопрос 2 ... 4

Для cv.preds вы получаете что-то вроде вероятностей, потому что вы устанавливаете гауссову ссылку. Чтобы соответствовать логит-ссылке, необходимо указать параметр family. А именно:

cv.glmmod <- cv.glmnet(x=train.mtx, y=df.train$MADE.MAJORS, alpha=1, family="binomial")

> cv.preds
            1
1  -10.873290
2    1.299113
3   15.812671
4    3.622259
5    5.621857
6  -24.826551
7    1.734000
8   -5.420878
9  -26.160403
10  -4.496020

В этом случае cv.preds будет выводиться вдоль реальной линии, и вы можете пропустить эти значения через обратный логит, чтобы получить вероятности.

person Gene Burinsky    schedule 27.08.2016
comment
Спасибо, это очень помогает. Я не понимал, что функция cv.glmnet может принимать аргумент family. - person gasbag_1; 28.08.2016
comment
Могу я спросить - зачем здесь нужны cv.preds и preds? Я имею в виду, я ожидал только одного вектора прогнозов, но здесь мы, кажется, используем два - person baxx; 15.04.2019
comment
@baxx извините за поздний ответ. Не уверен, зачем нужны оба. Два вектора представляют одни и те же значения, но в разной форме. Рассмотрим модель $ p_i = \ frac {\ exp (\ betaX_i)} {\ exp (\ beta X_i) +1} $. В вопросе OP preds относится к \ betaX_i, а cv.preds относится к $ p_i $. В вопросе я имею в виду только $ \ betaX_i $ (т.е. cv.preds), но если вы пропустите cv.preds через обратный логит, вы получите прогнозируемые вероятности. - person Gene Burinsky; 26.04.2019