Lasso regression(稀疏学习,R)

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

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

其实就是在普通回归的损失函数的基础上增加了个 β 的约束。那么 β 的约束为什么要使用这种形式,比如,下面形式这种约束也能使得 β 不是太大。
β2t
.
妙处就在这个地方,在第一范数的约束下,一部分回归系数刚好可以被约束为0.这样的话,就达到了特征选择的效果。至于为什么大家可以看看下图
Lasso regression(稀疏学习,R)_第2张图片
图中的红色线圈表示,损失函数的等值线,我们可以看到,第一范数约束下, β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         X6
1 14.9607083  1.5953295  2.9141118  2.9490906 2.3531784  1.0412069  0.8151355
2 -0.3579434 -0.5584693 -1.1981533  1.2275879 0.3332272  0.5569235 -1.9695117
3  0.8765146 -0.6689517  0.9050208  1.1657989 1.3203673 -0.7263651  0.3727694
4  1.8098995  0.2648723 -1.0164312 -0.2752811 1.6298845  0.5185340  0.4962158
5  3.0404683 -0.4606268  0.3767176  0.9498028 1.2291411  1.6759266 -1.6201224
6 -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 ‘ ’ 1

Residual standard error: 2.914 on 24 degrees of freedom
Multiple 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 ‘ ’ 1

Ridge parameter: 0.07890282, chosen automatically, computed using 5 PCs

Degrees 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 regression(稀疏学习,R)_第3张图片
下面继续

#查看模型详细信息 
summary(model.lasso)
LARS/LASSO
Call: lars(x = X, y = Y, type = "lasso")
  Df    Rss      Cp
0  1 980.27 84.1817
1  2 595.57 42.1569
2  3 371.22 18.4827
3  4 208.56  1.8672
4  5 205.15  3.4768
5  6 201.10  5.0131
6  7 200.98  7.0000
set.seed(12345)
#做交叉验证
CV.lasso <- cv.lars(X, Y, K=10)   

产生如下效果图
Lasso regression(稀疏学习,R)_第4张图片

(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可以用来选择资产组合。

你可能感兴趣的:(Lasso regression(稀疏学习,R))