第一范文网 - 专业文章范例文档资料分享平台

[原创]R语言多元线性回归模型:岭回归和Lasso回归案例分析报告附代码数据

来源:用户分享 时间:2025/11/4 7:33:14 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

【原创】附代码数据

有问题到淘宝找“大数据部落”就可以了

多元线性回归模型中,如果所有特征一起上,容易造成过拟合使测试数据误差方差过大;因此减少不必要的特征,简化模型是减小方差的一个重要步骤。除了直接对特征筛选,来也可以进行特征压缩,减少某些不重要的特征系数,系数压缩趋近于0就可以认为舍弃该特征。

岭回归(Ridge Regression)和Lasso回归是在普通最小二乘线性回归的基础上加上正则项以对参数进行压缩惩罚。 首先,对于普通的最小二乘线性回归,它的代价函数是:

线性回归RSS

通过拟合系数β来使RSS最小。方法很简单,求偏导利用线性代数解方程组即可。 根据线性代数的理论可知,只要样本量合适,它就存在唯一解,也就是该模型的最优解。

这么做尽管使RSS达到了最小,它还是把所有的特征看作同样重要的程度来求解,并没有做任何特征选择,因此存在过拟合的可能。

岭回归在OLS回归模型的RSS上加上了惩罚项(l2范数),这样代价函数就成为:

岭回归的代价函数

λ是一个非负的调节参数,可以看到:当λ=0时,此时它与RSS一致,没有起到任何惩罚作用;当λ -> ∞时,它的惩罚项也就是无穷大,而为了使代价函数最小,只能压缩系数β趋近于0。

但是因为λ不可能为无穷大,二次项求偏导时总会保留变量本身,所以事实上它也不可能真正地将某个特征压缩为0。尽管系数较小可以有效减小方差,但依然留着一大长串特征会使模型不便于解释。这是岭回归的缺点。 lasso回归的正项则就把二次项改成了一次绝对值(l1范数),具体为:

lasso回归的代价函数

一次项求导可以抹去变量本身,因此lasso回归的系数可以为0。这样可以起来真正的特征筛选效果。 无论对于岭回归还是lasso回归,本质都是通过调节λ来实现模型误差vs方差的平衡调整。

【原创】附代码数据

有问题到淘宝找“大数据部落”就可以了

训练构建岭回归模型

> library(ISLR) > Hitters = na.omit(Hitters) > x = model.matrix(Salary~., Hitters)[,-1] # 构建回归设计矩阵 > y = Hitters$Salary > > library(glmnet) > grid = 10^seq(10,-2,length = 100) # 生成100个λ值 > ridge.mod = glmnet(x,y,alpha = 0,lambda = grid) # alpha为0表示岭回归模型,为1表示lasso回归模型 > > dim(coef(ridge.mod)) # 20*100的系数矩阵。20是19个特征+截距项,100是λ值 [1] 20 100 > > # 显然可见l2范数越大,系数就越小 > ridge.mod$lambda[50] [1] 11497.57 > coef(ridge.mod)[,50] (Intercept) AtBat Hits HmRun Runs 407.356050200 0.036957182 0.138180344 0.524629976 0.230701523 RBI Walks Years CAtBat CHits 0.239841459 0.289618741 1.107702929 0.003131815 0.011653637 CHmRun CRuns CRBI CWalks LeagueN 0.087545670 0.023379882 0.024138320 0.025015421 0.085028114 DivisionW PutOuts Assists Errors NewLeagueN -6.215440973 0.016482577 0.002612988 -0.020502690 0.301433531 > ridge.mod$lambda[60] [1] 705.4802 > coef(ridge.mod)[,60]

【原创】附代码数据

