为什么在机器学习中使用不同的数据集测试模型时结果不准确?

问题描述

我正在尝试根据时间序列进行预测。我正在使用过去三年的每小时数据进行温度预测。 我没有使用 X_test 方法中的 train_test_split,而是使用我自己的测试数据集,因为我需要提前 7 天进行预测。

问题:当我使用虚拟测试数据集进行预测时,它给出了不正确的值。但是当我使用来自 train_test_split 方法的测试数据集时,它给出了准确的值。我不明白为什么会这样。

我试图解决这个问题的方法:首先,我认为这是因为我没有应用特征缩放,但在实施特征缩放后结果是相同的。然后我想,当 train_test_split 分割数据时,它也会给数据带来一些随机性,所以我对我的虚拟测试数据应用了随机性,但结果还是一样。

我的问题:如何应用不同的数据框来测试模型?我是如何得到准确结果的?

image

程序:

df = pd.read_csv("Timeseries_47.999_7.850_SA_0deg_0deg_2013_2016.csv",sep=",")

time_mod = []
for i in range(0,len(df['time'])):
    ss=pd.to_datetime(df['time'][i],format= "%Y%m%d:%H%M")
    time_mod.append(ss)
df['datetime'] = time_mod

df["Hour"] = pd.to_datetime(df["datetime"]).dt.hour
df["Month"] = pd.to_datetime(df["datetime"]).dt.month
df["Day_of_year"] = pd.to_datetime(df["datetime"]).dt.dayofyear
df["Day_of_month"] = pd.to_datetime(df["datetime"]).dt.day
df["week_of_year"] = pd.to_datetime(df["datetime"]).dt.week

X = df[{"Hour","Day_of_year","Day_of_month",'week_of_year','Month'}].values
y = df[{"T2m"}].values

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state=0) 

## Creating dummy datetime for Test data
df.set_index('datetime',inplace=True)
future_dates = [df.index[-1]+DateOffset(hours=x) for x in range(0,168)]
future_dates_df = pd.DataFrame({'Data':future_dates})

future_dates_df["Hour"] = pd.to_datetime(future_dates_df["Data"]).dt.hour
future_dates_df["Month"] = pd.to_datetime(future_dates_df["Data"]).dt.month
future_dates_df["Day_of_year"] = future_dates_df["Data"].dt.dayofyear
future_dates_df["Day_of_month"] = pd.to_datetime(future_dates_df["Data"]).dt.day
future_dates_df["Date"] = pd.to_datetime(future_dates_df["Data"]).dt.date
future_dates_df["week_of_year"] = future_dates_df["Data"].dt.week

X_test_dum = future_dates_df[["Hour",'Month','Day_of_year','Day_of_month']].values

#Model
regressor = LinearRegression()
regressor.fit(X_train,y_train)

y_pred = regressor.predict(X_test_dum)

plt.plot(y_test,color="r",label="actual")
plt.plot(y_pred,label="forecasted")
sns.set(rc={'figure.figsize':(20,10)})
plt.legend()
plt.show()

解决方法

不准确的原因可能是:

  1. 虚拟数据集变量的排列方式与实际数据集不同。
X = df[{"Hour","Day_of_year","Day_of_month",'week_of_year','Month'}].values
X_test_dum = future_dates_df[["Hour",'Month','Day_of_year','Day_of_month']].values
  1. 我还注意到您正在应用 Linear Regression,但数据看起来不像线性。尝试使用 Polynomial RegressionDecision TreeRandom Forest 或适用于非线性数据的模型。
  2. 我认为消除一些非必要的自变量也可以改善您的结果。 只考虑:Hour 和 Day_of_year
  3. 最后,尝试直接在 csv 文件中创建虚拟数据集,然后在 python 中分离训练和测试数据集。