2015-10-20 53 views
3

如果在sklearn.linear_model中的任何线性模型中将标准化参数设置为True,是否在分数步骤期间应用标准化?sci-kit中的标准化学习linear_models

例如:

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性能下降。

+0

IIRC此选项已弃用,应使用'sklearn.preprocessing'中的工具进行标准化。 'sklearn.preprocessing.StandardScaler'或'sklearn.preprocessing.Normalizer' – eickenberg

回答

3

规范化确实适用于拟合数据和预测数据。你看到了这些不同结果的原因是,在波士顿的房价数据集列的范围变化很​​大:

>>> 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正规化方面对标准化VS非标准化数据非常不同的效果,这就是结果不同的原因。 您可以通过将正则化强度(alpha)设置为非常小的数字(例如, 1E-8。在这种情况下,正则化的影响非常小,归一化不再影响预测结果。

1

@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)的模型具有相同的分数。