python sklearn岭回归归一化

时间:2018-06-07 18:27:34

标签: python machine-learning scikit-learn linear-regression normalize

我生成一个简单的线性模型,其中X(维度D)变量来自具有0协方差的多正态。只有前10个变量的真系数为1,其余的系数为0.因此,理论上,岭回归结果应该是真系数除以(1 + C),其中C是惩罚常数。

import numpy as np
from sklearn import linear_model
def generate_data(n):
    d = 100
    w = np.zeros(d)
    for i in range(0,10):
        w[i] = 1.0

    trainx = np.random.normal(size=(n,d))
    e = np.random.normal(size=(n))
    trainy = np.dot(trainx, w) + e

    return trainx, trainy

然后我用:

n = 200
x,y = generate_data(n)
regr = linear_model.Ridge(alpha=4,normalize=True)
regr.fit(x, y)
print(regr.coef_[0:20])

在normalize = True下,我得到前10个系数为真值1的20%(即1 /(1 + 4))。当normalize = False时,我得到前10个系数1,与简单线性回归模型的结果相同。此外,由于我生成的数据是mean = 0和std = 1,normalize = True不应该做任何事情,因为数据已经“标准化”。有人可以向我解释这里发生了什么吗?谢谢!

2 个答案:

答案 0 :(得分:1)

重要的是要理解规范化和标准化是相同而两者都不能同时完成。您可以标准化或标准化。

标准化通常指的是转换数据,使其具有0均值和单位(1)方差。例如。可以通过去除平均值并除以标准偏差来实现。在这种情况下,这将是特征(列)明智。

通常规范化是指将数据值转换为0到1之间的范围。可以通过除以矢量的长度来实现。但这并不意味着均值将为0且方差为1.

生成trainx, trainy后,它们尚未正常化。也许打印出来看看你的结果。

  • 因此,当normalize=True时,trainx将通过减去均值并除以l2范数(根据sklearn)进行归一化。
  • normalize=False时,trainx将保持原样。

答案 1 :(得分:0)

如果你做 normalize=True,每一个特征列都除以它的 L2 范数,换句话说,每一个特征列的量级都减少了,这导致估计的系数更大(βX 应该或多或少是恒定的; X 越小,β 越大)。当系数较大时,施加较大的 L2 惩罚。因此,该函数更关注 L2 惩罚而不是线性部分 (Xβ)。因此,与纯线性回归相比,线性部分的系数估计不太准确。

相比之下,如果 normalize=False,则 X 较大,β 较小。给定相同的 alpha,L2 惩罚是微不足道的。更多地关注线性部分 - 结果接近于纯线性回归。