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

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

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

如果我使用normalize选项,非零系数的数量会发生变化

In [74]: l = Lasso(alpha=alpha_perc70).fit(x_val, y_val)In [81]: sum(l.coef_!=0)Out[83]: 47In [84]: l2 = Lasso(alpha=alpha_perc70, normalize=True).fit(x_val, y_val)In [93]: sum(l2.coef_!=0)Out[95]: 3

在我看来,normalize似乎只是将每列的方差设置为1。这很奇怪,因为结果变化如此之大。我的数据已经是方差为1了。

那么normalize=T到底做了什么?


回答:

这是由于sklearn.linear_model.base.center_data中关于缩放概念的(或潜在的[1])不一致性造成的:如果normalize=True,那么它将除以设计矩阵每列的范数,而不是标准差。值得注意的是,从sklearn版本0.17开始,关键字normalize=True将被废弃。

解决方案:不要使用standardize=True。相反,构建一个sklearn.pipeline.Pipeline,并在你的Lasso对象前添加一个sklearn.preprocessing.StandardScaler。这样你甚至不需要进行初始缩放。

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

[1] 我所说的潜在不一致性,是因为normalizenorm(范数)这个词相关,因此至少在语言上是一致的:)

[如果你不想了解细节,请在此停止阅读]

以下是一些可复制粘贴的代码,用于重现问题

import numpy as nprng = np.random.RandomState(42)n_samples, n_features, n_active_vars = 20, 10, 5X = 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 Lassolasso1 = 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的lasso估计器,其惩罚按np.sqrt(n_samples)缩小,作用类似于一个normalize=False的lasso估计器(在你这种类型的数据上,即已经标准化为std=1)。

lasso3 = Lasso(alpha=.1 / np.sqrt(n_samples), normalize=True)print lasso3.fit(X, y).coef_  # 产生与lasso1.fit(X, y).coef_相同的系数

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注