我应该如何在 python 中使用 rsquare 和 mse 定义多项式回归评估中的 y_true
How should I define the y_true in Polynomial regression evaluation using rsquare and mse in python
from sklearn.preprocessing import PolynomialFeatures
train_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 转换为 poly 吗?如果应该,我该怎么做?
不,你不应该改变你的 y_true
价值观。多项式特征的作用是它采用 x_1, x_2, ..., x_p
个预测变量并将所选次数的多项式变换应用于每个预测变量。
如果您有 2 个预测变量 x_1 and x_2
并应用 3 次多项式变换,您最终会遇到以下形式的问题:
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))
- train/test拆分
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) # transform the data as well
- 在训练数据上拟合线性回归模型
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
数据并进行预测
# do NOT call fit_transform here
X_test_poly = poly_features.transform(X_test)
y_pred = reg.predict(X_test_poly)
还有一种更方便的方法是构建一个处理所有事情的管道(在您的情况下是多项式变换和回归),这样您就不必手动执行每个单独的步骤。
from sklearn.pipeline import Pipeline
pipe = 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 显示的值不佳并不意味着您的代码有误。可能是您的数据不适合该任务,或者您需要使用不同次数的多项式变换 - 您可能对训练数据欠拟合或过拟合等。
from sklearn.preprocessing import PolynomialFeatures
train_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 转换为 poly 吗?如果应该,我该怎么做?
不,你不应该改变你的 y_true
价值观。多项式特征的作用是它采用 x_1, x_2, ..., x_p
个预测变量并将所选次数的多项式变换应用于每个预测变量。
如果您有 2 个预测变量 x_1 and x_2
并应用 3 次多项式变换,您最终会遇到以下形式的问题:
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))
- train/test拆分
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) # transform the data as well
- 在训练数据上拟合线性回归模型
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
数据并进行预测
# do NOT call fit_transform here
X_test_poly = poly_features.transform(X_test)
y_pred = reg.predict(X_test_poly)
还有一种更方便的方法是构建一个处理所有事情的管道(在您的情况下是多项式变换和回归),这样您就不必手动执行每个单独的步骤。
from sklearn.pipeline import Pipeline
pipe = 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 显示的值不佳并不意味着您的代码有误。可能是您的数据不适合该任务,或者您需要使用不同次数的多项式变换 - 您可能对训练数据欠拟合或过拟合等。