R语言如何和什么时候使用glmnet岭回归

这里向您展现如何在R中使用glmnet包进行岭回归(使用L2正则化的线性回归),并使用模拟来演示其相对于普通最小二乘回归的优点。框架

岭回归

当回归模型的参数被学习时,岭回归使用L2正则化来加权/惩罚残差。在线性回归的背景下,它能够与普通最小二乘法(OLS)进行比较。OLS定义了计算参数估计值(截距和斜率)的函数。它涉及最小化平方残差的总和。L2正则化是OLS函数的一个小增长,以特定的方式对残差进行加权以使参数更加稳定。结果一般是一种适合训练数据的模型,不如OLS更好,但因为它对数据中的极端变异(例如异常值)较不敏感,因此通常性更好。函数

包package

咱们将在这篇文章中使用如下软件包:学习

library(tidyverse)library(broom)library(glmnet)

与glmnet的岭回归

glmnet软件包提供了经过岭回归的功能glmnet()。重要的事情要知道:测试

它不须要接受公式和数据框架,而须要一个矢量输入和预测器矩阵。spa

您必须指定alpha = 0岭回归。code

岭回归涉及调整超参数lambda。glmnet()会为你生成默认值。另外,一般的作法是用lambda参数来定义你本身(咱们将这样作)。对象

如下是使用mtcars数据集的示例:

由于,与OLS回归不一样lm(),岭回归涉及调整超参数,lambda,glmnet()为不一样的lambda值屡次运行模型。咱们能够自动找到最适合的lambda值,cv.glmnet()以下所示:ip

cv_fit <- cv.glmnet(x, y, alpha =0, lambda = lambdas)

cv.glmnet() 使用交叉验证来计算每一个模型的归纳性,咱们能够将其视为:it

plot(cv_fit)

clipboard.png

R语言如何和什么时候使用glmnet岭回归

曲线中的最低点指示最佳的lambda:最好使交叉验证中的偏差最小化的lambda的对数值。咱们能够将这个值提取为:class

opt_lambda <- cv_fit$lambda.minopt_lambda#> [1] 3.162278

咱们能够经过如下方式提取全部拟合的模型(如返回的对象glmnet()):

这是咱们须要预测新数据的两件事情。例如,预测值并计算咱们训练的数据的R 2值:

y_predicted <- predict(fit, s = opt_lambda, newx = x)# Sum of Squares Total and Errorsst <- sum((y - mean(y))^2)sse <- sum((y_predicted - y)^2)# R squaredrsq <-1- sse / sstrsq#> [1] 0.9318896

最优模型已经在训练数据中占93%的方差。

Ridge v OLS模拟

经过产生比OLS更稳定的参数,岭回归应该不太容易过分拟合训练数据。所以,岭回归可能预测训练数据不如OLS好,但更好地推广到新数据。当训练数据的极端变化很大时尤为如此,当样本大小较低和/或特征的数量相对于观察次数较多时这趋向于发生。

下面是我建立的一个模拟实验,用于比较岭回归和OLS在训练和测试数据上的预测准确性。

我首先设置了运行模拟的功能:

可视化结果...
对于不一样数量的训练数据(对多个特征进行平均),两种模型对训练和测试数据的预测效果如何?

clipboard.png

R语言如何和什么时候使用glmnet岭回归

根据假设,OLS更适合训练数据,但Ridge回归更好地概括为新的测试数据。此外,当训练观察次数较少时,这些影响更为明显。

对于不一样的相对特征比例(平均数量的训练数据),两种模型对训练和测试数据的预测效果如何?

clipboard.png

R语言如何和什么时候使用glmnet岭回归

再一次地,OLS在训练数据上表现稍好,但Ridge在测试数据上更好。当特征的数量相对于训练观察的数量相对较高时,效果更显着。

下面的图有助于将Ridge对OLS的相对优点(或劣势)可视化为观察值和特征的数量:

R语言如何和什么时候使用glmnet岭回归

clipboard.png

这显示了综合效应:当训练观察数量较低和/或特征数目相对于训练观察数目较高时,Ridge回归更好地转移到测试数据。OLS在相似条件下的训练数据上表现略好,代表它比使用脊线正则化时更容易过分训练数据。

相关文章
相关标签/搜索