Я работаю над моделью, чтобы предсказать вероятность того, что бейсболисты из колледжа попадут в высшую лигу. В моем наборе данных 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
У меня есть несколько вопросов по поводу этих результатов. Не стесняйтесь отвечать на любой из них или на все (или ни на одно). Меня больше всего интересует ответ на первый вопрос.
Почему прогнозы от
predict.glmnet
(вектораpreds
) не представлены в форме вероятностей? Я пропустилpreds
значений через функцию обратного логита и получил разумные вероятности. Это было правильно?Прогнозы от
predict.cv.glmnet
(вектораcv.preds
) в основном выглядят как вероятности, но некоторые из них отрицательны. Почему это?Когда я использую функцию
glmnet
для создания объекта glmmod, я включаю аргументfamily="binomial"
, чтобы указать, что я использую логистическую регрессию. Однако, когда я использую функциюcv.glmnet
для поиска наилучшего значения лямбда, я не могу указать логистическую регрессию. Действительно ли я получаю наилучшее значение лямбда, если перекрестная проверка не использует логистическую регрессию?Точно так же, когда я использую функцию
predict.cv.glmnet
, я не могу указать логистическую регрессию. Производит ли эта функция те прогнозы, которые мне нужны?
predict
предоставлять вероятности и как гарантировать, чтоcv.glmnet
используетlogit
функцию ссылки, которые, по сути, являются вопросами кодирования. - person eipi10   schedule 27.08.2016