glmnet多分类模型lambda.1se的Nonzero含义及非零系数提取
glmnet多分类默认模式下Nonzero字段含义与系数提取方法
1. lambda.1se对应Nonzero=9的含义
默认type.multinomial = "ungrouped"时,cv.glmnet返回结果的Nonzero字段统计的是所有分类中,至少在一个分类里系数非零的特征变量数量,不包含每个分类的独立截距项。
你之前统计每个分类非零系数数量得到10、12、10,是因为统计结果包含了每个分类各自的截距项,去掉截距后每个分类的非零特征数分别为9、11、9,三个分类的非零特征取并集后刚好为9个,和返回的Nonzero值完全匹配。你之前统计的是三个分类非零特征的交集,和Nonzero的统计逻辑完全不同。
2. 对应变量名和系数的提取方法
第一步:提取lambda.1se对应的系数列表
# 提取lambda.1se对应的系数,每个分类对应一个稀疏矩阵 coef_1se <- coef(cvfit, s = "lambda.1se")
第二步:提取Nonzero对应的9个特征名
# 排除每个分类的截距行(第一行),提取所有非零特征名 var_nonzero_list <- lapply(coef_1se, function(class_coef) { rownames(class_coef)[-1][as.matrix(class_coef[-1, ]) != 0] }) # 取特征并集,就是Nonzero对应的9个特征 nonzero_features <- unique(unlist(var_nonzero_list))
第三步:提取对应系数(含截距)
# 将所有分类的系数合并为数据框,方便查看 coef_all <- do.call(cbind, lapply(coef_1se, function(m) as.matrix(m[, 1]))) colnames(coef_all) <- paste0("分类", colnames(coef_all), "系数") # 筛选出目标行(包含截距和9个非零特征) result_df <- coef_all[c("(Intercept)", nonzero_features), ]
内容的提问来源于stack exchange,提问作者user328349
相关产品推荐
相关产品推荐

