R - 从插入符号和glmnet套索模型对象中提取因子预测符名称

时间:2017-07-27 21:01:08

标签: r r-caret glmnet lasso

在下面的例子中,我设置了一个带有3个变量的df,预测,var1和var2(一个因子)。

当我在插入符号或glmnet中运行模型时,该因子被转换为虚拟变量,例如var2b。

我想以编程方式提取变量名并匹配原始变量名,而不是虚拟变量名 - 有没有办法做到这一点?

这只是一个例子,我的真实世界问题有许多不同级别的变量,因此,我想避免手动执行此操作,例如尝试将“b”子串出来。

谢谢!

library(caret)
library(glmnet)

df <- data.frame(predict = c('Y','Y','N','Y','N','Y','Y','N','Y','N'), var1 = c(1,2,5,1,6,7,3,4,5,6),
              var2 = c('a','a','b','b','a','a','a','b','b','a'))

str(df)

# 'data.frame': 10 obs. of  3 variables:
# $ predict: Factor w/ 2 levels "N","Y": 2 2 1 2 1 2 2 1 2 1
# $ var1   : num  1 2 5 1 6 7 3 4 5 6
# $ var2   : Factor w/ 2 levels "a","b": 1 1 2 2 1 1 1 2 2 1

test <- train(predict ~ .,
           data = df,
           method = 'glmnet',
           trControl = trainControl(classProbs = TRUE,
                                    summaryFunction = twoClassSummary,
                                    allowParallel = FALSE),
           metric = 'ROC',
           tuneGrid = expand.grid(alpha = 1,
                                  lambda = .005))

predictors(test)
# [1] "var1"  "var2b"
varImp(test)
# glmnet variable importance

# Overall
# var2b     100
# var1        0

coef(test)
# NULL
#################
x <- model.matrix(as.formula(predict~.),data=df)
x <-  x[,-1] ##remove intercept

df$predict <- ifelse(df$predict == 'Y', TRUE, FALSE)

glmnet1 <- glmnet::cv.glmnet(x = x,
                          y = df$predict,
                          type.measure='auc',
                          nfolds=3,
                          alpha=1,
                          parallel = FALSE)

rownames(coef(glmnet1))
# [1] "(Intercept)" "var1"        "var2b

2 个答案:

答案 0 :(得分:1)

&#39;火车的table1,500000 table2,300 方法&#39;对象返回一个&#39;公式&#39;具有您正在寻找的属性的对象。

formula

“cv.glmnet”中似乎没有可用的变量名称。宾语。我不知道收集这些的优雅方式。 glmnetUtils 包可能具有一些生活质量功能。

以下是您可以尝试的一些代码;请注意,这将返回误报,因为它是按输入数据中的模式搜索列名称(例如&#34; var11&#34;将匹配&#34; var1&#34;)。

f1 <- formula(test)
f1
# predict ~ var1 + var2
# attr(,"variables")
# list(predict, var1, var2)
# attr(,"factors")
#         var1 var2
# predict    0    0
# var1       1    0
# var2       0    1
# attr(,"term.labels")
# [1] "var1" "var2"
# attr(,"order")
# [1] 1 1
# attr(,"intercept")
# [1] 1
# attr(,"response")
# [1] 1
# attr(,"predvars")
# list(predict, var1, var2)
# attr(,"dataClasses")
#   predict      var1      var2 
#  "factor" "numeric"  "factor" 
attr(f1, "term.labels")
# [1] "var1" "var2"

答案 1 :(得分:1)

Per @ CSJCampbell的回答:glmnetUtils包允许你使用glmnet和cv.glmnet对象来执行此操作。

library(glmnetUtils)
m <- glmnet(mpg ~ ., data=mtcars)
all.vars(m$terms)

m2 <- cv.glmnet(mpg ~ ., data=mtcars)
all.vars(m2$terms)

请注意,all.vars也适用于大多数其他R模型对象:

m3 <- lm(mpg ~ ., data=mtcars)
all.vars(delete.response(m3$terms))

glmnetUtils可用on CRAN,或者您可以从Github获取dev version。我目前正在完成一项重大更新,该更新应尽快发布到CRAN。