跳到主要内容

数据本身是歪的 — 一条斜线毁掉一个模型

这一章讲三件事: 前八章所有评估数字底下压着的那个前提是什么; 它破了会怎样(而且你多半看不出来);以及数据里另外三类常见的缺陷怎么发现、怎么补。 它在全书链条里的位置: 第 08 章解决了「数据怎么进来」, 这一章解决「进来的这些数据本身靠不靠谱」。 这是全书唯一一章不讲模型的。 但书自己说得很硬: 至今绝大部分训练失败的症结所在都是数据的缺陷1

1. 先看现象:一个看起来很正常、其实已经废了的模型

书假设了一个场景2:你要做一个估加州房价的应用。 手上有一份加州房价的 CSV,一万七千行,每行是一个片区的房间数、房龄、经纬度等等。

你按老规矩来:前 80% 当训练集,后 20% 当测试集,开训。

训练曲线正常,测试损失也不算离谱。可这个模型已经废了。

为什么? 因为那份 CSV 是按经度排好序的

经度

│ ●●●●●●●●●
│ ●●●●●●●●
│ ●●●●●●●●●
│ ●●●●●●●●
└──────────────────────────────────────▶ 这一行在文件里排第几
0 8500 17000
└──── 你的训练集 ────┘└─ 你的测试集 ─┘

图说:这是书里那张图的样子 —— 经度和行号几乎是一条直线。
切前 80% 当训练集,等于「拿全是偏西那一侧的房子训,拿全是偏东的房子考」。
西边靠海、东边内陆,房价规律根本不是一回事。

最要命的一点是:这个错误在损失曲线上看不出来。 你会得到一个能收敛、能出数的模型,然后花几天几周去调超参数、换架构—— 书的原话是:可能会浪费数天,甚至数周,直到最后才恍然大悟——应该先看数据3

2. 顶层全景:四类缺陷,一张检查单

拿到一份数据,动手训练之前,按这四条过一遍:

① 它独立吗? ── 排过序没有?知道这一条能不能猜出下一条?
查法:画「特征 对 行号」的散点图,看有没有趋势
治法:打乱 —— 但窗口要开到比数据集还大

② 它同分布吗? ── 训练时见到的世界,和上线后要面对的是同一个吗?
查法:比两边每个特征的均值/中位数/方差;或者训个模型去猜「这条来自哪边」
治法:治不了,只能不断拿最新数据重训

③ 有离群值吗? ── 40~130 公斤的人堆里混着一个 145000 公斤的
治法:过滤掉,或者截断 + 加一个「这条被截过」的标记

④ 有缺失吗? ── 先分清它为什么缺,再决定填什么
治法:扔掉 / 填均值 / 填标记值 / 填均值再加一个「原本缺了」的特征

最后,如果查完补完数据还是太少:造伪样例(但只能用在训练集上)

图说:① 和 ② 是同一个前提的两半,下一节整节讲它;③④ 在第 5 节;伪样例在第 6 节。

3. 承重节:那个没被说出口的前提

这一节是本章的地基,也是前八章所有数字的地基。

前提是什么

机器学习的很多基础理论建立在同一个假设上4:

训练集里的每一个样例,都是从同一个概率分布(可以想成同一个出题人,它按固定的偏好在出题)里独立抽出来的; 而测试集,是从完全一模一样的那个分布里抽出来的另一批。

这个前提有个正式的名字,叫独立同分布(independent and identically distributed, 常缩写成 IID)。拆成两半来记:

半边意思破了会怎样
同分布训练时见到的世界,和上线后见到的世界是同一个你在工作日的路况上训,拿去预测周末——规律根本不一样
独立知道了这一条,不该让你对下一条有任何额外的猜测排过序的数据里,知道这一行的经度,你大致就能猜出下一行的——它们不独立

「同分布」怎么破:两种偏斜

两个数据集的分布不一致,这个现象叫偏斜(skew)。书给了两类成因5:

成因一:你抽样的方式本身就偏。

  • 预测路况,训练数据全采自周一和周二,测试数据来自周末——工作日和周末的路况分布明显不同;
  • 做人脸识别,训练用的全是你自己所在地区的人脸——换个人口构成的地方就认不准了。

成因二:采集过程中途变了。

