微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 mlr3 中重复 glmnet 的超参数调整alpha 和/或 lambda

如何解决如何在 mlr3 中重复 glmnet 的超参数调整alpha 和/或 lambda

我想在较小的数据集中重复 alphalambdaavoid variability 的超参数调整(glmnet 和/或 mlr3)>

caret,我可以使用"repeatedcv"

因为我真的很喜欢 mlr3 系列软件包,所以我想用它们进行分析。但是,我不确定如何在 mlr3

中执行此步骤的正确方法

示例数据

#library
library(caret)
library(mlr3verse)
library(mlbench)

# get example data
data(PimaIndiansDiabetes,package="mlbench")
data <- PimaIndiansDiabetes

# get small training data
train.data <- data[1:60,]

reprex package (v1.0.0) 于 2021 年 3 月 18 日创建

caret 方法(调整 alphalambda)使用 "cv""repeatedcv"


trControlCv <- trainControl("cv",number = 5,classprobs = TRUE,savePredictions = TRUE,summaryFunction = twoClassSummary)

# use "repeatedcv" to avoid variability in smaller data sets
trControlRCv <- trainControl("repeatedcv",repeats= 20,summaryFunction = twoClassSummary)

# train and extract coefficients with "cv" and different set.seed
set.seed(2323)
model <- train(
  diabetes ~.,data = train.data,method = "glmnet",trControl = trControlCv,tuneLength = 10,metric="ROC"
)

coef(model$finalModel,model$finalModel$lambdaOpt) -> coef1

set.seed(23)
model <- train(
  diabetes ~.,model$finalModel$lambdaOpt) -> coef2


# train and extract coefficients with "repeatedcv" and different set.seed
set.seed(13)

model <- train(
  diabetes ~.,trControl = trControlRCv,model$finalModel$lambdaOpt) -> coef3


set.seed(55)
model <- train(
  diabetes ~.,model$finalModel$lambdaOpt) -> coef4

reprex package (v1.0.0) 于 2021 年 3 月 18 日创建

用交叉验证证明不同的系数,用重复交叉验证证明相同的系数

# with "cv" I get different coefficients
identical(coef1,coef2)
#> [1] FALSE

# with "repeatedcv" I get the same coefficients
identical(coef3,coef4)
#> [1] TRUE

reprex package (v1.0.0) 于 2021 年 3 月 18 日创建

使用 mlr3 的第一个 cv.glmnet 方法(在内部调整 lambda

# create elastic net regression
glmnet_lrn = lrn("classif.cv_glmnet",predict_type = "prob")

# define train task
train.task <- TaskClassif$new("train.data",train.data,target = "diabetes")

# create learner 
learner = as_learner(glmnet_lrn)

# train the learner with different set.seed
set.seed(2323)
learner$train(train.task)
coef(learner$model,s = "lambda.min") -> coef1

set.seed(23)
learner$train(train.task)
coef(learner$model,s = "lambda.min") -> coef2

reprex package (v1.0.0) 于 2021 年 3 月 18 日创建

用交叉验证证明不同的系数

# compare coefficients
coef1
#> 9 x 1 sparse Matrix of class "dgCMatrix"
#>                        1
#> (Intercept) -3.323460895
#> age          0.005065928
#> glucose      0.019727881
#> insulin      .          
#> mass         .          
#> pedigree     .          
#> pregnant     0.001290570
#> pressure     .          
#> triceps      0.020529162
coef2
#> 9 x 1 sparse Matrix of class "dgCMatrix"
#>                        1
#> (Intercept) -3.146190752
#> age          0.003840963
#> glucose      0.019015433
#> insulin      .          
#> mass         .          
#> pedigree     .          
#> pregnant     .          
#> pressure     .          
#> triceps      0.018841557

reprex package (v1.0.0) 于 2021 年 3 月 18 日创建

更新 1:我取得的进展

根据下面的评论this comment 我可以使用 rsmpAutoTuner

这个answer建议不要调cv.glmnet而是glmnet(当时在ml3中没有)

使用 mlr3 的第二个 glmnet 方法(重复 alphalambda 的调整)

# define train task
train.task <- TaskClassif$new("train.data",target = "diabetes")

# create elastic net regression
glmnet_lrn = lrn("classif.glmnet",predict_type = "prob")

# turn to learner
learner = as_learner(glmnet_lrn)

# make search space
search_space = ps(
  alpha = p_dbl(lower = 0,upper = 1),s = p_dbl(lower = 1,upper = 1)
)

# set terminator
terminator = trm("evals",n_evals = 20)

#set tuner
tuner = tnr("grid_search",resolution = 3)

# tune the learner
at = AutoTuner$new(
  learner = learner,rsmp("repeated_cv"),measure = msr("classif.ce"),search_space = search_space,terminator = terminator,tuner=tuner)

at
#> <AutoTuner:classif.glmnet.tuned>
#> * Model: -
#> * Parameters: list()
#> * Packages: glmnet
#> * Predict Type: prob
#> * Feature types: logical,integer,numeric
#> * Properties: multiclass,twoclass,weights

解决的问题

我如何证明我的第二种方法是有效的,并且我使用不同的种子获得相同或相似的系数? IE。如何提取 AutoTuner

的最终模型的系数
set.seed(23)
at$train(train.task) -> tune1

set.seed(2323) 
at$train(train.task) -> tune2

reprex package (v1.0.0) 于 2021 年 3 月 18 日创建

解决方法

glmnet 的重复超参数调整(alpha 和 lambda)可以使用如上所述的SECOND mlr3 方法来完成。 可以使用 stats::coefAutoTuner

中存储的值提取系数
coef(tune1$model$learner$model,alpha=tune1$tuning_result$alpha,s=tune1$tuning_result$s)
# 9 x 1 sparse Matrix of class "dgCMatrix"
# 1
# (Intercept) -1.6359082102
# age          0.0075541841
# glucose      0.0044351365
# insulin      0.0005821515
# mass         0.0077104934
# pedigree     0.0911233031
# pregnant     0.0164721202
# pressure     0.0007055435
# triceps      0.0056942014
coef(tune2$model$learner$model,alpha=tune2$tuning_result$alpha,s=tune2$tuning_result$s)
# 9 x 1 sparse Matrix of class "dgCMatrix"
# 1
# (Intercept) -1.6359082102
# age          0.0075541841
# glucose      0.0044351365
# insulin      0.0005821515
# mass         0.0077104934
# pedigree     0.0911233031
# pregnant     0.0164721202
# pressure     0.0007055435
# triceps      0.0056942014

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?