R语言:岭回归和LASSO回归

一、实验说明

岭回归和LASSO回归的原理就是在线性回归的基础上添加了2范数和1范数的惩罚项。这两个模型的关键点是找到一个合理的lambda系数,来平衡模型 的方差和偏差,从而得到比较符合实际的回归系数。

二、实验过程

1. 数据预处理/数据清洗

加载相关数据包:

install.packages("caret")
library(caret)
library(glmnet)
install.packages("ISLR")
library(ISLR)

处理哑变量:

dummies <- dummyVars(~League+Division+NewLeague, data = Hitters)
dummies <- predict(dummies, newdata = Hitters)

将原数据集与哑变量数据合并:

Hitters_dummy <- cbind(Hitters, dummies)

删除缺失值:

Hitters_dummy <- na.omit(Hitters_dummy)

删除无关变量:

Hitters_dummy <- subset(Hitters_dummy, 
                       select = -c(League,Division,NewLeague,League.N,Division.W,NewLeague.N))

然后就可以基于清洗过后的数据集进行建模。 在建立模型之前将数据拆分为训练集和测试集:

set.seed(1)
index <- sample(1:nrow(Hitters_dummy), size = 0.8*nrow(Hitters_dummy))
train <- Hitters_dummy[index,]
test <- Hitters_dummy[-index,]

2.岭回归

2.1确定lambda值

岭回归系数会随着lambda的变化而变化,为保证选择出最佳的岭回归系数,有以下三种方式确定这个lambda值。 (1)绘制不同的lambda值与对应beta值之间的折线图,寻找使得岭回归系数趋于稳定的lambda值,同时与OLS相比,得到的回归系数更符合实际意义; (2)方差膨胀因子法:选择一个lambda 值,使得所有方差膨胀因子均不超过10; (3)lambda值的增大会使残差平方和变大,需要选择一个lambda值使得残差平方和趋于稳定。 这里我们通过不确定的alpha值,生成不同的岭回归模型:

fit_ridge <-  glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 0)
plot(fit_ridge,xvar = lambda,label = T)

接下来我们再使用交叉验证来确定最佳的lambda。

fit_ridge_cv <- cv.glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 0)
best_lambda_ridge <- fit_ridge_cv$lambda.min
best_lambda_ridge

交叉验证的结果表示,选取的最佳lambda值是25.21039。

2.2建立岭回归模型

根据最佳lambda构建岭回归模型

fit_ridge <- glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 0)
coeff_ridge <- predict(fit_ridge, s = best_lambda_ridge, type = coefficients)
coeff_ridge

2.3模型评估

pred_ridge <- predict(fit_ridge, s = best_lambda_ridge, newx = as.matrix(test[,-17]))
RMSE <- sqrt(mean((test$Salary-pred_ridge)**2))
RMSE

得到的RMSE为268.7117。

3.LASSO回归

3.1确定lambda值

通过不确定的alpha值,生成不同的LASSO回归模型:

fit_lasso <-  glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 1)
plot(fit_lasso,xvar = lambda,label = T)

从图形结果来看,alpha在 附近时,所有LASSO系数基本趋于稳定,但不能完全确定。接下来我们再使用交叉验证来确定最佳的lambda。

fit_lasso_cv <- cv.glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 1)
best_lambda_lasso <- fit_lasso_cv$lambda.min
best_lambda_lasso

交叉验证的结果表示,选取的最佳lambda值是2.64。

3.2建立LASSO回归模型

根据最佳lambda构建岭回归模型

fit_lasso <- glmnet(x = as.matrix(train[,-17]), y = train[,17], alpha = 1)
coeff_lasso <- predict(fit_lasso, s = best_lambda_lasso, type = coefficients)
coeff_lasso

3.3模型评估

pred_lasso <- predict(fit_lasso, s = best_lambda_lasso, newx = as.matrix(test[,-17]))
RMSE <- sqrt(mean((test$Salary-pred_lasso)**2))
RMSE

得到的RMSE为262.5091,比岭回归模型的RMSE要小,说明LASSO回归对于该数据的拟合效果更好。

经验分享 程序员 微信小程序 职场和发展