不清楚为什么在使用sklearn.linear_model.LinearRegression
之前必须标准化数据集。我不明白为什么尽管原始数据标准化了,它还是必须得到正确的结果。
作为测试,我准备了一些数据集:
import numpy as np
import pandas as pd
size = 700
data['x_1'] = x_1
data['x_2'] = x_2
data['y'] = map(lambda i : x_1[i]*7.5 - 2*x_2[i] + noise[i], range(size))
其中:
^{pr2}$然后我试着用线性回归和标准化矩阵求系数:
from sklearn.preprocessing import scale
from sklearn.utils import shuffle
df_shuffled = shuffle(data, random_state=123)
X = scale(df_shuffled[df_shuffled.columns[:-1]])
y = df_shuffled["y"]
结果如下:
linear_regressor.fit(X,y)
(14.951827073780766, 'x_1')
(-1.9171042297858722, 'x_2')
之后,我重复了没有scale()函数的所有步骤,得到了更好的结果:
(7.5042271168341887, 'x_1')
(-1.9835960918124507, 'x_2')
只是个例外还是我犯了些错误?在
标准化并不是线性回归的真正要求。下面是一个例子,我将数据分成训练/测试分割,然后对测试进行预测。在
分数也一样:
^{pr2}$那么为什么要标准化呢?因为它不痛。在管道中,您可以添加额外的步骤,如集群或PCA,这将需要扩展。只要记住,如果你想应用缩放,你也需要将它应用到你的评分数据集。在本例中,需要使用StandardScaler,因为它有一个}。在我的例子中,我使用了
fit
和{scale
,因为我在拆分之前将其应用于我的训练和测试。然而,在现实生活中,您未来的数据是未知的,所以您需要使用StandardScaler
根据从训练集中找到的mu和std进行转换。在sklearn.preprocessing.scale()
通过减去平均值(mu
)并除以标准差(sigma
)来转换变量:在您的例子中,}的值分别是5和2。所以调用scale,将从每个
mu
和{x1
中减去5,然后除以2。在这种变化并不影响线性回归系数,它只是改变截距。但规模不同。如果x 1和y之间的关系是:
^{pr2}$我们把
x1
除以2,然后你需要加倍系数来保持相同的关系。在在本例中,
x2
不受影响,因为它的sigma
为1。在系数/无标度截距:
缩放比例:
在第二种情况下,您将获得
x1
和x2
的缩放版本的系数和截距。在这不是问题,也不是错误。这意味着,如果您使用拟合模型进行预测,您只需对新数据应用相同的转换。在
相关问题 更多 >
编程相关推荐