书举的例子极具体:你在录音频样本,录到一半麦克风坏了,换了一个新的接着录。 于是数据集后半段的噪声特性和前半段不一样;而你上线时用的是新麦克风, 训练集和线上数据之间就产生了偏斜6

一个必须接受的事实:偏斜消不掉

书在这里说了一句很有分量的话7:

数据集的偏斜在某种意义上而言是不可避免的。 训练集一定来自过去,而应用运行时的数据一定来自当下; 文化、兴趣、潮流都在变,这些样本背后的分布必然会改变。

所以对策不是「消灭偏斜」,是「探究它的成因,并尽可能最小化它的影响」。 而生产环境里最常见的做法是:不断拿最新的数据重新训练7

「独立」怎么破:排序

这一半更隐蔽,因为破坏它的往往是我们自己的好习惯。

书说得很有意思:我们作为训练有素的计算机科学家,往往非常重视对数据的整理—— 排序能提升读取速率;而且即使你什么都不做,数据库系统通常也会帮你排好8

于是第 1 节那个事故就发生了。

3. 补救:打乱,但窗口要够大

第 08 章讲过 shuffle(窗口大小) 只在窗口内打乱这一节就是那条限制的代价现形的地方。

书拿那份加州房价数据做了一组实验,把窗口从小到大试了四个值9:

窗口 10: ▲ 经度
│ ●●●●●●●●●
│ ╲╲╲╲╲●●●●●●●● ← 还是一条斜线,只是毛糙了一点
└──────────────────────▶ 行号

窗口 50: 和窗口 10 差不多,斜线依然清晰

窗口 250: ▲
│ ●●●●●●●●
│ ●●╲●●●●●●●● ← 斜线还在,只是变宽了
└──────────────────────▶

窗口 6000: ▲
│ ● ● ● ● ●● ● ● ●
│ ●● ● ●● ● ● ●● ← 终于散开了,看不出趋势
└──────────────────────▶

图说:窗口 250 时,「大的经度值都挤在小的行号那边」这个关联仍然一眼可见。
只有窗口开到 6000(数据集是 17000 行)时,数据才终于像是独立同分布的。

书给的规矩很简单:窗口开得比整个数据集还大。 那时候「窗口内打乱」和「整体打乱」等价10

但如果数据集太大、内存装不下,或者干脆是无限的呢? 书很诚实:那就只能凑合用一个相对大的窗口,并且必须对数据分布做更严谨的分析10

这个坑还有另一面,在第 11 章。 那一章讲通用流程时会说: 时序数据的验证集必须来自训练集时段之后的时间段。 听起来和这一章相反(那里禁止打乱), 其实是同一件事的两面:问的都是「你的评估数据,和你上线后要面对的数据,是同一个分布吗」。 加州房价那里,不打乱就不是;时序预测那里,打乱了就不是。 书没有把这两处连起来,是我们接的。

4. 主走查:一万七千行,从一张图到一个决定

这一章的每个承重机制,在这条走查上各占一步。数字全部来自书里。

发生了什么具体的数 / 状态
1拿到加州房价 CSV17 000 行,每行是一个片区的若干特征
2动手建模之前,先画一张图横轴「这一行排第几」,纵轴「经度」,取前 1000 行画散点
3看图几乎是一条直线 —— 行号越大,经度越小
4推断后果切前 80% 当训练集 = 拿全是偏西的房子训、拿全是偏东的房子考
5打乱,窗口 10斜线还在
6窗口 50斜线还在
7窗口 250斜线仍然清晰可见——大的经度值仍然集中在小的行号那边
8窗口 6000终于散开了,看不出行号和经度的关联
9得出规矩窗口要开到比数据集(17 000 行)还大;开不到就必须另做分布分析

第 2 步是这一章最该带走的动作:动手训练之前,先给每个特征画一张「它 对 行号」的散点图。 理想的数据集里,行号不该包含关于特征的任何信息。

5. 另外三类缺陷

离群值:一个 145 000 公斤的人

离群值是那些明显不符合数据背后规律的值。书的例子很好记: 一份医疗数据里,成年人体重通常在 40 到 130 公斤之间; 可数据里时不时会冒出 145 000 公斤、0 公斤,甚至 NaN11

NaN 尤其危险: 书在脚注里警告——它会在模型里传播得到处都是12。 第 02 章说过学习率过大也会让权重变成 NaN两条路都通向同一个废掉的模型。

