先摆个结果:我用 PyTorch 上手了一个手机价格区间分类实战,测试集准确率跑到 95% 左右。这篇文章不打算只晒一条漂亮的准确率,而是把大家私信问得最多的三块内容一次讲透:PyTorch 实战里模型保存与加载怎么搞才稳,训练时 loss 上蹿下跳到底正不正常,以及出了问题该怎么排查。
如果你是刚入门 PyTorch、对着公开数据集不知道从哪下手的人,这篇可以直接照着跑;如果你已经写过一些训练脚本,但每次保存模型、恢复训练都要现查资料,这篇也能帮你省不少时间。我尽量把代码、现象、原因、解决办法都放到一起,方便后面直接拿来当手册查。
这个项目用的是手机价格分类那类公开的匿名配置文件,特征都是硬件参数,目标变量是四个价格档位。任务本身不复杂,但作为 PyTorch 入门到实战过渡的案例非常合适:数据量不大、特征维度不高、不需要 GPU 也能几分钟跑完,同时又能把训练、验证、保存、加载、loss 分析这一整套流程完整走一遍。
1. 项目概述与整体方案
1.1 手机价格区间分类是个什么样的任务
手机价格区间分类,简单说就是给你一系列手机硬件配置,比如电池容量、蓝牙、摄像头像素、内存、重量、屏幕尺寸这些参数,让你判断这台手机属于哪个价格档位。常见的公开数据集会把价格切成 0、1、2、3 四档,0 代表低成本,3 代表高成本。整个任务本质是一个多分类问题,不是回归问题,所以输出层该用 softmax 或者全连接后接交叉熵损失,而不是用 MSE 去拟合具体价格。
我第一次接触这个数据集的时候,第一反应是这东西随便跑个随机森林也能有不错的准确率,干嘛非要用 PyTorch?后来想明白了,这个项目的核心价值不在“分类准确率能刷多高”,而在于它能把深度学习里最常用的工程流程完整串起来:数据预处理、自定义网络、训练循环、模型持久化、loss 监控。很多新手学 PyTorch 时天天看 MNIST 手写数字,但一遇到真正的表格数据就不知道怎么组织 DataLoader,这个项目刚好补上这块空白。
数据集本身大概有两千条样本,二十个特征,没有缺失值。特征里既有连续值,比如 ram、battery_power、px_height,也有二值特征,比如有无蓝牙、是否双卡、是否支持 4G。这种特征混合形态很常见,预处理的时候要注意量纲问题,不能直接丢进网络。
1.2 为什么选 PyTorch 而不是直接用 sklearn
如果只追求准确率,用 sklearn 的 GradientBoosting 或者 XGBoost 可能更省事,调参空间还大。但我推荐用 PyTorch 来做这个项目,有几个很实际的原因。
第一,PyTorch 的训练循环是完全可控的。你想在某个 batch 之后打印梯度、想中途改学习率、想手动判断 loss 是否异常,都可以直接插代码进去。sklearn 对底层训练过程的开放程度很低,出了问题只能当黑盒处理,不利于深入理解。
第二,这个任务非常适合体验“从零到一”的建模过程。自定义一个 MLP 只需要几十行代码,你能清楚看到每一层做了什么,也能直观感受 BatchNorm、Dropout、Adam 这些组件对训练曲线的实际影响。以后遇到更复杂的任务,这些基本功照样用得上。
第三,模型保存与加载这套操作在 PyTorch 里细节很多,而它们恰恰是这个项目的主题之一。如果你只用 sklearn,joblib 一行就完事,根本见不到 state_dict、checkpoint、map_location 这些坑,也就没办法积累真正的实战经验。
当然,我也不是说要排斥传统机器学习。事实上最后做对比的时候,XGBoost 在这个数据集上也能到 90% 以上。我的建议是两者都跑,一边用 PyTorch 练深度学习流程,一边用传统模型当基线,这样对“深度学习在表格数据上到底有没有优势”会有更直观的判断。
1.3 环境准备与依赖安装
这个项目不需要很夸张的硬件环境,CPU 也能跑,有 GPU 更好。我自己用的 PyTorch 2.x 版本,Python 3.10 左右,安装方式直接参考官网命令就行。建议先用 Anaconda 建一个干净的虚拟环境,别一股脑装进 base 环境里,后面项目多了容易乱。
bash复制conda create -n mobile_cls python=3.10
conda activate mobile_cls
pip install torch torchvision torchaudio
pip install pandas numpy scikit-learn tensorboard
如果本机有 NVIDIA 显卡,建议装对应 CUDA 版本的 PyTorch,训练会快很多。不过这个数据集太小,计算量几乎可以忽略,CPU 跑也就几十秒一个 epoch。很多人在安装 PyTorch 时会碰上网络慢的问题,我的经验是别死磕,换个网络好的时段,或者用官方轮子对应的本地安装方式,都比反复中断重试要省心。
数据方面,把下载好的 CSV 文件放到项目目录下,然后写代码读取。后面所有操作都是围绕这个文件展开的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据预处理与特征分析
2.1 数据加载与初步检查
拿到数据的第一步永远是看结构,而不是急着写模型。用 pandas 读进来之后,我先做了三件事:看 shape、看 info、看缺失值。
python复制import pandas as pd
df = pd.read_csv("train.csv")
print(df.shape)
print(df.info())
print(df.isnull().sum().sum())
print(df["price_range"].value_counts())
两千多条样本,二十个特征,一个缺失值都没有,四个价格档位各占四分之一,类别非常均衡。这种均衡的好处是后面可以直接用 accuracy 作为主要指标,不用太担心类别不平衡导致
