⚙️ 第十二章 如何让计算机【学习】
📄 一句话概括

一条数据等于特征加标签;而最重要的一步是把数据分成训练与测试两份——拿学过的数据去考试,等于把答案背下来。

📝 本节和前面几节的关系

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 秒实验

  1. 把每个数字的样本数改成 20 条,看总数变成多少。
  2. 想一想:如果训练集里只有工整的字,遇到潦草的字时会发生什么。

常见误区

  1. 以为用同一批数据训练又测试没关系。那是背答案,分数不可信。
  2. 以为数据是【现成的】。准备数据往往是整个流程里最费力的一环。
自测三问(点开对答案) 1. 一条数据由哪两部分组成? —— 特征(输入)和标签(正确答案)。 2. 为什么要把数据分成训练和测试两份? —— 用学过的数据考试等于背答案,必须用没见过的数据检验真实效果。 3. 这一章用的样本长什么样? —— 8×8 的点阵,每个格子 0 或 1,共 64 个特征,标签是它是几。

相关笔记