罚广义线性模型:LASSO vs 岭回归



  • 3 罚广义线性模型 51

    install.packages("lars")
    install.packages("ridge")
    

    (1) OLS回归

    library(ridge)
    data(GenCont)
    model.ols <- lm(Phenotypes ~ ., data = as.data.frame(GenCont))
    summary(model.ols)
    

    提取回归系数

    coef.ols <- coef(model.ols)
    

    查看不等于0的回归系数

    coef.ols[coef.ols!=0]  
    

    (2) ridge regression(岭回归)

    model.rid <- linearRidge(Phenotypes ~ ., seq(0, 10, length = 100), data = as.data.frame(GenCont))
    

    查看结果

    summary(model.rid)
    

    提取系数

    coef返回的是标准化系数; 直接输入model.rid返回的是原始数据系数
    coef.rid <- coef(model.rid)
    
    model.rid2 <- linearRidge(Phenotypes ~ ., data = as.data.frame(GenCont))
    summary(model.rid2)
    coef.rid <- coef(model.rid2)
    

    查看不等于0的系数

    coef.rid[coef.rid!=0]                           
    

    (3) 做 lasso regression

    模型设定

    library(lars)
    dt<-as.matrix(GenCont)
    X<-dt[,-1]
    Y<-dt[,1]
    model.lasso1 <- lars(X, Y)    
    model.lasso2 <- lars(X, Y, type='lasso') 
    model.lasso3 <- lars(X, Y, type='for')  # Can use abbreviations
    

    看变量选入顺序

    model.lasso3
    summary(model.lasso3)
    

    Cp的含义:衡量多重共线性,其取值越小越好,这里取到第3步使得Cp值最小

    画个图

    plot(model.lasso3)
    set.seed(12345)
    

    做交叉验证

    CV.lasso <- cv.lars(X, Y, K=10)   
    
    (best <- CV.lasso$index[which.min(CV.lasso$cv)])
    

    选择最好的效果

    (coef.lasso <- coef.lars(model.lasso3, mode='fraction', s=best))
    

    命名

    names(coef.lasso) <- colnames(dt)[-1]
    

    查看结果

    coef.lasso[coef.lasso!=0]
    


    1. 为什么用Penalized regression而不是普通的OLS回归?它究竟有什么好处?
    2. Lasso regression和ridge regression有什么区别?

    用罚回归(Penalized regression)的原因

    罚回归主要用来解决两个问题:一个是过拟合(over fitting),一个是特征(feature)的多重共线性。

    普通的OLS模型如下所示:
    $y = \beta_0 + \beta_1 \times x_1 + \beta_2 \times x_2 + ... \beta_n \times x_n +e$

    其中

    • $y$是因变量(dependent variable)
    • $x_i$ $i=1,2,...n$ 是自变量
    • $\beta_i$ $i=0,1,2,...n$ 是系数
    • e 是残差项

    OLS算法要做小化残差平方和 $\sum_{i=1}^{i=n}(y-\hat{y})^2$,这个函数也可以看作OLS的损失函数(loss function)

    过拟合

    但是这个模型可能有过拟合的问题,过拟合就意味着一些特征是不需要的。因此,需要把一些特征剔除或者让它们的系数越小越好。

    因此,如果能够在原本的损失函数(loss function)的基础上,加上一个惩罚项$f(\beta)$,使得这个损失函数能够随着$\beta$的增加而增加就好了。

    罚回归和普通回归最大的区别就是在损失函数上加上了惩罚项。

    多重共线性

    罚回归可以解决多重共线性的问题。

    Lasso regression和Ridge regression

    Lasso regression和Ridge regression的区别在于它们对于惩罚项的定义不同。
    Lasso regression用的是l1-norm,Ridge regression用的是l2-norm。
    l1-norm是$\beta$绝对值的和,l2-norm是$\beta$的平方和。用公式写出来的话,就是

    • l1-norm: $f(\beta) = ||\beta||_1 = \sum|\beta|$

    • l2-norm $f(\beta) = ||\beta||_2^2 = \sum\beta^2$

    所以Lasso和Ridge的损失函数分别是
    $\sum_{i=1}^{i=n}(y-\hat{y})^2 + \lambda \sum|\beta|$

    $\sum_{i=1}^{i=n}(y-\hat{y})^2 + \lambda \sum\beta^2$

    $\lambda$参数代表惩罚程度的高低。

    • 当$\lambda$过高时,最后得到的模型就会过于简单。
    • 当$\lambda$过低时,最后得到的模型就会过于复杂,相当于没有解决过拟合问题。

    Lasso和Ridge在实践过程中最大的区别是:Lasso求得的损失函数最小值点会让一些$\beta$系数直接变成0,然而Ridge求得的损失函数最小值点虽然会让一些$\beta$系数变得很小,但是一般不会减小到0。

    因此Lasso回归还有选择特征的作用。当特征很多时,Lasso回归的表现往往更好。

    但是Lasso在两种情况下表现较差:

    • 特征很多,观测值(observations)很少的时候。极端情况下是观测值小于特征数。此时,Lasso回归选择的参数不会多于观测值的个数。
    • 变量高度相关的时候,Lasso只会选择高度相关变量中的一个而忽略其它变量。

    Elastic Net

    为了解决Lasso和Ridge回归的缺点,可以使用Elastic Net回归,Elastic net结合了Lasso和Ridge两者的惩罚项。

    Elastic net的惩罚项是:
    $f(\beta) = \lambda_1 ||\beta||_1 + \lambda_2 ||\beta||_2^2$

    • 当$\lambda_1 = \lambda, \lambda_2 =0的时候,它是Lasso 回归$
    • 当$\lambda_2 = \lambda, \lambda_1 =0的时候,它是Ridge 回归$

    参考文献:
    https://en.wikipedia.org/wiki/Elastic_net_regularization



  • 为什么用Penalized regression前需要对变量做标准化(standardization)

    惩罚项是不对任何参数区别对待的。但是当一个变量取不同的量纲时,其参数的估计值自然也不一样。在这种情况下,惩罚项就会更多的“惩罚”大参数。

    为了避免这种情况,需要对变量进行标准化,让它们有相同的量纲。

    这里介绍两种标准化的方法,分别对应sklearn包中的StandardScaler和MaxminScaler

    1. StandardScaler:变量减去均值除以标准差。用Standard Scaler还有能够简化计算的优点。

    2. MaxminScaler:有时也叫做Normalization(注:这个词有多重意思)。把变量缩小到0和1之间。

    用哪种最好目前说法不一。实际操作中最好两者都进行尝试。根据结果选择最好的方法。



  • 感谢老师!我加一点理论知识,有时间把相对应的python代码传上来。



  • 为什么penalized regression可以解决多重共线问题我还没有想明白,欢迎大家补充



  • Ridge罚回归的贝叶斯解释: Bayesian interpretation of regularization

    普通OLS回顾

    对于普通的OLS回归,当假设残差项为正态分布时,我们可以把它算作MLE(Maximum likelihood regression)

    $y = \beta_0 + \beta_1 \times x_1 + \beta_2 \times x_2 + ... \beta_n \times x_n +e$

    ($\beta_0 + \beta_1 \times x_1 + \beta_2 \times x_2 + ... \beta_n \times x_n$用向量表示的话就是 $X\beta$)

    $\text{Likelihood}: L(\beta|X) = p(Y|X, \beta)$

    MLE的任务就是要最大化likelihood。

    因为$e\text{服从} N(0, \sigma_e^2)$, 所以
    $y \text{服从} N(X\beta, \sigma_e^2 I)$

    因此, likelihood 可以表示为

    $\text{Likelihood} ~ N(X\beta, \sigma_e^2 I) \propto exp(-\frac{1}{2\sigma_e^2}||Y-X\beta||^2)$

    所以得出结论:需要找到让$||Y-X\beta||^2$最小的$\beta$

    罚回归

    这里要引入MAP的概念(maximum a posteriori estimate),是指最大化后验分布概率

    罚回归相当于我们假设$\beta$的先验分布是正态分布$N(0, \tau^2 I)$其中$\tau$是未知常量

    根据贝叶斯公式,可以得到

    $p(\beta|X,Y) \propto p(Y|X, \beta) p(\beta)$

    $\text{Likelihood} \propto exp(-\frac{1}{2\sigma_e^2}||Y-X\beta||^2) \times exp(-\frac{1}{2\tau^2}||\beta||_2^2)$

    最大化likelihood就是最小化$||Y-X\beta||^2+\frac{\sigma_e^2}{\tau^2}||\beta||_2^2$

    其中$\frac{\sigma_e^2}{\tau^2}$就是参数$lambda$


Log in to reply