时空预测是指对未知系统状态在时间和空间上的预测,它是地球系统科学、交通运输、智慧城市等领域的重要技术和工具。时空预测的目的是利用历史数据和当前信息,通过建立时空依赖关系,来推断未来的变化趋势和可能的情景。时空预测的应用价值非常巨大,它可以帮助人们提前了解和应对各种自然灾害、社会危机、经济波动等问题,从而提高决策效率和社会福祉。
时空预测面临着许多挑战和问题,主要包括以下几个方面:
一是数据的高度非线性和复杂性。时空数据往往具有多尺度、多源、多变量、多模态等特点,同时受到多种因素的影响,如气候变化、人口迁移、政策干预等,导致数据的分布和结构难以捕捉和建模。
二是预测任务的多样性和难度。时空预测的任务可以涉及不同的时间跨度(如短期、中期、长期)、空间范围(如局部、区域、全局)、预测目标(如单点、多点、区域、全域)、预测形式(如确定性、概率性、演绎性、结论性)等,不同的任务对预测方法的要求和评估标准也不同。
三是时空依赖关系的复杂性和动态性。时空数据之间存在着复杂的依赖关系,如时间上的自相关、空间上的异质性、时空上的交互作用等,这些依赖关系不仅需要考虑数据的拓扑结构,还需要考虑数据的语义含义和物理机制。此外,时空依赖关系也可能随着时间和空间的变化而变化,如季节性、周期性、突发性等,这给预测方法的稳定性和鲁棒性带来了挑。
三是预测结果的不确定性和可解释性。由于数据的噪声、缺失、异常等问题,以及模型的偏差、方差、过拟合等问题,时空预测结果往往具有不确定性,即预测结果可能与真实值存在一定的偏差或误差。
我将介绍一种基于微软fost的时空预测工具,它是一个通用的时空预测开源工具,可以帮助用户在各种业务场景中进行高效的预测。
Win下深度学习环境的安装可以参考安装教程,fost的安装可以参照的安装教程。
torch-geometric与pytorch强依赖的,所以建议本机的cuda版本、pytorch、torch-geometric一直,也就是若你本机的安装的是12.1版本的cuda,你安装pytorch时候,也要选择选择cuda12.1,在torch-geometric也要选择cuda12.1。
Fost不支持cpu版本的pytorch,后期若我们需打包fost项目分享出去,可以用pyinstaller打包项目为纯cpu运行的版本,不过要修改配置文件、项目几个文件的代码
pip install openpyxl
安装python excel依赖,方便将结果保存为表格
fost的使用非常简单,只需要2个步骤:
用户需要将自己的数据整理成fost所需的格式,包括训练数据文件(train.csv)和图结构文件(graph.csv),具体的数据格式可以参考数据格式一节,因为大局域网的原因,下不了官方的数据,在这里来这里下载。
可以看到,在官方的案例里面,有效的格式可能如下所示:
Node:当前数据的节点名称
日期:当前数据的日期或时间戳
TARGET:预测目标
我们参考官方的“Predict States Energy Data”案例给出一个教程,并给出注释。
#导入fostool.pipeline模块
from fostool.pipeline import Pipeline
#导入数据
train_path = r'FOST_example_data\Energy\train.csv'
graph_path = r'FOST_example_data\Energy\graph.csv'
#预测的步长
lookahead = 5
#Pipeline的建立,可以看做模型建立
fost = Pipeline(lookahead=lookahead, train_path=train_path, graph_path=graph_path)
#训练
fost.fit()
#预测
result = fost.predict()
模型保存
#fost.save_pipeline()
#保存预测结果
result.to_excel("result.xlsx")
到这里,我们就完成了第一个基于图神经网络的时空预测。
若仅仅是简单使用,到这里就可以了,下面是项目的优化使用。
配置参数文件是fostool\config文件下的default.yaml,若想根据自己的数据和任务来配置fost的参数,需要在
fost = Pipeline(lookahead=lookahead, train_path=train_path, graph_path=graph_path config_path= r'FOST_example_data\Energy\ default.yaml')
传入config的参数,在这里给出config的解读
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
base:
# 模型保存路径
dump_path: 'runs'
# 损失函数
loss_func: 'mse'
data_handler:
#细看Tips 4
lookback: 'auto'
trainer:
# 最大的训练次数,因为fost项目设置运用了早停策略,所以不一定运行完一次max_epochs
max_epochs: 100
# coda or cpu,实际项目上面默认配置下,占1.7显存
device: 'cuda'
model:
# KRNN模型
KRNNModel:
cnn_dim: 64
cnn_kernel_size: 3
rnn_dim: 64
rnn_dups: 3
# 刚看到这个项目的时候,以为只纯GNN模型,但是看到这里才发现并不是,SandwichModel是cnn、rnn、gcn三明治混合的模型
SandwichModel:
cnn_dim: 64
cnn_kernel_size: 3
rnn_dim: 64
rnn_dups: 3
gcn_dim: 64
gcn_type: 'gat'
gcn_aggr: 'max'
gcn_norm: 'none'
# MLP 前馈神经网络
MLP_Res:
hid_dim: 64
nb_layer: 4
fusion:
# fost支持trunacted、average两种模型融合策略
method: 'trunacted'
现在从官方的“Predict States Energy Data”案例,开始解读
model KRNNModel_3164_7
是什么意思
我们来看fostool\model
文件下的__init__.py
可以看到,这里给出的模型名字并不是实际的名字,是对模型名字哈希后的,其中model KRNNModel_3164_7
中的7
,就是我们设置的lookback_list
参数带来的,这就带来第一个问题,在配置文件里面,也有个lookback
参数,这两有什么区别,看Tips 4。
我们来看fostool
文件下的pipeline.py
函数
当模型的预测步长小于7的时候,lookback_list
为[7, 14, 24]。实际上,配置文件中lookback
是不齐作用的,想修改lookback_list
参数,我们需要在Pipeline(lookahead=lookahead, train_path=train_path, graph_path=graph_path, lookback_list=[10, 20, 30])
进行导入,不知道是否为微软写下的bug。
我们来看fostool\ task
文件下的fusion.py
函数
Fost支持的模型融合为average
、trunacted
两种模型融合策略,其中average
将所有模型的结果进行取均值后给出,trunacted
比较复杂,不是简单的取最好的模型输出,而是取出那些误差<最小误差的模型+误差的标准差模型,然后将所有模型的结果进行取均值后给出。
我们来看fostool文件下的pipeline.py
函数,可以看到模型最低要求的训练数据量为100,若想修改,直接改就行。