两种处理办法13:

办法一:直接过滤掉这些样例。
⚠ 但推断时也必须用同一套逻辑判断 —— 否则你自己制造了偏斜。

办法二:截断到合理区间。
weight = Math.min(130, Math.max(weight, 40));

⚠ 这一步有个副作用:一个本来就 40 公斤的人,
和一个被从 −5 截上来的人,现在长得一模一样。
解法:再加一个新特征,记下「这条被截过没有」
isOutlierWeight = weight > 130 || weight < 40;

图说:第二个办法多出来的那个特征,让模型有机会学到「被截断」这件事本身
和目标之间有没有关系 —— 如果有的话。

缺失值:先分清它为什么缺

填个平均值就完了?书说没那么简单——得先看它为什么缺。 书把缺失分成三类,第三类是致命的14:

类型定义书给的例子
完全随机缺(MCAR)缺不缺和任何东西都无关宇宙射线打翻了一个存储单元
随机缺(MAR)缺不缺和别的能看到的特征有关,但和它自己的值无关车牌识别系统天黑就读不到车牌——和车牌号是什么无关,和「几点」有关
非随机缺(MNAR)缺不缺恰恰取决于它自己的值气象站测太阳辐射,下雪时就测不到了

为什么第三类致命? 因为「它缺失」这件事本身携带了信息(下雪了), 而你填任何一个数,都是在抹掉这个信息

四种补法,代价各不同。其中第二种有个专门的名字叫插值—— 就是拿一个算出来的数去把空缺填上15:

补法怎么做代价
① 扔掉这个样例filter 一下只有完全随机缺时才安全;否则会让训练集产生偏差(比如正类的缺失比负类多,训出来的类别概率就是错的)
② 插值填这一列的均值、中位数或众数模型从此感知不到「这里原本是缺的」;如果缺失本身带信息,这个信息就没了
③ 填一个标记值比如体重缺失就填 −1模型要花一部分算力去学「−1 是特殊值,不是真的体重」;而且要先填标记值再做离群值截断,顺序反了 −1 会被截成 40
④ ②+③ 组合:插值 + 加一个「这里原本缺了」的新特征填均值,再加一列 weight_isMissing(缺是 1,不缺是 0)书说这可能是最稳健的做法:既不混淆真值和填值,又保住了「缺失」这个信息

分布不一致:怎么发现

上面讲了偏斜是什么,这里讲怎么查16:

  • 初级做法: 算每个特征在两个数据集上的均值、中位数、方差,看差得离不离谱;
  • 高级做法(很妙): 拿样本去训一个模型,预测「这个样本来自哪个数据集」。 如果两个数据集真的同分布,这件事应该做不到;做得到就说明有偏斜;
  • 现成工具: 书推荐 Facets——把两个数据集丢进去,它会画出每个特征的分布让你并排比。

顺带四条容易踩的

书在章末列了几条看起来琐碎、但都真的会毁掉模型的注意事项17:

  1. 字符串格式不一致。 训练时是 FIREFOX,线上传进来的是 FIREFOX\n"FIREFOX"—— 这是最难查的一种偏斜;
  2. 过于不平衡的特征。 一列里几乎所有值都一样,建议直接删掉: 它容易导致过拟合,而且深度学习模型不擅长处理很稀疏的数据;
  3. 用整数编码的类别必须转成 one-hot 或嵌入。 否则模型会把这些编号当成有大小的数—— 这正是第 05 章那条规矩,在数据侧的样子;
  4. 特征尺度差太多要标准化——第 03 章那道手续,推断时也要用同一套

还有一条书单列了一段:数据的偏见、安全和隐私。 书说这不是一章讲得完的,但了解它是开发机器学习方案的必要功课, 并且给了一个很务实的理由:哪怕纯粹从自身利益出发也该注意—— 数据在这些方面出纰漏会导致系统性错误,进而流失客户18

6. 数据不够怎么办:造伪样例

这一节回答:上面查完了、补完了,可数据就是太少,怎么办。

书给的办法是数据增强:对现有样例做小幅改动,造出新的训练样例19

一张标着「猫」的照片
↓ 随机旋转一点
还是猫
↓ 随机做一点错切(把方框拉成平行四边形)
还是猫
↓ 随机水平翻转
还是猫

