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,但话说回来,这件事其实和库无关):