EpiLearn:机器学习与流行病学融合的全栈式Python研究框架
1. 项目概述:为什么我们需要一个机器学习的流行病建模工具库?
如果你在公共卫生、数据科学或者计算流行病学领域工作过,大概率对SIR、SEIR这类经典的机理模型(Mechanistic Models)不陌生。这些基于微分方程的模型,通过定义人群在易感(S)、暴露(E)、感染(I)、康复(R)等状态间的转移概率,为我们理解疾病传播的宏观动力学提供了坚实的数学基础。在过去几十年里,它们是流行病学家的核心工具箱。然而,当COVID-19大流行席卷全球时,我们面临的数据复杂性达到了前所未有的高度:多源异构的时空数据(如病例报告、人口流动网络、环境因素)、快速变化的干预措施、以及传播过程中强烈的非线性效应。传统模型在应对这种高维、动态且充满噪声的现实世界数据时,常常显得力不从心,调参困难,且难以捕捉数据中隐藏的复杂模式。
与此同时,机器学习(ML),尤其是深度学习,在计算机视觉、自然语言处理等领域取得了革命性成功。其核心能力在于“端到端”地从数据中自动学习特征和表示,无需过多依赖人工预设的强假设。这自然引出了一个激动人心的交叉点:能否将机器学习的强大拟合与预测能力,应用于流行病建模,以弥补传统方法的不足?答案是肯定的,并且已经涌现了大量研究,例如利用图神经网络(GNN)对城市间的传播网络进行建模,或使用时序模型(如LSTM、Transformer)预测未来感染趋势。
但问题也随之而来。这个领域的研究工具目前处于一种“碎片化”状态。流行病学家可能精通R语言的EpiModel,但对PyTorch搭建神经网络感到陌生;数据科学家熟悉TensorFlow和Scikit-learn,却不了解流行病学任务(如溯源检测)的特殊数据结构和评估指标。研究者想复现一篇最新的基于GNN的疫情预测论文,往往需要从头搭建数据管道、模型框架和评估流程,大量时间耗费在工程而非科研上。这种隔阂严重阻碍了机器学习在公共卫生领域的有效应用和创新。
EpiLearn的诞生,正是为了弥合这道鸿沟。它不是一个简单的模型集合,而是一个为“机器学习+流行病学”量身定制的、全栈式的Python研究框架。你可以把它想象成流行病学领域的PyTorch Geometric(PyG)或scikit-learn。它的目标非常明确:为流行病学家和数据科学家提供一个统一、灵活、高效的平台,让大家能专注于模型创新和科学发现,而不是重复的底层编码。接下来,我将从一个实践者的角度,深入拆解EpiLearn的设计哲学、核心功能,并分享如何利用它快速开展研究。
2. EpiLearn核心架构与设计哲学
2.1 模块化与解耦:构建灵活的研究流水线
EpiLearn最值得称道的设计是其彻底的模块化思想。它将一个完整的流行病机器学习项目分解为几个清晰独立的组件:数据(Dataset)、模型(Model)、任务(Task)、变换(Transforms)以及工具(Utils,如可视化、模拟)。这种设计与PyTorch的设计哲学一脉相承,确保了极高的灵活性和可扩展性。
为什么模块化如此重要?在科研中,我们经常需要做控制变量实验:固定数据集,比较不同模型的效果;或者固定模型,测试其在多个数据集上的泛化能力。如果代码中数据加载、模型训练、评估指标计算等逻辑纠缠在一起,做一次这样的对比实验就意味着一场代码重构的灾难。EpiLearn通过解耦,让每个组件可以像乐高积木一样自由组合。
例如,其核心数据类UniversalDataset被设计为容纳各种形态的流行病数据:节点特征(Node Features,如各地区每日新增病例数)、节点状态(Node States,如易感、感染等)、静态图(Static Graph,如固定的行政区划邻接关系)、动态图(Dynamic Graph,如随时间变化的人口流动网络)。所有模型都通过统一的接口从这个数据容器中获取所需输入。这意味着,无论你后续想尝试GCN还是Transformer,数据预处理部分几乎无需改动。
2.2 面向两大核心任务的设计
EpiLearn目前聚焦于流行病学中两个最经典也最具挑战性的计算任务:预测(Forecasting)和溯源检测(Source Detection)。库的设计紧密围绕这两个任务展开。
预测任务的核心是时序外推。给定过去一段时间(lookback窗口,如过去14天)的观测数据,预测未来一段时间(horizon窗口,如未来7天)的发展趋势。这不仅是公共卫生资源调配的关键依据,也是检验模型时序建模能力的试金石。EpiLearn为此任务集成了从经典时序模型(ARIMA)到机器学习模型(XGBoost),再到深度学习模型(LSTM, GRU, DLinear)乃至最新的时空图神经网络(如Cola-GNN, DASTGN)的完整谱系。
溯源检测任务则更像一个“侦探游戏”。在疫情爆发后,给定一个观察到的感染网络(谁感染了谁),目标是推断出最初的“零号病人”(Patient Zero)。EpiLearn将这个问题形式化为一个图节点分类问题:输入是当前的接触网络图,输出是每个节点作为源头的概率。这需要模型具备强大的图结构推理能力,因此该任务下主要集成了各种图神经网络模型(如GCN, GAT, GIN)。
为每个任务,EpiLearn都提供了一个高级的Task类(如Forecast,SourceDetection)。这个类封装了该任务特定的数据加载、训练循环、损失计算和评估流程。用户只需要准备好数据和模型实例,将其传入对应的Task类,调用train_model()和evaluate_model()即可,极大地简化了实验流程。
2.3 内置数据模拟器:解决数据稀缺的痛点
高质量的流行病数据往往涉及隐私,难以公开获取,这是该领域研究的一大瓶颈。EpiLearn内置的数据模拟(Simulation)模块,为此提供了一个优雅的解决方案。它允许研究者在虚拟环境中生成符合流行病传播动力学规律的合成数据,用于算法开发、验证和消融实验。
模拟器支持三个层次:
- 空间模拟:利用PyG等工具生成各种拓扑结构的随机静态图(如Erdős–Rényi随机图、小世界网络),模拟人群的接触网络。
- 时间模拟:基于经典的SIR、SIS、SEIR等机理模型,生成疾病在单一区域(或均质人群)内随时间演变的病例曲线。
- 时空模拟:这是最强大的部分,结合了上述两者。例如,使用
NetworkSIR模型,在一个生成的接触网络(空间)上,模拟疾病随时间的传播过程(时间),从而产生带有时空依赖关系的节点状态序列。
这个功能的价值在于,它让研究者可以在一个受控的、已知“地面真相”的环境中,严格测试模型在不同传播参数(如基本再生数R0)、网络结构下的性能,这是使用真实数据难以做到的。
3. 核心模块深度解析与实操要点
3.1 模型库:从经典到前沿的武器库
EpiLearn的模型库是其核心价值所在。它没有停留在简单的接口封装,而是对模型进行了精心分类和统一化改造,使其能无缝接入其流水线。
3.1.1 时序模型(Temporal Models)这类模型处理单一区域或多个区域聚合后的时间序列数据,不考虑空间相互作用。库中包含了:
- 统计模型:如
ARIMA,适用于具有明显自相关和移动平均特性的平稳序列。在疫情初期趋势分析中仍有参考价值。 - 机器学习模型:如
XGBoost,以其强大的特征组合能力和抗过拟合特性著称,常作为强基线模型。 - 机理模型:
SIR,SIS,SEIR。EpiLearn提供了它们的PyTorch实现,这意味着你可以用梯度下降法来优化模型参数(如传播率β、恢复率γ),使其更好地拟合真实数据,而不是手动调参。 - 深度学习模型:
LSTM/GRU:循环神经网络的经典选择,擅长捕捉时间序列中的长期依赖关系。DLinear:一种简单的线性模型,近年来被证明在时序预测任务上能与复杂的Transformer架构媲美,强调了时序分解(将序列分解为趋势项和季节项)的重要性。EINN(流行病学信息神经网络):这是一种混合模型的典范。它将机理模型(如SIR)的微分方程作为“物理约束”嵌入到神经网络的架构中,让网络在数据驱动学习的同时,遵守基本的流行病学规律。这种“知识引导”的机器学习是当前非常热门的研究方向,能有效提升模型的可解释性和在数据稀缺情况下的泛化能力。
实操心得:模型选择指南对于刚接触该领域的研究者,建议遵循一个简单的实验路径:先用
XGBoost或ARIMA建立一个强基线,了解数据的可预测性。然后尝试LSTM或GRU,观察深度模型是否能捕捉到更复杂的模式。如果数据具有明显的空间结构(如多地区数据),务必转向时空模型。对于追求模型可解释性和物理一致性的场景,EINN这类混合模型是首选。记住,没有“银弹”模型,最终选择应基于在验证集上的性能和实际业务需求(是追求绝对精度,还是需要模型提供传播参数的估计?)。
3.1.2 空间模型(Spatial Models)主要处理图结构数据,用于节点分类、链接预测等任务,在EpiLearn中主要用于溯源检测。
GCN(图卷积网络):通过聚合邻居节点信息来更新节点表示,是图神经网络的基础。GAT(图注意力网络):在GCN的基础上引入注意力机制,允许模型在聚合信息时对不同邻居分配不同的权重,更灵活。GIN(图同构网络):理论上比GCN和GAT更强大,能更好地区分不同的图结构。 在溯源任务中,这些模型学习从网络结构和有限的节点特征(如感染时间)中,推断出最可能的传播源头。
3.1.3 时空模型(Spatial-Temporal Models)这是流行病建模中最复杂也最有趣的一类,旨在同时建模疾病传播在“时间”和“空间”上的动力学。EpiLearn在此收录了大量前沿工作:
- 通用时空基线:如
DCRNN(扩散卷积循环网络)、ST-GCN(时空图卷积网络)、GraphWaveNet,这些模型最初为交通流量预测设计,但其捕捉时空相关性的能力同样适用于流行病传播。 - 流行病学专用模型:这是EpiLearn的精华部分。
Cola-GNN:引入了“跨位置注意力”机制,显式地建模不同地区间随时间变化的相互影响强度,更符合疾病随人口流动传播的直觉。STAN:利用真实的电子健康记录数据,通过时空注意力网络进行疫情预测。DASTGN(动态自适应时空图网络):能够自适应地学习节点间动态的关联关系,而不是依赖预定义的静态邻接矩阵,这对于刻画因防控措施而实时变化的传播网络非常有价值。
这些模型都通过统一的父类接口实现,确保了它们可以使用相同的训练和评估流程。
3.2 数据处理与变换管道
原始流行病数据通常不能直接喂给模型。EpiLearn的transforms模块提供了类似PyTorch Vision的数据增强和标准化流程,这是保障模型稳定训练的关键。
- 标准化(Normalization):对节点特征和邻接矩阵进行标准化是GNN训练的标配。例如,对特征进行
Z-Score标准化,对邻接矩阵进行对称归一化(D^(-1/2) A D^(-1/2)),可以防止梯度爆炸或消失,并加速训练收敛。 - 时序嵌入(Time Embeddings):将时间信息(如星期几、是否节假日)编码为向量,作为额外的特征输入模型,帮助模型学习周期性和事件模式。
- 频域变换与季节分解:这是时序预测的经典技巧。通过傅里叶变换将时序数据转换到频域,可能更容易让模型捕捉周期性。
STL(季节性-趋势分解)可以将序列分解为趋势、季节性和残差三项,模型可以分别对这三项进行预测后再组合,往往能提升效果。
这些变换可以通过Compose函数组合成一个处理管道,在数据集加载时自动应用,代码非常简洁。
from epilearn.utils import transforms # 定义一个变换管道:先标准化特征,再标准化邻接矩阵,最后添加时间嵌入 transformation = transforms.Compose({ "features": [transforms.normalize_feat(method='zscore')], 'graph': [transforms.normalize_adj()], 'temporal': [transforms.add_time_embedding(cycle='weekly')] }) dataset.transforms = transformation3.3 统一训练与评估流水线
这是EpiLearn提升研究效率的“杀手锏”。下面这段代码完美展示了其简洁性:
from epilearn.models.SpatialTemporal.STGCN import STGCN from epilearn.data import UniversalDataset from epilearn.tasks.forecast import Forecast # 1. 加载数据(这里使用内置的示例数据集) dataset = UniversalDataset() dataset.load_toy_dataset() # 2. 定义任务与模型 lookback = 12 # 用过去12步数据 horizon = 3 # 预测未来3步 task = Forecast(model_class=STGCN, lookback=lookback, horizon=horizon) # 3. 训练与评估 train_result = task.train_model(dataset=dataset, loss='mse', epochs=100) evaluation_metrics = task.evaluate_model(dataset=dataset) print(evaluation_metrics) # 输出如MSE, MAE, MAPE等指标在这短短几行代码背后,EpiLearn自动完成了数据按时间步的滑动窗口分割、训练集/验证集/测试集划分、模型初始化、优化器设置、训练循环、损失记录和模型验证。如果你想换用Cola-GNN模型,只需将STGCN替换为ColaGNN。如果你想做溯源检测,只需将Forecast任务替换为SourceDetection。这种设计让基准测试(Benchmarking)变得异常轻松。
4. 从零开始:使用EpiLearn完成一个疫情预测项目
假设我们现在有一个任务:利用美国各县级的COVID-19历史病例数据,预测未来两周的新增病例。我们将使用EpiLearn来构建一个完整的解决方案。
4.1 环境配置与数据准备
首先,安装EpiLearn及其依赖。由于它基于PyTorch,请确保你的PyTorch版本兼容。
pip install torch torch-geometric # 先安装核心依赖 pip install epilearn # 假设已发布到PyPI,目前可从GitHub安装 # 或从源码安装: git clone https://github.com/Emory-Melody/EpiLearn && cd EpiLearn && pip install -e .数据准备是关键一步。EpiLearn期望数据被组织成几个NumPy数组或PyTorch张量:
node_features: 形状为[num_nodes, num_timesteps, num_feats]。例如,3000个县,1000天的时间步,每个时间步的特征可以是[当日新增病例,累计病例,人口密度,移动指数]。node_states: 形状为[num_nodes, num_timesteps, num_states]。这通常来自机理模型模拟,或通过对病例数据进行划分得到(如SIR状态)。static_graph: 一个[num_nodes, num_nodes]的邻接矩阵,表示县之间的空间关系(如地理邻接、交通连通性)。dynamic_graphs(可选): 一个列表,包含每个时间步的动态邻接矩阵,表示随时间变化的人口流动。
我们可以从公开数据源(如约翰斯·霍普金斯大学COVID-19数据库、美国人口普查局)收集和清洗数据,然后构建这些数组。
import numpy as np import pandas as pd from scipy.spatial import distance_matrix # 假设我们已经有了一个DataFrame `df_cases`: index为日期,columns为县FIPS码,值为新增病例 # 以及一个DataFrame `df_geo`: 包含每个县的经纬度 num_nodes = len(df_cases.columns) num_timesteps = len(df_cases) # 1. 构建节点特征(这里仅使用病例数作为特征,实践中可加入更多) node_features = df_cases.values.T[:, :, np.newaxis] # 转换为 [nodes, timesteps, 1] # 可以在这里加入归一化 # node_features = (node_features - node_features.mean(axis=1, keepdims=True)) / (node_features.std(axis=1, keepdims=True) + 1e-8) # 2. 构建静态图(基于地理距离) county_coords = df_geo[['lat', 'lon']].values # 计算距离矩阵 dist_matrix = distance_matrix(county_coords, county_coords) # 使用阈值法构建邻接矩阵:距离小于阈值的县视为相连 threshold_km = 100 # 100公里 adj_matrix = (dist_matrix < threshold_km).astype(np.float32) np.fill_diagonal(adj_matrix, 0) # 去掉自环 # 3. 创建EpiLearn数据集 from epilearn.data import UniversalDataset dataset = UniversalDataset() dataset.node_features = torch.FloatTensor(node_features) dataset.static_graph = torch.FloatTensor(adj_matrix) # 划分训练/验证/测试集(按时间比例,如70%/15%/15%) split_point1 = int(num_timesteps * 0.7) split_point2 = int(num_timesteps * 0.85) dataset.train_idx = slice(0, split_point1) dataset.val_idx = slice(split_point1, split_point2) dataset.test_idx = slice(split_point2, None)4.2 模型选择、训练与调优
我们选择时空图神经网络Cola-GNN进行预测,因为它专为捕捉跨区域的注意力设计。
from epilearn.models.SpatialTemporal.ColaGNN import ColaGNN from epilearn.tasks.forecast import Forecast from epilearn.utils import transforms import torch # 定义数据变换 transform_pipe = transforms.Compose({ "features": [transforms.normalize_feat(method='minmax')], # 使用MinMax归一化 'graph': [transforms.normalize_adj()], # 对称归一化邻接矩阵 }) dataset.transforms = transform_pipe # 初始化预测任务 lookback = 21 # 使用过去3周的数据 horizon = 14 # 预测未来2周 task = Forecast( model_class=ColaGNN, lookback=lookback, horizon=horizon, device='cuda' if torch.cuda.is_available() else 'cpu' # 指定设备 ) # 配置模型参数(需要查阅ColaGNN的文档或源码) model_kwargs = { 'num_nodes': num_nodes, 'input_dim': 1, # 我们的特征维度 'output_dim': 1, # 预测未来病例数,也是1维 'hidden_dim': 64, 'num_layers': 2, 'temporal_attention_heads': 4, 'spatial_attention_heads': 4, 'dropout': 0.1 } # 训练模型 train_history = task.train_model( dataset=dataset, model_kwargs=model_kwargs, loss='mae', # 使用平均绝对误差作为损失,对异常值不如MSE敏感 optimizer='adam', learning_rate=0.001, epochs=200, patience=20, # 早停耐心值 verbose=True # 打印训练过程 ) # 在测试集上评估 test_metrics = task.evaluate_model(dataset=dataset, split='test') print(f"测试集 MAE: {test_metrics['mae']:.4f}, RMSE: {test_metrics['rmse']:.4f}")训练过程中,task.train_model会返回一个包含损失历史记录的字典,方便我们绘制学习曲线,监控模型是否过拟合或欠拟合。
4.3 结果分析与可视化
EpiLearn内置了基础的可视化工具,但为了更深入的分析,我们通常需要结合Matplotlib或Seaborn。
import matplotlib.pyplot as plt # 1. 绘制训练损失曲线 plt.figure(figsize=(12, 4)) plt.subplot(1, 2, 1) plt.plot(train_history['train_loss'], label='Train Loss') plt.plot(train_history['val_loss'], label='Val Loss') plt.xlabel('Epoch') plt.ylabel('MAE Loss') plt.legend() plt.title('Training History') # 2. 对某个特定区域进行预测结果可视化 node_id = 100 # 选择第100个县 task.model.eval() with torch.no_grad(): # 获取测试集最后一个窗口的输入和预测 # 这里需要根据数据集结构具体编写数据获取逻辑,以下为示意 test_input, test_target = dataset.get_test_item(node_id, lookback, horizon) prediction = task.model(test_input.unsqueeze(0)).squeeze().cpu().numpy() # 假设模型输出形状正确 plt.subplot(1, 2, 2) time_steps = np.arange(horizon) plt.plot(time_steps, test_target, 'b-', label='Ground Truth', marker='o') plt.plot(time_steps, prediction, 'r--', label='Prediction', marker='s') plt.xlabel('Future Days') plt.ylabel('New Cases') plt.legend() plt.title(f'Forecast for County {node_id}') plt.tight_layout() plt.show()此外,EpiLearn提供的交互式Web应用是一个亮点。你可以将训练好的模型和数据集加载到该应用中,动态地观察疫情在不同地区的传播模拟、查看特定节点的感染轨迹、甚至调整模拟参数(如隔离强度)来观察干预效果。这对于向非技术背景的决策者展示模型发现至关重要。
5. 常见问题、避坑指南与进阶技巧
在实际使用EpiLearn进行研究和开发时,你可能会遇到一些典型问题。以下是我总结的一些经验和解决方案。
5.1 数据相关问题
问题1:数据尺度差异巨大。例如,不同县的人口从几千到上千万,导致病例数尺度相差数个数量级。直接使用原始数据训练,模型会被大数值区域主导。
- 解决方案:务必进行特征缩放。对于病例数,推荐使用
Z-Score标准化或Log1p变换(先取对数再标准化)。对于人口等静态特征,可以单独归一化。EpiLearn的normalize_feat提供了多种方法。
问题2:静态图不能反映真实的传播动态。基于地理距离的固定邻接矩阵,无法刻画因节假日、防控政策带来的瞬时人口流动变化。
- 解决方案:
- 使用动态图。如果你有手机信令、交通流量等数据,可以构建时间序列的邻接矩阵作为
dynamic_graphs输入。 - 使用能够学习隐式空间关系的模型,如
DASTGN,它可以通过注意力机制自适应地学习节点间的动态关联权重。 - 在静态图的基础上,加入节点间的流动强度作为边特征。
- 使用动态图。如果你有手机信令、交通流量等数据,可以构建时间序列的邻接矩阵作为
问题3:数据存在大量缺失值或报告延迟。真实世界的流行病数据很少是完整的。
- 解决方案:在将数据传入EpiLearn前,需要进行预处理。常用方法包括:前向填充、线性插值、使用移动平均值平滑。对于大面积缺失,可以考虑使用矩阵补全技术或引入相关协变量(如搜索指数、社交媒体数据)进行估算。
5.2 模型训练与调优
问题4:模型训练不稳定,损失震荡或NaN。
- 排查步骤:
- 检查数据:确认数据中没有无穷大或NaN值。检查归一化是否稳定(分母加小epsilon)。
- 检查图结构:确保邻接矩阵归一化正确(
normalize_adj)。对于孤立节点(度为零),归一化可能导致除零错误,通常需要添加自环或特殊处理。 - 调整学习率:这是最常见的原因。尝试使用更小的学习率(如1e-4),或使用学习率预热(Warmup)和衰减策略。
- 梯度裁剪:对于RNN或深层GNN,梯度爆炸可能导致NaN。在PyTorch中,可以使用
torch.nn.utils.clip_grad_norm_。 - 检查损失函数:确保预测值和真实值的尺度在损失函数(如MSE)的合理范围内。
问题5:模型过拟合,在训练集上表现好,验证集上差。
- 解决方案:
- 正则化:增加
Dropout率,在GNN层和全连接层后都加入Dropout。为损失函数添加L2权重衰减。 - 简化模型:减少GNN层数或隐藏层维度。复杂的模型在数据量不足时容易过拟合。
- 数据增强:对时序数据,可以尝试轻微的时间扭曲、添加噪声。对图结构,可以使用DropEdge(随机丢弃一部分边)作为正则化。
- 早停(Early Stopping):EpiLearn的
train_model已内置早停功能,合理设置patience参数。
- 正则化:增加
问题6:如何为我的新模型设计一个lookback窗口?
- 经验法则:这取决于疾病的潜伏期和传播周期。对于流感或COVID-19,一个典型的潜伏期加传染期大约在10-21天。因此,
lookback窗口应至少覆盖一个完整的传播周期,通常设置在14-28天(天粒度数据)。可以通过自相关函数(ACF)分析序列的自相关性来确定一个经验值。
5.3 模型选择与创新
问题7:什么时候该用时序模型,什么时候该用时空模型?
- 决策树:
- 如果你的数据是单一区域的全国/全球总病例数 -> 使用时序模型(LSTM, Transformer)。
- 如果你的数据是多个区域(如各省、各县),但不考虑区域间的相互影响-> 可以对每个区域单独使用时序模型,或使用一个共享参数的模型。
- 如果你的数据是多个区域,且区域间存在明确的相互作用(人口流动、地理邻近)->必须使用时空模型(如ST-GCN, Cola-GNN)。忽略空间相关性会导致模型忽略关键的传播驱动因素。
问题8:我想在EpiLearn中实现一篇新论文的模型,该如何入手?
- 步骤:
- 继承基类:在
epilearn/models/下找到合适的目录(Spatial, Temporal, SpatialTemporal),创建一个新文件。你的模型类应继承自对应的基类(如BaseSpatialTemporalModel)。 - 实现核心方法:至少需要实现
__init__和forward方法。forward方法的输入输出格式需与基类要求一致(通常接收x(特征),edge_index(图结构),edge_weight等)。 - 注册模型:为了能通过
Forecast或SourceDetection任务类调用,你可能需要在对应的__init__.py文件中导入你的新模型。 - 测试:使用库内的模拟数据或一个小型真实数据集,快速验证模型的前向传播和训练流程是否正常。
- 继承基类:在
5.4 评估与部署
问题9:除了MSE、MAE,还有什么适合流行病预测的评估指标?
- 关键指标:
- MAPE(平均绝对百分比误差):易于理解,但当真实值接近零时不稳定。
- sMAPE(对称平均绝对百分比误差):在一定程度上缓解了MAPE的不对称性。
- RMSE(均方根误差):对大的误差惩罚更重,更关注峰值预测的准确性。
- 相关性系数:如皮尔逊相关系数,衡量预测趋势与真实趋势的一致性。
- 区间覆盖概率:如果你的模型能输出预测区间(如分位数回归),这个指标很重要。
- 流行病学特异性指标:如预测的疫情峰值时间误差、累计病例误差等。这些可能需要自定义。
问题10:如何将训练好的EpiLearn模型用于实时预测或部署?
- 流程:
- 模型保存与加载:使用
torch.save保存训练好的模型状态字典和必要的预处理参数(如归一化的均值、标准差)。 - 构建推理管道:编写一个脚本,包含:数据预处理(应用与训练时相同的变换)、加载模型、执行
model.eval()和torch.no_grad()下的前向传播、后处理(反归一化)。 - API服务化:可以使用FastAPI或Flask将推理管道包装成REST API,供其他系统调用。
- 持续学习:疫情模式会变化,需要定期用新数据对模型进行微调或重新训练。EpiLearn的流水线设计使得这个过程可以自动化。
- 模型保存与加载:使用
EpiLearn作为一个活跃的学术开源项目,其真正的力量在于社区。通过阅读源码、参与Issue讨论甚至提交Pull Request,你不仅能解决自己的问题,还能推动这个工具变得更加强大。它降低了机器学习在流行病学中应用的门槛,但并不意味着替代了领域知识。成功的建模永远需要流行病学家、数据科学家和决策者的紧密合作。理解疾病的生物学特性、传播机制和社会行为因素,与掌握先进的机器学习工具同等重要。EpiLearn正是为这种跨学科协作搭建了一座坚实的桥梁。
