R中使用自定义交叉验证训练glmnet时遇错误求助
解决Lasso模型训练中的警告与拟合失败问题
问题分析
你遇到的两个核心问题:
- "Setting row names on a tibble is deprecated"警告:因为
train函数处理tibble格式数据时,尝试设置行名的操作已被tibble包弃用。 - glmnet拟合失败:常见诱因包括目标变量格式错误、数据含缺失值、变量共线性极强、lambda序列不合理等。你的y_train维度为(6048,1),说明目标变量是单列data.frame而非向量,这是触发拟合失败的潜在原因之一。
解决方案
1. 消除行名设置警告
将输入的预测变量数据从tibble转换为普通data.frame或矩阵,规避tibble行名操作的兼容性问题:
Train_x <- as.data.frame(Train[, predictorsNames])
2. 修正目标变量格式
确保目标变量是因子向量而非单列data.frame,glmnet要求y输入为向量格式:
Train_y <- Train[[outcomeName]] # 也可使用 dplyr::pull(Train, bcpm07c)
3. 排查数据异常
- 检查缺失值:缺失值会直接导致glmnet拟合失败,统计各列缺失情况:
处理方式:删除含缺失的行(colSums(is.na(Train))Train <- na.omit(Train))或填充缺失值(如用中位数填充:Train <- mutate_all(Train, ~ifelse(is.na(.), median(., na.rm=T), .)))。 - 检查共线性:高度相关的变量会干扰正则化过程,计算变量相关系数:
处理方式:移除其中一个共线性强的变量。corr_matrix <- cor(Train[, predictorsNames]) # 筛选相关系数绝对值>0.9的变量对 high_corr_pairs <- which(abs(corr_matrix) > 0.9 & row(corr_matrix) != col(corr_matrix))
4. 优化模型参数设置
- 手动指定lambda范围:默认lambda序列可能包含极端值,手动设置合理范围提升拟合稳定性:
tuneGrid <- expand.grid(alpha = 1, lambda = seq(0.001, 0.1, by = 0.001)) - 添加标准化预处理:显式设置变量中心化和标准化,确保变量尺度一致:
preProcess = c("center", "scale")
修改后的完整代码
new_df$bcpm07c <- as.factor(new_df$bcpm07c ) outcomeName <- "bcpm07c" predictorsNames <- names(new_df)[names(new_df)!= outcomeName] # 调整数据格式,适配glmnet要求 Train_x <- as.data.frame(Train[, predictorsNames]) Train_y <- Train[[outcomeName]] ctrl <- trainControl(method="repeatedcv", number = 10, repeats = 3 ) # 带优化设置的模型训练 fit.lass <- train(Train_x, Train_y, family= "binomial", alpha = 1, method='glmnet', trControl=ctrl, preProcess = c("center", "scale"), tuneGrid = expand.grid(alpha = 1, lambda = seq(0.001, 0.1, by=0.001)))
内容的提问来源于stack exchange,提问作者NFB
相关产品推荐
相关产品推荐