图说:内容变了,标签没变。这些人造出来的样例叫「伪样例」。
对 MNIST 也一样:把一个「9」往左挪一个像素,它还是 9,但已经是一个新样例了。

它的价值和它的天花板,书都写得很清楚20:

它买到什么它买不到什么
训练数据更多样,泛化能力更好(也就是缓解过拟合);训练集很小时尤其有用它产生不了任何新信息,只能把现有信息重新混合 —— 所以它很难完全避免过拟合

还有一个风险: 增强出来的训练集,分布可能和真实的测试集对不上—— 你为了补数据,反而制造了这一章开头讲的那种偏斜20。 划不划算,书说只能靠测试和实验来验。

一条不许违反的规矩:数据增强只能用在训练集上,绝不能用在验证集和测试集上。21 理由很直接:推断时的输入是没有增强过的,你拿增强过的数据去评估,评出来的数不作数。

7. 作者的判断与证据

书里给了证据的:

  • 加州房价数据是按经度排序的。 书给了绘图代码,你自己就能画出那条斜线2
  • 窗口 250 还不够,要 6000。 有四张对照图,窗口取 10 / 50 / 250 / 60009
  • 先跳过再转换省算力(第 08 章那个计数器实验)在这一章仍然适用。

属于作者判断、书里没给证据的:

  • 「至今绝大部分问题的症结所在都是数据的缺陷。」1 书明说这来自作者们自己构建和指导机器学习系统的经验,不是一项统计。
  • 「偏斜在某种意义上是不可避免的。」 这是一个论断,书给的支撑是「文化、兴趣、潮流会变」7
  • 「插值 + 缺失指示特征可能是最稳健的做法。」 书用的是「可能」这个词15
  • 「数据科学家对哪种场景适用哪种缺失值处理办法持不同意见。」 这是对领域现状的描述14

判断(我们的,不是书里的): 这一章在整本书里的位置很尴尬——它不讲模型、不出准确率, 读起来像一章「注意事项」。但它是全书唯一一章能让你避免「浪费几周」的。 前八章教的所有评估纪律(基准、验证集、ROC 曲线),全部建立在第 2 节那个前提上; 前提破了,那些纪律一条都不成立。 如果错,会错在: 如果你的数据是当场合成的(像第 07 章那个目标检测例子、 或第 08 章那个纸牌游戏),那么独立同分布天然成立,这一章对你只剩参考价值。

8. 边界与局限

  • 这一章只教了「怎么发现」,没教「怎么修好」。 偏斜发现之后怎么办? 书给的唯一对策是「不断用最新数据重训」7
  • 类别不平衡这一章没讲。 第 05 章提过它会让准确率骗人, 但重采样、加权损失这些对策,全书一个字都没有。
  • shuffle 窗口该开多大,只有一条经验规矩。 数据集大到开不下时怎么办, 书只说「必须做更严谨的分析」,没有给方法10
  • 数据增强只讲了图像。 文本、音频、时序数据怎么增强,书没讲 (只在练习里问了一句「前几章的数据集可以怎么增强」)22
  • 这一章的工具都是外部的。 Facets、Observable、Jupyter、Colab—— 书没有给出用 TensorFlow.js 自己做数据审计的办法,而这本书的定位本来是 JS 生态。
  • 偏见、安全、隐私只有一段。 书自己承认「仅凭本书的这一章,无法面面俱到」18

9. 可带走的

  1. 前八章所有的评估数字,都压在一个前提上:每个样例都是从同一个分布里独立抽出来的。 这个前提叫独立同分布,它一破,那些数字全部不作数;
  2. 「同分布」破了叫偏斜。 两个成因:抽样方式本身偏(只采工作日的路况), 或者采集过程中途变了(录到一半换了麦克风);
  3. 偏斜消不掉。 训练集永远来自过去,线上数据永远来自当下。 对策是不断用最新数据重训;
  4. 「独立」最常被排序破坏,而且往往是我们自己排的。 加州房价那份 CSV 按经度排好序,切前 80% 就训出一个只认海边的模型;
  5. 动手训练之前先画一张图:横轴是行号,纵轴是某个特征。 理想的数据集里,行号不该包含关于特征的任何信息;
  6. 打乱的窗口要比数据集还大。 17 000 行的数据,窗口 250 还看得见斜线,得开到 6000;
  7. 离群值有两种处理:过滤掉,或截断到合理区间—— 截断时最好再加一个「这条被截过」的新特征。推断时必须用同一套逻辑;
  8. 缺失值先分清为什么缺。 完全随机缺可以放心扔; 「因为它自己的值才缺」那一类(下雪就测不到太阳辐射)填什么都是错的; 最稳的做法是插值 + 加一个「这里原本缺了」的新特征;
  9. 查偏斜有个妙招:训一个模型去预测「这个样本来自哪个数据集」。 真同分布的话,这件事应该做不到;
  10. 数据增强能补数据,但产生不了新信息。 而且绝不能用在验证集和测试集上——推断时的输入是没增强过的。

