本课目标
建立正确的模型评估观,掌握系统化调参方法,用 ONNX 把模型导出为跨语言推理资产。
notebook 里的模型准确率 95%,一上线掉到 70%。"notebook 里的好"不等于"生产环境的好"。本讲教你三件事:怎么正确地衡量模型好不好,怎么系统地让它更好,怎么把它从 Python notebook 里弄出来跑在你的 Java/Go 服务里。
核心内容
不要只看准确率——选对你的"尺子"
99% 准确率的癌症筛查模型,可能一个病人都没查出来——因为 99% 的样本不是癌症。类别不平衡时看三个指标:
- 精确率 P:预测为"正"的里面,多少是真的。误报成本高时看它(垃圾邮件过滤——正常邮件被误拦是灾难)
- 召回率 R:真正的"正"里面,找出了多少。漏报成本高时看它(癌症筛查——漏掉一个就完蛋)
- F1:P 和 R 的调和平均
from sklearn.metrics import classification_report, confusion_matrix
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
混淆矩阵值得打印出来逐格看——哪两类最容易混?多半不是模型的问题,是数据标注或类别定义的问题。
过拟合诊断:训练 99%,测试 85%
经典的过拟合信号。对策有优先顺序:更多数据 > 数据增强 > 正则化 > 更小模型。永远先怀疑数据够不够、脏不脏,再怀疑模型结构。
调参方法论
GridSearchCV 穷举(参数少时),RandomizedSearchCV 随机采样(参数多时)。深度学习调参优先级:学习率 > batch size > 网络结构 > 正则化。学习率调对,解决一半问题。学习率调错,后面全白费。
ONNX:让模型走出 Python
训练在 Python,推理在 Java——这是 ML 工程的常态。ONNX 是跨框架模型格式:
import torch
model.eval()
dummy = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy, "garbage_classifier.onnx",
input_names=['input'], output_names=['output'],
dynamic_axes={'input': {0: 'batch'}, 'output': {0: 'batch'}})
导出后 Java 侧用 ONNX Runtime 加载——无需 Python 环境。训练归训练,推理归推理,语言栈解耦。这是我把 ML 模型塞进 Java 微服务的标准路径。
动手练习
- 对之前训练的模型输出
classification_report,找出最容易混淆的类别对 - 把垃圾分类模型导出 ONNX,用
onnxruntime验证推理结果与原模型一致