glmnet logistic回归可以直接处理因子(类别)变量而不需要虚拟变量吗?[关闭]


15

我正在使用LASSO方法在R中构建逻辑回归,并具有cv.glmnet用于选择lambdaglmnet用于最终模型的功能。

我已经知道关于自动模型选择的所有缺点,但是无论如何我都需要这样做。

我的问题是我需要在模型中包括因子(分类)变量,有什么方法可以在不创建大量虚拟变量的情况下做到这一点?此变量几乎是所有字符串,而不是数字。


2
我很好奇这方面的最佳方法。
theforestecologist

Answers:


26

glmnet无法直接获取因子,您需要将因子变量转换为虚拟变量。例如,这只是使用model.matrix的一个简单步骤:

x_train <- model.matrix( ~ .-1, train[,features])
lm = cv.glmnet(x=x_train,y = as.factor(train$y), intercept=FALSE ,family =   "binomial", alpha=1, nfolds=7)
best_lambda <- lm$lambda[which.min(lm$cvm)]

alpha = 1将建立一个LASSO。


1
+1好答案!请问为什么您或任何人为什么要使用intercept = FALSE?
Erosennin

当有两个类别变量时,这似乎失败了:如果var1具有L1级别,则我正确地获得了L1列,但是var2(具有L2级别)则获得了L2-1列。
彼得·斯特拉卡

@Peter Straka:所有记录的sum(超过var1的L1虚拟变量)= 1,所有记录的sum(超过V2的L2虚拟变量)= 1,因此var1的L1虚拟变量和var2的L2虚拟变量线性相关。var2的至少一个L2虚拟变量是冗余的(出于建立线性模型的目的)。
VictorZurkowski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.