from sklearn.preprocessing import PolynomialFeaturestrain_x_p = np.asanyarray(train[['FUELCONSUMPTION_COMB_MPG']])poly = PolynomialFeatures(degree = 3)train_x_poly = poly.fit_transform(train_x_p)regr.fit(train_x_poly, train_y)print('Coefficients: ', regr.coef_)print('Intercept', regr.intercept_)test_x_poly = poly.fit_transform(test_x)test_y_poly1 = np.asanyarray(test[['CO2EMISSIONS']]) #im not sure especially about this line test_y_hat_poly1 = regr.predict(test_x_poly)mse = metrics.mean_squared_error(test_y_poly1, test_y_hat_poly1)r2 = (r2_score(test_y_poly1,test_y_hat_poly1))print('MSE&R2SQUARE polynomial linear regression (FUELCONSUMPTION_COMB_MPG): ')print('MSE: ',mse)print('r2-sq: ',r2)
另外,为什么我觉得MSE的结果不正确?我是否应该将测试集的y值转换为多项式形式?如果需要,该如何操作?
回答:
不,您不应该转换y_true
值。多项式特征的作用是将x_1, x_2, ..., x_p
预测变量应用指定度的多项式变换。
如果您有两个预测变量x_1 和 x_2
,并且应用三次多项式变换,最终问题形式将是:
y = b_0 + b_1 * x_1 + b_2 * x_1^2 + b_3 * x_1^3 + b_4 * x_2 + b_5 * x_2^2 + b_6 * x_2^3
当预测变量和响应变量之间存在非线性关系时,您会使用这种方法,并希望使用线性模型来拟合数据。不论您是否使用多项式特征(或大多数其他回归模型),y_true
保持不变。
您的代码几乎没有问题,只有一个问题 – 您在测试数据上调用了fit_transform
,这是您绝对不应该做的。您已经在训练数据上拟合了多项式特征对象,您只需要调用transform
方法来转换您的测试数据。
test_x_poly = poly.transform(test_x)
以下是当预测变量和响应变量之间存在多项式关系时使用多项式特征的示例:
- 获取数据(我将生成一些数据)
X = np.random.randint(-100, 100, (100, 1))y = X ** 2 + np.random.normal(size=(100, 1))
- 训练/测试拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
- 在训练数据上拟合多项式特征
poly_features = PolynomialFeatures(degree=2)X_train_poly = poly_features.fit_transform(X_train) # 同时转换数据
- 在训练数据上拟合线性回归模型
reg = LinearRegression()reg.fit(X_train_poly, y_train)
- (仅用于说明目的 – 可视化回归线 – 仅适用于只有一个预测变量的情况)
reg_line_x = poly_features.transform(np.linspace(-100, 100, 1000).reshape((-1, 1)))reg_line_y = reg.predict(reg_line_x)plt.scatter(X_train_poly[:, 1].ravel(), y_train)plt.plot(reg_line_x[:, 1].ravel(), reg_line_y, c="red", label="regression line")plt.legend()plt.show()
- 转换
X_test
数据并进行预测
# 不要在这里调用fit_transformX_test_poly = poly_features.transform(X_test)y_pred = reg.predict(X_test_poly)
还有一个更方便的方法可以通过构建管道来处理所有事情(在您的案例中是多项式变换和回归),这样您就不需要手动执行每个步骤。
from sklearn.pipeline import Pipelinepipe = Pipeline([ ("poly_features", poly_features), ("regression", reg)])y_pred = pipe.predict(X_test)print(f"r2 : {r2_score(y_test, y_pred)}")print(f"mse: {mean_squared_error(y_test, y_pred)}")
r2 : 0.9999997923643911
mse: 1.4848830127345198
请注意,在您的案例中R方或MSE显示出较差的值,并不意味着您的代码有问题。可能是您的数据不适合这个任务,或者您需要使用不同程度的多项式变换 – 您可能在训练数据上出现了欠拟合或过拟合等情况。