如何循环运行glm、ridge和lasso模型获取MSE、MSPE并绘制箱线图
R实现重复回归建模+误差收集+箱线图绘制
以下代码默认基于连续响应变量的回归场景,使用glmnet包实现正则化回归,你可以直接替换成你自己已有的单模型代码。
1. 封装单次运行逻辑
把单次数据拆分、建模、误差计算的逻辑封装为函数,方便后续循环调用:
# 加载依赖包 library(glmnet) library(ggplot2) # 单次建模函数,输入为自变量矩阵x、响应变量向量y,测试集占比默认0.3 run_single <- function(x, y, test_ratio = 0.3) { # 随机拆分训练/测试集 train_id <- sample(seq(nrow(x)), size = floor((1 - test_ratio) * nrow(x))) x_train <- x[train_id, ] y_train <- y[train_id] x_test <- x[-train_id, ] y_test <- y[-train_id] # --- 普通GLM模型 --- glm_fit <- glm(y_train ~ ., data = as.data.frame(cbind(y_train, x_train))) glm_mse <- mean(glm_fit$residuals ^ 2) # 训练集MSE glm_mspe <- mean((predict(glm_fit, as.data.frame(x_test)) - y_test) ^ 2) # 测试集MSPE # --- Ridge回归 --- cv_ridge <- cv.glmnet(x_train, y_train, alpha = 0, nfolds = 5) # 交叉验证选最优lambda ridge_fit <- glmnet(x_train, y_train, alpha = 0, lambda = cv_ridge$lambda.min) ridge_mse <- mean((predict(ridge_fit, x_train) - y_train) ^ 2) ridge_mspe <- mean((predict(ridge_fit, x_test) - y_test) ^ 2) # --- Lasso回归 --- cv_lasso <- cv.glmnet(x_train, y_train, alpha = 1, nfolds = 5) lasso_fit <- glmnet(x_train, y_train, alpha = 1, lambda = cv_lasso$lambda.min) lasso_mse <- mean((predict(lasso_fit, x_train) - y_train) ^ 2) lasso_mspe <- mean((predict(lasso_fit, x_test) - y_test) ^ 2) # 格式化返回结果 return(data.frame( model = rep(c("GLM", "Ridge", "Lasso"), each = 2), metric = rep(c("MSE", "MSPE"), 3), value = c(glm_mse, glm_mspe, ridge_mse, ridge_mspe, lasso_mse, lasso_mspe) )) }
注意:你可以把上面三个模型的实现代码直接替换成你已经写好的单模型代码,只要最后返回对应误差值即可。如果是分类任务,把MSE/MSPE替换成你需要的评估指标计算逻辑。
2. 循环运行100次收集所有误差
# 替换为你自己的数据集:x为自变量矩阵(去掉截距项),y为响应变量向量 # 示例生成方式:x <- model.matrix(你的响应变量~., data = 你的数据集)[, -1] # y <- 你的数据集$你的响应变量 # 设置随机种子保证结果可复现 set.seed(123) n_repeat <- 100 # 循环调用函数,合并所有结果 all_res <- do.call(rbind, replicate(n_repeat, run_single(x, y), simplify = FALSE))
3. 绘制箱线图对比误差
ggplot(all_res, aes(x = model, y = value, fill = model)) + geom_boxplot(linewidth = 0.4, outlier.size = 0.8) + # 按MSE/MSPE分面展示,两个指标的y轴独立 facet_wrap(~metric, scales = "free_y") + labs(x = "模型类型", y = "误差值", fill = "模型类型") + theme_bw()
如果不需要GLM参与重复实验,你可以单独计算一次GLM的MSE和MSPE,用geom_hline在对应分面添加参考横线即可。
内容的提问来源于stack exchange,提问作者ahhahahahahah1234
相关产品推荐
相关产品推荐

