为什么阶数为1的多项式特征的线性回归会给出不同的结果?

2024-06-28 14:56:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用于回归的数据集:(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算法,并且没有任何随机操作。所以,它应该对相同的数据进行相同的计算。然而,我得到了不同的结果

有人知道原因吗


Tags: 数据trainvalsklearnregpredictscorelinear
1条回答
网友
1楼 · 发布于 2024-06-28 14:56:07

Sklearn线性回归使用普通最小二乘优化将列车数据拟合到线性模型中,但不清楚Sklearn多项式特征使用什么。但基于其transform()函数:

Prefer CSR over CSC for sparse input (for speed), but CSC is required if the degree is 4 or higher. If the degree is less than 4 and the input format is CSC, it will be converted to CSR, have its polynomial features generated, then converted back to CSC. (see: https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html)

假设多项式特征使用普通最小二乘优化,您仍然会得到相同的结果,但略有不同(就像您的一样),因为压缩稀疏行(CSR)方法会损害浮点值(换句话说,截断/近似误差)

相关问题 更多 >