谷歌机器学习课程笔记(8)——表示

机器学习模型不能直接看到、听到或感知输入样本。必须创建数据表示,为模型提供有用的信号来了解数据的关键特性。也就是说,为了训练模型,必须选择最能代表数据的特征集。

 

一、特征工程

 

将原始数据映射到特征

下图左侧表示来自输入数据源的原始数据,右侧表示特征矢量,也就是组成数据集中样本的浮点值集。 特征工程指的是将原始数据转换为特征矢量。进行特征工程预计需要大量时间。

机器学习模型通常期望样本表示为实数矢量。这种矢量的构建方法如下:为每个字段衍生特征,然后将它们全部连接到一起。

 

映射数值

机器学习模型根据浮点值进行训练,因此整数和浮点原始数据不需要特殊编码。

 

映射字符串值

模型无法通过字符串值学习规律,因此需要进行一些特征工程来将这些值转换为数字形式:

1、首先,为要表示的所有特征的字符串值定义一个词汇表

2、然后,使用该词汇表创建一个独热编码,用于将指定字符串值表示为二元矢量。在该矢量(与指定的字符串值对应)中:

  • 只有一个元素设为 1
  • 其他所有元素均设为 0

该矢量的长度等于词汇表中的元素数。

 

映射分类(枚举)值

分类特征具有一组离散的可能值。

机器学习模型通常将每个分类特征表示为单独的布尔值。

采用这种方法编码可以简化某个值可能属于多个分类这种情况。

 

二、良好特征的特点

 

避免很少使用的离散特征值

良好的特征值应该在数据集中出现大约 5 次以上。这样一来,模型就可以学习该特征值与标签是如何关联的。也就是说,大量离散值相同的样本可让模型有机会了解不同设置中的特征,从而判断何时可以对标签很好地做出预测。

相反,如果某个特征的值仅出现一次或者很少出现,则模型就无法根据该特征进行预测。

 

最好具有清晰明确的含义

每个特征对于项目中的任何人来说都应该具有清晰明确的含义。

 

不要将“魔术值”与实际数据混为一谈

良好的浮点特征不包含超出范围的异常断点或“魔术值”。

为解决魔术值的问题,需将该特征转换为两个特征:

  • 一个特征只存储普通值,不含魔术值。
  • 一个特征存储布尔值,表示是否为魔术值。

 

考虑上游不稳定性

特征的定义不应随时间发生变化。

收集由其他模型推理的值会产生额外成本,这类值在未来运行其他模型时可能轻易发生变化。

 

三、清理数据

 

机器学习工程师需要花费大量的时间挑出坏样本并加工可以挽救的样本。即使是非常少量的坏样本也会破坏掉一个大规模数据集。

 

缩放特征值

缩放是指将浮点特征值从自然范围(例如 100 到 900)转换为标准范围(例如 0 到 1 或 -1 到 +1)。如果某个特征集只包含一个特征,则缩放可以提供的实际好处微乎其微或根本没有。不过,如果特征集包含多个特征,则缩放特征可以带来以下优势:

  • 帮助梯度下降法更快速地收敛。
  • 帮助避免“NaN 陷阱”。在这种陷阱中,模型中的一个数值变成 NaN,并且模型中的所有其他数值最终也会因数学运算而变成 NaN。
  • 帮助模型为每个特征确定合适的权重。如果没有进行特征缩放,则模型会对范围较大的特征投入过多精力。

不需要对每个浮点特征进行完全相同的缩放。即使特征 A 的范围是 -1 到 +1,同时特征 B 的范围是 -3 到 +3,也不会产生什么恶劣的影响。不过,如果特征 B 的范围是 5000 到 100000,模型会出现糟糕的响应。

 

处理极端离群值

特征集的值大部分都会在某个范围之内,但是会有少量值会游离在这个范围之外,并且这些值有可能拥有较为极端的数值大小,这些值会对特征集产生不良影响。

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

对数缩放可稍稍缓解这种影响,但仍然存在离群值这个大尾巴。

另一个方法是只是简单地将特征集的最大值“限制”为某个任意值(比如 x),将特征值限制到 x 并不意味着我们会忽略所有大于 x 的值。而是说,所有大于 x 的值都将变成 x。这会导致特征集在 x 处产生一个小峰值。尽管存在这个小峰值,但是缩放后的特征集现在依然比原始数据有用。

 

分箱

在数据集中,某些值是浮点值。然而,这类值和特征之间不存在线性关系,因此在模型中将其表示为浮点特征没有意义。但是,这类值与特征仍有一定相关性。

为了将这类值变为一项实用的预测指标,我们对这类值进行分箱

分箱即是将值分成 N 类,然后用 N 个布尔值来表示,并将它们统一成一个 N 个元素的矢量。这样做之后,这个值即可用类似于如下表达方式来表示:[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]。

分箱之后,我们的模型现在可以为每个值学习完全不同的权重。

 

清查

在现实生活中,数据集中的很多样本是不可靠的,原因有以下一种或多种:

  • 遗漏值。 
  • 重复样本。 
  • 不良标签。
  • 不良特征值。 

一旦检测到存在这些问题,通常需要将相应样本从数据集中移除,从而“修正”不良样本。要检测遗漏值或重复样本,可以编写一个简单的程序。而检测不良特征值或标签可能会比较棘手。

除了检测各个不良样本之外,还必须检测集合中的不良数据。直方图是一种用于可视化集合中数据的很好机制。此外,收集如下统计信息也会有所帮助:

  • 最大值和最小值
  • 均值和中间值
  • 标准偏差

 

了解数据

遵循以下规则:

  • 记住预期的数据状态。
  • 确认数据是否满足这些预期(或者可以解释为何数据不满足预期)。
  • 仔细检查训练数据是否与其他来源的数据一致。

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

Pingbacks已关闭。

Trackbacks

评论已关闭