在这篇文章中,您将了解 R 平台的 3 种惩罚回归方法。
您可以复制并粘贴本文中的代码,以快速开始您自己的项目,或学习和练习 R 中的线性回归。
使用我的新书 《R 机器学习精通》 快速启动您的项目,其中包含分步教程和所有示例的R 源代码文件。
让我们开始吧。

惩罚回归
照片作者:Bay Area Bias,保留部分权利
本文中的每个示例都使用了 R 自带的 datasets 包中的 longley 数据集。longley 数据集描述了从 1947 年到 1962 年观察到的 7 个经济变量,用于预测每年就业人数。
岭回归
岭回归 (Ridge Regression) 创建一个线性回归模型,该模型受到 L2 范数(即系数平方和)的惩罚。这会缩小系数的值(以及模型的复杂度),允许一些对响应变量贡献较小的系数趋近于零。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 加载包 library(glmnet) # 加载数据 data(longley) x <- as.matrix(longley[,1:6]) y <- as.matrix(longley[,7]) # 拟合模型 fit <- glmnet(x, y, family="gaussian", alpha=0, lambda=0.001) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, x, type="link") # 总结准确度 mse <- mean((y - predictions)^2) print(mse) |
了解 glmnet 包中的 glmnet 函数。
需要更多关于R机器学习的帮助吗?
参加我为期14天的免费电子邮件课程,了解如何在您的项目中使用R(附带示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
最小绝对收缩和选择算子
最小绝对收缩和选择算子 (LASSO) 创建一个回归模型,该模型受到 L1 范数(即系数绝对值之和)的惩罚。这会缩小系数的值(以及模型的复杂度),允许一些对响应变量有轻微影响的系数变为零。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 加载包 library(lars) # 加载数据 data(longley) x <- as.matrix(longley[,1:6]) y <- as.matrix(longley[,7]) # 拟合模型 fit <- lars(x, y, type="lasso") # 总结拟合 summary(fit) # 选择一个误差最小的步 best_step <- fit$df[which.min(fit$RSS)] # 进行预测 predictions <- predict(fit, x, s=best_step, type="fit")$fit # 总结准确度 mse <- mean((y - predictions)^2) print(mse) |
了解 lars 包中的 lars 函数。
弹性网络
弹性网络 (Elastic Net) 创建一个同时受到 L1 范数和 L2 范数惩罚的回归模型。这会有效地缩小系数(如岭回归),并使某些系数变为零(如 LASSO)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 加载包 library(glmnet) # 加载数据 data(longley) x <- as.matrix(longley[,1:6]) y <- as.matrix(longley[,7]) # 拟合模型 fit <- glmnet(x, y, family="gaussian", alpha=0.5, lambda=0.001) # 总结拟合 summary(fit) # 进行预测 predictions <- predict(fit, x, type="link") # 总结准确度 mse <- mean((y - predictions)^2) print(mse) |
了解 glmnet 包中的 glmnet 函数。
总结
在这篇文章中,您学习了 R 中 3 种惩罚回归的方法。
惩罚是一种强大的特征选择方法,可以提高预测模型的准确性。有关更多信息,请参阅 Kuhn 和 Johnson 的《应用预测建模》的第 6 章,其中为 R 初学者提供了出色的线性回归入门。
好文章,但是第一个和第三个代码是一样的 🙂 有什么区别?
差不多。注意 alpha 的值(弹性网络混合参数)。
glmnet 函数的一个优点是它可以执行岭回归、Lasso 回归以及两者的混合。在第一个示例中,我们使用了 alpha=0 的 glmnet,结果是岭回归(仅 L2)。如果 alpha 设置为 1,则是 Lasso 回归(仅 L1)。请注意,在第三个示例中,alpha 设置为 0.5,这是 L1 和 L2 以 50% 的比例混合的弹性网络。
希望这样更清楚。
现在清楚多了。非常感谢 🙂
感谢您的文章,
我想知道使用 lars 包和 alpha=1 的 glmnet 包进行 LASSO 回归在计算和统计性能上的区别?
感谢您的时间和继续保持好工作!
好文章。我想知道如何使用 R 进行回归分析。您正在按照分步方法进行,这是通过我的电子邮件发送的。我的笔记本电脑上已经安装了 R 包。
嗨 Jason,非常感谢您提供的清晰教程,
这可能是一个愚蠢的问题,但我该如何解释弹性网络的拟合优度?在我运行
# 总结拟合
summary(fit)
# 进行预测
predictions <- predict(fit, x, type="link")
# 总结准确度
rmse <- mean((y – predictions)^2)
print(rmse)
之后得到了一个值,但不确定该如何解释。
非常感谢!
我也在想同样的问题,如何解释 mse?
取平方根,结果与原始数据单位相同。
“longley[,1:6]”和“longley[,7]”分别是什么意思?
如何用我自己的 CSV 数据准确地替换 data(longley)?
它指定了数据中的列。
例如,“longley[,1:6]”指定了哪些列?
当我点击 R Studio 检查器中的“x”时,它会显示一个带有标题的表
GNP.deflator
GNP
Unemployed
Armed.Forces
Population
Year
当我点击 y 时,它会显示一个带有“V1”标题的表
能用文字描述为“longley[datastart,dataend:datarows]”吗?
这是一种子集操作吗?
或者,如果它的意思是
longley[,1:6] = longley[,第1列到第6列]
和
longley[,7] = longley[,第7列]
那么“,”前面的部分是什么?有通配符吗?
明白了…
dataset[10:12,1:3] = dataset[startRow:endRow,startColumn:endColumn]
dataset[,1:3] = dataset[allRows,startColumn:endColumn]
在 R Studio 中,有没有一种简单的方法可以看到“data(longley)”的原始表格结构(所有标题)?
我不用 RStudio,所以无法提供这方面的建议,抱歉。
在 RStudio 中,您可以使用 View(df) 在查看器中显示数据框/tibble。
View(longley)
或者,在 dplyr 包中,您可以使用 glimpse(df) 来获取列名和数据类型的列表。
dplyr::glimpse(longley)
如何在上面的代码中预测一个未见数据的步骤?
我们是否需要使用训练集和测试集来预测未见数据(使用 glmnet)?
如果是,我们是否应该使用预测的最后观测值作为 newx 来预测新的未见数据?
您可以使用任何您喜欢的测试框架来估计模型在未见数据上的性能。
内部使用了什么方法 – 最小二乘法
还是最大似然法
我建议阅读包文档以了解具体方法。
如果我必须使用一个提出的惩罚而不是 LASSO 或弹性网络的内置惩罚,该怎么办?如何使用?
好问题,您可能需要自己实现。
嗨,Jason,
我开始了您的机器学习课程——似乎非常有用。我有一个关于我计划进行的分析的问题。我简要描述了我的研究环境和关于 R 包的问题。如果您能帮助我,那就太好了。
我一直在尝试分析高维数据(p 超过 n),观测值有限(n=50)。我想使用 Lasso 方法进行变量选择和参数估计,以开发预测模型。由于我的数据是计数观测,它必须是泊松或负二项分布。我研究了几个 R 包和研究,最后决定使用 Glmnet。现在我有一些问题
我知道“Glmnet”和“Penalized”包使用不同的算法。正如我看到的“Mpath”使用像 Glmnet 这样的坐标下降法,那么“Mapth”和“Glmnet”的结果是否可比?我只对“Mpath”感兴趣是因为它们允许负二项回归,“Glmnet”则不行。
一些包允许进行事后推断(p 值和置信区间),例如“selectiveInference”、“hdi”。然而,我找不到关于泊松或负二项模型的任何内容。有哪个包可以帮助我吗?
提前感谢。
可能有,我暂时不确定,抱歉。
也许可以尝试在 R 用户列表上发帖?
根据我对 glmnet 包的描述(https://cran.r-project.cn/web/packages/glmnet/glmnet.pdf),它不拟合岭回归,只拟合 lasso 或弹性网络——我猜是因为惩罚定义(它从不减少到岭惩罚定义)。
使用弹性网络,您可以执行岭回归、Lasso 回归以及两者(例如,弹性网络)。
对于回归问题 ML 算法,Lasso 是用于高维数据集进行特征选择的好方法吗?
也就是说,我正在尝试确定用于确定我的输出变量(连续)的最佳特征的最佳算法,我一直在使用 Lasso,只是不确定它与其他算法相比有多有效……对于侧重于回归的 ML 问题,是否有推荐的特征选择方法?
谢谢,
它可以,在你的问题上试试看。
总的来说,我建议测试您的问题的各种“视图”,使用不同的算法来发现最佳组合。这篇文章可能会有帮助
https://machinelearning.org.cn/how-to-get-the-most-from-your-machine-learning-data/