本课目标

建立正确的模型评估观,掌握系统化调参方法,用 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 微服务的标准路径。

动手练习

  1. 对之前训练的模型输出 classification_report,找出最容易混淆的类别对
  2. 把垃圾分类模型导出 ONNX,用 onnxruntime 验证推理结果与原模型一致