【问题标题】:How to identify the non-zero coefficients in final caret elastic net model -如何识别最终插入符号弹性网络模型中的非零系数 -
【发布时间】:2021-08-02 19:34:25
【问题描述】:

我已经使用插入符号构建了一个使用 10 倍 cv 的弹性网络模型,我想看看最终模型中使用了哪些系数(即那些没有减少到零的系数)。我使用以下代码查看系数,但是,这似乎是为使用的系数值的每个排列创建一个数据框,而不是最终模型中使用的那些:

tr_control = train_control(method="cv",number=10)
formula = response ~.

model1 = caret::train(formula,
                    data=training,
                    method="glmnet",
                    trControl=tr_control,
                    metric = "Accuracy",
                    family = "binomial")

然后为了从最终模型中提取系数并使用最佳 lambda 值,我使用了以下方法:

data.frame(as.matrix(coef(model1$finalModel, model1$bestTune$.lambda)))

但是,这只是返回所有系数的数据框,我可以看到系数已减小为零的不同实例,但是,我不确定最终模型使用哪个。使用一些稍微不同的代码,我得到的结果略有不同,但在这种情况下,没有一个系数被减少到零,这表明最终模型没有将任何系数减少到零:

data.frame(as.matrix(coef(model1$finalModel, model1$bestTune$lambda))) #i have removed the full stop preceeding lambda

基本上,我想知道最终模型中有哪些特征,以评估模型作为特征缩减过程的表现(以及标准模型评估指标,例如准确度、灵敏度等)。

【问题讨论】:

    标签: r r-caret glmnet


    【解决方案1】:

    由于您没有提供任何示例数据,我发布了一个基于 iris 内置数据集的示例,稍作修改以更好地满足您的需求(二项式结果)。

    首先,修改数据集

    library(caret)
    set.seed(5)#just for reproducibility
    iris
    irisn <- iris[iris$Species!="virginica",]
    irisn$Species <- factor(irisn$Species,levels = c("versicolor","setosa"))
    str(irisn)
    summary(irisn)
    

    拟合模型(为train设置控制参数的caret函数是trainControl,而不是train_control

    tr_control = trainControl(method="cv",number=10)
    model1  <-  caret::train(Species~.,
                          data=irisn,
                          method="glmnet",
                          trControl=tr_control,
                          family = "binomial")
    

    您可以像之前那样提取最终模型的系数:

    data.frame(as.matrix(coef(model1$finalModel, model1$bestTune$lambda)))
    

    同样这里的模型没有将任何系数减少到 0,但是如果我们添加一个对结果没有任何解释的随机变量呢?

    irisn$new1 <- runif(nrow(irisn))
    model2  <-  caret::train(Species~.,
                             data=irisn,
                             method="glmnet",
                             trControl=tr_control,
                             family = "binomial")
    var <- data.frame(as.matrix(coef(model2$finalModel, model2$bestTune$lambda)))
    

    在这里,你可以看到,新变量的系数变成了0。你可以提取模型保留的变量名:

    rownames(var)[var$X1!=0]
    

    最后,测试集的准确度指标可以用

    confusionMatrix(predict(model1,test),test$outcome)
    

    【讨论】:

    • 谢谢你——看来我的最终模型实际上并没有将任何系数减少到零,这表明它没有惩罚任何变量。感谢您的帮助。
    • 您可以尝试使用lasso 模型,该模型仅适用于 L1 惩罚。它应该在选定的预测变量方面更具选择性,因为它是一个 alpha=1 的弹性网络回归。
    • 是的,我比较了 glm、elasticnet、岭回归和套索。我已经在 caret 包之外完成了它们,并且也使用了 caret。
    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 2021-08-25
    • 2019-08-06
    • 1970-01-01
    • 2018-06-13
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多