当前位置: 首页 > news >正文

从0开始学习R语言--Day28--高维回归

我们一般处理的数据,都是样本数量远大于其特征数量,可用很多种回归方法;但当特征数量远大于样本量时,可能会因为出现无数多个完美解导致过拟合现象,也使得在计算时搜索最有特征子集的方法不再可行(因为计算量过大)。鉴于此,我们可以使用高维回归,该方法会对很多特征的系数做出限制,一是增加惩罚项,许多特征的系数为0,减少算法的计算量;二是用主成分回归的办法,先对数据进行降维,将特征限定在有限的范围内再去做回归。

以下是一个例子:

# 加载必要的包
library(glmnet)  # 用于Lasso回归
library(ggplot2) # 用于可视化# 生成高维数据集
set.seed(123)
n <- 100   # 样本量
p <- 200   # 变量数(远大于n)# 生成设计矩阵X(100×200)
X <- matrix(rnorm(n * p), nrow = n, ncol = p)# 生成真实的系数向量(只有前5个变量有真实效应)
true_beta <- c(rep(3, 5), rep(0, p-5))# 生成响应变量 y = Xβ + ε
y <- X %*% true_beta + rnorm(n, sd = 2)# 将数据分为训练集和测试集
train <- sample(1:n, 70)
X_train <- X[train, ]
y_train <- y[train]
X_test <- X[-train, ]
y_test <- y[-train]# 使用交叉验证拟合Lasso模型
cv_fit <- cv.glmnet(X_train, y_train, alpha = 1)  # alpha=1表示Lasso# 查看最优lambda值
best_lambda <- cv_fit$lambda.min
cat("最优lambda值:", best_lambda, "\n")# 绘制交叉验证误差
plot(cv_fit)# 使用最优lambda拟合最终模型
final_model <- glmnet(X_train, y_train, alpha = 1, lambda = best_lambda)# 查看非零系数的变量
selected_vars <- predict(final_model, type = "coefficients")
cat("选择的变量数量:", sum(selected_vars != 0) - 1, "\n")  # 减去截距# 预测测试集
predictions <- predict(final_model, newx = X_test)# 计算测试集MSE
mse <- mean((predictions - y_test)^2)
cat("测试集MSE:", mse, "\n")# 可视化真实系数与估计系数
coef_df <- data.frame(Variable = 1:p,True = true_beta,Estimated = as.numeric(selected_vars[-1])  # 去掉截距
)ggplot(coef_df, aes(x = Variable)) +geom_point(aes(y = True, color = "真实值")) +geom_point(aes(y = Estimated, color = "估计值")) +scale_color_manual(values = c("真实值" = "red", "估计值" = "blue")) +labs(title = "真实系数与Lasso估计系数比较",y = "系数值",color = "类型") +theme_minimal()

输出:

最优lambda值: 0.141299
选择的变量数量: 45 
测试集MSE: 6.238843

我的结果表明,有45个变量是有效的,但所画的图则表明只有前五个变量是有效的,其他变量的系数都是0,造成这个原因很可能是因为lambda不够大(惩罚值较小),所以才让模型引入了40个无关变量。

http://www.lqws.cn/news/469063.html

相关文章:

  • 大学专业解读——电气,自动化,仪器
  • ZooKeeper 3.9.2 集群安装指南
  • AIGC工具平台-Duix.Heygem音频对口型数字人
  • API网关Apisix管理接口速查
  • Mac电脑-触摸板增强工具-BetterTouchTool
  • SpringAI1.0.0 入门案例
  • LLM:重构数字世界的“智能操作系统”
  • 71、单元测试-Junit5简介
  • Transformer架构每层详解【代码实现】
  • 使用Trae编辑器与MCP协议构建高德地图定制化服务
  • 【unity】批量剔除图片四周空白像素的工具
  • 深入Java大厂面试:从Spring框架到微服务架构的技术解析
  • python web开发-Flask数据库集成
  • 深度剖析 PACK_SESSIONID 实现原理与安全突破机制
  • 分组交换比报文交换的传输时延更低
  • 深入剖析Linux epoll模型:从LT/ET模式到EPOLLONESHOT的实战指南
  • 【Linux】线程概念 分页式存储 优缺点
  • 开源Blazor界面组件库:Ant Design Blazor
  • 【全开源】填表问卷统计预约打卡表单系统+uniapp前端
  • ESP32 ESP-IDF Ubuntu平台工具链的标准设置
  • 百度萝卜快跑携4颗禾赛激光雷达进军迪拜,千辆L4无人车开启全球化战略
  • 华为云Flexus+DeepSeek征文 | AingDesk 对接华为云 ModelArts Studio 全流程教程与性能测评对比
  • 基于 Flutter+Sqllite 实现大学个人课表助手 APP(期末作业)
  • 【Docker 08】Compose - 容器编排
  • 【AGI】突破感知-决策边界:VLA-具身智能2.0
  • Node.js特训专栏-实战进阶:5. Express路由系统设计与优化
  • [幻灯片]分析设计高阶-02结构05-202506更新-GJ-002
  • 【Memory协议栈】Autosar架构下如何测量Fee的切页时间
  • Qthread应用
  • Taro 跨端应用性能优化全攻略:从原理到实践