如何识别最终插入符号弹性网模型中的非零系数 -
How to identify the non-zero coefficients in final caret elastic net model -
我已经使用 caret 使用 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)))
然而,这只是 returns 所有系数的数据框,我可以看到系数已减少到零的不同实例,但是,我不确定哪个是最终模型使用。使用一些略有不同的代码,我得到略有不同的结果,但在这种情况下,没有系数减少到零,这对我来说表明最终模型没有将任何系数减少到零:
data.frame(as.matrix(coef(model1$finalModel, model1$bestTune$lambda))) #i have removed the full stop preceeding lambda
基本上,我想知道最终模型中有哪些特征,以评估模型作为特征缩减过程的表现(以及标准模型评估指标,如准确性、灵敏度等)。
由于您没有提供任何示例数据,我 post 基于 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)
我已经使用 caret 使用 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)))
然而,这只是 returns 所有系数的数据框,我可以看到系数已减少到零的不同实例,但是,我不确定哪个是最终模型使用。使用一些略有不同的代码,我得到略有不同的结果,但在这种情况下,没有系数减少到零,这对我来说表明最终模型没有将任何系数减少到零:
data.frame(as.matrix(coef(model1$finalModel, model1$bestTune$lambda))) #i have removed the full stop preceeding lambda
基本上,我想知道最终模型中有哪些特征,以评估模型作为特征缩减过程的表现(以及标准模型评估指标,如准确性、灵敏度等)。
由于您没有提供任何示例数据,我 post 基于 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)