拿到一份包含很多信息(比如日期、检测人数、密接数等)的新冠数据 CSV 文件,让计算机从这些信息中 “学规律”,最终能根据这些信息准确预测未来的新冠阳性人数

核心概念先搞懂(小白必背,对应代码)

在看代码前,先记住 3 个核心概念,否则会越看越懵:

  1. 特征(x / 输入):就是 CSV 里除了 “新冠人数” 之外的其他信息(比如日期、气温、检测量),相当于 “做题的已知条件”,计算机靠这些条件猜结果。
  • 代码里的x/x_original/x_core都是它,“维度” 就是 “有多少个已知条件”(比如选 6 个信息,就是 6 维特征)。
  1. 标签(y / 输出目标):就是 CSV 里的 “新冠人数”,相当于 “题目的标准答案”,计算机学习的目的就是 “让自己猜的结果接近这个标准答案”。
  2. 模型(myNet):相当于一个 “黑盒子”,把特征(x)输进去,就能输出一个 “新冠人数预测值”,训练的过程就是 “调教这个黑盒子,让它猜得越来越准”。

代码整体流程(像做一道菜,步骤清晰)

整套代码就像 “做一道菜”,步骤是:准备食材(加载数据)→ 处理食材(数据预处理)→ 准备厨具(定义模型)→ 开火烹饪(模型训练)→ 品尝菜品(模型预测),我们一步步拆解。

步骤 1:导入 “做菜工具”(导入库)

这一步就像 “做饭前把菜刀、菜板、锅碗瓢盆摆好”,每个库都是一个专用工具:

  • csv:专门用来读取 CSV 格式的新冠数据(相当于 “打开食材包装袋的工具”)。
  • torch/torch.nn/torch.optim:PyTorch 核心工具,用来搭建模型、训练模型(相当于 “菜刀、炒锅、铲子”,深度学习核心工具)。
  • sklearn:用来筛选有用的特征(相当于 “挑菜工具”,把不新鲜、没用的菜扔掉,只留新鲜核心食材)。
  • matplotlib:用来画训练过程的曲线(相当于 “摆盘工具”,直观看到训练效果好不好)。

步骤 2:筛选 “核心食材”(特征选择函数:get_feature_importance)

小白理解:

CSV 数据里有很多特征(93 个,相当于 93 种食材),但不是所有特征都有用:比如 “日期” 对预测新冠人数有用,“当地超市销量” 可能就没用。这个函数的作用就是 **“挑食材”**:从 93 个特征中,选出k个(代码里是 6 个)对预测 “新冠人数(y)” 最有用的特征,扔掉没用的,减少计算机的 “工作量”,还能让预测更准确。

具体做了什么(大白话):
  1. SelectKBest+chi2(卡方检验):相当于 “一个智能挑菜机”,它能判断每个特征和 “新冠人数(y)” 的相关性(是不是越相关越有用)。
  2. 给每个特征打分:有用的特征得分高,没用的得分低。
  3. 选得分前k名的特征:只留这k个核心特征,作为后续训练的 “核心食材”。
为什么要做这步?

就像做饭:用 10 种核心食材做的菜,比用 100 种乱七八糟的食材做的菜,味道更好、更不容易翻车。这里也是一样,核心特征能让模型训练更快、预测更准。

步骤 3:处理 “食材” 并分份(自定义数据集:covidDataset)

这是代码的核心难点之一,但本质就是 “处理食材 + 分份”:把 CSV 数据读取进来,处理成计算机能识别的格式,再分成 “训练份”“验证份”“测试份”(就像做饭:把菜洗干净、切好,分成 “炒菜用的”“尝咸淡用的”“最后上桌用的”)。

里面的关键步骤(大白话拆解):
  1. 读取 CSV 数据,提取 x 和 y
    • 从 CSV 文件里,把 “特征(x)” 和 “标签(y)” 分开(相当于 “把菜和肉分开,分别处理”)。
    • x_original:所有原始特征(93 个),y_original:对应的新冠人数(标准答案)。
  2. 筛选核心特征 x
    • 调用上面的 “挑菜函数”,把 93 个特征筛选成 6 个核心特征(x_core),这是最终要喂给模型的 “干净食材”。
  3. 数据归一化
    • 作用:消除不同特征的 “量纲差异”。比如 “检测人数” 是几千几万,“气温” 是十几二十,两个数差距太大,计算机不好学习。
    • 相当于 “把所有食材切成同样大小的块”,方便后续 “翻炒”(模型训练)。
  4. 数据集分份
    • 训练集(train):80% 的数据(逢 5 选 4),用来 “大火炒菜”(模型主要学习的样本)。
    • 验证集(val):20% 的数据(逢 5 选 1),用来 “尝咸淡”(每炒一步尝一口,判断模型学得好不好,要不要调整)。
    • 测试集(test):没有标准答案(y),用来 “最后上桌”(模型训练完后,用它来做最终预测,输出结果)。
  5. __getitem____len__
    • 这两个是 PyTorch 的 “固定要求”,相当于 “给食材贴标签、数数量”,方便后续 “按份取菜”(批量训练)。
    • __getitem__:按下标取一份数据(训练 / 验证集返回 “特征 x + 标签 y”,测试集只返回 “特征 x”)。
    • __len__:告诉计算机一共有多少份数据。

步骤 4:搭建 “炒菜的锅”(定义模型:myNet)

这个类就是搭建我们的 “预测黑盒子”(模型),相当于 “准备一口合适的炒锅”,用来加工 “核心食材(x_core)”,最终产出 “预测结果(新冠人数)”。

