使用glmnet包运行LASSO回归:

library(glmnet)
library(dplyr)
library(magrittr)
library(ggplot2)
x <- matrix(rnorm(100*20),100,20) # 自变量矩阵
y <- rnorm(100) #因变量矩阵
fit1 <- glmnet(x,y) # LASSO拟合
plot(fit1,xvar="lambda",label=T) # 回归系数随惩罚项收缩图
lasso.coef <- predict(fit1,type='coefficients',s=0.0656100)[1:20 ,] #提取特定lambda值的模型系数

coeffin <- lasso.coef %>%  # 整理数据
  as.data.frame() %>%
  rename('lasso.coef'='.') %>%
  mutate(name=rownames(.)) %>%
  filter(lasso.coef<20) 

ggplot(coeffin,aes(reorder(name,lasso.coef), # 画出lambda=0.06561时每个变量的系数
                   lasso.coef)) + 
  geom_point(size=1.5, color='red')+
  coord_flip()+
  labs(x='变量',y='LASSO回归系数') +
  theme_bw()

运行结果为:

lasso.png

lassocoef.png

那么图2 显示的系数可以看做各个变量对因变量预测的重要性吗? 因为LASSO事先对自变量进行了无量纲化,是否可以通过系数的比较将最后的结果看做变量的重要性?类似于决策树与随机森林等算法计算的变量重要性那样?

希望和大家讨论下对这个算法的理解。谢谢!

抛砖引玉 …… 我觉得系数和重要度从本质上没有什么关系。举个不恰当的例子,线性模型里,估计的系数更大,p值不一定更小,两者没有必然联系,虽然p值也并不代表变量重要度,但大概是这么个道理。

系数只是衡量了effect size的大小,而变量重要度更多得从这个变量对预测性能的影响大小来定义。线性模型里的系数更大,不代表对预测性能影响更大。

当然,为了定义变量重要度,很有可能需要用到系数,因为这涉及到做预测。

关于可解释的机器学习,变量重要度之类的,最近几年出来了一些不错的成体系的研究,比如 LIME 和 SHAP 之类。时代发展太快,跟不上形势了 …… 😅

    我印象中lasso是不太讨论系数显著性的,毕竟系数估计值是lambda的函数,中间还有个非枢轴量冗余参数的问题。
    既然只从预测效果来看的话,拿单位化后的变量系数大小来讲重要性(对预测的贡献),我觉得也可以接受。
    但是有两点可能要注意:
    1.单位化的过程中,自变量按自己的样本标准差进行了放缩,某自变量的lasso回归系数大,其本身标准差可能更大。
    2.老生常谈的共线性问题,两个自变量高度相关,其中一个在lasso结果中幸存下来了,那另一个必然希望不大。分割来看,二者的影响其实差别不会很大。

      nan.xiao 明白您的意思。但是首先变量被标准化后变得相互可比较了,是否能近似作为不同变量对于因变量变化大小的衡量?
      所以LASSO没有对应于决策树那样的(基于基尼系数的)变量重要性指标吗?还是这种指标在LASSO中被很少讨论?

        holydudu 如果有先验知识的话,group lasso是不是就是解决类似问题的 😅

        就问题而言要否定很容易,量刚就能说明。

        但是你的意思应该是:与因变量相关性大的自变量对因变量是不是更重要。

        我觉得也是否定的,因为我觉得重要性探讨更像是讨论因子的贡献度,而相关性更相似在讨论自变量和因变量的相关度,可能需要在某些条件下比较才会有意义;
        其次,就lasso法来说其相对与桥法更偏向让某个参数区域0,如果某个变量可以由其他变量表示时候,结果会不稳定,那么这时候好像也不好解释。

        暂时就想到这两点,忘大神指点!

        至于@nan.xiao#433867 从p值角度,我觉得不合适,因为p值是对该参数其是不是服从假设下应该服从的分布而言的,参数之间没有比较的意义。

        lasso是指L1 regression吧, 当自变量比较多的时候lasso可以让不重要的自变量系数变为0,所以用来做特征选择是没问题的。

        lasso就是在loss function里加了个lambda为系数惩罚项,用来限制模型参数绝对值之和,目标是降低模型复杂度,用模型的偏度(bias)增加换取散度(variance)的降低。
        lambda用来调节了这一限制的强度,你的图一里也可以看到随着lambda增加,不同自变量的系数先后归零,模型复杂度减小,而归零系数的先后顺序就反映了自变量相对的重要程度。所以用lasso做特征选择是没问题的。

        但是lasso回归系数(图1的y轴)有正有负,并不反映特征的重要性(虽然有点关系),要比较特征的重要性的话看图1的x轴就行,随lambda增大,系数比较晚归0的自变量比较重要。比如图一里前三重要的系数是v10, v14, v9,lasso回归系数有负有正

        参考
        https://towardsdatascience.com/l1-and-l2-regularization-methods-ce25e7fc831c

        songxiao 这事和对数据做不做标准化其实并没有什么联系哈。首先,lasso 中做标准化的根本原因是原作者发现这样干在一般情况下模型效果更好 …… 所以 glmnet 里默认设置了 standardize = TRUE,可以自己改成 FALSE。当然,做了标准化带来的一个「副作用」就是,估计的系数可能在一定条件下可以互相比较,避免了变量尺度的问题。即使尺度问题解决了,正如楼下所说的,系数的均值大了,方差也可能更大 …… 再有就是变量之间相关(共线性)可能导致的问题。这个帖子里举了一些明确的反例:https://stats.stackexchange.com/questions/202221/

        变量重要度基本上还是得通过对预测效果的影响来定义(虽然变量重要度本身也不是一个很严谨的概念)。

        从理念上说,相对于没有显式变量选择的模型(比如树模型),在 lasso 这类模型的语境下讨论变量重要度个人觉得意义不是很大。原因是,有显式变量选择的模型里最关心的问题是选还是不选,并且这些选中的变量必须组成一个集合一起作用才形成了这个模型,所以可以说只要是选中的变量都「重要」,而很难说哪个比另外一些个更重要或更不重要。如果哪个变量更「不重要」,那为什么要选中它呢 …… 一般是在没有显式变量选择的效果模型中,才会讨论是不是需要定义一个指标,来诊断下在这个模型里哪些变量对预测效果更「重要」一些。

          在线性、广义线性模型中见到的所谓变量重要性,要从两个方面来解读,一个是协变量和响应变量的相关程度(一般来说是线性相关程度),一个是指在均方误差最小的意义下,哪个协变量能使得 MSE 降得更多哪个更重要(比如同在一个 baseline 的模型基础上,比较两个协变量谁更重要),还有就是如果知道某个协变量对于响应变量是因果关系,那一般来说肯定很重要(感觉这是句废话)。

          在这里从系数显著性角度讨论重要程度,似乎应该使用统计功效而不是 P 值来衡量,就是分割来看,依次单独检验给定的协变量和响应变量的相关性显著的程度

          nan.xiao 可以解释一下您说的“有显式变量选择的模型”指什么吗?我认为决策树能够通过控制参数进行剪枝也算是一种“显式的”变量选择吧?

            songxiao 嗯,显式是说模型最后能够明确告诉用户哪些变量选入用在了模型里,哪些变量完全没有选入用在模型里,重点是能给出一个 binary 的决策。而其他方法,只要没有给出这种决策的,就不属于显式的变量选择,即使是在建模过程中通过某种方式(比如剪枝或者重抽样)尽量避免用到那些对性能帮助少的变量。