1. 为什么拿新冠疫情预测作为深度学习入门题
1.1 这个项目练的不是模型,是完整流程
很多初学者找我咨询深度学习入门,第一句话往往是“我想学LSTM”或者“我想做图像识别”。但真正的问题不是学哪个模型,而是能不能独立跑通一个完整的项目链路:数据获取、清洗、特征构造、模型搭建、训练验证、结果评估。
新冠感染人数预测恰好是这么一道“全链路”的入门题。它不像图像分类那样需要你折腾复杂的卷积网络,也不像自然语言处理那样要处理词向量和注意力机制。数据本身就是一张CSV表格,里面是日期和每日新增确诊数,目标明确:用过去一段时间的数据,预测未来一段时间的结果。整个项目对机器配置要求极低,CPU都能跑,数据和代码都好找,非常适合用来建立对深度学习项目的整体手感。
用PyTorch也好,TensorFlow也好,核心不是框架选择,而是你能否理解“时间序列数据”和“普通表格数据”在训练时的本质区别。这个区别如果没搞懂,后面调什么模型都是白费。
1.2 大多数人第一次跑这个项目容易在哪翻车
先说我观察到的几个高频翻车点,也是这个项目最有学习价值的地方。
第一个翻车点是数据泄漏。很多人把数据集随机切分成训练集和验证集,然后用后一段数据里的“未来信息”去预测前一段,最后验证集上表现惊人,换到真实场景立刻崩盘。
第二个翻车点是用原始确诊数字直接训练。2020年到2021年,很多国家的每日新增数据跨度极大——从几十例到几十万例,这种量纲差异会让均方误差完全被峰值数据主导,模型为了照顾那几个峰值点,把其他所有时间段全部拟合成了“基本为零”。最后预测曲线就是一条几乎贴地的线。
第三个翻车点是单步预测自嗨。模型用前14天预测第15天,在验证集上画出来的曲线和真实曲线高度重合,于是以为成功了。实际上每次预测都依赖前一步预测的结果作为输入,误差会一级级累积,预测到第7天以后曲线就开始放飞自我。
这篇文章我会按我实际做这个项目时的顺序,把数据准备、特征构造、模型选型、训练验证和结果评估整个过程过一遍,重点写那些“教程里不会告诉你、但你自己踩一次要浪费好几天”的细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备:下载CSV只是开始
2.1 数据源与最初的数据清洗
做这个项目,数据源我建议用约翰霍普金斯大学维护的公开疫情数据集(GitHub上直接可以下载)。它提供全球各国每日累计确诊数,原始文件是CSV格式,每行是一个国家或地区,每列是一个日期,单元格里的数值是当天累计确诊人数。
下载完第一件事不是建模,是看数据。先用 Pandas 把它读进来,打印前几行和数据类型,看看有没有缺失值、负数和乱码列名。
python复制import pandas as pd
df = pd.read_csv("time_series_covid19_confirmed_global.csv")
print(df.head())
print(df.info())
这段代码跑完,你会发现问题:原始宽表里,每个日期占一列,国家在行上。这种“宽表”适合人眼看,但不适合建模。你需要用 pd.melt() 把它从宽表转成长表,变成三列:国家、日期、累计确诊数。
python复制df_long = df.melt(
id_vars=["Country/Region"],
value_vars=df.columns[4:],
var_name="date",
value_name="confirmed"
)
df_long["date"] = pd.to_datetime(df_long["date"])
df_long = df_long.sort_values(["Country/Region", "date"]).reset_index(drop=True)
然后把累计确诊数转成每日新增数。很多人这一步偷懒,直接对累计值建模,结果发现模型总是预测一个单调递增的曲线——这本来就是累计曲线的特性,根本不需要深度学习,随便一个线性模型都能做到。我们要预测的是“新增感染人数”,这才是真正有波动、有难度的目标序列。
python复制df_long["daily_new"] = df_long.groupby("Country/Region")["confirmed"].diff().fillna(0)
接下来处理异常值。疫情数据里经常出现“某天新增为负”的情况,这是因为上报口径调整、历史数据修订,导致当天累计值比前一天还小。对这类数据,最简
