title: "我的算法工程师方法论:先把数据与评估搞明白" publishedAt: "2025-12-27" summary: "从一次 CV 竞赛(SVHN 字符识别)和一次时序预测(内存故障预测)的经历出发,聊聊我最常用的改进路径:数据分布、评估偏差、以及可复现实验。"
很多时候,模型不是输在"结构不够大",而是输在 数据分布 和 评估逻辑 上。
我做过两个很不一样的任务:
- 视觉:街景字符识别(基于 YOLOv8)
- 表格/时序:内存故障预测(特征工程 + 传统模型)
任务不同,但最有效的改进路径惊人一致:先确保你在优化"正确的东西"。
1. 先问:训练集、验证集、线上测试,到底是不是同一种分布?
在街景字符识别里,我遇到过一个非常典型的问题:
验证集存在"结构性漏标"(比如重复字符少标),导致离线 MAP 难以突破某个上限。
这会带来一个后果:你以为你在优化模型,实际上你在优化"验证集的噪声"。
经验:
- 当你发现离线指标卡死,但线上还能涨/或涨幅不稳定时,优先怀疑验证集质量与分布差异。
- 可以尝试重新划分验证集:从训练+验证中抽取一部分重新组成更"公平"的验证集,用来验证你的改进是否真的有效。
2. 评估偏差比你想象得更常见
在视觉任务里,后处理(NMS、置信度阈值、字符排序规则)经常带来"看起来很小但很稳"的提升。
在时序预测里,前向填充(ffill)+ 时间聚合会直接改变特征分布,从而让模型学到更"稳定"的模式。
这里的共同点是:
你并不是在"作弊",而是在把评估方式更贴近真实任务目标。
我常用的检查清单:
- 模型输出与提交格式是否一致?
- 后处理是否引入了不必要的随机性?
- 采样策略是否让评估变成"抽奖"?
3. 可复现实验是提升速度的秘密武器
如果你每次改一行参数就直接跑整套训练,最终你会被自己淹死。
我现在会强制自己做到:
- 固定随机种子(能固定就固定)
- 记录每次实验改动点(写在日志或 README)
- 对改动进行"单变量对照"(一次只改一个关键点)
这能让你在两周后还能回答:
"我当时到底是怎么把分数提高的?"
结语
我更偏爱这种工程化的节奏:
先搞清楚数据与评估,再谈模型与技巧。
后续我会把两个项目里具体有效的改进(比如 YOLO 的输出排序、时序聚合粒度与采样策略)单独写成可复现的笔记。