10. 原文地图

主题原书章原文位置
绝大部分问题的症结是数据缺陷第 6 章text/18-ch06.txt:808(搜「模型不收敛」)
独立同分布这个前提第 6 章text/18-ch06.txt:816(搜「概率分布」)
偏斜的两个成因:抽样偏、采集过程变了第 6 章text/18-ch06.txt:818(搜「周一和周二」) · text/18-ch06.txt:820(搜「麦克风坏掉了」)
偏斜不可避免;对策是不断重训第 6 章text/18-ch06.txt:822(搜「不可避免」)
排序破坏独立性;我们自己爱排序第 6 章text/18-ch06.txt:824(搜「对数据的排序」)
加州房价的经度事故与绘图代码第 6 章text/18-ch06.txt:826(搜「加州周边房价」) · text/18-ch06.txt:826(搜「Plotly」) · text/18-ch06.txt:852(搜「两个完全不同的地理区域」)
「应该先看数据」第 6 章text/18-ch06.txt:852(搜「应该先看数据」)
打乱窗口 10 / 50 / 250 / 6000第 6 章text/18-ch06.txt:858(搜「大于整个数据集尺寸」) · text/18-ch06.txt:864(搜「windowSize」) · text/18-ch06.txt:868(搜「6000时」)
离群值:40~130 公斤、145000、截断、指示特征第 6 章text/18-ch06.txt:878(搜「145 000kg」) · text/18-ch06.txt:882(搜「MAX_WEIGHT」) · text/18-ch06.txt:884(搜「isOutlierWeight」)
NaN 会传播第 6 章text/18-ch06.txt:998(搜「传播得到处都是」)
缺失的三类:MCAR / MAR / MNAR第 6 章text/18-ch06.txt:894(搜「随机缺失」) · text/18-ch06.txt:900(搜「完全随机缺失」) · text/18-ch06.txt:906(搜「非随机缺失」)
四种补法第 6 章text/18-ch06.txt:914(搜「直接舍弃有数据缺失的样本」) · text/18-ch06.txt:920(搜「插值」) · text/18-ch06.txt:952(搜「标记值」) · text/18-ch06.txt:956(搜「最稳健」)
偏斜检测:统计量、预测来源、Facets第 6 章text/18-ch06.txt:972(搜「Facets」) · text/18-ch06.txt:976(搜「预测样本来自哪个数据集」)
字符串格式、不平衡特征、整数编码、尺度第 6 章text/18-ch06.txt:980(搜「FIREFOX」) · text/18-ch06.txt:986(搜「过于不平衡的数据」) · text/18-ch06.txt:988(搜「数值与分类特征在表示上的区别」) · text/18-ch06.txt:990(搜「特征在尺度上的区别」)
偏见、安全与隐私第 6 章text/18-ch06.txt:992(搜「Responsible AI Practices」)
数据增强:伪样例、猫图形变第 6 章text/18-ch06.txt:1006(搜「伪样例」) · text/18-ch06.txt:1008(搜「旋转、剪裁和缩放」)
增强产生不了新信息;可能造成偏斜第 6 章text/18-ch06.txt:1014(搜「重新混合现有的信息」)
不能用在验证集和测试集上第 6 章text/18-ch06.txt:1016(搜「不应该将它用于验证集或测试集」)

