在 Python 中将时间序列数据拆分为训练测试集和有效集

Posted

技术标签:

【中文标题】在 Python 中将时间序列数据拆分为训练测试集和有效集【英文标题】:Split time series data into Train Test and Valid sets in Python 【发布时间】:2020-03-17 08:54:05 【问题描述】:

我正在开展一个项目,其中我结合了 2 个时间序列数据集(例如 D1、D2)。 D15-minutes 间隔,D21-minute 间隔,所以我将D1 转换为1 分钟间隔并与D2 结合。现在我想根据这些条件将这个新数据集D1D2 拆分为训练集、测试集和有效集:

注意:我已经搜索了很多并试图找到解决我的问题的方法,但没有任何答案适合我的问题,所以请不要将其标记为重复! p>

    有效集合应该是数据集末尾的 60 个值。 那么,测试集应该是最近的值,直到 valid set 然后,我将使用剩余数据设置火车。

这是我现在的拆分方式:

def split_train_test(dataset, train_size, test_size):
    train = dataset[:train_size, :]
    test = dataset[test_size:, :]
    # split into input and outputs
    train_X, train_y = train[:, :-1], train[:, -1]
    test_X, test_y = test[:, :-1], test[:, -1]
    # reshape input to be 3D [samples, timesteps, features]
    train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
    test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
    print(train_X.shape, train_y.shape, test_X.shape)
    return train, test, train_X, train_y, test_X, test_y

但是现在我需要在以上条件的基础上转换成train、test和split?

我该怎么做?并且它是拆分时间序列数据集的正确方法吗?

【问题讨论】:

可以选择倒数行数:train_df = df[:-60, :] 所以,它会给我valid set 的最后 60 条记录,但我怎样才能将剩余的记录拆分为 train and test 我在问题中提到了上面的3个条件。 Then, the test set should be the most recent values till to the valid set 是什么意思? 这意味着,我们在 valid set 中取最后 60 个值,也就是说,我们必须通过保留数据集的最后 60 条记录,将最近的值作为 test set 【参考方案1】:

试试这个:

valid_set = dataset.iloc[-60:, :]
test_set = dataset.iloc[-120:-60]
train_set = dataset.iloc[:-120]

概括:

def split_train_test(dataset, validation_size):
    valid = dataset.iloc[-validation_size:, :]
    train_test = dataset.iloc[:-validation_size)]

    train_length = int(0.63 * len(train_test))

    # split into input and outputs
    train_X, train_y = train_test.iloc[:train_length, :-1], train_test.iloc[:train_length, -1]
    test_X, test_y = train_test.iloc[train_length:, :-1], train_test.iloc[train_length:, -1]
    valid_X, valid_y = valid.iloc[:, :-1], valid.iloc[:, -1]

    return train_test, valid, train_X, train_y, test_X, test_y, valid_X, valid_y

您可以将 % 拆分率作为参数传递给函数,而不是像我一样将其硬编码到函数中。

【讨论】:

以上是关于在 Python 中将时间序列数据拆分为训练测试集和有效集的主要内容,如果未能解决你的问题,请参考以下文章

如何在 TensorFlow 中使用我自己的数据将图像拆分为测试和训练集

根据python中训练和测试集中的时间戳为每个用户拆分数据集

python 将数据拆分为训练/测试数据集。

如何将数据集 (csv) 拆分为训练和测试数据

数据集拆分:训练集、验证集、测试集

将主数据目录拆分为训练/验证/测试集