markdown复制## 1. 项目背景与核心目标
这个实战项目源于去年冬季的特殊时期,当时身边不少朋友都在讨论如何通过数据手段预判感染趋势。作为长期从事机器学习教学的从业者,我决定用实际数据带学员完成一次完整的时序预测实战。不同于常见的房价预测等静态数据集,这次我们要处理的是具有明显时间依赖性的动态数据,这对模型选择和特征工程都提出了特殊要求。
核心要解决三个问题:首先是如何处理官方通报数据与真实情况的偏差;其次是针对小样本时间序列如何设计有效的特征;最后是选择适合短期预测的轻量级模型。我们最终确定的方案是采用7天滑动窗口特征+LightGBM回归的组合,在保证预测精度的同时实现每日更新预测。
> 重要提示:所有数据均来自公开的官方通报信息,项目仅用于教学演示目的,不涉及任何敏感数据处理。
## 2. 数据准备与特征工程
### 2.1 原始数据获取与清洗
我们使用了两类公开数据源:一是各地卫健委每日通报的感染数统计,二是互联网平台发布的搜索指数数据。原始数据需要经过以下处理步骤:
1. 日期对齐:不同数据源的更新频率不同,需要统一转换为日粒度
2. 缺失值处理:对节假日等无通报日期采用前7天均值填充
3. 异常值修正:对明显偏离趋势线的单日突增数据作平滑处理
清洗后的数据结构示例(2022年12月片段):
| 日期 | 通报感染数 | 搜索指数 | 温度 | 星期 |
|------------|------------|----------|------|------|
| 2022-12-01 | 1523 | 6852 | 8.5 | 4 |
| 2022-12-02 | 1845 | 7123 | 7.2 | 5 |
### 2.2 时序特征构造
针对小样本时序预测,我们设计了三类特征:
1. 滑动统计特征:
- 近3/7天均值
- 近7天变化斜率
- 上周同期值
2. 周期特征:
- 星期几的one-hot编码
- 是否节假日的布尔标记
3. 外部特征:
- 当日平均温度
- 搜索指数3日移动平均
```python
# 特征生成代码示例
def create_features(df, window_size=7):
df['7d_avg'] = df['count'].rolling(window=window_size).mean()
df['weekday'] = df['date'].dt.weekday
return df
我们对比了三种主流时序预测方法:
最终选择LightGBM的原因:
关键参数设置:
python复制params = {
'objective': 'regression',
'metric': 'mae',
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.8,
'bagging_fraction': 0.8
}
训练集划分采用时间序列交叉验证(TimeSeriesSplit):
当历史数据不足3个月时,可以采用:
线上部署时需要建立监控机制:
重要特征重要性排序(示例):
现象:预测曲线总是比实际数据晚1-2天
解决方法:
现象:节假日前后预测误差显著增大
应对方案:
现象:随着时间推移预测效果逐渐下降
更新策略:
这个项目的完整代码已整理成Jupyter Notebook,包含数据预处理、特征工程、模型训练和评估的全流程。在实际教学中发现,学员最容易出错的是忽略了时序数据的自相关性,直接用随机划分的交叉验证会导致数据泄露。下次我们将继续探讨如何将这类模型部署为实时预测服务,包括API设计、性能优化等工程化内容。
code复制