gpt4 book ai didi

python - 标准化之前/之后训练/测试多项式回归时的 RMSE 不同

转载 作者:行者123 更新时间:2023-12-01 08:24:13 27 4
gpt4 key购买 nike

我正在构建一个回归模型,最终将被其他用户使用。该模型利用气温、湿度、太阳辐射、风等多种大气​​变量来预测花朵温度。

经过多次涂鸦后,我注意到通过 SKlearn 进行的二阶多项式回归为我的训练和测试数据提供了良好的 RMSE。然而,由于存在超过 36 个系数,因此会发生共线性,根据这篇文章的评论:https://stats.stackexchange.com/questions/29781/when-conducting-multiple-regression-when-should-you-center-your-predictor-varia ,共线性会干扰 beta,因此我得到的 RMSE 将是不正确的。

我听说也许我应该标准化以消除共线性或使用正交分解,但我不知道哪个会更好。无论如何,我尝试标准化我的 x 变量,当我计算训练和测试数据的 RMSE 时,我得到训练数据相同的 RMSE,但测试数据得到不同的 RMSE。

这是代码:

import pandas as pd
import numpy as np
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn import metrics

def OpenFile(ThePath):
path = Location + ThePath
Prepared_df = pd.read_csv(path, sep=',', encoding='utf-8')
Prepared_df = Prepared_df.loc[:, ~Prepared_df.columns.str.contains('^Unnamed')]
return(Prepared_df)

def EvaluateRegression(Test_data,Predict_data):
MAE = np.round(metrics.mean_absolute_error(Test_data, Predict_data),3)
MSE = np.round(metrics.mean_squared_error(Test_data, Predict_data),3)
RMSE = np.round(np.sqrt(metrics.mean_squared_error(Test_data, Predict_data)),3)
print('Mean absolute error :',MAE)
print('Mean square error :',MSE)
print('RMSE :',RMSE)
return MAE,MSE,RMSE

#Read files ------------------------------------------------------------------------------------------------------------
Location = 'C:\\Users\...'

#Training data
File_Station_day = 'Flower_Station_data_day.csv' #X training data
File_TD = 'Flower_Y_data_day.csv' #Y training data
Chosen_Air = OpenFile(File_Station_day)
Day_TC = OpenFile(File_TD)

#Testing data
File_Fluke_Station= 'Fluke_Station_data.csv' #X testing data
File_Fluke = 'Flower_Fluke_data.csv' #Y testing data
Chosen_Air_Fluke = OpenFile(File_Fluke)
Fluke_Station = OpenFile(File_Fluke_Station)

#Prepare data --------------------------------------------------------------------------------------------------------
y_train = Day_TC
y_test = Fluke_data
#Get the desired atmospheric variables
Air_cols = ['MAXTemp_data', 'MINTemp_data', 'Humidity', 'Precipitation', 'Pression', 'Arti_InSW', 'sin_time'] #Specify the desired atmospheriv variables
X_train = Chosen_Air[Air_cols]
X_test = Chosen_Air_Fluke[Air_cols]

#If not standardizing
poly = PolynomialFeatures(degree=2)
linear_poly = LinearRegression()
X_train_rdy = poly.fit_transform(X_train)
linear_poly.fit(X_train_rdy,y_train)
X_test_rdy = poly.fit_transform(X_test)

Input_model= linear_poly
print('Regression: For train')
MAE, MSE, RMSE = EvaluateRegression(y_train, Input_model.predict(X_train_rdy))
#For testing data
print('Regression: For test')
MAE, MSE, RMSE = EvaluateRegression(y_test, Input_model.predict(X_test_rdy))

#Output:
Regression: For train
Mean absolute error : 0.391
Mean square error : 0.256
RMSE : 0.506
Regression: For test
Mean absolute error : 0.652
Mean square error : 0.569
RMSE : 0.754

#If standardizing
std = StandardScaler()
X_train_std = pd.DataFrame(std.fit_transform(X_train),columns = Air_cols)
X_test_std = pd.DataFrame(std.fit_transform(X_test),columns = Air_cols)
poly = PolynomialFeatures(degree=2)
linear_poly_std = LinearRegression()
X_train_std_rdy = poly.fit_transform(X_train_std)
linear_poly_std.fit(X_train_std_rdy,y_train)
X_test_std_rdy = poly.fit_transform(X_test_std)

Input_model= linear_poly_std
print('Regression: For train')
MAE, MSE, RMSE = EvaluateRegression(y_train, Input_model.predict(X_train_std_rdy))
#For testing data
print('Regression: For test')
MAE, MSE, RMSE = EvaluateRegression(y_test, Input_model.predict(X_test_std_rdy))

#Output:
Regression: For train
Mean absolute error : 0.391
Mean square error : 0.256
RMSE : 0.506
Regression: For test
Mean absolute error : 10.901
Mean square error : 304.53
RMSE : 17.451

为什么我得到的标准化测试数据的 RMSE 与非标准化测试数据如此不同?也许我这样做的方式一点都不好?请告诉我是否应该将文件附加到帖子中。

感谢您的宝贵时间!

最佳答案

IIRC,至少你不应该调用poly.fit_transform两次——你的做法与回归模型相同——用训练数据拟合一次,然后用测试进行转换。现在您正在重新训练缩放器(这可能会给您不同的平均值/标准差),但应用相同的回归模型。

旁注:您的代码相当难以阅读/调试,并且很容易导致简单的拼写错误/错误。我建议您将训练逻辑包装在单个函数中,并可选择使用 sklearn pipelines 。这将使测试缩放器[un]注释单行,字面意思。

关于python - 标准化之前/之后训练/测试多项式回归时的 RMSE 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54392596/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com