小白理解:

这是一个两层全连接神经网络(简单的 MLP),结构非常简单,就像 “一个流水线”:

关键细节:
  1. nn.Linear(inDim, 64):全连接层,相当于 “食材加工机”,把输入的维度转换成指定的维度,模型训练的核心就是学习这个层里的 “权重参数”(相当于 “加工机的转速、时间”,需要不断调整)。
  2. ReLU:激活函数,没有它,模型就是一个简单的线性回归,没法学习复杂的规律(相当于 “没有调料,菜只能是淡的,不好吃”)。
  3. squeeze(1):调整输出维度,让预测结果的格式和标签 y 一致(相当于 “把菜品装到合适的盘子里,方便后续对比味道”)。

步骤 5:定义 “判断菜好不好吃的标准”(自定义损失函数:mseLoss)

小白理解:

这个函数的作用是 **“判断模型猜得准不准”**:模型输出的预测值(pred)和真实的新冠人数(target,也就是 y)之间的差距有多大,差距越小,说明模型学得越好(菜越好吃)。

具体做了什么:
  1. MSE 损失:均方误差,就是 “预测值和真实值的差的平方,再求平均”,这是回归任务(预测具体数字,比如新冠人数)的 “标配判断标准”(相当于 “尝一口菜,判断咸淡差多少”)。
  2. L2 正则化:相当于 “防止菜炒得太咸 / 太辣”,惩罚模型中过大的参数,避免模型 “死记硬背” 训练数据(过拟合),让它在新数据上也能预测准确(泛化能力强)。

步骤 6:“开火炒菜”(模型训练与验证:train_val)

这是整个代码的训练核心,相当于 “大火翻炒食材,中途尝咸淡调整,最终炒出一道好菜”,也是模型 “学规律” 的过程。

小白理解:训练循环的核心步骤(每一轮都要做的事)
  1. 模型设为训练模式(model.train ()):相当于 “把锅烧热,准备炒菜”,启用梯度计算,让模型可以学习参数。
  2. 遍历训练集,批量训练:相当于 “一次炒一小份菜,分批炒完所有食材”,每一批的步骤固定(深度学习的 “万能训练步骤”,记下来!):
    • optimizer.zero_grad():梯度清零(相当于 “炒下一份菜前,把锅刷干净”,避免上一份菜的残留影响当前份)。
    • 提取批次数据(x_batch, y_batch):相当于 “把一小份食材放进锅”。
    • y_pred = model(x_batch):前向传播,相当于 “翻炒食材,做出一份半成品”(模型输出预测值)。
    • batch_loss = loss(y_pred, y_batch, model):计算损失,相当于 “尝一口半成品,判断咸淡差距”。
    • batch_loss.backward():反向传播,相当于 “根据咸淡差距,判断该加多少盐 / 糖”(计算参数的梯度,指导参数调整)。
    • optimizer.step():优化器更新参数,相当于 “根据判断,往锅里加适量调料”(调整模型参数,让下一次预测更准)。
  3. 模型设为验证模式(model.eval ()):相当于 “炒完一批菜,关火尝咸淡”,禁用梯度计算,不更新参数,只评估效果。
  4. 遍历验证集,评估效果:相当于 “用验证份的食材尝味道”,计算验证损失,判断模型是不是真的学好了(不是死记硬背)。
  5. 保存最优模型:相当于 “把炒得最好吃的那一份菜存起来”,如果当前验证损失是历史最小,说明模型当前最好,保存下来,后续用于最终预测。
  6. 绘制损失曲线:相当于 “把每一轮的咸淡差距画出来”,直观看到训练损失和验证损失是不是在下降(菜是不是越炒越好)。

步骤 7:“上桌上菜”(模型评估与预测:evaluate)

这是最后一步,相当于 “用炒得最好的那道菜(最优模型),做最终的成品上桌”,用训练好的最优模型,对测试集进行预测,并保存结果。

小白理解:
  1. 加载最优模型:相当于 “把存起来的最好吃的那道菜拿出来”,加载之前保存的最优模型。
  2. 遍历测试集,进行预测:相当于 “把测试份的食材放进锅里,做出最终菜品”,因为测试集没有标签 y,所以只输入特征 x,输出预测结果。
  3. 保存预测结果:相当于 “把最终菜品装到盘子里,端给用户”,把预测结果保存到 CSV 文件里,方便查看和使用。

步骤 8:主程序(把所有步骤串起来)

这部分就是 “厨师按步骤做菜”,把上面的所有步骤串起来,配置参数(比如选 6 个核心特征、训练 50 轮),依次执行 “加载数据→搭建模型→训练模型→预测结果”,最终得到我们想要的新冠人数预测结果。

小白必看:总结与核心感悟

  1. 整套代码的核心逻辑给模型喂 “有用的特征(x)”,让它通过 “标签(y)” 学规律,最终能用新的特征(x)预测未知的标签(y)
  2. 训练的本质:不断调整模型参数,让 “预测值” 和 “真实值” 的差距越来越小(损失越来越低)。
  3. 关键步骤记牢:数据加载→特征筛选→数据预处理→模型搭建→训练验证→预测保存,这是深度学习回归任务的 “万能流程”,后续不管做什么预测(房价、销量、新冠人数),都离不开这个框架。
  4. 不用纠结复杂公式:作为小白,先搞懂 “每一步做什么、为什么做”,再慢慢深入公式和细节,不要上来就死磕数学,会打击信心。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