如何从mlr3训练后的学习器(如glmnet、log_reg)获取特征与系数等指标?
在mlr3中提取模型系数、特征及特征重要性
一、从训练后的学习器对象提取系数与特征
1. 针对classif.cv_glmnet这类glmnet系列学习器
训练后的mlr3学习器对象可以通过$model访问底层的原生glmnet模型,再用glmnet自带方法提取系数:
# 获取训练后的底层glmnet模型 glmnet_model <- lrn_glmnet$model # 提取lambda.min对应最优模型的系数(也可指定lambda.1se) coef_matrix <- coef(glmnet_model, s = "lambda.min") # 转成数据框筛选非零系数的特征 coef_df <- as.data.frame(as.matrix(coef_matrix)) colnames(coef_df) <- "coefficient" # 过滤掉系数为0的特征,行名即为特征名 coef_df <- coef_df[coef_df$coefficient != 0, , drop = FALSE]
2. 针对log_reg(逻辑回归)这类基础学习器
以classif.log_reg为例,训练后同样通过$model访问底层的glm对象,直接提取系数:
# 训练逻辑回归学习器 learner_log <- lrn("classif.log_reg") lrn_log <- learner_log$train(task, row_ids = train_set) # 提取系数 log_coef <- coef(lrn_log$model) # 转成数据框方便查看 log_coef_df <- as.data.frame(log_coef) colnames(log_coef_df) <- "coefficient"
二、提取特征重要性
不同学习器的特征重要性获取方式略有差异,优先使用mlr3统一接口,或基于底层模型计算:
1. 通用接口:$importance()
大部分mlr3官方支持的学习器都实现了该方法,直接调用即可返回特征重要性分数:
# 针对cv_glmnet获取重要性 importance_scores <- lrn_glmnet$importance() # 针对log_reg(线性模型可将系数绝对值作为重要性) log_importance <- abs(coef(lrn_log$model))[-1] # 去掉截距项 names(log_importance) <- task$feature_names
2. 重采样后提取特征重要性
重采样完成后,可从ResampleResult对象中提取各折叠的重要性,再做汇总:
# 假设resample_result是重采样返回的结果对象 # 提取所有折叠的训练后学习器 fold_learners <- resample_result$learners # 遍历收集每个折叠的特征重要性 all_fold_importance <- lapply(fold_learners, function(lrn) { lrn$importance() }) # 转成数据框并计算各特征的平均重要性 importance_df <- do.call(rbind, all_fold_importance) mean_importance <- colMeans(importance_df) # 按重要性降序排序 sorted_importance <- sort(mean_importance, decreasing = TRUE)
内容的提问来源于stack exchange,提问作者Haneme
相关产品推荐
相关产品推荐

