1. 项目概述
1.1 核心需求解析
你有没有遇到过这种情况:学了一堆深度学习理论,看了不少教程,但真要自己动手写个项目的时候,却不知道从哪里下手?我当年也是这么过来的,后来发现最快的学习路径就是找一个贴近实际场景的小项目,从头到尾走一遍完整流程。这个“新冠感染人数预测”项目,就是这样一个非常适合入门的实战题目。
先说清楚这个项目到底在干什么。它本质上是一个时间序列预测问题:给出一段时间内每日新增感染人数(或者累计确诊人数),让模型学习数据的变化规律,然后预测未来若干天的数字。这跟天气预报、股票价格预测、交通流量预测都是一个套路,所以学会了这个项目,你等于掌握了一类深度学习应用的通用法。
为什么说它适合入门?第一,数据是公开的,不需要你自己爬虫采集,网上有很多整理好的数据集,下载下来就能用;第二,数据形态简单,就是一列或者几列数字,不需要做复杂的图像预处理或者自然语言处理;第三,预测效果好不好一眼就能看出来,把预测曲线和真实曲线画在一张图上,差距摆在眼前,很直观。
这个项目的技术栈也很经典:Python + PyTorch + LSTM(长短期记忆网络),再加 Pandas、NumPy、Matplotlib 这些数据处理的常用库。其中 LSTM 是循环神经网络(RNN)的一种改进结构,专门用来处理序列数据,后面我会详细说它为什么适合这个场景。
1.2 项目到底能学到什么
很多初学者容易陷入一个误区:整天讨论深度学习框架哪个好、模型结构有多复杂,却忽略了工程实现的基本功。这个项目刚好帮你把这些基本功全部补上。
第一,环境搭建能力。在 Windows 系统配置深度学习环境是新手最容易翻车的地方,CUDA 版本不对、PyTorch 装不上、conda 环境冲突……各种问题层出不穷。我会在第四章专门讲环境配置,把我踩过的坑全部列出来。
第二,数据处理能力。真实项目里数据往往不是拿来就能用的,可能有空缺值、有异常值、量纲不一致。怎么清洗、怎么补全、怎么归一化,这些看起来不起眼的步骤,其实决定了模型效果的上限。我之前见过太多人模型调参调了一周没效果,最后发现是数据预处理出了问题。
第三,模型构建能力。从简单的全连接网络开始,到 LSTM 这种循环结构,再到训练循环、损失函数、优化器的选择,每一步都需要动手实现。这个项目规模不大,模型代码也就几十行,但麻雀虽小五脏俱全,深度学习的标准流程全都有。
第四,结果可视化和评测能力。光知道跑个训练还不行,你得会看学习曲线判断模型有没有收敛,会画预测图来判断效果好坏,会算误差指标来量化性能。这些都是实际工作中每天都用得到的技能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备与分析
2.1 数据怎么获取,拿到手什么样
我建议直接用公开的 COVID-19 数据集,网上有很多机构实时维护着全球各地的疫情数据,格式基本都是 CSV 文件。以某公开数据集为例,你下载之后解压,会看到几个不同维度的表格:confirmed(累计确诊)、deaths(累计死亡)、recovered(累计治愈)。每行是一个地区,每列是一个日期,单元格里是对应当天的累计数值。
这里需要注意一个关键点:数据集里存的是累计值,不是每日新增值。如果你要预测的是每日新增,就得做一步差分计算,把相邻两天的累计值相减。很多新手在这个地方踩坑,买了数据就直接喂给模型,结果预测出来的东西完全没法看。
拿到数据之后,我通常先画一张整体走势图。把时间作为横轴、每日新增人数作为纵轴,看一眼数据的大致形态。你会发现这个序列有几个明显特征:有上升段、有峰值、有下降段,后面可能还有小规模的反弹。这种非平稳、有波动的序列,就是 LSTM 比较擅长处理的类型。
然后是数据检查。用 Pandas 加载 CSV 之后,第一件事是看有没有缺失值,方法很简单:
python复制import pandas as pd
df = pd.read_csv('covid_data.csv')
print(df.isnull().sum())
如果某一天的数据缺失了,最简单的处理方式是前后填充。我个人比较推荐线性插值(df.interpolate()),因为它比直接填 0 或者填前一日的值更平滑,对模型训练的干扰更小。还要顺手做一步数据类型转换,确保日期列是 datetime 格式、数值列是 float 格式,不然后面画图的时候会发现各种报错。
2.2 一个关键点:预测目标到底是什么
在动手写代码之前,心里必须想清楚一个问题:你要预测的是“每日新增”还是“累计确诊”?
这两个目标做出来的项目效果差别很大。预测累计确诊通常比较容易,因为累计值只会单调增长,曲线的整体趋势性很强,模型只要大致学到“一直在涨”这个规律,预测结果就不会太离谱。但这样做有点没意思,相当于考试只做送分题。
预测每日新增难度更高,也更接近真实需求。每日新增是累计值的差分,数值波动大、噪声多,模型需要真正学到数据的周期性趋势才能预测得准。我建议你做每日新增,挑战性强一点,学到的经验也更值钱。
另外一个细节是:你计划用过去多少天的数据来预测未来多少天?这就是时间序列预测里的窗口长度概念。比较常用的设置是“用过去 14 天预测未来 7 天”,也有的项目做“用过去 7 天预测未来 1 天”。窗口长度会直接影响模型复杂度:窗口越大,输入维度越高,模型需要学习的模式越丰富;但窗口也不是越大越好,窗口太长反而会引入太多历史噪声。
这里给一个实用建议:第一次跑通流程,用“过去 14 天预测未来 7 天”就好,既不会太简单,也不至于让模型难到学不动。
2.3 数据预处理,重要的不是代码而是思路
数据清洗完之后,下一步就是构造训练样本。时间序列不像图像分类那样可以直接把图片路径和标签对应起来,它需要人为地把连续序列“切成”一段一段的输入输出对。
假设我们有 200 天的每日新增数据,用过去 14 天预测未来 7 天,那第一条训练样本就是第 1~14 天的数据作为输入 X,第 15~21 天的数据作为输出 Y;第二条样本是第 2~15 天预测第 16~22 天,以此类推滑动窗口。这样算下来,总共能构造出大约 180 条样本,数据量虽然不大,但足够跑通一个入门模型了。
这里有个非常容易犯的错误:数据泄露。滑窗构造的数据,相邻的样本之间存在大量重叠。如果你随机打乱再切分训练集和验证集,验证集里就会混入很多跟训练集高度重叠的数据,导致验证指标看起来非常漂亮,但真实预测效果一塌糊涂。正确的做法是先按时间顺序切分,比如前 80% 的时间数据作为训练集,后 20% 作为验证集,然后再在各自
