为什么我的时间序列数据在训练/测试拆分之前没有被洗牌,而在拆分之前它被洗牌时性能更差?

数据挖掘 时间序列 预测建模 随机森林 训练 迁移学习
2022-03-08 04:53:27

我们在时间序列数据上运行 RandomForest 模型。该模型是实时运行的,并且每次添加新行时都会重新调整。由于它是时间序列数据,我们将 shuffle 设置为 false,同时拆分为训练和测试数据集。

我们观察到,当 shuffle 为 True 和 shuffle 为 false 时,分数会发生巨大变化

正在使用的代码如下

# Set shuffle = 'True' or 'False'
df = pandas.read_csv('data.csv', index_col=0)
X = df.drop(columns=['label'])
y = df['label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.05, shuffle=True)

count = 0 
predictions = [] 

for idx in X_test.index.values:
    # Train the model on training data
    # print(count, X_train.shape, y_train.shape)
    rf = RandomForestRegressor(n_estimators = 600, max_depth = 7, random_state = 12345)
    rf.fit(X_train, y_train)

    predictions.append(rf.predict(X_test.loc[X_test.index == idx]))
    # print(len(predictions))

    X_train.loc[len(X_train)] = X_test.loc[idx]
    y_train.loc[len(y_train)] = y_test.loc[idx]
    count+=1

最初,我们认为差异是由于数据的协方差变化造成的。但这不应该对连续拟合产生太大影响

这是预测图的屏幕截图

使用 shuffle = False 在此处输入图像描述

随机播放 = True 在此处输入图像描述

2个回答

不用自己进一步研究数据,我可以推测您的数据最近发生了一些变化,因此,如果您在没有改组的情况下拆分,则测试集中数据的某些方面(这是您最近收集的数据)在您的训练中的代表性不足放。通过打乱数据,您可以让那些更新的样本也出现在您的训练集中,从而提高您的测试集性能。

在时间序列模型中,混洗应该是错误的,因为否则,您将使用它尚未访问的模式来训练模型。

在每个时间步,模型应该只被训练到数据可见点。例如,在时间步 10,模型应该只使用 0 到 10 的数据进行训练,而没有 11 到 40 的数据可见性。

否则,您现在会得到很好的模型结果,但是当您今天(2021 年)实施模型时,实际性能会很差,因为您无法使用未来 2023 年的模式/数据来训练模型。