Lasso regression(稀疏学习,R)

来源:互联网 发布:公孙止 知乎 编辑:程序博客网 时间:2024/05/17 20:08

这一讲呢,给大家讲解一下lasso回归。目前这个方法还没有一个正规的中文名,如果从lasso这个单词讲的话,叫套索。那么套索是啥呢,就是套马脖子的东西,见下图:
套索
就是拿这个东西把动物脖子套住,不要它随便跑。lasso 回归就是这个意思,就是让回归系数不要太大,以免造成过度拟合(overfitting)。所以呢,lasso regression是个啥呢,就是一个回归,并且回归系数不要太大。这个思想如果拿数学语言表达的话,就是下面的样子

minmizeβ0R,βRp1ni=1n(yiβ0xTiβ)2  subject  to  β1t

其实就是在普通回归的损失函数的基础上增加了个β的约束。那么β的约束为什么要使用这种形式,比如,下面形式这种约束也能使得β不是太大。
β2t
.
妙处就在这个地方,在第一范数的约束下,一部分回归系数刚好可以被约束为0.这样的话,就达到了特征选择的效果。至于为什么大家可以看看下图
范数
图中的红色线圈表示,损失函数的等值线,我们可以看到,第一范数约束下,β1可以被约束成0。而右边第二范式约束下,β1可以被约束的接近0.但是没有达到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)             

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片段找出来。那么在这种情况下,传统回归不要说选择了,就是运行都无法运行了。因为维度太大,这个矩阵XTX是不可逆了。如果用ridge regression也不行。lasso是我们最佳选择,在金融当中,lasso可以用来选择资产组合。

原创粉丝点击