【发布时间】:2014-07-28 16:34:49
【问题描述】:
我有一个矩阵,其中每列的平均值为 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
如果我使用归一化选项,非 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 实际上做了什么?
【问题讨论】:
-
使用
==比较浮点数不是一个好主意。最好检查从 0 到非常小的数字的绝对差,例如 1e-10。你能用abs做同样的实验吗? -
问题是真实存在的,请参见下面的示例。不过,我不完全确定它的确切来源。这很有趣 - 特别是因为我刚刚发现某处必须进行一些额外的重新缩放,因为
alpha_max = np.abs(X.T.dot(y)).max()不是零解惩罚集的严格下限。 -
@eickenberg 如果我设置 normalize=False,你能确认套索工作正常吗?
-
我更新了我的答案 - 这是一个缩放问题。我稍后会详细说明。
-
是的,套索很好用。坚持
normalize=False并在Pipeline中使用StandardScaler,如下所述。请注意,最大惩罚公式还包含一个缩放项(在下面的注释中描述)。
标签: python machine-learning scikit-learn lasso-regression