1. 项目背景与核心目标
这个项目源于我在准备研究生复试期间的一个实战练习。当时手头正好有一份公开的新冠疫情数据集,就想尝试用回归分析的方法来预测未来几天的确诊人数变化。对于数据科学初学者来说,疫情数据具有典型的时序特征,且变量间存在明显的相关性,非常适合用来练习回归模型的构建与优化。
项目的核心目标是:基于历史疫情数据(包括每日新增确诊、治愈人数、检测数量等特征),构建一个能够预测未来3天新增确诊人数的回归模型。这不仅考验特征工程的能力,还需要处理时间序列数据特有的自相关性等问题。我选择了从最简单的线性回归开始,逐步尝试更复杂的模型,最终得到了RMSE在15以内的预测效果。
2. 数据准备与特征工程
2.1 数据来源与清洗
使用的数据集来自某公共卫生机构的公开数据,包含以下字段:
- date:日期(作为索引)
- new_cases:当日新增确诊
- tests:检测数量
- hospitalized:在院治疗人数
- recovered:当日治愈人数
清洗过程特别注意了以下几点:
- 处理缺失值:用前后7天的移动平均值填充
- 异常值处理:对超过3倍标准差的数据点进行Winsorize缩尾
- 数据平滑:对new_cases列应用7天移动平均,减少周末报告延迟的影响
python复制# 示例:数据平滑处理
df['new_cases_smoothed'] = df['new_cases'].rolling(
window=7,
min_periods=3,
center=True
).mean()
2.2 特征构造技巧
除了原始特征外,构造了以下衍生特征:
- 滞后特征:创建new_cases的1-7天滞后项
- 变化率:检测数量的周环比变化
- 交互特征:住院人数与治愈人数的比值
- 时间特征:星期几的one-hot编码
注意:滞后特征会导致前几行出现NaN,需要统一在最后才删除缺失值
3. 回归模型构建与优化
3.1 基线模型选择
从简单到复杂尝试了以下模型:
- 线性回归(LinearRegression)
- 带L2正则的岭回归(Ridge)
- 随机森林回归(RandomForestRegressor)
- XGBoost回归
通过5折交叉验证比较发现,在数据量不大(<5000样本)时,随机森林和XGBoost表现接近,但XGBoost训练速度更快。
3.2 关键参数调优
使用Optuna进行超参数优化,核心参数范围:
python复制params = {
'n_estimators': (100, 500),
'max_depth': (3, 10),
'learning_rate': (0.01, 0.3),
'subsample': (0.6, 1.0),
'colsample_bytree': (0.6, 1.0)
}
最终最佳参数组合:
- learning_rate: 0.12
- max_depth: 6
- n_estimators: 320
- subsample: 0.8
3.3 评估指标设计
除了常用的MAE、RMSE外,针对疫情预测的特殊性增加了:
- 方向准确率:预测趋势(上升/下降)的正确率
- 峰值捕获率:对疫情波峰的识别能力
- 7日预测稳定性:连续多日预测的方差
4. 实际预测效果分析
4.1 预测结果可视化
使用Plotly绘制动态对比图,关键发现:
- 模型对平稳期预测准确(误差<10%)
- 疫情快速上升期存在3-5天的滞后
- 节假日前后预测偏差较大
4.2 误差来源诊断
通过残差分析发现主要误差来自:
- 检测策略突变(如大规模筛查)
- 病毒变异导致的传播系数变化
- 政府干预措施(如封控)的滞后影响
改进措施:
- 加入政策干预的虚拟变量
- 使用Prophet模型检测变点
- 集成多个模型的预测结果
5. 工程化部署建议
5.1 实时预测Pipeline设计
mermaid复制graph LR
A[数据抓取] --> B[特征工程]
B --> C[模型预测]
C --> D[结果存储]
D --> E[可视化更新]
5.2 性能优化技巧
- 使用joblib缓存特征处理管道
- 对XGBoost启用GPU加速
- 采用增量更新策略减少计算量
6. 常见问题与解决方案
6.1 数据更新延迟
症状:新数据与历史模式不符
解决:建立数据质量监控规则,自动触发重新训练
6.2 预测结果震荡
症状:连续预测波动过大
解决:加入Kalman Filter进行后处理平滑
6.3 长期预测失效
症状:预测超过7天后准确率骤降
建议:改为使用SEIR等流行病学模型
7. 项目收获与延伸思考
通过这个实战项目,我深刻体会到:
- 在时间序列预测中,特征工程比模型选择更重要
- 对于突发公共卫生事件,需要建立快速的特征迭代机制
- 模型的可解释性在医疗领域极为关键
后续改进方向:
- 结合搜索指数等替代数据
- 尝试Transformer时序模型
- 加入空间维度(省市级数据)