首页 > 解决方案 > 为什么具有度数 = 1 的多项式特征的 LinearRegression 会给出不同的结果?

问题描述

我有一个回归数据集: (X_train_scaled, y_train) 和 (X_val_scaled, y_val) 分别用于训练和验证。使用 StandardScaler 对输入进行缩放。

我使用 sklearn.linear_model.LinearRegression 创建一个线性回归模型,如下所示:

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

linear_reg = LinearRegression()

linear_reg.fit(X_train_scaled, y_train)
y_pred_train = linear_reg.predict(X_train_scaled)
y_pred_val = linear_reg.predict(X_val_scaled)

r2_train = r2_score(y_train, y_pred_train)
r2_val = r2_score(y_val, y_pred_val)

print('r2_train', r2_train)
print('r2_val', r2_val)

之后我做同样的事情,但使用度数 = 1 的多项式特征(这与原始特征相同,但有一个附加特征,即 x^0,我忽略了它)。

from sklearn.preprocessing import PolynomialFeatures

pf = PolynomialFeatures(1)
X_train_poly = pf.fit_transform(X_train_scaled)[:, 1:] # ignore first col
X_val_poly = pf.transform(X_val_scaled)[:, 1:] # ignore first col

linear_reg = LinearRegression()

linear_reg.fit(X_train_poly, y_train)
y_pred_train = linear_reg.predict(X_train_poly)
y_pred_val = linear_reg.predict(X_val_poly)

r2_train = r2_score(y_train, y_pred_train)
r2_val = r2_score(y_val, y_pred_val)

print('r2_train', r2_train)
print('r2_val', r2_val)

但是,我得到不同的结果。第一个代码给了我以下输出:

r2_train 0.7409525513417043
r2_val 0.7239859358973735

而第二个代码给出了这个输出:

r2_train 0.7410093370149977
r2_val 0.7241725658840452

为什么数据集和模型相同,但输出却不同?

为了证明数据集是相同的,我尝试了以下代码:

print(X_train_scaled.shape, X_train_poly.shape)
print(X_val_scaled.shape, X_val_poly.shape)
print((X_train_poly != X_train_scaled).sum())
print((X_val_poly != X_val_scaled).sum())

其中有输出:

(802, 9) (802, 9)
(268, 9) (268, 9)
0
0

这表明两个数据集是相同的。

另外,我在两种使用 OLS 算法并且根本没有随机操作的情况下使用 LinearRegression。因此,它应该对相同的数据进行相同的计算。但是,我得到不同的结果。

有人知道原因吗?

标签: pythonmachine-learningscikit-learnlinear-regression

解决方案


Sklearn LinearRegression 使用普通的最小二乘优化将训练数据拟合到线性模型中,而目前尚不清楚 Sklearn PolynomialFeatures 使用什么。但是基于它的 transform() 函数:

对于稀疏输入(为了速度),首选 CSR 而不是 CSC,但如果度数为 4 或更高,则需要 CSC。如果度数小于 4 且输入格式为 CSC,则将其转换为 CSR,生成其多项式特征,然后再转换回 CSC。(见:https ://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html )

假设 PolynomialFeatures 使用普通的最小二乘优化,您仍然会有相同的结果,但略有不同(就像您的一样),因为压缩稀疏行 (CSR) 方法会影响浮点值(换句话说,截断/近似错误)。


推荐阅读