现实世界的时间序列预测由于多种原因而充满挑战,这些原因不仅限于问题的特点,例如具有多个输入变量、需要预测多个时间步长以及需要对多个物理站点执行相同类型的预测。
在本帖中,您将发现一个标准但复杂的时间序列预测问题,它具有这些特性,但规模较小且易于理解,可以用来探索和更好地理解在具有挑战性的数据集上开发预测模型的方法。
阅读本文后,你将了解:
- 空气质量数据集的竞争和动机。
- 对定义的预测问题及其涵盖的数据挑战的概述。
- 您可以下载并立即开始使用的免费数据文件的描述。
通过我的新书《Python时间序列预测》启动您的项目,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

一个标准的多变量、多步、多站点时间序列预测问题
照片由某人拍摄,部分权利保留。
EMC 数据科学全球黑客马拉松
该数据集曾是 Kaggle 竞赛的中心。
具体来说,这是一场由 Data Science London 和 Data Science Global 作为 Big Data Week 活动的一部分举办的为期 24 小时的黑客马拉松,这两个组织在 6 年后似乎已不复存在。
比赛设有数千美元的现金奖励,数据集由伊利诺伊州库克县地方政府提供,表明数据集中提到的所有地点都位于该地区。
挑战的动机是开发一个更好的空气质量预测模型,摘自比赛描述
美国环保署的空气质量指数每天都被哮喘和其他呼吸系统疾病患者用来避免危险的户外空气污染物水平,这些污染物会引发发作。根据世界卫生组织的数据,估计目前有 2.35 亿人患有哮喘。在全球范围内,自 1980 年以来,哮喘已成为儿童最常见的慢性病,在美国发病率翻倍。
比赛描述表明,获奖模型可以作为新的空气质量预测系统的基础,尽管尚不清楚是否有任何模型曾为此目的进行过过渡。
比赛由 Kaggle 员工Ben Hamner赢得,由于利益冲突,他可能没有领取奖金。Ben 在题为“将一切放入随机森林:Ben Hamner 谈赢得空气质量预测黑客马拉松”的博文中描述了他的获胜方法,并在 GitHub 上提供了他的代码。
在此题为“分割模型的通用方法?”的论坛帖子中,也有对解决方案和相关代码的良好讨论。
预测建模问题
该数据描述了一个多站点或物理位置的多元时间序列的多元步预测问题。
根据随时间推移的多种天气测量值,预测多个物理位置上特定未来时间间隔的空气质量测量值。
这是一个具有许多真实世界预测特性的挑战性时间序列预测问题。
- 数据不完整。并非所有地点都提供所有天气和空气质量测量值。
- 数据缺失。并非所有可用的测量值都有完整的历史记录。
- 多元输入:每次预测的模型输入由多个天气观测值组成。
- 多步输出:模型输出是离散的预测空气质量测量值序列。
- 多站点输出:模型必须为多个物理站点输出多步预测。
下载数据集文件
该数据集可从 Kaggle 网站免费获取。
您必须先创建账户并登录 Kaggle,然后才能下载数据集。
数据集可在此处下载
数据集文件说明
共有 4 个相关文件需要单独下载;它们是:
文件:SiteLocations.csv
此文件包含站点位置列表,由唯一标识符和其在地球上的精确位置(经纬度)标记。
所有坐标似乎都在北半球西部相对较近,例如美国。
以下是文件的样本。
1 2 3 4 5 6 7 |
"SITE_ID","LATITUDE","LONGITUDE" 1,41.6709918952829,-87.7324568962847 32,41.755832412403,-87.545349670582 50,41.7075695897648,-87.5685738570845 57,41.9128621248178,-87.7227234452095 64,41.7907868783739,-87.6016464917605 ... |
文件:SiteLocations_with_more_sites.csv
此文件与SiteLocations.csv格式相同,并且似乎列出了与该文件相同的所有位置,并增加了一些额外的位置。
正如文件名所示,它只是站点列表的一个更新版本。
以下是文件的样本。
1 2 3 4 5 6 7 |
"SITE_ID","LATITUDE","LONGITUDE" 1,41.6709918952829,-87.7324568962847 14,41.834243,-87.6238 22,41.6871654376343,-87.5393154841479 32,41.755832412403,-87.545349670582 50,41.7075695897648,-87.5685738570845 ... |
文件:TrainingData.csv
此文件包含用于建模的训练数据。
数据以未规范化的方式呈现。每行数据包含一个小时内一个地点的一组气象测量值,以及该地点在该小时的目标或结果。
测量值包括:
- 时间信息,包括时间块、连续时间块内的索引、平均月份、星期几和一天中的小时。
- 风力测量,如风向和风速。
- 温度测量,如最高和最低环境温度。
- 压力测量,如最高和最低气压。
目标变量是不同物理位置上的一系列不同的空气质量或污染测量值。
并非所有地点都有所有天气测量值,也并非所有地点都与所有目标测量值相关。此外,对于已记录的变量,存在标记为 NA 的缺失值。
以下是文件的样本。
1 2 3 4 5 6 7 |
"rowID","chunkID","position_within_chunk","month_most_common","weekday","hour","Solar.radiation_64","WindDirection..Resultant_1","WindDirection..Resultant_1018","WindSpeed..Resultant_1","WindSpeed..Resultant_1018","Ambient.Max.Temperature_14","Ambient.Max.Temperature_22","Ambient.Max.Temperature_50","Ambient.Max.Temperature_52","Ambient.Max.Temperature_57","Ambient.Max.Temperature_76","Ambient.Max.Temperature_2001","Ambient.Max.Temperature_3301","Ambient.Max.Temperature_6005","Ambient.Min.Temperature_14","Ambient.Min.Temperature_22","Ambient.Min.Temperature_50","Ambient.Min.Temperature_52","Ambient.Min.Temperature_57","Ambient.Min.Temperature_76","Ambient.Min.Temperature_2001","Ambient.Min.Temperature_3301","Ambient.Min.Temperature_6005","Sample.Baro.Pressure_14","Sample.Baro.Pressure_22","Sample.Baro.Pressure_50","Sample.Baro.Pressure_52","Sample.Baro.Pressure_57","Sample.Baro.Pressure_76","Sample.Baro.Pressure_2001","Sample.Baro.Pressure_3301","Sample.Baro.Pressure_6005","Sample.Max.Baro.Pressure_14","Sample.Max.Baro.Pressure_22","Sample.Max.Baro.Pressure_50","Sample.Max.Baro.Pressure_52","Sample.Max.Baro.Pressure_57","Sample.Max.Baro.Pressure_76","Sample.Max.Baro.Pressure_2001","Sample.Max.Baro.Pressure_3301","Sample.Max.Baro.Pressure_6005","Sample.Min.Baro.Pressure_14","Sample.Min.Baro.Pressure_22","Sample.Min.Baro.Pressure_50","Sample.Min.Baro.Pressure_52","Sample.Min.Baro.Pressure_57","Sample.Min.Baro.Pressure_76","Sample.Min.Baro.Pressure_2001","Sample.Min.Baro.Pressure_3301","Sample.Min.Baro.Pressure_6005","target_1_57","target_10_4002","target_10_8003","target_11_1","target_11_32","target_11_50","target_11_64","target_11_1003","target_11_1601","target_11_4002","target_11_8003","target_14_4002","target_14_8003","target_15_57","target_2_57","target_3_1","target_3_50","target_3_57","target_3_1601","target_3_4002","target_3_6006","target_4_1","target_4_50","target_4_57","target_4_1018","target_4_1601","target_4_2001","target_4_4002","target_4_4101","target_4_6006","target_4_8003","target_5_6006","target_7_57","target_8_57","target_8_4002","target_8_6004","target_8_8003","target_9_4002","target_9_8003" 1,1,1,10,"Saturday",21,0.01,117,187,0.3,0.3,NA,NA,NA,14.9,NA,NA,NA,NA,NA,NA,NA,NA,5.8,NA,NA,NA,NA,NA,NA,NA,NA,747,NA,NA,NA,NA,NA,NA,NA,NA,750,NA,NA,NA,NA,NA,NA,NA,NA,743,NA,NA,NA,NA,NA,2.67923294292042,6.1816228132982,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,2.38965627997991,NA,5.56815355612325,0.690015329704154,NA,NA,NA,NA,NA,NA,2.84349016287551,0.0920223353681394,1.69321097077376,0.368089341472558,0.184044670736279,0.368089341472558,0.276067006104418,0.892616653070952,1.74842437199465,NA,NA,5.1306307034019,1.34160578423204,2.13879182993514,3.01375212399952,NA,5.67928016629218,NA 2,1,2,10,"Saturday",22,0.01,231,202,0.5,0.6,NA,NA,NA,14.9,NA,NA,NA,NA,NA,NA,NA,NA,5.8,NA,NA,NA,NA,NA,NA,NA,NA,747,NA,NA,NA,NA,NA,NA,NA,NA,750,NA,NA,NA,NA,NA,NA,NA,NA,743,NA,NA,NA,NA,NA,2.67923294292042,8.47583334194495,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,1.99138023331659,NA,5.56815355612325,0.923259948195698,NA,NA,NA,NA,NA,NA,3.1011527019063,0.0920223353681394,1.94167127626774,0.368089341472558,0.184044670736279,0.368089341472558,0.368089341472558,1.73922213845783,2.14412041407765,NA,NA,5.1306307034019,1.19577906855465,2.72209869264472,3.88871241806389,NA,7.42675098668978,NA 3,1,3,10,"Saturday",23,0.01,247,227,0.5,1.5,NA,NA,NA,14.9,NA,NA,NA,NA,NA,NA,NA,NA,5.8,NA,NA,NA,NA,NA,NA,NA,NA,747,NA,NA,NA,NA,NA,NA,NA,NA,750,NA,NA,NA,NA,NA,NA,NA,NA,743,NA,NA,NA,NA,NA,2.67923294292042,8.92192983362627,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,1.7524146053186,NA,5.56815355612325,0.680296803933673,NA,NA,NA,NA,NA,NA,3.06434376775904,0.0920223353681394,2.52141198908702,0.460111676840697,0.184044670736279,0.368089341472558,0.368089341472558,1.7852333061419,1.93246904273093,NA,NA,5.13639545700122,1.40965825154816,3.11096993445111,3.88871241806389,NA,7.68373198968942,NA 4,1,4,10,"Sunday",0,0.01,219,218,0.2,1.2,NA,NA,NA,14,NA,NA,NA,NA,NA,NA,NA,NA,4.8,NA,NA,NA,NA,NA,NA,NA,NA,751,NA,NA,NA,NA,NA,NA,NA,NA,754,NA,NA,NA,NA,NA,NA,NA,NA,748,NA,NA,NA,NA,NA,2.67923294292042,5.09824561921501,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,2.38965627997991,NA,5.6776192223642,0.612267123540305,NA,NA,NA,NA,NA,NA,3.21157950434806,0.184044670736279,2.374176252498,0.460111676840697,0.184044670736279,0.368089341472558,0.276067006104418,1.86805340797323,2.08890701285676,NA,NA,5.21710200739181,1.47771071886428,2.04157401948354,3.20818774490271,NA,4.83124285639335,NA 5,1,5,10,"Sunday",1,0.01,2,216,0.2,0.3,NA,NA,NA,14,NA,NA,NA,NA,NA,NA,NA,NA,4.8,NA,NA,NA,NA,NA,NA,NA,NA,751,NA,NA,NA,NA,NA,NA,NA,NA,754,NA,NA,NA,NA,NA,NA,NA,NA,748,NA,NA,NA,NA,NA,2.67923294292042,4.87519737337435,NA,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,0.114975168664303,NA,2.31000107064725,NA,5.6776192223642,0.694874592589394,NA,NA,NA,NA,NA,NA,3.67169118118876,0.184044670736279,2.46619858786614,0.460111676840697,0.184044670736279,0.368089341472558,0.276067006104418,1.70241320431058,2.60423209091834,NA,NA,5.21710200739181,1.45826715677396,2.13879182993514,3.4998411762575,NA,4.62565805399363,NA ... |
文件:SubmissionZerosExceptNAs.csv
此文件包含预测问题提交样本。
每行指定了在连续时间块的给定小时内,所有目标位置的每个目标测量的预测值。
以下是文件的样本。
1 2 3 4 5 6 7 |
"rowID","chunkID","position_within_chunk","hour","month_most_common","target_1_57","target_10_4002","target_10_8003","target_11_1","target_11_32","target_11_50","target_11_64","target_11_1003","target_11_1601","target_11_4002","target_11_8003","target_14_4002","target_14_8003","target_15_57","target_2_57","target_3_1","target_3_50","target_3_57","target_3_1601","target_3_4002","target_3_6006","target_4_1","target_4_50","target_4_57","target_4_1018","target_4_1601","target_4_2001","target_4_4002","target_4_4101","target_4_6006","target_4_8003","target_5_6006","target_7_57","target_8_57","target_8_4002","target_8_6004","target_8_8003","target_9_4002","target_9_8003" 193,1,193,21,10,0,0,-1e+06,0,0,0,0,0,0,0,-1e+06,0,-1e+06,0,0,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,0,0,0,0,0,0,0,0,0,-1e+06,-1e+06,0,0,0,0,-1e+06,0,-1e+06 194,1,194,22,10,0,0,-1e+06,0,0,0,0,0,0,0,-1e+06,0,-1e+06,0,0,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,0,0,0,0,0,0,0,0,0,-1e+06,-1e+06,0,0,0,0,-1e+06,0,-1e+06 195,1,195,23,10,0,0,-1e+06,0,0,0,0,0,0,0,-1e+06,0,-1e+06,0,0,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,0,0,0,0,0,0,0,0,0,-1e+06,-1e+06,0,0,0,0,-1e+06,0,-1e+06 196,1,196,0,10,0,0,-1e+06,0,0,0,0,0,0,0,-1e+06,0,-1e+06,0,0,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,0,0,0,0,0,0,0,0,0,-1e+06,-1e+06,0,0,0,0,-1e+06,0,-1e+06 197,1,197,1,10,0,0,-1e+06,0,0,0,0,0,0,0,-1e+06,0,-1e+06,0,0,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,-1e+06,0,0,0,0,0,0,0,0,0,-1e+06,-1e+06,0,0,0,0,-1e+06,0,-1e+06 ... |
构建预测问题
这个预测问题的一个很大挑战在于,存在大量的可能性来构建用于建模的问题。
这具有挑战性,因为不清楚哪种构建方式可能最适合这个特定的建模问题。
例如,以下是一些引发思考关于如何构建问题的疑问。
- 是填补缺失的观测值还是忽略它们更好?
- 是输入一系列天气观测值,还是仅输入当前小时的观测值更好?
- 是使用一个或多个源站点提供的天气观测值进行预测更好?
- 是为每个站点建立一个模型,还是为一个模型涵盖所有站点更好?
- 是为每个预测时间建立一个模型,还是为一个模型涵盖所有预测时间更好?
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
总结
在本帖中,您了解了 Kaggle 空气质量数据集,它为复杂的时间序列预测提供了一个标准数据集。
具体来说,你学到了:
- 空气质量数据集的竞争和动机。
- 对定义的预测问题及其涵盖的数据挑战的概述。
- 对可以下载并立即开始使用的免费数据文件的描述。
您是否处理过这个数据集,或者您打算处理吗?
在下面的评论中分享您的经验。
在这本书中,“多元”并没有得到处理。
怎么会呢?
多个输入或多个输入系列就是多元。
我认为他指的是您在文章结尾的图书广告。
是的。我希望以后写一本专门针对该主题的书。
道路交通路径推荐问题如何构建为多元、多步、多站点时间序列预测问题?我正在考虑以下不同的输入参数:1.源和目的地之间的距离;2.车辆的速度和类型;3.交通量和密度;4.环境条件;5.基础设施条件等。并寻找合适的路径,以便从源到目的地旅行,以最小的距离、可行的速度等。是否有任何与交通数据相关的数据集可用?请建议。谢谢!
抱歉,我不知道有。
Jason,谢谢您关于使用 LSTM 进行序列预测的文章。我有一个问题,其中多个用户在一段时间内通过 6 个不同的指标进行测量。
我将其视为一个“多时间序列”问题。
具体来说,问题如下。
用户 ID 能量 睡眠质量 营养质量……
1 4 3 4
1 5 3 2
2 1 5 3
2 4 3 2
所以,我需要考虑每个用户 ID 的上述序列并预测下一个序列。
我想知道如何处理这样的问题。
请帮帮我。
这能帮助您弄清楚问题的类型。
https://machinelearning.org.cn/taxonomy-of-time-series-forecasting-problems/
Jason,看到您将如何处理这个问题会很有趣。您认为能否从包含如此多缺失变量的数据集中构建一个可靠的预测模型?我期待您的反馈。
也许可以,这真的取决于数据的具体情况。
嗨,Jason!
好帖子!我正在尝试用 Python 模仿这个分析,但在随机森林回归中处理缺失值时遇到困难。根据我所读到的,随机森林可以处理树分割的 NaN,但不能处理回归的 NaN。
看看 Ben 的 Matlab 代码,似乎他将缺失值“填补”为 0。我说得对吗?我不确定将缺失值填补为 0 是否最适合回归。有什么想法吗?
先谢谢您了。
这真的取决于具体的实现。
也许可以试试 xgboost 库?或者 sklearn 的实现?
嗨,Jason,
最近我阅读了您在这篇博客上发表的文章。从那时起,我阅读了您在此处发表的许多文章。您的知识和经验令人印象深刻。
我正在尝试解决一个多元(多输入数据)多步(多输出)预测问题,但不知道应该使用哪种方法。
我拥有代表天气(温度、压力、湿度、风速、风向等)、污染(PM10、PM2.5、NO2 等)、交通(平均速度、街道交通拥堵系数)的时间序列数据。我拥有一个来自约 100 个城市内部(327 平方公里)的数据。测量每小时进行一次。
我正在尝试实现一个软件,该软件可以预测特定污染物(例如 PM10)的 24 小时预测,使用当前数据和历史数据。是否有任何首选方法来执行此类分析?最初,我考虑了两种类型的方法:
a) 使用 LSTM 进行多元时间序列预测
b) 本文所述的使用 RandomForest 算法的方法
也许还有我没听说过的其他方法。如果您必须解决这类问题,您会使用什么方法?
感谢您在此博客上所做的工作:)
我推荐在此类问题上使用深度 MLP。
非常感谢。
我还有一个问题。您的博客上是否有关于使用 MLP 进行多元/多步时间序列预测的文章?
我曾试图在互联网上查找有关此方法的一些资料,但找不到任何有趣的内容。我看到了一些科学论文,但没有一篇描述了完全相同的问题。
我希望以后写一本关于这个主题的书。
这将是一个非常好的主意。我很想读这样的书。
无论如何,我将自己尝试解决这个问题。我只是以为您有对我有用的材料,但现在我明白了为什么您还没有发布它们。
我感谢到目前为止提供的信息。祝您好运:)
Jason,关于这本书覆盖了深度深度 MLP 用于多元时间序列预测的 ETA 是什么?
我打赌固定窗口数据是关键,您对此有何看法?
我知道这很大程度上取决于具体实现,但在这些情况下,深度到底有多深?
目前没有固定的 ETA。正在进行中。
嗨 Jason
非常感谢您分享 LSTM 时间序列预测,这对我的 LSTM 学习帮助很大。但我对几个时间步的 LSTM 预测仍有一些困惑。
问题是我有 12 年的单变量时间序列数据,想用 84 小时的数据通过 BP 网络和 LSTM 预测未来 12 小时的数据。我发现 BP 表现更好,但我认为 LSTM 会做得更好,也许我有什么不对,您能告诉我如何构建一个多步预测 LSTM 网络吗?
我期待您的回复!
我在此回答了如何为 LSTM 准备时间序列数据的问题。
https://machinelearning.org.cn/faq/single-faq/how-do-i-prepare-my-data-for-an-lstm
我在此回答了为什么 LSTM 在时间序列预测方面表现不佳的问题。
https://machinelearning.org.cn/faq/single-faq/how-do-i-use-lstms-for-time-series-forecasting
嗨,Jason,
非常感谢您分享 LSTM 时间序列预测,这对我学习时间序列预测很有帮助。但是,我在时间序列预测方面仍存在一些问题。它们列在下面:
1) 我想知道序列预测和时间序列预测的区别。我们是否可以使用处理序列预测的模型来进行时间序列预测?
2)正如我看到您过去的博客,您将 LSTM 模型应用于只有一个 Shampoo-Sales 数据集的 36 条记录。我们知道,深度学习模型通常用于大数据集。因此,您的经验可能会导致性能不佳。我的数据集有 1000 条记录。在这种情况下,我可以使用 LSTM 来构建模型吗?
3)您能否提供一些关于可变时间步 LSTM 的有用示例?
我希望收到您的回复。
好问题。
时间序列是一种序列预测。序列预测模型可用于时间序列。
LSTM 可能对您的问题有益,但我鼓励您也测试一套其他方法,以确认 LSTM 的技能。
在使用具有可变输入时间步长的 LSTM 时,您必须填充输入并使用掩码层来忽略填充。我在博客上有示例。
这有帮助吗?
嘿,杰森!
您能否详细说明如何使用随机森林进行多步时间序列预测(Python)?您的其中一篇进一步阅读的主题涵盖了 Matlab 上的此内容。但是,我没有多少 Matlab 经验,并且发现理解起来很困难。
您必须将数据分成窗口,其中输入向量是过去观测值,映射到下一个观测值。
这篇帖子将有助于准备数据。
https://machinelearning.org.cn/convert-time-series-supervised-learning-problem-python/
这有帮助吗?
嗨,Jason,
我查看了您的博客一整天,找到了许多非常有趣的文章。
我目前正在处理以下问题:
预测电力生产(在不同的领域 - 太阳能、风能等),使用历史生产数据。我曾考虑通过将日期作为输入来改进预测(月份可以为太阳能照射和风力提供良好信息)。我还考虑使用天气数据集作为附加输入。
您认为多元、多步时间序列(可能使用 LSTM 网络)会是一个好方法吗?
我推荐使用此过程来做到系统化。
https://machinelearning.org.cn/how-to-develop-a-skilful-time-series-forecasting-model/
嗨,Jason,
我有一个更普遍的问题。在你的一篇教程中,你说过应该使时间序列平稳。如果我有一个多元时间序列,并对每个变量进行平稳性检验,得到的结果是一些变量需要差分,而另一些变量已经平稳,你会怎么做?也许只对部分变量进行差分是不合理的……?
首先直接对数据进行建模,然后尝试使每个/所有变量平稳,看看这对模型学习问题的能力有什么影响。
您好,我是一名中国研究人员,对将机器学习算法应用于空气质量领域非常感兴趣,但我无法下载您使用的数据。您能发我一份副本吗?
谢谢你
您必须在 Kaggle 上注册,然后才能下载数据集。
抱歉,我无法发送给您。
嗨,Jason,
在一般的多站点时间序列中,我们能用一个单一模型(我想用 LSTM)来预测多个站点吗?还是我们需要为不同的站点建立不同的模型(如果有 1000 多个站点,比如客户数据,这种方法有多实用?)
好问题,这会有帮助
https://machinelearning.org.cn/faq/single-faq/how-to-develop-forecast-models-for-multiple-sites
我们如何在一个组或所有站点上训练一个单一模型(LSTM 或 SARIMAX)?在某个时间步长,我们会为同一特征有不同的值(对应不同站点)?您是否有关于这方面的文章,因为这种方法对我来说还不清楚?或者您能否简单介绍一下,我就可以在此基础上继续研究了!
总之,感谢您的快速回复!我很喜欢您的文章!
是的,从这里开始
https://machinelearning.org.cn/start-here/#deep_learning_time_series