2015-10-20 80 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)的模型具有相同的分數。