PyTorch 学习笔记-Week5
这周学习了从零开始使用PyTorch构建一个完整机器学习项目的全过程。通过两个经典案例——PIMA糖尿病分类和泰坦尼克号生还预测分类,系统地学习了数据处理、模型构建、训练、评估和优化的核心技能。
1. 核心概念与工作流
1.1 训练三元组:Epoch, Batch, Iteration
这是理解模型训练过程的基础。
- Epoch (周期): 指的是整个训练数据集被完整地、系统地过了一遍。
- Batch-Size (批次大小): 由于数据集太大无法一次性载入内存,我们将其分成小批次(batch)。Batch-Size就是每个批次中包含的样本数量。
- Iteration (迭代): 模型更新一次权重的过程。每处理一个batch的数据,就完成了一次迭代。
- 关系:
Iterations_per_Epoch = Total_Samples / Batch_Size
1.2 标准机器学习工作流
一个标准的项目遵循以下流程:
- 数据加载与探索 (EDA)
- 数据预处理与清洗
- 划分训练集/验证集
- 构建数据管道 (DataLoader)
- 定义模型架构
- 训练模型
- 评估模型性能
- (可选)超参数调优
- (可选)对新数据进行预测
2. 数据处理与加载 (Pandas & PyTorch)
2.1 探索性数据分析 (EDA)
在接触任何数据集时,首先要了解它。
1 | import pandas as pd |
2.2 数据预处理
这是将原始数据转换为模型可用格式的关键步骤。
a. 处理缺失值
1 | # 对于数值型特征,用中位数填充更稳健 |
b. 处理类别特征(独热编码)
神经网络只能处理数字,因此文本特征需要转换。
1 | # drop_first=True 用于避免多重共线性,是一种好习惯 |
c. 特征选择
删除与预测目标不相关的列。
1 | df = df.drop(['PassengerId', 'Name', 'Ticket'], axis=1) |
d. 特征缩放 (Standardization)
将所有特征缩放到相似的范围,有助于模型更快、更稳定地收敛。
1 | from sklearn.preprocessing import StandardScaler |
正确的顺序和做法
正确的流程应该是严格模拟真实世界:我们只能根据已有的训练数据来学习规律,然后将这些规律应用到未知的测试数据上。
正确的顺序是:1. 先分割,2. 后处理。
- 先分割数据:将数据集划分为训练集和测试集。
- 拟合和转换训练集:在 仅有训练集 (
x_train
) 上调用fit_transform()
。这一步会计算出只属于训练集的均值和标准差,并用它们来转换训练集。 - 仅转换测试集:使用同一个(已经在训练集上拟合好的)scaler,在测试集 (
x_test
) 上只调用transform()
。这一步是用训练集的均值和标准差来转换测试集,以确保两边处理标准一致。
额外的重要提示:不要标准化标签
2.3 PyTorch数据管道
a. 自定义 Dataset
1 | from torch.utils.data import Dataset |
b. DataLoader
将Dataset
封装成一个可迭代对象,实现批处理和数据打乱。
1 | from torch.utils.data import DataLoader |
3. 模型构建与训练
3.1 模型定义
使用nn.Module
定义模型结构,用nn.Sequential
可以使结构更简洁。
1 | import torch.nn as nn |
3.2 训练循环
这是模型学习的核心。
1 | # 初始化模型、损失函数和优化器 |
4. 模型评估与实践技巧
4.1 评估循环
在验证集上检查模型性能,全程不计算梯度。
1 | from sklearn.metrics import accuracy_score |
4.2 Kaggle提交流程
关键在于对test.csv
应用完全相同的预处理流程。
1 | # 1. 加载测试数据 |
4.3 超参数调优
通过实验寻找最佳的模型配置。
- 关键超参数: 学习率、网络结构(层数、神经元数)、训练周期数等。
- 策略: 一次只调整一个参数,观察其对验证集性能的影响。
- 自动化: 将训练/评估过程封装成函数,用循环来自动化测试不同的超参数组合。
5.代码实战
5.1PIMA糖尿病分类
1 | import torch |
5.2泰坦尼克号生还预测分类
1 | import torch |
评论
评论插件加载失败
正在加载评论插件