Skip to content

03. 把问题变成样本 ​

程序已经能执行,但训练前还有一个更重要的问题:一条输入和一个目标究竟对应同一件事吗?重量读错单位、价格记录来自不同计费时期,算法仍可能运行并降低损失,结果却无法使用。

本篇承接运行环境,围绕运费与数字识别确定样本、特征、标签和数据集合。读完应能写清一次预测的输入输出,并检查训练与评估有没有互相污染。

一行数据是一项完整观察 ​

运费教学任务中,一条样本是“一次包裹计费”,输入为以千克计的重量,目标为以元计的运费。(2,5) 的含义应固定;不能有的重量单位是千克,有的却是克。

给模型用来判断的信息称为特征,这里就是重量;希望模型学会给出的答案称为目标,这里是运费。训练时同时提供输入与正确答案,让模型对照着改,这种方式叫监督学习,就像做带答案的练习题。

预测运费、气温这类数值的任务称为回归,预测值可以是 5 元,也可以是 5.3 元。识别数字则是从 0—9 中选一个类别,称为分类;图片对应的正确类别就是它的标签。这里的区别是“估计一个量”与“选择一个类别”,而非模型是否复杂。同样一张图片重复存成两份,文件数增加了,独立信息未必增加。

三条运费记录由人为规则生成,称为合成数据,只用于展示计算过程。真实记录中可能有称重偏差、录入错误或促销折扣,这些扰动常被称为噪声;本例把它们暂时去掉,便于看清计算。数字识别项目会在后续使用公开数据,再检验模型面对真实差异时的表现。

输入合同比文件后缀更重要 ​

把“模型究竟接收什么”写成明确约定,就是这里说的输入合同。它像插头和插座的规格:看起来都能连上,还要核对每个位置的含义。运费模型只接收一个大于零的有限数,2.5 表示 2.5 千克;文字、负数、表示无穷大的 inf 或表示无效数值的 NaN,都应先拒绝或处理。

图片也一样。只记录明暗、不记录颜色的图片称为灰度图片。一张 8×8 灰度图有 64 个像素,按行把这些数排成一列,就叫展平。训练时按行读、使用时却按列读,虽然仍有 64 个数,每个位置对应的内容已经变了。裁剪、缩放、调整数值范围等进入模型前的处理,统称预处理;训练和使用时要采用约定好的同一套方法。图片如何排列将在第 05 篇具体展开。

先留出没有参与学习的数据 ​

如果练习时已经看过答案,再拿原题考试,很难知道自己有没有学会方法。模型也是如此:它可能记住见过的例子,却处理不好新输入。对新样本仍然有效的能力称为泛化能力。要观察这种能力,需要从原始数据开始分开用途。

训练集像日常练习,用来修改参数;验证集像模拟考试,帮助比较哪一种模型或训练设置更合适;测试集像方案确定后的最终考试,用来观察没有参与前面选择的数据表现。若看完测试答案又反复修改方案,这份试卷就参与了备考,需要另找未使用过的数据做最终检验。

前八篇的三条运费数据只验证计算机制,数量太少,无法承担真实泛化评估。后续完整项目会给每条样本固定编号(ID),记下哪些编号被分到哪个集合,避免每次运行都换一份“试卷”。

同一来源的数据要一起分组 ​

假设一张数字图片被复制并向右挪动一点,原图进入训练、移动后的图进入测试,模型实际已经见过非常接近的输入。这种本该留给评估的信息进入了学习过程的现象,称为数据泄漏,就像考试题换了排版却还是练习原题。

对已有图片做适量平移等变化,增加训练时能见到的样子,称为数据增强。应先按原图划分集合,再只在训练集合内增强,所有变体保留来源编号。还要检查变化后答案是否仍然成立:把数字 6 旋转成像 9 的样子,就可能破坏原标签。

训练、验证与测试集合分别承担参数学习、方案选择和最终评估职责

图中的三条支路分别承担学习、选方案和最终检查。先按来源分组,再划分集合,就能让同一张图的不同版本留在同一侧,避免熟悉的内容悄悄进入最终检查。

真实业务还需要按目标决定切分方式。要预测未来销量,就用较早的数据训练、较晚的数据检查;要检验对新用户的效果,就让同一个用户的记录待在同一侧。随机打乱后切分很方便,但重复来源、用户关联和时间先后会让“没见过这一行”与“没见过这类信息”产生差别。

如果要预测用户未来 14 天会不会购买,还要等这 14 天过去,才能知道正确答案;预测当天也只能使用当时已经拿到的记录。怎样确定这些时间边界,可继续阅读数据与任务建模。

先定义一条样本表示什么,固定输入与目标,再按真实使用目标隔离学习、选择和评估。下一篇把这些样本放进一个真正可调的函数:04. 模型怎样算出预测。

别急,先让缓存热一下。