1. 项目背景与核心价值
去年疫情最严重的时候,我在医院工作的朋友经常抱怨床位和呼吸机调配困难。当时我就在想,如果能提前几天预测疫情发展趋势,医疗资源的调度会不会更从容?这个想法促使我开始了"新冠预测"这个深度学习项目。
这个项目本质上是个时间序列预测问题,但和普通销量预测最大的不同在于:疫情数据具有明显的传播特性。就像往池塘里扔石头会产生涟漪一样,一个地区的感染人数变化会直接影响周边地区。传统ARIMA模型很难捕捉这种空间相关性,而深度学习中的图神经网络(GNN)正好擅长处理这类具有拓扑结构的数据。
2. 数据准备与特征工程
2.1 数据来源与清洗
我主要使用了三个公开数据集:
- 约翰霍普金斯大学的每日病例数据(包含经纬度信息)
- 百度迁徙指数(反映城市间人口流动)
- 当地天气数据(温度、湿度等)
数据清洗时遇到几个典型问题:
- 不同国家的数据上报频率不一致(有些国家周末不更新)
- 早期数据存在明显的"阶梯式"增长(检测能力不足导致)
- 某些地区会出现数据回撤(统计口径调整)
处理技巧:对缺失数据采用7日滑动平均填充,对异常值使用3σ原则过滤。特别注意保留数据修正记录,这对模型评估很重要。
2.2 空间特征构建
关键创新点在于构建了动态邻接矩阵:
def create_adj_matrix(mobility_data, threshold=0.1): """ 根据人口流动数据构建邻接矩阵 :param mobility_data: 城市间迁徙比例矩阵 :param threshold: 连接阈值,过滤掉弱关联 :return: 稀疏邻接矩阵 """ adj = (mobility_data > threshold).astype(float) # 添加自连接 np.fill_diagonal(adj.values, 1) return sparse.csr_matrix(adj)这个矩阵会每天更新,反映疫情传播路径的变化。
3. 模型架构设计
3.1 混合模型结构
最终采用的模型结合了三种神经网络:
- 时空图卷积网络(ST-GCN):处理地理传播特性
- LSTM编码器-解码器:捕捉时间依赖性
- 注意力机制:动态调整各区域影响权重
模型超参数选择依据:
- 图卷积层数:通过实验发现3层时效果最好(层数过多会导致过平滑)
- LSTM隐藏单元:256(小于128时长期记忆能力不足,大于512容易过拟合)
- 训练周期:早停法(patience=15) + 学习率衰减(step_size=5)
3.2 损失函数优化
没有使用简单的MSE,而是设计了复合损失函数:
Loss = α*CasePredictionLoss + β*TrendConsistencyLoss + γ*SpatialSmoothLoss其中TrendConsistencyLoss确保预测曲线的导数方向与真实数据一致,这对医疗资源规划特别重要。
4. 训练技巧与调优
4.1 小样本训练策略
疫情数据的一个挑战是:真正有价值的数据点(爆发期)其实很少。我们采用了这些方法:
- 区域间迁移学习:先用中国数据预训练,再微调其他国家
- 数据增强:通过合理的时间偏移生成更多训练样本
- 课程学习:先学习平稳期模式,再逐步加入爆发期数据
4.2 不确定性量化
单纯的点预测对决策帮助有限,我们通过以下方式量化不确定性:
- Monte Carlo Dropout:推理时保持dropout开启,运行100次取分布
- 分位数损失:同时预测10%、50%、90%分位数
- 集成学习:组合5个不同初始化的模型
实测发现,集成学习对突变点的捕捉最稳定,但计算成本也最高。
5. 部署与效果验证
5.1 实时预测系统
部署架构要点:
- 使用Airflow每天自动更新数据
- 预测服务封装为gRPC接口(比REST快3倍)
- 结果缓存采用Redis时间序列数据库
性能指标:
- 单次预测耗时:<500ms(RTX3090)
- 内存占用:<4GB(优化后的ONNX模型)
5.2 评估指标选择
没有单纯看RMSE,而是采用三类指标:
- 点预测精度:sMAPE(对称平均绝对百分比误差)
- 趋势预测:TrendScore(我们自己定义的指标)
- 决策价值:HospitalOverloadPrecision(预测医疗挤兑的准确率)
在2022年1-3月上海数据上的表现:
| 指标 | 我们的模型 | 传统SEIR模型 |
|---|---|---|
| sMAPE | 12.7% | 23.5% |
| TrendScore | 0.81 | 0.62 |
| 预警准确率 | 88% | 72% |
6. 经验总结与改进方向
这个项目最大的教训是:模型效果严重依赖数据质量。有几次预测失误后来发现都是因为某地调整了检测政策。现在我们会同时训练一个"数据可信度评估"子网络。
未来改进方向:
- 加入疫苗接种率动态数据
- 尝试Transformer替代LSTM
- 构建自适应阈值预警系统
如果重新做这个项目,我会更早建立数据质量监控模块。疫情预测不只是算法问题,更是数据工程问题。最后分享一个实用技巧:在计算sMAPE时,给分母加上一个小的平滑项(如平均值的10%),可以避免低病例时期的指标震荡。