sci-kit中的规范化学习linear_models

时间:2015-10-20 20:33:23

标签: python scikit-learn normalization linear-regression

如果True中的任何线性模型中的归一化参数都设置为sklearn.linear_model,则在分数步骤中是否应用了归一化?

例如:

from sklearn import linear_model
from sklearn.datasets import load_boston

a = load_boston()

l = linear_model.ElasticNet(normalize=False)
l.fit(a["data"][:400], a["target"][:400])
print l.score(a["data"][400:], a["target"][400:])
# 0.24192774524694727

l = linear_model.ElasticNet(normalize=True)
l.fit(a["data"][:400], a["target"][:400])
print l.score(a["data"][400:], a["target"][400:])
# -2.6177006348389167

在这种情况下,当我们设置normalize=True时,我们会看到预测能力下降,我无法判断这是否只是score函数未应用规范化的工件,或者标准化值导致model性能下降。

3 个答案:

答案 0 :(得分:5)

标准化确实适用于拟合数据和预测数据。您看到如此不同结果的原因是Boston House Price数据集中列的范围差异很大:

>>> from sklearn.datasets import load_boston
>>> boston = load_boston()
>>> boston.data.std(0)
array([  8.58828355e+00,   2.32993957e+01,   6.85357058e+00,
         2.53742935e-01,   1.15763115e-01,   7.01922514e-01,
         2.81210326e+01,   2.10362836e+00,   8.69865112e+00,
         1.68370495e+02,   2.16280519e+00,   9.12046075e+01,
         7.13400164e+00])

这意味着ElasticNet中的正则化项对归一化与非归一化数据的影响非常不同,这就是结果不同的原因。 您可以通过将正则化强度(alpha)设置为非常小的数字来确认这一点,例如1E-8。在这种情况下,正则化的影响非常小,归一化不再影响预测结果。

答案 1 :(得分:3)

@jakevdp已经正确地回答了这个问题,但是对于那些感兴趣的人来说,这是正确化应用规范化的证明:

from sklearn.preprocessing import Normalizer
from sklearn import linear_model
from sklearn.datasets import load_boston

a = load_boston()

n = Normalizer()

a["data"][:400] = n.fit_transform(a["data"][:400])
a["data"][400:] = n.transform(a["data"][400:])

l = linear_model.ElasticNet(normalize=False)
l.fit(a["data"][:400], a["target"][:400])
print l.score(a["data"][400:], a["target"][400:])
# -2.61770063484

从我原始问题的示例中,您可以看到适合预标准化数据的模型与具有Normalize=True的模型具有相同的分数(分数为-2.61770063484)。

答案 2 :(得分:0)

我发现此线程非常有用: Comparing Results from StandardScaler vs Normalizer in Linear Regression

请注意,@ mgoldwasser的“证明”具有误导性,并可能导致混淆。 normalize = True沿着列(轴= 0)进行归一化,即减去每列的均值和l2norm。 sklearn代码使用normalize()函数。 “证明”中使用的Normalizer()转换器是不同的,并且跨行操作,即,每行/样本除以其l2norm。 不幸的是,R2在上述两个实验中是相同的(-2.6177),因为在两种情况下,使用默认的alpha时,coef_最终都为零。设置alpha = 0,您将获得不同的结果。