从0开始学习R语言--Day24--稀疏建模

在解决风险类问题时,我们往往面临要在很多个指标中筛选关键指标的抉择。每个指标都是根据真实数据计算得出的,但是只有少数是能作为解释模型的,其余的都算是冗余特征。

这听起来有点像是稳健回归,但区别在于稳健回归是为了将数据的整体趋势不被部分离散点所带歪,而稀疏建模则是在损失函数中添加惩罚项,从而自动筛选保留少数的重要特征,而不是仅仅通过是否离散来判断。

以下是一个用于解释的例子:

R 复制代码
set.seed(123)
n <- 100  # 样本数
p <- 100  # 特征数

# 生成稀疏数据:只有前5个特征真实影响y
X <- matrix(rnorm(n * p), n, p)
beta_true <- c(3, -2, 1.5, 0, 0, rep(0, p-5))  # 后95个系数为0
y <- X %*% beta_true + rnorm(n, sd = 1)  # 添加噪声

# 转换为数据框(添加一些无关特征)
df <- data.frame(y, X)

library(glmnet)  # 安装:install.packages("glmnet")

# 准备数据(x需为矩阵,y为向量)
x <- as.matrix(df[, -1])
y <- df$y

# 拟合Lasso模型(alpha=1表示纯L1惩罚)
lasso_model <- glmnet(x, y, alpha = 1, lambda = 0.1)  # lambda需调优

# 查看系数(自动稀疏化)
coef(lasso_model)

# 10折交叉验证找最优lambda
cv_fit <- cv.glmnet(x, y, alpha = 1)
plot(cv_fit)  # 展示MSE随lambda的变化

# 最优lambda下的系数
best_lambda <- cv_fit$lambda.min
coef(cv_fit, s = "lambda.min")  # 非零系数即关键特征

# 普通线性回归(所有特征都保留)
lm_model <- lm(y ~ ., data = df)
summary(lm_model)  # 结果难以解释,且容易过拟合

输出:

R 复制代码
Residual standard error: NaN on 0 degrees of freedom
Multiple R-squared:      1,	Adjusted R-squared:    NaN 
F-statistic:   NaN on 99 and 0 DF,  p-value: NA

从输出中可以看到,如果是用普通线性回归,结果显示统计量失效,无法解释;而稀疏建模则是把其余的冗余变量的系数都强制归为0了,而从图像可以观察到,当参数减少时,模型包含的特征逐渐增多,误差也在逐渐下降。

相关推荐
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码6 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习