M4数据集

702 阅读3分钟

M4数据集是时间序列常用的一个数据集,先说点比较容易查到的基础信息(废话)以下来自GPT:

M4 数据集是用于第四届 Makridakis 预测竞赛的 100,000 个时间序列集合。该数据集由年度、季度、月度和其他(每周、每日和每小时)数据的时间序列组成,并分为训练和测试集。 M4 数据集的特点包括:

  • 规模庞大,包含来自不同来源的多种类型的时间序列数据。
  • 数据覆盖了广泛的领域,包括经济、金融、商业、社会、环境等。
  • 数据质量良好,经过仔细清理和验证。

M4 数据集已被广泛用于时间序列预测研究。它为研究人员提供了一个宝贵的资源,可以用于开发和评估新的预测方法。

为什么要了解这个数据集?

挺多时间序列算法会用到这个数据集,毕竟只看代码即有看不懂也有跑不通的风险,总是要在数据集上实际🫧才好说。

数据集介绍

“上面GPT不是已经说了么“ == 上面说的可能能帮助你知道这个概念,但对你使用数据集做事情基本没有帮助,区别就好比你知道足球规则和你知道怎么把球踢进对手球门一样。

我看到比较好的对原始数据集介绍的文章来自 github.com/Mcompetitio…, 部分原因是因为M4是希腊的一个学术组织提供的,这个github链接应该和原始组织有关系。

Dataset/M4-info.csv,格式如下

   ID (M4id), domain (category), frequency (Frequency), number of forecasts requested (Horizon), seasonal periods (SP) and starting date (StartingDate)
    1. M4id,category,Frequency,Horizon,SP,StartingDate
    2. Y1,Macro,1,6,Yearly,01-01-79 12:00
    3. Y2,Macro,1,6,Yearly,01-01-79 12:00

包括ID,其中Y表示year级别,对应还有Q(quarter)/M(month)/W(week)/D(day)/H(hour),实际和后面的horizon对应。

Dataset/Train/(Yearly)-train.csv: 训练集,同样对应有Q/M/W/D/H

Dataset/Train/(Yearly)-test.csv: 测试集,同样对应有Q/M/W/D/H

github.com/Mcompetitio… 它的readme比较有意思:

Point Forecasts:有不同solution里面的csv对应rar,csv里面包含10w行,对应10w给序列,列的个数最多是48,因为按最多的任务来算是48,所以有些任务,比如year的任务,因为只预测6条, 6之后都是NA

Prediction Intervals:每个预测,同样给出结果的上下界面

除了数据folder,这个库里面还提供了很多solution,部分是Python,也有部分是R的。

更好的数据集使用方法

当然只是个人认为,上述数据清洗等需要一些时间,这些事情 datasetforecast github.com/Nixtla/data… 已经完成了,基于它来使用M4数据集,会简单不少,比如:

from datasetsforecast.m4 import M4, M4Evaluation, M4Info

# 下载数据
await M4.async_download('data')

def train_valid_split(group):
    df, *_ = M4.load(directory='data', group=group)
    df['ds'] = df['ds'].astype('int')
    horizon = M4Info[group].horizon
    valid = df.groupby('unique_id').tail(horizon)
    train = df.drop(valid.index)
    return train, valid

# 划分训练/测试集
hourly_train, hourly_valid = train_valid_split('Hourly')

可以看到的数据格式:

以hourly为例
    1.        unique_id   ds        y
    2. 0             H1    1    605.0
    3. 1             H1    2    586.0
    4. 2             H1    3    586.0
    5. 3             H1    4    559.0
    6. 4             H1    5    511.0
    7. ...          ...  ...      ...
    8. 373319       H99  696  27926.0

unique id就是唯一的序列号,这里有99个序列。

ds是每个序列的下标,均是从1开始。

y是序列值。

基于数据处理,可以做一个简单的预测(这部分不是datasetforecast的内容了,可以参考同一个公司的mlforecast,但话说回来,这件事其实和库无关):