You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sklearn中LassoLarsIC与Lasso同alpha结果不一致问题问询

问题

在使用sklearn的LASSO相关函数时发现:理论上基于BIC调参的linear_model.LassoLarsIC仅调整alpha,其结果应与使用该最优alpha的linear_model.Lasso一致,但实际实验中两者系数存在明显差异。

实验的DGP设置如下:

################## DGP ##################
np.random.seed(10)
T = 200     # 样本量
p = 100     # 自变量个数
X = np.random.normal(size = (T, p))
u = np.random.normal(size = T)
beta = np.hstack((np.array([5, 0, 3, 0, 1, 0, 0, 0, 0, 0]), np.zeros(p-10)))
y = np.dot(X, beta) + u

先使用LassoLarsIC(BIC准则)训练:

# LASSO with BIC
lasso = linear_model.LassoLarsIC(criterion='bic')
lasso.fit(X,y)
print("lasso coef = \n {}".format(lasso.coef_))
print("lasso optimal alpha = {}".format(lasso.alpha_))

得到结果:

lasso coef = 
 [ 4.81934044  0.          2.87574831  0.          0.90031582  0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.01705965  0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.          0.
 -0.07789506  0.          0.05817856  0.          0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.        ]
lasso optimal alpha = 0.010764484244859006

接着使用该最优alpha训练Lasso:

# LASSO with fixed alpha
clf = linear_model.Lasso(alpha=lasso.alpha_)
clf.fit(X,y)
print("lasso coef = \n {}".format(clf.coef_))

得到结果:

lasso coef = 
 [ 4.93513468e+00  5.42491624e-02  3.00412571e+00 -3.83394653e-02
  9.87262697e-01  5.21693412e-03 -2.89977454e-02 -1.40952930e-01
  5.18653123e-02 -7.66271662e-02 -1.99074552e-02  2.72228580e-02
 -1.01217167e-01 -4.69445223e-02  1.74378470e-01  2.52655725e-02
  1.84902632e-02 -7.11030674e-02 -4.15940817e-03  1.98229236e-02
 -8.81779536e-02 -3.59094431e-02  5.53212537e-03  9.23031418e-02
  1.21577471e-01 -4.73932893e-03  5.15459727e-02  4.17136419e-02
  4.49561794e-02 -4.74874460e-03  0.00000000e+00 -3.56968194e-02
 -4.43094631e-02  0.00000000e+00  1.00390051e-03  7.17980301e-02
 -7.39058574e-02  1.73139031e-02  7.88996602e-02  1.04325618e-01
 -4.10356303e-02  5.94564069e-02  0.00000000e+00  9.28354383e-02
  0.00000000e+00  4.57453873e-02  0.00000000e+00  0.00000000e+00
 -1.94113178e-02  1.97056365e-02 -1.17381604e-01  5.13943798e-02
  2.11245596e-01  4.24124220e-02  1.16573094e-01  1.19551223e-02
 -0.00000000e+00 -0.00000000e+00 -8.35210244e-02 -8.29230887e-02
 -3.16409003e-02  8.43274240e-02 -2.90949577e-02 -0.00000000e+00
  1.24697858e-01 -3.07120380e-02 -4.34558350e-02 -0.00000000e+00
  1.30491858e-01 -2.04573808e-02  6.72141775e-02 -6.85563204e-02
  5.64781612e-02 -7.43380132e-02  1.88610065e-01 -5.53155313e-04
  0.00000000e+00  2.43191722e-02  9.10973250e-02 -4.49945551e-02
  3.36006276e-02 -0.00000000e+00 -3.85862475e-02 -9.63711465e-02
 -2.07015665e-01  8.67164869e-02  1.30776709e-01 -0.00000000e+00
  5.42630086e-02 -1.44763258e-01 -0.00000000e+00 -3.29485283e-02
 -2.35245212e-02 -6.19975427e-02 -8.83892134e-03 -1.60523703e-01
  9.63008989e-02 -1.06953313e-01  4.60206741e-02  6.02880434e-02]

可见两者系数差异明显,请问原因是什么?

原因分析

出现这种差异的核心原因有两个:

  1. 正则化参数alpha的尺度定义不同
    sklearn中LassoLarsIC(基于LARS算法)和Lasso(默认基于坐标下降法)的alpha参数对应不同的损失函数尺度:

    • LassoLarsIC的损失函数为:$||y - Xw||_2^2 + \lambda ||w||_1$,这里的alpha_就是公式中的$\lambda$,是基于原始数据未做样本量缩放的正则化权重。
    • Lasso的损失函数为:$\frac{1}{2n_{samples}} ||y - Xw||2^2 + \alpha ||w||1$,这里的alpha是经过样本量$n{samples}$缩放后的正则化权重。
      两者的转换关系为:Lasso.alpha = LassoLarsIC.alpha_ / (2 * n_samples)。在本次实验中,$n
      {samples}=200$,所以正确的Lasso alpha应该是$0.01076 / (2*200) ≈ 2.69e-5$,而非直接使用lasso.alpha_。
  2. 求解算法的数值差异

    • LassoLarsIC使用LARS(最小角回归)算法,该算法沿着系数的有效路径逐步迭代,天然具有稀疏性,在筛选特征时更直接。
    • Lasso默认使用坐标下降法,通过循环更新每个系数来收敛,在alpha较小时,可能会因收敛精度、迭代次数设置等因素,保留更多非零小系数。
      两种算法的数值收敛特性不同,即使使用了正确转换后的alpha,也可能存在细微差异,但不会像当前实验中这样显著。

内容的提问来源于stack exchange,提问作者Michael cy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:42:06