问题描述
我正在尝试根据时间序列进行预测。我正在使用过去三年的每小时数据进行温度预测。
我没有使用 X_test
方法中的 train_test_split
,而是使用我自己的测试数据集,因为我需要提前 7 天进行预测。
问题:当我使用虚拟测试数据集进行预测时,它给出了不正确的值。但是当我使用来自 train_test_split
方法的测试数据集时,它给出了准确的值。我不明白为什么会这样。
我试图解决这个问题的方法:首先,我认为这是因为我没有应用特征缩放,但在实施特征缩放后结果是相同的。然后我想,当 train_test_split
分割数据时,它也会给数据带来一些随机性,所以我对我的虚拟测试数据应用了随机性,但结果还是一样。
我的问题:如何应用不同的数据框来测试模型?我是如何得到准确结果的?
程序:
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()
解决方法
不准确的原因可能是:
- 虚拟数据集变量的排列方式与实际数据集不同。
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
- 我还注意到您正在应用
Linear Regression
,但数据看起来不像线性。尝试使用Polynomial Regression
、Decision Tree
、Random Forest
或适用于非线性数据的模型。 - 我认为消除一些非必要的自变量也可以改善您的结果。 只考虑:Hour 和 Day_of_year
- 最后,尝试直接在
cs
v 文件中创建虚拟数据集,然后在 python 中分离训练和测试数据集。