Lasso regression(稀疏学习,R)
来源:互联网 发布:公孙止 知乎 编辑:程序博客网 时间:2024/05/17 20:08
这一讲呢,给大家讲解一下lasso回归。目前这个方法还没有一个正规的中文名,如果从lasso这个单词讲的话,叫套索。那么套索是啥呢,就是套马脖子的东西,见下图:
就是拿这个东西把动物脖子套住,不要它随便跑。lasso 回归就是这个意思,就是让回归系数不要太大,以免造成过度拟合(overfitting)。所以呢,lasso regression是个啥呢,就是一个回归,并且回归系数不要太大。这个思想如果拿数学语言表达的话,就是下面的样子
其实就是在普通回归的损失函数的基础上增加了个
妙处就在这个地方,在第一范数的约束下,一部分回归系数刚好可以被约束为0.这样的话,就达到了特征选择的效果。至于为什么大家可以看看下图
图中的红色线圈表示,损失函数的等值线,我们可以看到,第一范数约束下,
既然lasso回归可以看成是约束优化问题,因此可以进行求解了。实际上lasso回归的意义远不止这个,lasso回归可以适应的情况是:样本量比较小,但是指标非常多,即小N大P问题。适用于高维统计,传统的方法无法应对这样的数据。并且lasso可以进行特征选择。现在的话,lasso家族已经发展出好多模型了,这个模型是由1996年Robert Tibshirani提出的。他和斯坦福的Bradley Efron等几个人,厉害的不得了,见证了整个统计学在计算机学科的影响下发展。
基于R的lasso回归
为什么要拿R做lasso,因为斯坦福统计系的几位大师最早都是拿R开发了几个lasso包。我们最好还是用R,毕竟是大师写的包。为了对比,我们做三个回归,一个是传统的均值回归,一个是ridge regression,一个是lasso回归,我们看看效果如何。
rm(list=ls())dat<-read.csv("D:/Rdata/lasso_dat.csv")head(dat) Y X1 X2 X3 X4 X5 X61 14.9607083 1.5953295 2.9141118 2.9490906 2.3531784 1.0412069 0.81513552 -0.3579434 -0.5584693 -1.1981533 1.2275879 0.3332272 0.5569235 -1.96951173 0.8765146 -0.6689517 0.9050208 1.1657989 1.3203673 -0.7263651 0.37276944 1.8098995 0.2648723 -1.0164312 -0.2752811 1.6298845 0.5185340 0.49621585 3.0404683 -0.4606268 0.3767176 0.9498028 1.2291411 1.6759266 -1.62012246 -4.4359221 -0.1008654 -0.9888361 0.4612514 1.1799055 -0.6183934 -1.7610674#下面做三个回归# (1) 最小二乘回归model.ols <- lm(Y~.-1, data=dat)summary(model.ols)Call:lm(formula = Y ~ . - 1, data = dat)Residuals: Min 1Q Median 3Q Max -4.3885 -1.1771 0.6464 1.9832 6.4057 Coefficients: Estimate Std. Error t value Pr(>|t|) X1 3.61142 0.63931 5.649 8.13e-06 ***X2 1.68079 0.64137 2.621 0.0150 * X3 -0.33011 0.63780 -0.518 0.6095 X4 1.33792 0.76541 1.748 0.0933 . X5 0.08907 0.81004 0.110 0.9134 X6 -0.34500 0.52378 -0.659 0.5164 ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 2.914 on 24 degrees of freedomMultiple R-squared: 0.8087, Adjusted R-squared: 0.7608 F-statistic: 16.91 on 6 and 24 DF, p-value: 1.485e-07#提取回归系数coef.ols <- coef(model.ols)#查看不等于0的回归系数coef.ols[coef.ols!=0] X1 X2 X3 X4 X5 X6 3.61141743 1.68079404 -0.33010639 1.33792406 0.08907369 -0.34499781 # (2) ridge regression(岭回归)model.rid <- linearRidge(Y~.-1, data=dat)#查看结果summary(model.rid)Call:linearRidge(formula = Y ~ . - 1, data = dat)Coefficients: Estimate Scaled estimate Std. Error (scaled) t value (scaled) Pr(>|t|) X1 3.34326 18.15297 3.02490 6.001 1.96e-09 ***X2 1.55602 9.33877 3.24737 2.876 0.00403 ** X3 -0.16886 -1.14619 3.43476 0.334 0.73860 X4 1.18625 6.86298 3.47735 1.974 0.04842 * X5 0.01244 0.05443 3.09414 0.018 0.98596 X6 -0.22464 -1.33800 2.84413 0.470 0.63804 ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Ridge parameter: 0.07890282, chosen automatically, computed using 5 PCsDegrees of freedom: model 5.315 , variance 4.744 , residual 5.886 #提取系数coef.rid <- coef(model.rid)#查看不等于0的系数coef.rid[coef.rid!=0] X1 X2 X3 X4 X5 X6 3.34325841 1.55601878 -0.16886083 1.18625138 0.01243652 -0.22464097 # (3) 做 lasso regression#模型设定model.lasso <- lars(X, Y, type='lasso') #画个图 plot(model.lasso)
下面继续
#查看模型详细信息 summary(model.lasso)LARS/LASSOCall: lars(x = X, y = Y, type = "lasso") Df Rss Cp0 1 980.27 84.18171 2 595.57 42.15692 3 371.22 18.48273 4 208.56 1.86724 5 205.15 3.47685 6 201.10 5.01316 7 200.98 7.0000set.seed(12345)#做交叉验证CV.lasso <- cv.lars(X, Y, K=10)
产生如下效果图
(best <- CV.lasso$index[which.min(CV.lasso$cv)]) 0.6969697#选择最好的效果(coef.lasso <- coef.lars(model.lasso, mode='fraction', s=best))#命名names(coef.lasso) <- colnames(dat)[-1]#查看结果coef.lasso[coef.lasso!=0] X1 X2 X4 3.213401 1.231145 0.741892
结论
通过上面的实验,我们可以看到,传统线性回归,岭回归都没有把一部分回归系数约束为0,只有lasso 回归做到了。实际上,这个只是一个很简单的例子,在实际当中,lasso处理的数据往往是DNA数据,变量非常多,我们目的是通过lasso把对某种疾病有明显影响的DNA片段找出来。那么在这种情况下,传统回归不要说选择了,就是运行都无法运行了。因为维度太大,这个矩阵
阅读全文
0 0
- Lasso regression(稀疏学习,R)
- Lasso Regression
- Lasso Regression
- Lasso Regression
- Lasso Regression
- 机器学习方法:回归(二):稀疏与正则约束ridge regression,Lasso
- 机器学习方法:回归(二):稀疏与正则约束ridge regression,Lasso
- 机器学习方法:回归(二):稀疏与正则约束ridge regression,Lasso
- 机器学习方法:回归(二):稀疏与正则约束ridge regression,Lasso
- 机器学习方法:回归(二):稀疏与正则约束ridge regression,Lasso
- Lasso regression 和 Ridge Regression
- python机器学习库scikit-learn: Lasso Regression
- Ridge Lasso Regression
- Week5 Lasso Regression
- Ridge Regression岭回归,lasso
- Lasso学习
- [R] ADMM for lasso
- 机器学习基础(三十一)—— 岭回归(Ridge Regression)到 LASSO
- 捋一下最近做的东西
- 机器学习中的范数规则化之(一)L0、L1与L2范数
- 【MATLAB入门】半波整流和全波整流
- 自定义View 波浪
- IO操作-BufferedInputStream,InputStreamReader,DataInputStream基本演示
- Lasso regression(稀疏学习,R)
- 循环外定义count=0,循环执行count=count++后,输出count仍是0
- 静态资源版本化
- 【Java】基本类型之short(四)
- 统计学习方法 李航---第1章 统计学习方法概论
- 数据挖掘学习------------------3-数据回归方法-1-一元回归
- 梯度下降(Gradient Descent)小结
- git git extension操作
- ARM中MMU地址转换理解