对数缩放可稍稍缓解这种影响,但仍然存在离群值这个大尾巴。我们来采用另一种方法。如果我们只是简单地将 roomsPerPerson 的最大值“限制”为某个任意值(比如 4.0),会发生什么情况呢?
图 6. 将特征值限制到 4.0
将特征值限制到 4.0 并不意味着我们会忽略所有大于 4.0 的值。而是说,所有大于 4.0 的值都将变成 4.0。这就解释了 4.0 处的那个有趣的小峰值。尽管存在这个小峰值,但是缩放后的特征集现在依然比原始数据有用。
分箱
下面的曲线图显示了加利福尼亚州不同纬度的房屋相对普及率。注意集群 - 洛杉矶大致在纬度 34 处,旧金山大致在纬度 38 处。
图 7. 每个纬度的房屋数
在数据集中,latitude 是一个浮点值。不过,在我们的模型中将 latitude 表示为浮点特征没有意义。这是因为纬度和房屋价值之间不存在线性关系。例如,纬度 35 处的房屋并不比纬度 34 处的房屋贵 35/34(或更便宜)。但是,纬度或许能很好地预测房屋价值。为了将纬度变为一项实用的预测指标,我们对纬度“分箱”,如下图所示:
图 8. 分箱值
我们现在拥有 11 个不同的布尔值特征(LatitudeBin1、LatitudeBin2、…、LatitudeBin11)
,而不是一个浮点特征。拥有 11 个不同的特征有点不方便,因此我们将它们统一成一个 11 元素矢量。这样做之后,我们可以将纬度 37.4 表示为:[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
分箱之后,我们的模型现在可以为每个纬度学习完全不同的权重。
为了简单起见,我们在纬度样本中使用整数作为分箱边界。如果我们需要更精细的解决方案,我们可以每隔 1/10 个纬度拆分一次分箱边界。添加更多箱可让模型从纬度 37.4 处学习和维度 37.5 处不一样的行为,但前提是每 1/10 个纬度均有充足的样本可供学习。
另一种方法是按分位数分箱,这种方法可以确保每个桶内的样本数量是相等的。按分位数分箱完全无需担心离群值。
清查
截至目前,我们假定用于训练和测试的所有数据都是值得信赖的。在现实生活中,数据集中的很多样本是不可靠的,原因有以下一种或多种:
- 缺失值。例如,有人忘记为某个房屋的年龄输入值。
- 重复样本。例如,服务器错误地将同一条记录上传了两次。
- 不良标签。例如,有人错误地将一颗橡树的图片标记为枫树。
- 不良特征值。例如,有人输入了多余的位数,或者温度计被遗落在太阳底下。
一旦检测到存在这些问题,你通常需要将相应样本从数据集中移除,从而“修正”不良样本。要检测缺失值或重复样本,你可以编写一个简单的程序。检测不良特征值或标签可能会比较棘手。
除了检测各个不良样本之外,你还必须检测集合中的不良数据。直方图是一种用于可视化集合中数据的很好机制。此外,收集如下统计信息也会有所帮助:
- 最大值和最小值
- 均值和中间值
- 标准偏差 考虑生成离散特征的最常见值列表。例如,
country:uk
的样本数是否符合你的预期?language:jp
是否真的应该作为你数据集中的最常用语言?
了解数据
遵循以下规则:
- 记住你预期的数据状态。
- 确认数据是否满足这些预期(或者你可以解释为何数据不满足预期)。
- 仔细检查训练数据是否与其他来源(例如信息中心)的数据一致。
像处理任何任务关键型代码一样谨慎处理你的数据。良好的机器学习依赖于良好的数据。
特征组合:对非线性规律进行编码
在图 9 和图 10 中,我们做出如下假设:
- 蓝点代表生病的树。
- 橙点代表健康的树。
图 9. 这是线性问题吗?
你可以画一条线将生病的树与健康的树清晰地分开吗?当然可以。这是个线性问题。这条线并不完美。有一两棵生病的树可能位于“健康”一侧,但你画的这条线可以很好地做出预测。
现在,我们来看看下图:
图 10. 这是线性问题吗?
你可以画一条直线将生病的树与健康的树清晰地分开吗?不,你做不到。这是个非线性问题。你画的任何一条线都不能很好地预测树的健康状况。
图 11. 一条线无法分开两类数据
要想解决图 10 所示的非线性问题,可以创建一个特征组合。特征组合是指通过将两个或多个输入特征相乘来对特征空间中的非线性规律进行编码的合成特征。“cross”(组合)这一术语来自 cross product
(向量积)。我们通过将x1与 x2组合来创建一个名为 x3的特征组合:
我们像处理任何其他特征一样来处理这个新建的x3特征组合。线性公式变为:
线性算法可以算出 w3的权重,就像算出 w1 和 w2 的权重一样。换言之,虽然 w3 表示非线性信息,但你不需要改变线性模型的训练方式来确定 w3的值。
特征组合的种类
我们可以创建很多不同种类的特征组合。例如:
- [A X B]:将两个特征的值相乘形成的特征组合。
- [A x B x C x D x E]:将五个特征的值相乘形成的特征组合。
- [A x A]:对单个特征的值求平方形成的特征组合。
通过采用随机梯度下降法,可以有效地训练线性模型。因此,在使用扩展的线性模型时辅以特征组合一直都是训练大规模数据集的有效方法。
特征组合:组合独热矢量
到目前为止,我们已经重点介绍了如何对两个单独的浮点特征进行特征组合。在实践中,机器学习模型很少会组合连续特征。不过,机器学习模型却经常组合独热特征矢量,将独热特征矢量的特征组合视为逻辑连接。例如,假设我们具有以下两个特征:国家/地区和语言。对每个特征进行独热编码会生成具有二元特征的矢量,这些二元特征可解读为 country=USA, country=France 或 language=English, language=Spanish
。然后,如果你对这些独热编码进行特征组合,则会得到可解读为逻辑连接的二元特征,如下所示:
country:usa AND language:spanish
再举一个例子,假设你对纬度和经度进行分箱,获得单独的 5 元素特征矢量。例如,指定的纬度和经度可以表示如下:
- binned_latitude = [0, 0, 0, 1, 0]
- binned_longitude = [0, 1, 0, 0, 0]
假设你对这两个特征矢量创建了特征组合:
- binned_latitude X binned_longitude
此特征组合是一个 25 元素独热矢量(24 个 0 和 1 个 1)。该组合中的单个 1 表示纬度与经度的特定连接。然后,你的模型就可以了解到有关这种连接的特定关联性。
假设我们更粗略地对纬度和经度进行分箱,如下所示:
binned_latitude(lat) = [ 0 < lat <= 10 10 < lat <= 20 20 < lat <= 30 ] binned_longitude(lon) = [ 0 < lon <= 15 15 < lon <= 30 ] 针对这些粗略分箱创建特征组合会生成具有以下含义的合成特征:
binned_latitude_X_longitude(lat, lon) = [ 0 < lat <= 10 AND 0 < lon <= 15 0 < lat <= 10 AND 15 < lon <= 30 10 < lat <= 20 AND 0 < lon <= 15 10 < lat <= 20 AND 15 < lon <= 30 20 < lat <= 30 AND 0 < lon <= 15 20 < lat <= 30 AND 15 < lon <= 30 ]
现在,假设我们的模型需要根据以下两个特征来预测狗主人对狗狗的满意程度:
- 行为类型behavior type(吠叫、啜泣、依偎等)
- 时段time of day
如果我们根据这两个特征构建以下特征组合:
[behavior type X time of day]
我们最终获得的预测能力将远远超过任一特征单独的预测能力。例如,如果狗狗在下午 5 点主人下班回来时(快乐地)叫喊,可能表示对主人满意度的正面预测结果。如果狗狗在凌晨 3 点主人熟睡时(也许痛苦地)哀叫,可能表示对主人满意度的强烈负面预测结果。
线性学习器可以很好地扩展到大量数据。对大规模数据集使用特征组合是学习高度复杂模型的一种有效策略。神经网络可提供另一种策略。