这个项目构建了一个深度学习模型,用于预测美国各州未来三天的新冠病毒感染人数。作为入门级实战项目,它完整展示了从数据预处理、特征工程到模型训练评估的全流程。核心价值在于:用不到200行PyTorch代码实现了一个端到端的预测系统,而同等功能的纯Python实现需要500+行代码。
项目特别适合两类学习者:
关键技术栈:
提示:完整代码文件包含covid.train.csv(训练数据)、covid.test.csv(测试数据)和main.py(模型代码),建议边阅读边运行代码观察效果。
PyTorch不是具体的模型,而是深度学习工具包(类似TensorFlow/Keras)。其核心价值可通过对比来说明:
| 实现方式 | 代码量示例 | 优势/劣势 | 适用场景 |
|---|---|---|---|
| 纯Python实现 | 需手动编写: - 矩阵乘法 - 梯度计算 - 反向传播 |
适合理解原理 但开发效率极低 |
教学演示 |
| TensorFlow实现 | 固定计算图模式 需定义Session |
部署性能好 但调试困难 |
工业级部署 |
| PyTorch实现 | 自动求导+动态图 模块化设计 |
灵活调试+快速迭代 | 研究/快速原型开发 |
以本项目为例:
python复制class myNet(nn.Module):
def __init__(self,inDim):
super(myNet,self).__init__()
self.fc1 = nn.Linear(inDim, 64) # 全连接层
self.relu = nn.ReLU() # 激活函数
self.fc2 = nn.Linear(64,1) # 输出层
def forward(self, x):
return self.fc2(self.relu(self.fc1(x)))
自动微分(Autograd):
loss.backward()一行代码动态计算图:
设备无关性:
to(device)切换设备原始数据格式(covid.train.csv):
使用SelectKBest选择最相关的k个特征:
python复制def get_feature_importance(feature_data, label_data, k=4):
model = SelectKBest(chi2, k=k) # 卡方检验选择特征
X_new = model.fit_transform(feature_data, label_data)
scores = model.scores_ # 特征重要性得分
indices = np.argsort(scores)[::-1] # 按得分降序排列
return X_new, indices[0:k]
注意:特征选择后需记录列索引,保证训练/验证/测试集使用相同的特征
对每个特征列进行Z-score标准化:
python复制self.data = (self.data - self.data.mean(dim=0)) / self.data.std(dim=0)
数学原理:
code复制x' = (x - μ) / σ
其中μ是均值,σ是标准差
按时间顺序划分(避免未来信息泄露):
python复制if mode == 'train':
indices = [i for i in range(len(csv_data)) if i % 5 != 0]
elif mode == 'val':
indices = [i for i in range(len(csv_data)) if i % 5 == 0]
项目采用两层全连接网络:
code复制输入层(k维) → 隐藏层(64维+ReLU) → 输出层(1维)
代码实现细节:
python复制class myNet(nn.Module):
def __init__(self,inDim):
super(myNet,self).__init__()
self.fc1 = nn.Linear(inDim, 64) # 第一层
self.relu = nn.ReLU() # 激活函数
self.fc2 = nn.Linear(64,1) # 输出层
def forward(self, x):
return self.fc2(self.relu(self.fc1(x)))
关键参数说明:
nn.Linear:实现y = Wx + b变换nn.ReLU():引入非线性,公式为max(0,x)使用MSE损失+L2正则化:
python复制def mseLoss(pred, target, model):
loss = nn.MSELoss(reduction='mean')
regularization_loss = 0
for param in model.parameters():
regularization_loss += torch.sum(param ** 2) # L2正则项
return loss(pred, target) + 0.00075 * regularization_loss
正则化作用:
使用带动量的SGD优化器:
python复制optimizer = optim.SGD(model.parameters(),
lr=0.001,
momentum=0.9)
参数说明:
完整训练epoch流程:
python复制for epoch in range(n_epochs):
model.train() # 训练模式
for batch in trainloader:
optimizer.zero_grad()
pred = model(batch_x)
loss = mseLoss(pred, batch_y)
loss.backward() # 反向传播
optimizer.step() # 参数更新
model.eval() # 验证模式
with torch.no_grad():
for val_batch in valloader:
val_pred = model(val_batch_x)
val_loss = mseLoss(val_pred, val_batch_y)
关键点:
zero_grad():清空上一轮梯度backward():自动计算梯度step():执行参数更新train()/eval():切换模式影响BN/Dropout等层通过loss曲线判断训练状态:
python复制plt.plot(plt_train_loss, label='train')
plt.plot(plt_val_loss, label='val')
plt.legend()
plt.show()
理想情况:
异常情况处理:
生成最终预测文件:
python复制def evaluate(model_path, testset, rel_path):
model = torch.load(model_path)
model.eval()
with torch.no_grad():
for data in testloader:
pred = model(data)
val_rel.append(pred.item())
# 保存CSV
with open(rel_path, 'w') as f:
writer = csv.writer(f)
writer.writerow(['id','tested_positive'])
for i, pred in enumerate(val_rel):
writer.writerow([i, pred])
输出格式示例:
code复制id,tested_positive
0,56.3
1,78.2
...
维度不匹配错误:
nn.Linear定义一致GPU内存不足:
梯度爆炸:
torch.nn.utils.clip_grad_norm_特征工程:
模型调优:
训练策略:
optim.lr_scheduler.StepLR项目文件组织:
code复制covid_prediction/
├── data/
│ ├── covid.train.csv # 训练数据
│ └── covid.test.csv # 测试数据
├── model_save/
│ └── model.pth # 保存的模型
└── main.py # 主程序
代码执行流程:
关键函数调用关系:
code复制main()
├── covidDataset() # 数据加载
├── myNet() # 模型定义
├── train_val() # 训练流程
└── evaluate() # 预测输出
时间序列特性:
集成学习:
部署应用:
这个项目最值得借鉴的是它展示了PyTorch的核心优势——用简洁的代码实现复杂功能。我在实际教学中发现,初学者常陷入两个极端:要么过度依赖高层API(失去灵活性),要么沉迷底层实现(降低开发效率)。而这个项目恰好找到了平衡点:既展示了PyTorch的易用性,又保留了足够的灵活性空间。