一条数据等于特征加标签;而最重要的一步是把数据分成训练与测试两份——拿学过的数据去考试,等于把答案背下来。
12.3 把工具用顺了,这一节开始做准备工作的第一步:把数据摆出来。
一、一条数据长什么样
机器学习吃的就是数据。一条数据由两部分组成: 特征(输入)+ 标签(正确答案)。 这一章用的例子是手写数字:8 × 8 的点阵,每个格子 0 或 1。 一个样本就是一张 8×8 的小方格图,标签就是它是几。 特征就是那 64 个格子——机器不认识【数字】,只认识这 64 个数。
二、这一步的实测数据
实测造出来 40 条数据:每个样本 64 维,用到 0 到 4 五个数字,每个 8 条。 数据量不大,但足够看清整个流程——这比一次上几万条更容易讲明白。 做真事的时候,这一步往往是整个项目里最费力的一环。 算法可以换,数据不对,怎么换都白搭。
三、最重要的一步:分开
把数据分成两份:一份用来学(训练),一份用来考(测试)。 实测按 80 / 20 分:32 条训练、8 条测试。 为什么必须分?因为拿学过的数据去考试,等于把答案背下来。 那样考出来的满分毫无意义——要看的是它面对没见过的数据能不能认出来。 这个区分是整章的地基:训练集是【课本】,测试集是【考卷】,两者绝不能混。
四、数据准备还要注意什么
标签要准。 标错一个样本,它就在往错的方向教模型。 量要够。 几十条只能做演示,真做事往往要成千上万条。 要能代表将来遇到的场景。 只用工整的字去训练,遇到潦草的字就没辙。 最后一条最容易被忽略:分清【训练数据】和【将来的真实数据】是不是同一类东西。
五、动手 Demo:准备学习数据
一条数据等于特征加标签;最重要的一步是分成训练与测试两份。 实测造一批 8×8 的手写数字样本。
# 每个数字给一个 8×8 的理想点阵,再加噪声生成若干变体
xs, ys = make_dataset(per_digit=8)
print("数据量", len(xs))
print("每个样本的维度", len(xs[0]))
cut = int(len(xs) * 0.8)
print("训练用", cut, "条")
print("测试用", len(xs) - cut, "条")
实跑输出:
--------------------------------------------------------------------
准备学习数据
--------------------------------------------------------------------
**机器学习吃的就是数据。**一条数据由两部分组成:
**特征**(输入)+ **标签**(正确答案)
按书里的路线,这里用手写数字当例子:**8×8 的点阵,每个格子 0 或 1。**
一个样本就是一个 8×8 的小方格图,**标签就是它是几。**
实测造出来的数据量 40 条
每个样本的维度 64(8 × 8)
用到几个数字 0、1、2、3、4
每个数字的样本数 0:8、1:8、2:8、3:8、4:8
**接下来是最重要的一步:把数据分成两份。**
训练用 32 条(80%)
测试用 8 条(20%)
**为什么要分?因为拿学过的数据去考试,等于把答案背下来。**
那样考出来的分数**毫无意义**——**要看的是它面对没见过的数据能不能认出来。**
实测:共 40 条,每个样本 64 维,五个数字各 8 条;按 80/20 分成 32 条训练、8 条测试。 拿学过的数据去考试等于背答案——所以要留一份从没给它看过的数据当考卷。
30 秒实验
- 把每个数字的样本数改成 20 条,看总数变成多少。
- 想一想:如果训练集里只有工整的字,遇到潦草的字时会发生什么。
常见误区
- 以为用同一批数据训练又测试没关系。那是背答案,分数不可信。
- 以为数据是【现成的】。准备数据往往是整个流程里最费力的一环。
自测三问(点开对答案)
1. 一条数据由哪两部分组成? —— 特征(输入)和标签(正确答案)。 2. 为什么要把数据分成训练和测试两份? —— 用学过的数据考试等于背答案,必须用没见过的数据检验真实效果。 3. 这一章用的样本长什么样? —— 8×8 的点阵,每个格子 0 或 1,共 64 个特征,标签是它是几。- ☐ 下一节(12.5 查看手写数字数据的内容)
相关笔记
- 查看手写数字数据的内容 — 数据到手后先做的一件事
- 通过机器学习识别手写数字 — 拿这批数据去训练
- 什么是机器学习 — 为什么数据决定上限
- 🔵 计算机基础 · 索引 — 硬件底层的入门课
- ⚙️ 程序是怎样跑起来的 · 索引