我有一个用于回归的数据集:(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算法,并且没有任何随机操作。所以,它应该对相同的数据进行相同的计算。然而,我得到了不同的结果
有人知道原因吗
Sklearn线性回归使用普通最小二乘优化将列车数据拟合到线性模型中,但不清楚Sklearn多项式特征使用什么。但基于其transform()函数:
假设多项式特征使用普通最小二乘优化,您仍然会得到相同的结果,但略有不同(就像您的一样),因为压缩稀疏行(CSR)方法会损害浮点值(换句话说,截断/近似误差)
相关问题 更多 >
编程相关推荐