mlr3中classif.cv_glmnet:获取CV选定的λ值与β系数方法
在mlr3中使用
classif.cv_glmnet的Lasso二分类问题解答 基础问题:获取CV选定的λ值及对应β系数
训练classif.cv_glmnet后,模型对象已包含CV过程得到的最优λ(默认是lambda.min,也可指定lambda.1se),你可以通过以下步骤提取对应系数:
# 初始化训练器并训练 learner = lrn("classif.cv_glmnet") learner$train(task) # 获取CV选定的最优λ(默认lambda.min,可通过lambda.select参数切换为lambda.1se) best_lambda = learner$model$lambda.min # 获取对应λ的β系数(包含截距项) best_coef = coef(learner$model, s = best_lambda) # 转为数据框方便查看 as.data.frame(as.matrix(best_coef))
你的三个疑问解答
1. 解释glmnet.fit输出中的%dev、df等指标
%dev:代表模型解释的偏差比例,对于二分类任务,计算公式为1 - (残差偏差 / 零模型偏差)。零模型是仅包含截距项的模型,%dev越接近1,说明模型对数据的拟合效果越好。df:指模型中非零系数的数量(包含截距项)。Lasso通过正则化将部分系数压缩至0,df反映了当前λ下模型的复杂度——λ越小,df越大,模型越复杂。lambda:正则化惩罚参数,λ越大,惩罚力度越强,被压缩至0的系数越多,模型越简洁。
2. 无需手动指定λ.1se,直接获取最终模型的β系数
classif.cv_glmnet的lambda.select参数默认值为"lambda.min",训练后模型已基于该最优λ完成拟合。你可以直接通过以下代码提取最终系数,无需手动输入λ值:
# 自动匹配训练器选定的最优λ final_coef = coef(learner$model, s = learner$model[[learner$param_set$values$lambda.select]]) as.data.frame(as.matrix(final_coef))
如果需要切换为lambda.1se,只需在初始化训练器时设置参数:
learner = lrn("classif.cv_glmnet", lambda.select = "lambda.1se") learner$train(task) # 同样方式提取系数 final_coef = coef(learner$model, s = learner$model$lambda.1se)
3. 使用resample时的嵌套重采样判定及各fold系数获取
- 是否属于嵌套重采样? 是的。
resample是外层重采样(如10折交叉验证),而classif.cv_glmnet内部会自动执行CV选择最优λ,这一结构就是嵌套重采样(双层交叉验证),目的是避免数据泄露,得到更可靠的模型性能估计。 - 获取各fold的最终β系数:遍历
resample结果中的每个训练器实例,提取对应fold的最优λ和系数即可:
# 初始化重采样策略 resampling = rsmp("cv", folds = 5) # 执行重采样 rr = resample(task, learner, resampling) # 遍历每个fold的训练器,提取系数 fold_coefs = lapply(rr$learners, function(l) { best_lambda = l$model[[l$param_set$values$lambda.select]] coef_df = as.data.frame(as.matrix(coef(l$model, s = best_lambda))) colnames(coef_df) = paste0("fold_", l$model$foldid[1], "_coef") return(coef_df) }) # 合并所有fold的系数(可选) combined_coefs = do.call(cbind, fold_coefs)
内容的提问来源于stack exchange,提问作者Hanna
相关产品推荐
相关产品推荐

