一个高准确率,先要问它是在什么条件下测出来的。
用一份公开的动作识别数据集(UCI HAR)教学子集训练,第一次就能拿到 约 93% 的验证得分,第二次换更重的档位能到 约 95.4%。 学生通常的反应是「那挺准的,能用了吧」。
但这份数据有一个关键事实:这 720 条样本来自 30 个不同的人, 而刚才是随机切成训练集和测试集的。
也就是说,同一个人可能既有数据在训练集里,也有数据在测试集里。 那模型学到的,到底是「走路这件事」,还是「这 30 个人各自走路的样子」?
这个现象叫 主体泄漏(subject leakage)。 后果是准确率虚高:模型在测试集上表现好,是因为它在训练时见过这个人, 而不是因为它学会了「走路」。
换一个从没见过的人来测,准确率就会掉下来。这正是 「实验室里 99%,上线后一塌糊涂」最常见的原因之一。
这份数据在学术界的标准做法是按人划分(21 人训练 / 9 人测试), 而不是随机划分。上面那个教学子集没有保留受试者编号, 所以课堂上的 93% 是偏高的——这一点必须讲清楚,否则就是在教错的直觉。
还可以顺手做一个更硬的检查:把模型拿给一个没参与建模的同事, 用他自己的数据试一遍。掉多少,就是你的真实水平。
不是。同一份数据上,更重的档位把分数从 93.1% 抬到 95.4%, 代价是训练时间翻近一倍、模型体积从约 3.4 MB 涨到约 75 MB。
而如果这 93.1% 本身来自有泄漏的划分, 那 2.3 个百分点的提升,很可能只是在更用力地记住同一批人。 先修划分方式,再谈调档位——顺序反了,花的时间都是白花。
一句可以带走的话:一个高准确率,先要问它是在什么条件下测出来的。 数据怎么划分,决定了这个数字意味着什么。
流程本身见 《串口采的传感器数据,怎么不写代码训出一个模型?》; 训完之后拿到的东西到底是什么,见 《模型导出之后,到底怎么用?》。