特征工程(一)

简介: 机器学习流程在深入研究特征工程之前,让我们花点时间看看整个机器学习流水线。这将帮助我们更好地了解应用的大方向。为此,让我们从数据和模型等基本概念入手。 数据我们所说的数据是对现实世界现象的观察。例如,股票市场数据可能涉及对每日股票价格的观察,个别公司的收益公告,甚至专家的意见文章。

机器学习流程
在深入研究特征工程之前,让我们花点时间看看整个机器学习流水线。这将帮助我们更好地了解应用的大方向。为此,让我们从数据和模型等基本概念入手。

数据
我们所说的数据是对现实世界现象的观察。例如,股票市场数据可能涉及对每日股票价格的观察,个别公司的收益公告,甚至专家的意见文章。个人生物识别数据可以包括我们的心率,血糖,血压等的测量数据。客户情报数据包括诸如:“Alice 在周日买两本书”,“Bob 浏览网站上的这些页面”和“查理点击了上周的特别优惠链接”。我们可以在不同领域得到无数的数据例子。

任务
我们为什么收集数据?因为数据可以帮助我们回答很多问题。这些问题可能是:“我应该投资哪些股票?”,“我怎么样才能活得更健康?”,或者“我如何理解顾客变化的口味,以便我的企业能够更好的服务他们?”。

从数据中获取答案的路途充满了谜题。最开始充满希望的方法可能行不通。最初只是一个预感却可能是最佳解决方案。数据的工作流程通常是一个多阶段的迭代过程。例如,股票价格是在交易所观察到的,由汤普森路透社等中间人汇总,存储在数据库中,由公司购买,在 Hadoop 集群中转换为 Hive 存储,通过脚本从商店中抽出,进行二次抽样,由另一个脚本处理和清理,转储为文件,转换为可以在 R,Python 或 Scala 中最喜欢的建模库中尝试的格式,将预测转储回 csv 文件,由评估程序分析,迭代多次,最后由生产团队用 C++ 或 Java 重写,运行所有数据,并将最终预测输出到另一个数据库。

然而,如果我们暂时忽略工具和系统的混乱,我们可能可以看到上述过程涉及到的两个数学实体,它们是机器学习的黄油和面包:模型和特征。

模型
尝试着从数据中了解世界就像用不完整的拼图以及一堆额外的碎片拼凑出现实。这就是数学模型,特别是统计模型的由来。统计语言中包含许多频繁数据特征的概念:误差,冗余或者缺失。误差数据是测量中的错误导致的。冗余数据意味着数据的多个方面传达完全相同的信息。例如,星期几可以作为“星期一”,“星期二”,...“星期天”的分类变量存在,并且再次被包括为 0 到 6 之间的整数里。如果某些数据点中不存在这种星期几的信息,那么这个数据就产生了缺失。数据的数学模型描述数据不同方面的关系。举个例子。一个预测股票价格的模型可能是一个将公司收益历史、过去股票价格和行业映射到预测股票价格的公式。推荐音乐的模型可能考量了用户的相似处,然后给欣赏很多同样歌曲的用户推荐一样的艺术家。

数学公式将数量相互关联。但是原始数据通常不是数字。(“爱丽丝周三买了‘指环王’三部曲”的行为不是数字,她后来对这本书的评论也不是。)必须有一样东西把两者连接在一起。这就是特征的由来。

特征
特征是原始数据的数学表示。有很多方法可以将原始数据转换为数学测量值,这也是为什么特征最终看起来与许多事情相似。自然的,特征必须来自可用数据的类型。可能它们与模型相关联的事实也没那么明显;一些模型更适合某些类型的特征,反之亦然。正确的特征应该与手头的任务相关并且容易被模型摄取。特征工程是指给定数据、模型和任务是制定最佳特征的过程。

特征的数量也是很重要的。如果没有足够的信息特征,模型就无法完成最终的任务。如果存在太多的特征,或者如果它们大多数是无关紧要的,那么训练这个模型会更加的棘手并且代价更多。在训练过程中可能会出现一些错误影响模型的表现。

