表示 (Representation):清理数据

苹果树结出的果实兼具美味水果和虫害。 而高端杂货店里的苹果则是 100% 完美的水果。 在从果园到杂货店的过渡期,有人要花费大量时间移除坏苹果,或者在可以捡到的苹果上撒点蜡。作为机器学习工程师,您将花费大量时间来抛弃不良样本并清理掉可以挽救的样本。即使只有少数“坏苹果”也会破坏大型数据集。

缩放特征值

缩放是指将浮点特征值从自然范围(例如 100 到 900)转换为标准范围(例如 0 到 1 或 -1 到 +1)。如果某个特征集仅包含一个特征,则缩放几乎没有实际好处。但是,如果特征集由多个特征组成,则特征缩放可带来以下好处:

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

您不必对每个浮点特征执行完全相同的缩放。如果特征 A 的范围是 -1 到 +1,而特征 B 的范围是 -3 到 +3,则不会发生任何糟糕的情况。但是,如果特征 B 的范围是 5,000 到 100,000,则模型的响应会很糟糕。

处理极端离群值

下面的曲线图表示加利福尼亚州住房数据集中名为 roomsPerPerson 的地图项。roomsPerPerson 的值的计算方法是将某个区域的房间总数除以该区域的人口数量。该曲线图显示,加利福尼亚州的绝大部分地区每人一到两个房间。不过我们来看一下 x 轴。

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

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

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

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

图 5. 对数缩放仍然会留下尾巴。

对数缩放的效果稍好一些,但仍有一个离群值显著尾巴。我们选择另一种方法。如果我们只是简单地将 roomsPerPerson 的最大值“限制”或“裁剪”为任意值(如 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 处的房屋并不比 \(\frac{35}{34}\) 纬度 34 处的房屋贵(或不贵)高。然而,单独的纬度很可能能够很好地预测房屋价值。

为了让纬度成为有用的预测指标,我们将纬度划分为“分箱”,如下图所示:

每个纬度的房屋数曲线图。曲线图分为

图 8. 将值分箱。

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

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

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

刷洗

到目前为止,我们假定用于训练和测试的所有数据都是可信的。在现实生活中,数据集中的许多样本都是不可靠的,原因如下:

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

一旦检测到不良样本,您通常可以通过从数据集中移除不良样本来“修正”这些样本。要检测遗漏值或重复样本,您可以编写一个简单的程序。检测不良特征值或标签可能要困难得多。

除了检测各个不良样本之外,您还必须检测集合中的不良数据。直方图是一种直观呈现汇总数据的绝佳机制。此外,获取如下统计信息也会有所帮助:

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

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

了解你的数据

请遵循以下规则:

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

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

其他信息

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