python sklearn 岭回归归一化

python sklearn ridge 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 不应该做任何事情,因为数据已经是 "normalized"。有人可以向我解释这里发生了什么吗?谢谢!

了解规范化和标准化不同并且两者不能同时进行很重要。您可以标准化或标准化。

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

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

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

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

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

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