在时间序列上进行训练/测试拆分的正确方法

数据挖掘 Python 深度学习 时间序列 lstm
2022-03-08 07:36:42

我想用 LSTM 创建一个模型来预测用户的下一次购买价值。为此,我使用了用户的购买历史记录。我已经创建了模型并且效果很好,但老实说,我不知道我是否以正确的方式进行训练/测试拆分。

为此,我使用了(单变量)用户的购买历史记录。(X-购买历史记录值,y-目标购买值) 作为第一步,我创建了一个创建新数据的滑动窗口过程。(如图所示)在原始数据集中,我有 1000 个用户,有 2820 个时间戳和 1 个特征(购买值),通过滑动窗口过程,我有 1000*2320 个用户,有 500 个时间戳和 1 个特征。

X.shape -> OriginalDataShape (1000, 2820, 1)

X.shape -> ModifiedDataShape (2320000, 500, 1) 在此处输入图像描述

# model
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(500,1))) model.add(Dense(1)) model.compile(loss='mae', optimizer='adam')


# train
repeats = range(3)
scores = list()
for i in repeats:
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
    model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=5, batch_size=32)
    pred = model.predict(X_test)
    score.append(metrics.mean_squared_error(pred,y_test))
print('Final score (Mse):')
print(score)

在此处输入图像描述

我的问题是:这是正确的方法吗?如果不是,您有解决方案的建议或 GitHub 链接吗?

1个回答

这里的问题是您在拆分时间序列之前要对其进行改组。
这样,测试集中的每个时间步可能在训练集中都有一个接近它的时间步。

为避免这种情况,您可以设置(以便训练集shuffle=Falsetrain_test_split测试集之前),或使用以日期为组的 Group K-Fold(因此整天都在训练集或测试集中)。

您可以在 Cross Validated 中阅读此问题的更多信息