如何在mlr中获取惩罚逻辑回归的系数具体值?
获取mlr中惩罚逻辑回归的具体系数值
我懂你遇到的困扰——用getLearnerModel()提取惩罚逻辑回归(比如基于glmnet的 learner)的模型结果时,它返回的glmnet对象只会显示系数数量,看不到具体的系数值。这是因为glmnet属于正则化路径模型,它会针对一系列不同惩罚强度的lambda值拟合模型,所以得指定你要提取系数对应的lambda值才行。
下面是具体的解决步骤和示例代码:
1. 确认你的惩罚逻辑回归Learner类型
通常mlr里做惩罚逻辑回归会用classif.glmnet这个原生支持glmnet参数的learner,当然用classif.logreg加penalty参数本质也是调用glmnet,两种情况的解决方法一致。
2. 拟合模型并提取glmnet对象
先完成模型训练的基础步骤:
library(mlr) library(titanic) suppressMessages(library(tidyverse)) # 预处理泰坦尼克号数据 titanic_clean <- titanic_train %>% select(Survived, Pclass, Sex, Age, Fare) %>% drop_na() %>% mutate(Survived = as.factor(Survived), Sex = as.factor(Sex)) # 创建分类任务和惩罚逻辑回归Learner task <- makeClassifTask(data = titanic_clean, target = "Survived") learner <- makeLearner("classif.glmnet", predict.type = "response") # 训练模型 trained_model <- train(learner, task)
3. 提取具体系数值
用getLearnerModel()拿到glmnet对象后,调用coef()函数并指定lambda参数。你可以选择交叉验证得到的最优lambda(比如lambda.min对应最小误差,lambda.1se对应更简洁的模型),也可以自己指定lambda值:
# 提取glmnet模型核心对象 glmnet_core <- getLearnerModel(trained_model) # 获取交叉验证最优lambda对应的系数 optimal_coef <- coef(glmnet_core, s = glmnet_core$lambda.min) # 转成易读的数据框格式(过滤掉被正则化到0的系数) coef_result <- as.data.frame(as.matrix(optimal_coef)) %>% rownames_to_column(var = "特征") %>% rename(系数值 = s1) %>% filter(系数值 != 0) print(coef_result)
为什么直接调用getLearnerModel()看不到系数?
因为glmnet对象存储的是整个正则化路径的系数矩阵,而非单个模型的系数。直接打印这个对象时,它只会展示模型的元信息(比如系数总数、lambda序列长度),必须通过coef()指定具体lambda,才能提取对应惩罚强度下的模型系数。
内容的提问来源于stack exchange,提问作者Rory Nolan
相关产品推荐
相关产品推荐