有问题到淘宝找“大数据部落”就可以了 (Intercept) AtBat Hits HmRun Runs 54.32519950 0.11211115 0.65622409 1.17980910 0.93769713 RBI Walks Years CAtBat CHits 0.84718546 1.31987948 2.59640425 0.01083413 0.04674557 CHmRun CRuns CRBI CWalks LeagueN 0.33777318 0.09355528 0.09780402 0.07189612 13.68370191 DivisionW PutOuts Assists Errors NewLeagueN -54.65877750 0.11852289 0.01606037 -0.70358655 8.61181213 > > # 输入一个新的λ,比如50,来预测系数 > predict(ridge.mod,s=50,type=\)[1:20,] (Intercept) AtBat Hits HmRun Runs 4.876610e+01 -3.580999e-01 1.969359e+00 -1.278248e+00 1.145892e+00 RBI Walks Years CAtBat CHits 8.038292e-01 2.716186e+00 -6.218319e+00 5.447837e-03 1.064895e-01 CHmRun CRuns CRBI CWalks LeagueN 6.244860e-01 2.214985e-01 2.186914e-01 -1.500245e-01 4.592589e+01 DivisionW PutOuts Assists Errors NewLeagueN -1.182011e+02 2.502322e-01 1.215665e-01 -3.278600e+00 -9.496680e+00 > > # 划分训练集和测试集 > set.seed(1) > train = sample(1:nrow(x),nrow(x)/2) > test = (-train) > y.test = y[test] > > # 训练模型,并计算λ=4时的MSE

【原创】附代码数据

有问题到淘宝找“大数据部落”就可以了 > ridge.mod = glmnet(x[train,],y[train],alpha = 0,lambda = grid,thresh = 1e-12) > ridge.pred = predict(ridge.mod,s=4,newx = x[test,]) > mean((ridge.pred - y.test)^2) [1] 101036.8 > > # 增大λ为10的10^10,此时可视为各个特征都被压缩趋近为0,基本只剩截距项起作用 > ridge.pred = predict(ridge.mod,s=1e10,newx = x[test,]) > mean((ridge.pred - y.test)^2) # MSE更大 [1] 193253.1 > > # 计算当λ=0也就是不加惩罚的最小二乘回归 > ridge.pred = predict(ridge.mod,s=0,newx = x[test,]) > mean((ridge.pred - y.test)^2) # MSE减小 [1] 114723.6 > > ## 以上结果说明,如果λ选得不合适,结果不一定就比最小二乘回归模型更优。至于怎么选择λ,就用交叉验证法。 > > set.seed(1) > cv.out = cv.glmnet(x[train,],y[train],alpha=0) > plot(cv.out) > bestlam = cv.out$lambda.min > bestlam # MSE最小的λ约为212 [1] 211.7416 > > ridge.pred = predict(ridge.mod,s=bestlam,newx = x[test,]) > mean((ridge.pred - y.test)^2) # MSE减小 [1] 96015.51

【原创】附代码数据

有问题到淘宝找“大数据部落”就可以了 > > # 基于整个数据集构建岭回归模型 > out = glmnet(x,y,alpha = 0) > predict(out,type = \,s=bestlam)[1:20,] (Intercept) AtBat Hits HmRun Runs 9.88487157 0.03143991 1.00882875 0.13927624 1.11320781 RBI Walks Years CAtBat CHits 0.87318990 1.80410229 0.13074381 0.01113978 0.06489843 CHmRun CRuns CRBI CWalks LeagueN 0.45158546 0.12900049 0.13737712 0.02908572 27.18227535 DivisionW PutOuts Assists Errors NewLeagueN -91.63411299 0.19149252 0.04254536 -1.81244470 7.21208390 > > ## 可见岭回归模型还是19个特征,没有舍弃任何特征! cv.out的图如下:

cv.out

当log(λ)为5.+时(log(bestlam)=5.3),MSE最小。

训练构建lasso回归模型

[原创]R语言多元线性回归模型:岭回归和Lasso回归案例分析报告附代码数据.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c42jm73m4ix1h1yk7phhy1xkfw968dk01avw_1.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top