【发布时间】:2019-06-01 17:02:05
【问题描述】:
我正在研究一些不同场景下的线性回归示例,比较使用Normalizer和StandardScaler的结果,结果令人费解。
我正在使用波士顿住房数据集,并以这种方式进行准备:
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.preprocessing import Normalizer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
#load the data
df = pd.DataFrame(boston.data)
df.columns = boston.feature_names
df['PRICE'] = boston.target
我目前正在尝试推理我从以下场景中得到的结果:
- 使用参数
normalize=True与使用Normalizer初始化线性回归 - 使用参数
fit_intercept = False初始化线性回归,使用和不使用标准化。
总的来说,我发现结果令人困惑。
我是这样设置一切的:
# Prep the data
X = df.iloc[:, :-1]
y = df.iloc[:, -1:]
normal_X = Normalizer().fit_transform(X)
scaled_X = StandardScaler().fit_transform(X)
#now prepare some of the models
reg1 = LinearRegression().fit(X, y)
reg2 = LinearRegression(normalize=True).fit(X, y)
reg3 = LinearRegression().fit(normal_X, y)
reg4 = LinearRegression().fit(scaled_X, y)
reg5 = LinearRegression(fit_intercept=False).fit(scaled_X, y)
然后,我创建了 3 个单独的数据框来比较每个模型的 R_score、系数值和预测。
为了创建数据框来比较每个模型的系数值,我执行了以下操作:
#Create a dataframe of the coefficients
coef = pd.DataFrame({
'coeff': reg1.coef_[0],
'coeff_normalize_true': reg2.coef_[0],
'coeff_normalizer': reg3.coef_[0],
'coeff_scaler': reg4.coef_[0],
'coeff_scaler_no_int': reg5.coef_[0]
})
以下是我创建数据框以比较每个模型的 R^2 值的方法:
scores = pd.DataFrame({
'score': reg1.score(X, y),
'score_normalize_true': reg2.score(X, y),
'score_normalizer': reg3.score(normal_X, y),
'score_scaler': reg4.score(scaled_X, y),
'score_scaler_no_int': reg5.score(scaled_X, y)
}, index=range(1)
)
最后,这是比较每个预测的数据框:
predictions = pd.DataFrame({
'pred': reg1.predict(X).ravel(),
'pred_normalize_true': reg2.predict(X).ravel(),
'pred_normalizer': reg3.predict(normal_X).ravel(),
'pred_scaler': reg4.predict(scaled_X).ravel(),
'pred_scaler_no_int': reg5.predict(scaled_X).ravel()
}, index=range(len(y)))
以下是生成的数据框:
我有三个无法解决的问题:
- 为什么前两个模型之间完全没有区别?似乎设置
normalize=False什么都不做。我可以理解具有相同的预测和 R^2 值,但是我的特征具有不同的数值尺度,所以我不确定为什么规范化根本没有效果。当您考虑到使用StandardScaler会显着改变系数时,这会更加令人困惑。 - 我不明白为什么使用
Normalizer的模型会导致与其他模型完全不同的系数值,尤其是当使用LinearRegression(normalize=True)的模型根本没有改变时。
如果您查看每个文档的文档,会发现它们非常相似,即使不相同。
来自sklearn.linear_model.LinearRegression() 上的文档:
normalize:布尔值,可选,默认为 False
当 fit_intercept 设置为 False 时忽略此参数。如果为 True,则回归量 X 将在回归前通过减去均值并除以 l2 范数进行归一化。
与此同时,sklearn.preprocessing.Normalizerstates that it normalizes to the l2 norm by default 上的文档。
我看不出这两个选项的作用有什么不同,我不明白为什么一个选项的系数值会与另一个选项有如此巨大的差异。
- 使用
StandardScaler的模型的结果与我一致,但我不明白为什么使用StandardScaler并设置set_intercept=False的模型表现如此糟糕。
来自Linear Regression module上的文档:
fit_intercept : 布尔值,可选,默认 True
是否计算此模型的截距。如果设置为 False,则否
截距将用于计算(例如,预计数据已经
居中)。
StandardScaler 集中您的数据,所以我不明白为什么将它与 fit_intercept=False 一起使用会产生不连贯的结果。
【问题讨论】:
标签: python machine-learning scikit-learn linear-regression