下载此笔记本

将数据集拆分为训练集和测试集#

在这个笔记本中,我们将展示如何沿着时间分割数据集的条目,以构建训练和测试数据子集(或训练/验证/测试)。具体来说,我们将使用 split 函数:

[1]:
from gluonts.dataset.split import split

这需要提供:

  • 我们想要拆分的 dataset

  • 一个 offsetdate,但不能同时使用这两者。这两个参数是为了让函数知道如何根据固定整数偏移量或 pandas.Period 切分训练和测试数据。

因此,split 方法返回分割的数据集,由训练数据 training_dataset 和一个“测试模板”组成,该模板知道如何生成输入/输出测试对。

加载数据集#

[2]:
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams["axes.grid"] = True
plt.rcParams["figure.figsize"] = (20, 3)

在我们的示例中,我们将使用来自以下 csv 文件的数据,该文件最初每5分钟进行一次采样,但我们以每小时的频率重新采样。请注意,这样会形成一个由单个时间序列组成的数据集,但我们在这里展示的所有内容都适用于任何数据集,无论它包含多少个序列。

[3]:
url = "https://raw.githubusercontent.com/numenta/NAB/master/data/realTweets/Twitter_volume_AMZN.csv"
df = (
    pd.read_csv(url, header=0, index_col="timestamp", parse_dates=True)
    .resample("1H")
    .sum()
)

数据看起来是这样的:

[4]:
df.plot()
plt.legend(["dataset"], loc="upper left")
plt.show()
../../_images/tutorials_data_manipulation_dataset_splitting_example_7_0.png

使用 PandasDataset 将数据框转换为GluonTS数据集

[5]:
from gluonts.dataset.pandas import PandasDataset

dataset = PandasDataset(df, target="value")

训练/测试分割#

让我们定义几个辅助函数来可视化数据拆分。

[6]:
from gluonts.dataset.util import to_pandas


def highlight_entry(entry, color):
    start = entry["start"]
    end = entry["start"] + len(entry["target"])
    plt.axvspan(start, end, facecolor=color, alpha=0.2)


def plot_dataset_splitting(original_dataset, training_dataset, test_pairs):
    for original_entry, train_entry in zip(original_dataset, training_dataset):
        to_pandas(original_entry).plot()
        highlight_entry(train_entry, "red")
        plt.legend(["sub dataset", "training dataset"], loc="upper left")
        plt.show()

    for original_entry in original_dataset:
        for test_input, test_label in test_pairs:
            to_pandas(original_entry).plot()
            highlight_entry(test_input, "green")
            highlight_entry(test_label, "blue")
            plt.legend(["sub dataset", "test input", "test label"], loc="upper left")
            plt.show()

在第一个例子中,我们将使用特定日期之前的训练数据,然后从该日期开始直接生成几个测试实例。

[7]:
prediction_length = 3 * 24
training_dataset, test_template = split(
    dataset, date=pd.Period("2015-04-07 00:00:00", freq="1H")
)
test_pairs = test_template.generate_instances(
    prediction_length=prediction_length,
    windows=3,
)

plot_dataset_splitting(dataset, training_dataset, test_pairs)
../../_images/tutorials_data_manipulation_dataset_splitting_example_13_0.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_13_1.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_13_2.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_13_3.png

然而,我们不一定需要将训练数据结束的日期与测试部分开始的日期对齐。因此,对于第二个例子,我们将训练数据取至日期 2015-03-27 00:00:00,然后从日期 2015-04-07 00:00:00 开始生成几个测试实例,方法是将 split 函数应用两次。

[8]:
training_dataset, _ = split(dataset, date=pd.Period("2015-03-28 00:00:00", freq="1H"))
_, test_template = split(dataset, date=pd.Period("2015-04-07 00:00:00", freq="1H"))
test_pairs = test_template.generate_instances(
    prediction_length=prediction_length,
    windows=3,
)

plot_dataset_splitting(dataset, training_dataset, test_pairs)
../../_images/tutorials_data_manipulation_dataset_splitting_example_15_0.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_15_1.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_15_2.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_15_3.png

此外,我们不必每次都对齐所有的测试实例。因此,对于第三个例子,我们将在 generate_instances 函数中添加 distance 参数,以使测试实例相互重叠。

[9]:
training_dataset, test_template = split(
    dataset, date=pd.Period("2015-04-07 00:00:00", freq="1H")
)
test_pairs = test_template.generate_instances(
    prediction_length=prediction_length,
    windows=3,
    distance=24,
)

plot_dataset_splitting(dataset, training_dataset, test_pairs)
../../_images/tutorials_data_manipulation_dataset_splitting_example_17_0.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_17_1.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_17_2.png
../../_images/tutorials_data_manipulation_dataset_splitting_example_17_3.png