表示法:清理数据

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

苹果树会带来各种美丽的水果和令人厌恶的混乱。 而高端杂货店的苹果则是 100% 完美的水果。 在果园和杂货店之间,有人会花费大量时间移除坏苹果,或在可回收的苹果上打一点蜡。作为一名机器学习工程师,您将花费大量时间来展示不良示例并清理可回收的示例。即使只有几个“不好的苹果”也会破坏大型数据集。

缩放特征值

缩放是指将浮点特征值从自然范围(例如 100 到 900)转换为标准范围(例如 0 到 1 或 -1 到 +1)。如果一个特征集仅包含一个特征,那么缩放几乎不会带来任何实际的好处。但是,如果一个特征集包含多个特征,则特征缩放具有以下优势:

  • 帮助梯度下降法更快地收敛。
  • 帮助避免“NaN 陷阱”。在这种陷阱中,模型中的一个数字变成 NaN(例如,当值在训练过程中超出浮点精度限制时),并且模型中的所有其他数字最终也会因数学运算而变成 NaN。
  • 帮助模型为每个特征学习适当的权重。 如果不进行特征缩放,模型将过于注意范围更广的特征。

您无需为每个浮点特征提供完全相同的缩放比例。如果特征 A 从 -1 缩放到 +1,而特征 B 从 -3 缩放到 +3,则不会发生任何糟糕的情况。不过,如果特征 B 的调节范围为 5000 到 100000,模型的响应效果会较差。

处理极端离群值

下面的图表显示了加利福尼亚州住房数据集中一项名为 roomsPerPerson 的地图项。roomsPerPerson 的值的计算方法是某个地区的房间总数除以该地区的人口总数。该曲线图表明,在加利福尼亚州的绝大部分地区,人均房间数为 1 或 2 个。请看 x 轴。

roomPerPerson 图表,其中几乎所有值都聚集在 0 到 4 之间,但有一个非常长的尾巴一直延伸到每人 55 个房间

图 4.一个非常短的尾巴。

我们如何才能最大限度地降低这些极端离群值的影响?一种方法是获取每个值的日志:

log(roomsPerPerson) 曲线图,其中 99% 的值都聚集在 0.4 到 1.8 之间,但还有一条长的尾巴延伸到 4.2 左右。

图 5. 对数缩放仍会产生一个尾巴。

对数缩放确实稍微优化了一点,但离群值仍存在明显的尾巴。让我们另选一种方式。如果我们只是将任意值的 roomsPerPerson 最大值设为“cap”或“clip”,比如 4.0,结果会怎样?

roomPerPerson 图表,其中所有值都介于 -0.3 和 4.0 之间。曲线图为钟形,但在 4.0 处有一个异常山丘

图 6. 将特征值裁剪到 4.0

将特征值裁剪到 4.0 并不意味着我们会忽略大于 4.0 的所有值。而是意味着所有大于 4.0 的值现在都会变成 4.0。这解释了 4.0 处的这个有趣的小山。尽管这个山丘仍然存在,但经过缩放的特征集现在比原始数据更有用。

分箱

下面的图表显示了加利福尼亚州不同纬度的房屋相对普及率。请注意聚类 - 洛杉矶大约在纬度 34 度,旧金山大约在纬度 38 度。

每个纬度的房屋数的图表。曲线图极其不规则,在纬度 36 左右出现低谷,在纬度 34 和 38 左右出现巨大的峰值。

图 7. 每个纬度的房屋数。

在数据集中,latitude 是一个浮点值。不过,在模型中将 latitude 表示为浮点特征没有意义。这是因为纬度值和住房值之间不存在线性关系。例如,纬度 35 度处的房屋并不比纬度 34 度处的房屋贵 \(\frac{35}{34}\) 贵(或者更便宜)。但是,各个纬度或许可以很好地预测房屋价值。

为了使纬度成为有用的预测器,让我们把纬度分成“箱”,如下图所示:

每个纬度的房屋数的图表。该图表会在整数纬度之间划分为“分箱”。

图 8. 将值分箱。

现在,我们没有 11 个浮点特征,而是有 11 个不同的布尔值特征(LatitudeBin1LatitudeBin2、...、LatitudeBin11)。有 11 个单独的特征不太方便,因此让我们将它们组合成一个包含 11 个元素的向量。这样,我们就可以表示纬度 37.4,如下所示:

[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

得益于分箱,我们的模型现在可以针对每个纬度学习完全不同的权重。

拖动

到目前为止,我们都假定用于训练和测试的所有数据都是可信的。在现实世界中,由于以下一个或多个原因,数据集中的许多示例都是不可靠的:

  • 省略的值。例如,有人忘记输入某个房子的年龄值。
  • 示例重复。例如,服务器错误地上传同一日志两次。
  • 标签有误。例如,有人错误地将一棵橡树的图片标记为枫树。
  • 特征值错误。例如,有人输入了额外的数字,或者温度计被遗落在太阳底下。

一旦检测到错误,您通常需要从数据集内移除错误的样本并对其进行“修正”。如需检测遗漏值或重复示例,您可以编写一个简单的程序。检测不良特征值或标签可能会比较棘手。

除了检测不良个体样本之外,您还必须检测聚合中的不良数据。直方图是一种很好的汇总数据可视化机制。此外,获取以下统计信息也会有所帮助:

  • 最大值和最小值
  • 平均值和中位数
  • 标准差

考虑为离散特征生成最常见的值列表。例如,country:uk 的样本数是否符合您的预期?language:jp 是否确实是数据集中最常见的语言?

了解您的数据

请遵循以下规则:

  • 请牢记您认为自己的数据应具有的样子。
  • 验证数据是否符合这些预期(或者您可以解释为何数据不满足预期)。
  • 仔细检查训练数据是否与其他来源(例如信息中心)一致。

请像处理任何任务关键型代码一样谨慎处理您的数据。良好的机器学习依赖于良好的数据。

其他信息

机器学习规则机器学习第二阶段:特征工程