模型评估
特征和模型位于原始数据和期望的观察结果之间。在机器学习工作流程中,我们不仅挑选模型,还挑选特征。这是一个双节杆,一个选择会影响另一个。良好的特征使后续的建模步骤变得简单,并且所得到的模型能更容易实现所需的任务。糟糕的特征可能需要更复杂的模型才能达到相同的性能水平。在本书的其余部分中,我们将介绍不同类型的特征,并讨论它们对不同类型数据和模型的优缺点。

简单数字的奇特技巧

在深入研究诸如文本和图像这样的复杂数据类型之前,让我们先从最简单的数字数据开始。它们可能来自各种来源:地理位置或人、购买的价格、传感器的测量、交通计数等。数字数据已经是数学模型容易消化的格式。这并不意味着不再需要特征工程。好的特征不仅代表数据的显著方面,而且符合模型的假设。因此,转换常常是必要的。数字特征工程技术是基础。当原始数据被转换为数字特征时,它们可以被应用。

数值数据的第一个健全检查是大小是否重要。我们只需要知道它是正面的还是负面的?或者我们只需要知道一个非常粗粒度的大小?这一明智的检查对于自动累积数尤其重要,比如统计,每天访问网站的次数,餐馆所获得的评论数量等等。

接下来,考虑特征的规模。最大值和最小值是什么?它们跨越几个数量级吗?输入特性平滑的模型对输入的尺度敏感。例如,3x+ 1是输入X的简单线性函数,其输出的规模直接取决于输入的比例。其他例子包括k-均值聚类,最近邻居方法,RBF内核,以及使用欧几里得距离的任何东西。对于这些模型和建模组件,通常规范化特征以使输出保持在预期的规模上通常是一个好主意。

另一方面,逻辑函数对输入特征量表不敏感。无论输入是什么,它们的输出都是二进制的。例如,逻辑,并采取任何两个变量和输出1,当且仅当两个输入均为真。逻辑函数的另一个例子是阶跃函数“输入x大于5”。决策树模型由输入特征的阶跃函数组成。因此,基于空间划分树(决策树、梯度提升机、随机森林)的模型对尺度不敏感。唯一的例外是如果输入的规模随着时间的增长而增长,那么如果该特征是某种类型的累积计数。最终它将生长在树被训练的范围之外。如果可能是这样的话,那么就有必要周期性地重新调整输入。另一个解决方案是第5章讨论的bin计数方法。

考虑数值特征的分布也是很重要的。分布总结了承担特定价值的可能性。输入特征的分布对某些模型比其他模型更重要。例如,线性回归模型的训练过程假定预测误差分布得像高斯。这通常是好的,除非预测目标在几个数量级上扩散。在这种情况下,高斯误差假设可能不再成立。解决这一问题的一种方法是转变产出目标,以驯服规模的增长。(严格地说,这将是目标工程,而不是特征工程。)对数变换,这是一种功率变换,将变量的分布接近高斯。另一个解决方案是第5章讨论的bin计数方法。

除了裁剪模型或培训过程的假设, 多个功能可以组合成更复杂的功能。希望复杂的功能能够更简洁地捕捉原始数据中的重要信息。通过使输入功能更加 "雄辩", 模型本身可以更简单, 更容易进行培训和评估, 并做出更好的预测。作为一个极端的, 复杂的特点本身可能是统计模型的输出。这是一个称为模型堆叠的概念, 我们将在7章和8章中更详细地讨论。在本章中, 我们给出了复杂特征的最简单示例: 交互功能。

交互特征易于制定,但特征的组合导致更多的输入到模型中。为了减少计算开销,通常需要使用自动特征选择来修剪输入特征。

我们将从标量、向量和空间的基本概念开始,然后讨论尺度、分布、交互特征和特征选择。

标量、向量和空间
在我们开始之前, 我们需要定义一些基本概念, 这本书的其余部分。单个数字特征也称为标量。标量的有序列表称为向量。向量位于向量空间中。在绝大多数机器学习应用中, 对模型的输入通常表示为数字向量。本书的其余部分将讨论将原始数据转换为数字向量的最佳实践策略.

