scikit 中的归一化学习 linear_model

Posted

技术标签:

【中文标题】scikit 中的归一化学习 linear_model【英文标题】:Normalization in sci-kit learn linear_models 【发布时间】:2016-01-19 16:23:39 【问题描述】:

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

【问题讨论】:

IIRC 此选项已弃用,应使用sklearn.preprocessing 中的工具进行标准化,例如sklearn.preprocessing.StandardScalersklearn.preprocessing.Normalizer 【参考方案1】:

归一化确实适用于拟合数据和预测数据。您看到如此不同结果的原因是波士顿房价数据集中的列范围变化很​​大:

>>> 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。在这种情况下,正则化的作用很​​小,并且不再影响预测结果。

【讨论】:

【参考方案2】:

@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)。

【讨论】:

以上是关于scikit 中的归一化学习 linear_model的主要内容,如果未能解决你的问题,请参考以下文章

层归一化和批次归一化学习

MATLAB中神经网络建模中的归一化和非归一化

R中的归一化函数

SVM 分类 - R 中的归一化

人工神经网络中的归一化

变异位点的归一化(normalization of indel)