Footnotes

  1. 出处:「第 6 章」第 808 段(text/18-ch06.txt:808,搜「模型不收敛」)。原文说:最难缠的一种表现是「模型不但收敛了,而且在验证集和测试集上表现还不错,但在生产环境中的性能不尽如人意」。 2

  2. 出处:「第 6 章」第 826~830 段与代码清单 6-20(text/18-ch06.txt:826,搜「加州周边房价」;text/18-ch06.txt:826,搜「Plotly」)。数据集出自谷歌机器学习速成课程的加州房价数据。 2

  3. 出处:「第 6 章」第 852 段(text/18-ch06.txt:852,搜「应该先看数据」)。

  4. 出处:「第 6 章」第 816 段(text/18-ch06.txt:816,搜「概率分布」)。

  5. 出处:「第 6 章」第 818 段(text/18-ch06.txt:818,搜「周一和周二」)。

  6. 出处:「第 6 章」第 820 段(text/18-ch06.txt:820,搜「麦克风坏掉了」)。

  7. 出处:「第 6 章」第 822 段(text/18-ch06.txt:822,搜「不可避免」)。 2 3 4

  8. 出处:「第 6 章」第 824 段(text/18-ch06.txt:824,搜「对数据的排序」)。

  9. 出处:「第 6 章」第 860~870 段与图 6-4 说明(text/18-ch06.txt:864,搜「windowSize」;text/18-ch06.txt:868,搜「6000时」;text/18-ch06.txt:870,搜「即使窗口尺寸为250」)。 2

  10. 出处:「第 6 章」第 858 与 868 段(text/18-ch06.txt:858,搜「大于整个数据集尺寸」;text/18-ch06.txt:868,搜「更严谨的分析」)。 2 3

  11. 出处:「第 6 章」第 878 段(text/18-ch06.txt:878,搜「145 000kg」)。

  12. 出处:「第 6 章」脚注 12,第 998 段(text/18-ch06.txt:998,搜「传播得到处都是」)。

  13. 出处:「第 6 章」第 878~884 段(text/18-ch06.txt:878,搜「编写程序自动过滤」;text/18-ch06.txt:882,搜「MAX_WEIGHT」;text/18-ch06.txt:884,搜「isOutlierWeight」)。原文强调推断时必须用同一套离群值判断逻辑,否则会制造偏斜。

  14. 出处:「第 6 章」信息栏 6-3,第 892~910 段(text/18-ch06.txt:894,搜「随机缺失」;text/18-ch06.txt:900,搜「完全随机缺失」;text/18-ch06.txt:906,搜「非随机缺失」)。原文说数据科学家对「哪种场景适用哪种方法」持不同意见(text/18-ch06.txt:890,搜「持不同意见」)。 2

  15. 出处:「第 6 章」第 912~956 段(text/18-ch06.txt:914,搜「直接舍弃有数据缺失的样本」;text/18-ch06.txt:920,搜「插值」;text/18-ch06.txt:952,搜「标记值」;text/18-ch06.txt:956,搜「最稳健」)。「先转成标记值再做离群值截断」这条顺序要求见第 952 段。 2

  16. 出处:「第 6 章」第 972~976 段(text/18-ch06.txt:972,搜「Facets」;text/18-ch06.txt:976,搜「预测样本来自哪个数据集」)。

  17. 出处:「第 6 章」第 980~990 段(text/18-ch06.txt:980,搜「FIREFOX」;text/18-ch06.txt:986,搜「过于不平衡的数据」;text/18-ch06.txt:988,搜「数值与分类特征在表示上的区别」;text/18-ch06.txt:990,搜「特征在尺度上的区别」)。

  18. 出处:「第 6 章」第 992 段(text/18-ch06.txt:992,搜「Responsible AI Practices」)。 2

  19. 出处:「第 6 章」第 1004~1008 段(text/18-ch06.txt:1006,搜「伪样例」;text/18-ch06.txt:1008,搜「旋转、剪裁和缩放」)。

  20. 出处:「第 6 章」第 1014 段(text/18-ch06.txt:1014,搜「重新混合现有的信息」)。原文同段指出增强训练集可能和测试集分布不匹配,「二者究竟如何权衡,取决于具体的应用场景」。 2

  21. 出处:「第 6 章」第 1016 段(text/18-ch06.txt:1016,搜「不应该将它用于验证集或测试集」)。代码清单 6-24 的注释里又强调了一次(text/18-ch06.txt:1036,搜「不要对验证集使用数据增强」)。

  22. 出处:「第 6 章」练习(5),第 1053 段(text/18-ch06.txt:1053,搜「可以用哪些方法对它们进行数据增强」)。