向量可以被可视化为空间中的一个点。(有时人们从原点到那一点画一条线和一个箭头。在这本书中,我们将主要使用这一点。例如,假设我们有一个二维向量v=[1,-1]。也就是说,向量包含两个数,在第一方向d1中,向量具有1的值,并且在第二方向d2中,它具有-1的值。我们可以在二维图中绘制v。

image
在数据世界中, 抽象向量及其特征维度具有实际意义。例如, 它可以代表一个人对歌曲的偏爱。每首歌都是一个特征, 其中1的值相当于大拇指向上,-1 个拇指向下。假设向量 v 表示一个听众 Bob 的喜好。Bob喜欢 Bob Dylan 的 “Blowin’ in the Wind” 和 Lady Gaga 的 "Poker Face"。其他人可能有不同的喜好。总的来说, 数据集合可以在特征空间中可视化为点云.

相反,一首歌可以由一组人的个人喜好来表示。假设只有两个听众,Alice 和 Bob。Alice 喜欢 Leonard Cohen 的 “Poker Face”, “Blowin’ in the Wind” 和 “Hallelujah”,但讨厌 Katy Perry 的 “Roar” 和 Radiohead 的 “Creep”。Bob 喜欢 “Roar", “Hallelujah”和“Blowin’ in the Wind”,但讨厌 “Poker Face” 和 “Creep” 。在听众的空间里,每一首歌都是一个点。就像我们可以在特征空间中可视化数据一样,我们可以在数据空间中可视化特征。图2-2显示了这个例子。

image
处理计数
在大数据时代,计数可以快速积累而不受约束。用户可以将歌曲或电影放在无限播放中,或者使用脚本反复检查流行节目的门票可用性,这会导致播放次数或网站访问计数迅速上升。当数据可以以高的体积和速度产生时,它们很可能包含一些极值。这是一个好主意,检查他们的规模,并确定是否保持它们作为原始数字,将它们转换成二进制变量,以指示存在,或将它们放入粗粒度。

二值化

Million Song 数据集中的用户品味画像包含了一百万个用户在 Echo Nest 的完整音乐聆听历史。下面是有关数据集的一些相关统计数据。

Echo Nest 品味画像数据集的统计

有超过4800万个用户ID、音乐ID和监听计数三元组。

完整的数据集包含1019318个独特用户和384546首独特歌曲。

引文:Echo Nest 品味画像的数据子集,官方的 Million Song 数据集的用户数据集,可从这里获得:http://labrosa.ee.columbia.edu/millionsong/tasteprofile

假设任务是建立一个推荐器向用户推荐歌曲。推荐器的一个组件可以预测用户将对一首特别的歌曲会有多少喜欢。由于数据包含实际的听歌次数,这应该是预测的目标吗?如果一个大的听计数意味着用户真的喜欢这首歌,反之亦然,那是正确的。然而,数据表明,虽然99%的听计数是24或更低,也有一些听计数数以千计,最大为9667。(如图2-3所示,直方图最接近于0的bin中的峰值。但是超过10000个三元组的计数更大,几千个则有几个。这些值异常大;如果我们试图预测实际的听计数,那么模型将被这些大的值拉离。
image
Histogram of listen counts in the user taste profile of the Million Song Dataset. Note that the y-axis is on a log scale.

在 Million Song 数据集中,原始监听计数不是用户口味的可靠度量。(在统计术语中,健壮性意味着该方法在各种各样的条件下工作。)用户有不同的听力习惯。有些人可能把他们最喜欢的歌曲放在无限的循环中,而其他人可能只在特殊的场合品尝它们。很难说听一首歌20次的人一定喜欢听10次的人的两倍。

用户偏好的更健壮表示是使计数二元化和修剪所有大于1的计数为1。换句话说,如果用户至少听过一首歌,那么我们将其视为用户喜欢歌曲。这样,模型不需要花费周期来预测原始计数之间的微小差异。二进制目标是用户偏好的简单而稳健的度量。

例子2-1。使 Million Song 数据集中听歌计数二进制化。

image

这是我们设计模型目标变量的一个例子。严格地说, 目标不是一个特征, 因为它不是输入。但有时我们确实需要修改目标以解决正确的问题。

量化或装箱

对于本练习, 我们从第 6 轮 Yelp 数据集挑战中采集数据, 并创建一个更小的分类数据集。Yelp 数据集包含用户对来自北美和欧洲十个城市的企业的评论。每个商户都标记为零个或多个类别。以下是有关数据集的相关统计信息。

关于第 6 轮 Yelp 数据集的统计

有782种商户类别。

完整的数据集包含 1569264 个(约1.6M)评论和 61184 个(61K)商户。

“餐厅”(990627个评论)和“夜生活”(210028个评论)是最流行的类别,评论计数是明智的。

没有一个商户同时属于餐厅和夜生活分类。因此,这两组评论之间没有重叠。

每个商户都有一个评论计数。假设我们的任务是使用协同过滤来预测用户可能给企业的评级。评论计数可能是一个有用的输入特征,因为通常在流行和良好的评级之间有很强的相关性。现在的问题是,我们应该使用原始评论计数或进一步处理它吗?图2-4显示了所有商户评论计数的直方图。我们看到和音乐听歌计数一样的模式。大部分的统计数字都很小,但一些企业有成千上万的评论。

例子2-2。在YELP数据集中可视化商户评论计数。
image
image
Histogram of business review counts in the Yelp reviews dataset. The y-axis is on a log-scale.

对于许多模型来说,跨越数个数量级的原始计数是有问题的。在线性模型中,相同的线性系数必须对计数的所有可能值工作。大量的计数也可能破坏无监督学习方法,如k-均值聚类,它使用相似性函数来测量数据点之间的相似性。k-均值使用数据点之间的欧几里得距离。数据向量的一个元素中的大计数将超过所有其他元素中的相似性,这可能会丢弃整个相似性度量。

一种解决方案是通过量化计数来包含标量。换句话说,我们将计数分组到容器中,并且去掉实际的计数值。量化将连续数映射成离散数。我们可以把离散化的数字看作是代表强度度量的容器的有序的序列。

为了量化数据,我们必须决定每一个箱子应该有多宽。解决方案分为固定宽度或自适应两种类型。我们将给出每个类型的例子。

固定宽度装箱
对于固定宽度装箱, 每个 bin 都包含一个特定的数值范围。范围可以是定制设计或自动分割, 它们可以线性缩放或指数缩放。例如, 我们可以将一个人的年龄分组为十年: 0-9 岁归纳到bin 1, 10-19 年归纳到 bin 2 等。要从计数映射到 bin, 只需除以 bin 的宽度并取整部分。

也经常看到定制设计的年龄范围更适合于生活的阶段:

0-12 岁

12-17 岁

18-24 岁

25-34 岁

35-44 岁

45-54 岁

55-64 岁

65-74 岁

75 岁以上

当数字跨越多个数量级时,最好用10个幂(或任何常数的幂)来分组:0-9、10-99、100-999、100-9999等。容器宽度呈指数增长,从O(10)、O(100)到O(1000)和以上。要从计数映射到bin,取计数的log值。指数宽度的划分与对数变换非常相关,我们在“对数变换”中讨论。

例子2-3。用固定宽度的箱进行量化计数
image
分位数装箱
固定宽度装箱很容易计算。但是如果计数有很大的差距, 那么将会有许多空的垃圾箱没有数据。该问题可以通过基于数据分布的垃圾箱自适应定位来解决。这可以使用分发的分位数来完成。

分位数是将数据划分为相等部分的值。例如, 中位数将数据分成一半;一半的数据是较小的, 一半大于中位数。分位数把数据分成几个部分, 十分位数把数据划分成十份。示例2-4 演示如何计算 Yelp 商户评论数的十等分, 图2-5 覆盖直方图上的十等分。这就更清楚地说明了对更小的计数的歪斜。

例子 2-4。计算 Yelp 商户评论数的十分位数
image
image
Deciles of the review counts in the Yelp reviews dataset. Note that both x- and y-axes are in log scale.

为了计算分位数和映射数据到分位数箱,我们可以使用 Pandas 库。 pandas.DataFrame.quantile 和 pandas.Series.quantile 用于计算分位数。pandas.qcut将数据映射到所需数量的分位数。

例子2-5。按分位数分箱计数。

image
对数转换
在“量化或装箱”中,我们简要地介绍了把计数的对数映射到指数宽度箱的概念。让我们现在再看一看。
image
image

The log function compresses the high numeric range and expands the low range. Note how the horizontal x values from 100 to 1000 got compressed into just 2.0 to 3.0 in the vertical y range, while the tiny horizontal portion of x values less than 100 are mapped to the rest of the vertical range.

对数变换是处理具有重尾分布的正数的有力工具。(重尾分布在尾部范围内的概率比高斯分布的概率大)。它将分布在高端的长尾压缩成较短的尾部,并将低端扩展成较长的头部。图2-7比较d对数转换之前和之后的YELP商户评论计数的直方图。Y轴现在都在正常(线性)尺度上。在(0.5,1)范围内的底部图中增加的仓间隔是由于在1和10之间只有10个可能的整数计数。请注意,原始审查计数非常集中在低计数区域,离群值在4000以上。对数变换后,直方图不集中在低端,更分散在X轴上。
例子2-6。可视化对数变换前后评论数分布
image
image
Comparison of Yelp business review counts before (top) and after (bottom) log transformation.

另一个例子是来自 UC Irvine 机器学习库的在线新闻流行数据集。以下是有关数据集的相关统计信息。

在线新闻流行数据集的统计
该数据集包括 MasHabor 在两年的时间内出版的 39797 个新闻文章的60个特征。

引证: K. Fernandes, P. Vinagre 和 P. Cortez . 一种用于预测在线新闻的流行程度的主动智能决策支持系统。2015 第十七届 EPIA 活动, 葡萄牙人工智能会议论文集, 9月, 葡萄牙科英布拉。

目的是利用这些特征来预测文章在社交媒体上的用分享数量表示的流行度。在本例中, 我们将只关注一个特征——文章中的单词数。图2-8 显示了对数转换前后特征的直方图。请注意, 在对数转换后, 分布看起来更高斯, 除了长度为零的文章 (无内容) 的断裂。

例子2-7。可视化在有对数变换和没有对数变换时新闻文章流行度的分布。
image
image

Comparison of word counts in Mashable news articles before (top) and after (bottom) log transformation.

对数转换实战
让我们看看在监督学习中对数转换如何执行。我们将使用上面的两个数据集。对于 Yelp 评论数据集, 我们将使用评论的数量来预测商户的平均评级。对于 Mashable 的新闻文章, 我们将使用文章中的字数来预测其流行程度。由于输出是连续的数字, 我们将使用简单的线性回归作为模型。我们在没有对数变换和有对数变换的特色上,使用 Scikit Learn 执行10折交叉验证的线性回归。模型由 R 方评分来评估, 它测量训练后的回归模型预测新数据的良好程度。好的模型有较高的 R 方分数。一个完美的模型得到最高分1。分数可以是负的, 一个坏的模型可以得到一个任意低的负评分。通过交叉验证, 我们不仅得到了分数的估计, 还获得了方差, 这有助于我们判断两种模型之间的差异是否有意义。

例子2-8。使用对数转换 YELP 评论数预测平均商户评级
image
从实验的结果来看, 两个简单的模型 (有对数变换和没有对数变换) 在预测目标时同样不好, 而有对数变换的特征表现略差。真令人失望!这并不奇怪, 他们都不是很好, 因为他们都只使用一个功能。但是, 人们本来希望日志转换的功能执行得更好。

让我们看看对数转换在线新闻流行数据集上如何表现。

例子2-9。利用经过对数转换在线新闻数据中的词数量预测文章流行度
置信区间仍然重叠,但具有对数变换特征的模型比没有对数变换的表现更好。为什么对数转换在这个数据集上更成功?我们可以通过观察输入特征和目标值的散点图来得到线索。如图2-9的底部面板所示,对数变换重塑了X轴,将目标值(大于200000个份额)中的大离群值进一步拉向轴的右手侧。这给线性模型在输入特征空间的低端更多的“呼吸空间”。没有对数转换(上部面板),在输入值变化下非常小的情况下,模型有更大的压力下适应非常不同的目标值。

示例2-10。可视化新闻流程度预测问题中输入输出相关性。

image
image
Scatter plot of number of words (input) vs. number of shares (target) in the Online News dataset. The top plot visualizes the original feature, and the bottom plot shows the scatter plot after log transformation.

将此与应用于YELP评论数据集的相同散点图进行比较。图2-10看起来与图2-9非常不同。在1到5,步长0.5的区间,平均星级是离散的。高评论计数(大致>2500评论)与较高的平均星级评级相关。但这种关系远不是线性的。没有一种清晰的方法可以根据输入来预测平均星级。从本质上讲,该图表明,评论数及其对数都是平均星级的不良线性预测因子。

例2-11。可视化 Yelp 商户评论预测中输入与输出的相关性。
image
Scatter plot of review counts (input) vs. average star ratings (target) in the Yelp Reviews dataset. The top panel plots the original review count, and the bottom panel plots the review count after log transformation.

数据可视化的重要性
对数变换在两个不同数据集上的影响的比较,说明了可视化数据的重要性。在这里,我们故意保持输入和目标变量简单,以便我们可以很容易地可视化它们之间的关系。如图2-10所示的曲线,立即显示所选择的模型(线性)不可能代表所选择的输入和目标之间的关系。另一方面,人们可以令人信服地在给定平均星级模拟评论数的分布。在建立模型时,最好直观地检查输入和输出之间的关系,以及不同输入特征之间的关系。

功率变换:对数变换的推广

image
image

A rough illustration of the Poisson distribution. λ represents the mean of the distribution. As λ increases, not only does the mode of of the distribution shift to the right, but the mass spreads out and the variance becomes larger. The Poisson distribution is an example distribution where the variance increases along with the mean.
image
Box-Cox transforms for different values of λ.

只有当数据为正值时, Box-Cox 公式才能工作。对于非正数据, 可以通过加上固定常量来移动数值。当应用 Box-Cox 变换或更一般的功率变换时, 我们必须确定参数 λ 的值。这可能是通过最大似然(找到的λ,使产生的变换信号的高斯似然最大) 或贝叶斯方法。完全介绍 Box-Cox 和一般功率变换的使用超出了本书的范围。感兴趣的读者可以通过 Jack Johnston 和John DiNardo (McGraw Hill) 编写的Econometric Methods 找到更多关于幂转换的信息。幸运的是, Scipy 的数据包包含了一个 Box-Cox 转换的实现, 其中包括查找最佳变换参数。

例子2-12。Yelp商户评论数的 Box-Cox 变换。
image
提供了原始和转换评论数分布的可视化比较。

例2-13。可视化评论数的原始、对数转换和 Box-Cox 转换的直方图。
image
image
Box-Cox transformation of Yelp business review counts.

概率图是一种直观地比较数据分布与理论分布的简单方法。这本质上是观察到散点图的与理论分位数。图2-14显示YELP评论数的原始数据和转换后数据相对正态分布的概率图。由于观测数据是严格正的,高斯可以是负的,所以分位数在负端上永远不会匹配。所以我们关注的是正数这的一边。在这方面,原始评论数明显比正常分布更重尾。(有序值上升到4000,而理论位数仅延伸到4)。简单的对数变换和最优的 Box-Cox 变换都使正尾部接近正态分布。最优的 Box-Cox 变换比对数变换更缩小尾部,由于尾部在红色对角线等值线下平展可以明显看出。

例子 2-14。原始和变换后的数据相对正态分布的概率图。
image
image

Comparing the distribution of raw and transformed review counts against the Normal distribution.

特征缩放或归一化
某些特征的值有界的,如纬度或经度。其他数值特征 (如数量) 可能会在无界的情况下增加。那些关于输入是平滑函数的模型, 如线性回归、逻辑回归或任何涉及矩阵的东西, 都受输入的数值范围影响。另一方面, 基于树的模型不太在意这个。如果你的模型对输入特征的数值范围敏感, 则特征缩放可能会有所帮助。顾名思义, 特征缩放会更改特征值的数值范围。有时人们也称它为特征规范化。功能缩放通常分别针对单个特征进行。有几种常见的缩放操作, 每个类型都产生不同的特征值分布。

Min-max缩放
设X是一个单独的特征值(即,在某些数据点中的一个特征值),以及 min(x) 和 max(x) ,分别是整个数据集上该特征的最小值和最大值。Min-max缩放压缩(或拉伸)所有特征值到[0, 1 ]的范围内。图2-15演示了这个概念。最小最大尺度的公式是
image
减去特征 (所有数据点) 的平均值并除以方差。因此, 它也可以称为方差缩放。缩放后的特征的平均值为0, 方差为1。如果原始特征具有高斯分布, 则缩放特征为标准高斯。图2-16 包含了标准化的说明。
image

Illustration of feature standardization

不要中心化稀疏数据
最小最大缩放和标准化都从原始特征值中减去一个数量。对于最小最大缩放, 移动量是当前特征的所有值中最小的。对于标准化, 移动的量是平均值。如果移动量不是零, 则这两种转换可以将稀疏特征(大部分值为零)的向量转换为一个稠密的向量。这反过来会给分类器带来巨大的计算负担, 取决于它是如何实现的。词袋是一种稀疏表示, 大多数分类库都对稀疏输入进行优化。如果现在的表示形式包含了文档中没有出现的每个单词, 那就太可怕了。请谨慎对稀疏特征执行最小最大缩放和标准化操作。

L2 normalization
这项技术通过所谓的 L2 范数 (也称为欧几里德范数) 正常化 (划分) 原始特征值。
image
Illustration of L2 feature normalization

数据空间与特征空间
请注意,图2-17中的说明是在数据空间中,而不是特征空间。还可以对数据点进行L2归一化,而不是特征,这将导致具有单位范数(范数为1)的数据向量。不管缩放方法如何,特征缩放总是将特征除以常数(也称为归一化常数)。因此,它不会改变单特征分布的形状。我们将用在线新闻文章标记计数来说明这一点。

例子 2-15。特征缩放示例。
image
我们也可以可视化用不同的特征缩放方法后的数据的分布。如图2-18所示,与对数变换不同,特征缩放不会改变分布的形状;只有数据的规模发生变化。

例2-16。绘制原始数据和缩放数据的直方图。
image
image
Original and scaled news article word counts. Note that only the scale of the x-axis changes; the shape of the distribution stays the same with feature scaling.

在一组输入特征在比例上差异很大的情况下,特征缩放非常有用。例如,一个流行的电子商务网站的每日访问者数量可能是十万,而实际销售额可能是几千。如果这两种功能都投入到模型中,那么该模型需要在确定要做什么的同时平衡它们的规模。输入特征的极大变化会导致模型训练算法的数值稳定性问题。在这些情况下,标准化功能是个好主意。第4章将详细介绍处理自然文本时的特征缩放,包括使用示例。

交互特征
简单的成对交互特征是两个特征的积。类似逻辑与。它以成对条件表示结果:“购买来自邮政编码98121”和“用户的年龄在18到35之间”。这一点对基于决策树的模型没有影响,但发交互特征对广义线性模型通常很有帮助。

image
这使我们能够捕获特征之间的相互影响,因此它们被称为交互特征。如果x1和x2是二元的,那么它们的积 x1x2 是逻辑函数 x1 AND x2 假设问题是根据他或她的个人资料信息预测客户的偏好。在这种情况下,交互特征不是仅基于用户的年龄或位置进行预测,而交互特征允许模型基于具有特定年龄和特定位置的用户进行预测。

在例2-17中,我们使用 UCI 在线新闻数据集中的成对交互特征来预测每篇新闻文章的分享数量。交互特征导致精度超过单身特征。两者都比例2-9表现得更好,它使用文章正文中单词数的单个预测器(有或没有经过对数变换)。

例子 2--17。用于预测的交互特征示例。
image
构造交互特征非常简单,但它们使用起来很昂贵。使用成对交互特征的线性模型的训练和得分时间将从O(n)到O(n2),其中n是单身特征的数量。

围绕高阶交互特征的计算成本有几种方法。可以在所有交互特征之上执行特征选择,选择前几个。或者,可以更仔细地制作更少数量的复杂特征。两种策略都有其优点和缺点。特征选择采用计算手段来选择问题的最佳特征。(这种技术不限于交互特征。)一些特征选择技术仍然需要训练多个具有大量特征的模型。

手工制作的复杂特征可以具有足够的表现力,所以只需要少量这些特征,这可以缩短模型的训练时间。但是特征本身的计算可能很昂贵,这增加了模型评分阶段的计算成本。手工制作(或机器学习)的复杂特征的好例子可以在第8章有关图像特征中找到。现在让我们看看一些特征选择技巧。

特征选择
特征选择技术会删除非有用的特征,以降低最终模型的复杂性。最终目标是快速计算的简约模型,预测准确性降低很小或不会降低。为了得到这样的模型,一些特征选择技术需要训练多个候选模型。换句话说,特征选择并不是减少训练时间,实际上有些技巧增加了整体训练时间,但是减少了模型评分时间。

粗略地说,特征选择技术分为三类。

Filtering(过滤): 预处理可以删除那些不太可能对模型有用的特征。例如,可以计算每个特征与响应变量之间的相关或相互信息,并筛除相关信息或相互信息低于阈值的特征。第3章讨论了文本特征的过滤技术的例子。过滤比下面的包装(wrapper)技术便宜得多,但是他们没有考虑到正在使用的模型。因此他们可能无法为模型选择正确的特征。最好先保守地进行预过滤,以免在进行模型训练步骤之前无意中消除有用的特征。

Wrapper methods(包装方法):这些技术是昂贵的,但它们允许您尝试特征子集,这意味着你不会意外删除自身无法提供信息但在组合使用时非常有用的特征。包装方法将模型视为提供特征子集质量分数的黑盒子。shi一个独立的方法迭代地改进子集。

Embedded methods(嵌入式方法):嵌入式方法执行特征选择作为模型训练过程的一部分。 例如,决策树固有地执行特征选择,因为它在每个训练步骤选择一个要在其上进行树分裂的特征。另一个例子L1正则,它可以添加到任何线性模型的训练目标中。L1鼓励模型使用一些特征而不是许多特征。因此它也被称为模型的稀疏约束。嵌入式方法将特征选择作为模型训练过程的一部分。它们不如包装方法那么强大,但也远不如包装方法那么昂贵。与过滤相比,嵌入式方法会选择特定于模型的特征。从这个意义上讲,嵌入式方法在计算费用和结果质量之间取得平衡。

特征选择的全面处理超出了本书的范围。有兴趣的读者可以参考 Isabelle Guyon 和 André Elisseeff 撰写的调查报告“变量和特征选择介绍”(“An Introduction to Variable and Feature Selection”)。

总结
本章讨论了许多常见的数字特征工程技术:量化,缩放(又称规范化),对数变换(一种功率变换),交互特征以及处理大量交互特征所需的特征选择技术的简要总结。在统计机器学习中,所有数据最终归结为数字特征。因此,所有道路最终都会指向某种数字特征工程技术。
原文发布时间为:2018-12-14
本文作者: 机器学习AI算法工程
本文来自云栖社区合作伙伴“ 机器学习AI算法工程”,了解相关信息可以关注“datayx”微信公众号

相关文章
|
1月前
|
机器学习/深度学习 数据采集 传感器
【机器学习】特征工程之特征选择
【机器学习】特征工程之特征选择
40 2
|
2月前
|
数据采集 机器学习/深度学习 Python
掌握XGBoost:特征工程与数据预处理
掌握XGBoost:特征工程与数据预处理
93 3
|
4月前
|
机器学习/深度学习 数据采集 算法
特征工程
特征工程是指对原始数据进行转换和提取,以创建新的特征,使得机器学习算法能够更好地理解和预测数据。特征工程是机器学习中非常重要的一个步骤,它能够改善模型的性能,提高模型的准确性和鲁棒性。
57 2
|
7月前
|
机器学习/深度学习 自然语言处理 算法
机器学习特征工程和特征提取
机器学习特征工程和特征提取
68 0
|
10月前
|
机器学习/深度学习 数据采集 算法
机器学习中的特征工程
介绍机器学习中的特征工程的相关概念
105 1
|
10月前
|
机器学习/深度学习 数据采集 数据处理
数据预处理与特征工程:提升机器学习模型性能
在机器学习领域,数据预处理和特征工程是构建强大、准确的模型的关键步骤。这些步骤的正确实施可以显著提高模型的性能和鲁棒性。本文将探讨数据预处理和特征工程的重要性,以及一些常用的技术和策略,帮助您在构建机器学习模型时取得更好的结果。
229 0
|
11月前
|
机器学习/深度学习
如何进行特征选择|机器学习
如何进行特征选择|机器学习
|
11月前
|
数据采集 机器学习/深度学习 Python
机器学习 - 数据预处理中的 特征离散化 方法
在数据分析中,我们认为在某个范围内取值过于密集的特征认为是取值”连续“的特征。出于某些需求经常需要将这些”连续特征进行离散化“。本文介绍三种比较实用的数据离散化方法。 本文介绍可供参考的三种特征离散化方法的Python实现。
190 1
|
机器学习/深度学习
一、特征工程
常用的特征工程方式?
98 0
一、特征工程
|
机器学习/深度学习 算法 数据库
特征工程系列之自动化特征提取器
特征工程系列之自动化特征提取器
特征工程系列之自动化特征提取器