R中的岭回归(一步一步)
岭回归是当数据中存在多重共线性时我们可以用来拟合回归模型的方法。
简而言之,最小二乘回归试图找到最小化残差平方和 (RSS) 的系数估计:
RSS = Σ(y i – ŷ i )2
金子:
- Σ :希腊符号,意思是和
- y i :第 i 个观测值的实际响应值
- ŷ i :基于多元线性回归模型的预测响应值
相反,岭回归旨在最小化以下因素:
RSS + λΣβ j 2
其中j从 1 到p 个预测变量且 λ ≥ 0。
等式中的第二项称为提款罚金。在岭回归中,我们选择产生尽可能最低的 MSE 检验(均方误差)的 λ 值。
本教程提供了如何在 R 中执行岭回归的分步示例。
第 1 步:加载数据
对于此示例,我们将使用 R 的内置数据集mtcars 。我们将使用hp作为响应变量,并使用以下变量作为预测变量:
- 英里/加仑
- 重量
- 拉屎
- 快秒
为了执行岭回归,我们将使用glmnet包中的函数。该包要求响应变量是一个向量,并且预测变量集是data.matrix类。
下面的代码展示了如何定义我们的数据:
#define response variable
y <- mtcars$hp
#define matrix of predictor variables
x <- data.matrix(mtcars[, c('mpg', 'wt', 'drat', 'qsec')])
步骤 2:拟合岭回归模型
接下来,我们将使用glmnet()函数来拟合 Ridge 回归模型并指定alpha=0 。
请注意,将 alpha 设置为 1 相当于使用 Lasso 回归,将 alpha 设置为 0 到 1 之间的值相当于使用弹性网络。
另请注意,岭回归要求对数据进行标准化,以便每个预测变量的均值为 0,标准差为 1。
幸运的是, glmnet()会自动为您完成此标准化工作。如果您已经标准化了变量,则可以指定standardize=False 。
library (glmnet)
#fit ridge regression model
model <- glmnet(x, y, alpha = 0 )
#view summary of model
summary(model)
Length Class Mode
a0 100 -none- numeric
beta 400 dgCMatrix S4
df 100 -none- numeric
dim 2 -none- numeric
lambda 100 -none- numeric
dev.ratio 100 -none- numeric
nulldev 1 -none- numeric
npasses 1 -none- numeric
jerr 1 -none- numeric
offset 1 -none- logical
call 4 -none- call
nobs 1 -none- numeric
步骤 3:选择 Lambda 的最佳值
接下来,我们将使用k 折交叉验证来确定产生最低测试均方误差 (MSE) 的 lambda 值。
幸运的是, glmnet有cv.glmnet()函数,可以使用 k = 10 次自动执行 k 倍交叉验证。
#perform k-fold cross-validation to find optimal lambda value
cv_model <- cv. glmnet (x, y, alpha = 0 )
#find optimal lambda value that minimizes test MSE
best_lambda <- cv_model$ lambda . min
best_lambda
[1] 10.04567
#produce plot of test MSE by lambda value
plot(cv_model)
最小化 MSE 测试的 lambda 值是10.04567 。
第四步:分析最终模型
最后,我们可以分析最优 lambda 值产生的最终模型。
我们可以使用以下代码来获得该模型的系数估计:
#find coefficients of best model
best_model <- glmnet(x, y, alpha = 0 , lambda = best_lambda)
coef(best_model)
5 x 1 sparse Matrix of class "dgCMatrix"
s0
(Intercept) 475.242646
mpg -3.299732
wt 19.431238
drat -1.222429
qsec -17.949721
我们还可以生成跟踪图来可视化系数估计值如何因 lambda 的增加而变化:
#produce Ridge trace plot
plot(model, xvar = " lambda ")
最后,我们可以在训练数据上计算模型的 R 平方:
#use fitted best model to make predictions
y_predicted <- predict (model, s = best_lambda, newx = x)
#find OHS and SSE
sst <- sum ((y - mean (y))^2)
sse <- sum ((y_predicted - y)^2)
#find R-Squared
rsq <- 1 - sse/sst
rsq
[1] 0.7999513
R 平方结果为0.7999513 。也就是说,最好的模型能够解释训练数据响应值的79.99%的变化。
您可以在此处找到本示例中使用的完整 R 代码。