Lasso sklearn中的normalize = True选项有什么作用?



我有一个矩阵,其中每列的平均值为0,标准差为1

In [67]: x_val.std(axis=0).min()
Out[70]: 0.99999999999999922
In [71]: x_val.std(axis=0).max()
Out[71]: 1.0000000000000007
In [72]: x_val.mean(axis=0).max()
Out[72]: 1.1990408665951691e-16
In [73]: x_val.mean(axis=0).min()
Out[73]: -9.7144514654701197e-17

如果我使用normalize选项

,则非0系数的数量会发生变化
In [74]: l = Lasso(alpha=alpha_perc70).fit(x_val, y_val)
In [81]: sum(l.coef_!=0)
Out[83]: 47
In [84]: l2 = Lasso(alpha=alpha_perc70, normalize=True).fit(x_val, y_val)
In [93]: sum(l2.coef_!=0)
Out[95]: 3

在我看来,规范化只是将每列的方差设置为1。奇怪的是,结果变化如此之大。我的数据已经有方差=1。

那么normalize=T实际上是做什么的呢?

这是由于sklearn.linear_model.base.center_data中缩放概念的不一致(或潜在的[1]):如果normalize=True,则它将除以设计矩阵每列的范数,而不是标准差。为了它的价值,关键字normalize=True将从sklearn 0.17版本中弃用。

<<p> 解决方案/strong>:做不是 standardize=True使用。相反,构建sklearn.pipeline.Pipeline并在Lasso对象之前添加sklearn.preprocessing.StandardScaler。这样,您甚至不需要执行初始缩放。

请注意,Lasso的sklearn实现中的数据丢失项按n_samples缩放。因此,产生零解的最小惩罚是alpha_max = np.abs(X.T.dot(y)).max() / n_samples(对于normalize=False)。

[1]我说potential inconsistent,因为normalizenorm这个词相关,因此至少在语言上是一致的:)

这里有一些复制和粘贴的代码再现了这个问题

import numpy as np
rng = np.random.RandomState(42)
n_samples, n_features, n_active_vars = 20, 10, 5
X = rng.randn(n_samples, n_features)
X = ((X - X.mean(0)) / X.std(0))
beta = rng.randn(n_features)
beta[rng.permutation(n_features)[:n_active_vars]] = 0.
y = X.dot(beta)
print X.std(0)
print X.mean(0)
from sklearn.linear_model import Lasso
lasso1 = Lasso(alpha=.1)
print lasso1.fit(X, y).coef_
lasso2 = Lasso(alpha=.1, normalize=True)
print lasso2.fit(X, y).coef_

为了理解发生了什么,现在观察

lasso1.fit(X / np.sqrt(n_samples), y).coef_ / np.sqrt(n_samples)

等于

lasso2.fit(X, y).coef_

因此,缩放设计矩阵并通过np.sqrt(n_samples)适当地重新缩放系数将一个模型转换为另一个模型。这也可以通过惩罚来实现:使用normalize=True的套索估计器,其惩罚按np.sqrt(n_samples)的比例缩小,就像使用normalize=False的套索估计器一样(基于您的数据类型,即已经标准化为std=1)。

lasso3 = Lasso(alpha=.1 / np.sqrt(n_samples), normalize=True)
print lasso3.fit(X, y).coef_  # yields the same coefficients as lasso1.fit(X, y).coef_

我认为上面的答案是错误的…

在Lasso中,如果您设置normalize=True,则在拟合Lasso回归之前,每列将被其L2范数(即sd*sqrt(n))除。设计矩阵的大小因此被减小,并且"预期的"。系数将被放大。系数越大,L1惩罚就越强。因此,函数必须更加注意L1惩罚,并使更多的特征为0。结果,您将看到更多的稀疏特征(β=0)。

相关内容

  • 没有找到相关文章

最新更新