如果在sklearn.linear_model
中的任何线性模型中归一化参数设置为True
,则在评分步骤中是否应用归一化?
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
性能下降。
归一化确实适用于拟合数据和预测数据。您看到如此不同结果的原因是波士顿房价数据集中列的范围差异很大:
>>> 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
。在这种情况下,正则化的作用很小,并且不再影响预测结果。
@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)。