提交 0dcde162 编写于 作者: W wizardforcel
......@@ -8,14 +8,11 @@
>
> **欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远**
* [在线阅读](http://fe4ml.apachecn.org)
* [ApacheCN 机器学习交流群 629470233](http://shang.qq.com/wpa/qunwpa?idkey=30e5f1123a79867570f665aa3a483ca404b1c3f77737bc01ec520ed5f078ddef)
* [ApacheCN 学习资源](http://www.apachecn.org/)
* [利用 Python 进行数据分析 第二版](https://github.com/apachecn/pyda-2e-zh)
<!-- break -->
+ [在线阅读](http://fe4ml.apachecn.org)
## 目录
+ [一、引言](docs/1.引言.md)
......@@ -29,27 +26,10 @@
+ 九、回到特征:将它们放到一起
+ [附录、线性模型和线性代数基础](docs/附录.线性模型和线性代数基础.md)
## 联系方式
### 负责人
## 负责人
* [@飞龙](https://github.com/wizardforcel): 562826179
### 贡献者
| 标题 | 译者 | 校对 |
| --- | --- | --- |
| 一、引言 | [@ZhipengYe](https://github.com/ZhipengYe) |
| 二、简单数字的奇特技巧 | [@coboe](https://github.com/coboe) | [@Ziseon Jiao](https://github.com/emengjzs) |
| 三、文本数据:展开、过滤和分块 | [@kkejili](https://github.com/kkejili) | [@HeYun](https://github.com/KyrieHee) |
| 四、特征缩放的效果:从词袋到 TF-IDF | [@gin](https://github.com/tirtile) | [@HeYun](https://github.com/KyrieHee) |
| 五、类别特征:机器鸡时代的鸡蛋计数 | [@ZhenLei Xu](https://github.com/HadXu) |
| 六、降维:使用 PCA 压缩数据集 | [@cn-Wziv](https://github.com/cn-Wziv) | [@HeYun](https://github.com/KyrieHee) |
| 七、非线性特征提取和模型堆叠 | [@friedhelm739](https://github.com/friedhelm739) |
| 八、自动化特征提取器:图像特征提取和深度学习 | [@friedhelm739](https://github.com/friedhelm739) |
| 九、回到特征:将它们放到一起 | |
| 附录、线性模型和线性代数基础 | [@Sherlock-kid](https://github.com/Sherlock-kid) |
## 免责声明
ApacheCN 纯粹出于学习目的与个人兴趣翻译本书,不追求任何经济利益。
......
# 一、引言
> 译者:[@ZhipengYe](https://github.com/ZhipengYe)
机器学习将数据拟合到数学模型中来获得结论或者做出预测。这些模型吸纳特征作为输入。特征就是原始数据某方面的数学表现。在机器学习流水线中特征位于数据和模型之间。特征工程是一项从数据中提取特征,然后转换成适合机器学习模型的格式的艺术。这是机器学习流水线关键的一步,因为正确的特征可以减轻建模的难度,并因此使流水线能输出更高质量的结果。从业者们认为构建机器学习流水线的绝大多数时间都花在特征工程和数据清洗上。然后,尽管它很重要,这个话题却很少单独讨论。也许是因为正确的特征只能在模型和数据的背景中定义。由于数据和模型如此多样化,所以很难概括项目中特征工程的实践。
尽管如此,特征工程不仅仅是一种临时实践。工作中有更深层的原则,最好就地进行说明。本书的每一章都针对一个数据问题:如何表示文本数据或图像数据,如何降低自动生成的特征的维度,何时以及如何规范化等等。把它看作是一个相互联系的短篇小说集,而不是一本长篇小说。每章都提供了大量现有特征工程技术的插图。它们一起阐明了总体原则。
......
# 二、简单数字的奇特技巧
> 译者:[@coboe](https://github.com/coboe)
>
> 校对者:[@ZiseonJiao](https://github.com/emengjzs)
在深入研究诸如文本和图像这样的复杂数据类型之前,让我们先从最简单的数字数据开始。它们可能来自各种来源:地理位置或人、购买的价格、传感器的测量、交通计数等。数字数据已经是数学模型容易消化的格式。这并不意味着不再需要特征工程。好的特征不仅代表数据的显著方面,而且符合模型的假设。因此,转换常常是必要的。数字特征工程技术是基础。当原始数据被转换为数字特征时,它们可以被应用。
数值数据的第一个健全检查是大小是否重要。我们只需要知道它是正面的还是负面的?或者我们只需要知道一个非常粗粒度的大小?这一明智的检查对于自动累积数尤其重要,比如统计,每天访问网站的次数,餐馆所获得的评论数量等等。
......
# 三、文本数据: 展开、过滤和分块
> 译者:[@kkejili](https://github.com/kkejili)
>
> 校对者:[@HeYun](https://github.com/KyrieHee)
如果让你来设计一个算法来分析以下段落,你会怎么做?
```
......
# 四、特征缩放的效果:从词袋到 TF-IDF
> 译者:[@gin](https://github.com/tirtile)
>
> 校对者:[@HeYun](https://github.com/KyrieHee)
字袋易于生成,但远非完美。假设我们平等的统计所有单词,有些不需要的词也会被强调。在第三章提过一个例子,Emma and the raven。我们希望在文档表示中能强调两个主要角色。示例中,“Eama”和“raven”都出现了3词,但是“the”的出现高达8次,“and”出现了次,另外“it”以及“was”也都出现了4词。仅仅通过简单的频率统计,两个主要角色并不突出。这是有问题的。
其他的像是“magnificently,” “gleamed,” “intimidated,” “tentatively,” 和“reigned,”这些辅助奠定段落基调的词也是很好的选择。它们表示情绪,这对数据科学家来说可能是非常有价值的信息。 所以,理想情况下,我们会倾向突出对有意义单词的表示。
......
# 五、类别特征:机器鸡时代的鸡蛋计数
> 译者:[@ZhenLeiXu](https://github.com/HadXu)
一个类别特征,见名思义,就是用来表达一种类别或标签。比如,一个类别特征能够表达世界上的主要城市,一年四季,或者说一个公司的产品(石油、路程、技术)。在真实世界的数据集中,类别值的数量总是无限的。同时这些值一般可以用数值来表示。但是,与其他数值变量不一样的是,类别特征的数值变量无法与其他数值变量进行比较大小。(作为行业类型,石油与旅行无法进行比较)它们被称之为非序的。
一个简单的问题可以作为测试是否应该是一个分类变量的试金石测试:“两个价值有多么不同,或者只是它们不同?”500美元的股票价格比100美元的价格高5倍。 所以股票价格应该用一个连续的数字变量表示。 另一方面,公司的产业(石油,旅游,技术等)应该无法被比较的,也就是类别特征。
......@@ -14,7 +16,7 @@
## One-hot 编码
将类别特征进行表示一个最好的办法就是使用一组比特位来表达。每一位代表一个可能的类别。 如果该变量不能一次成为多个类别,那么该组中只有一位可以是1。 这被称为热编码,它在Scikit Learn中实现[sklearn.preprocessing.OneHotEncoder](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html)。 每个位都是一个特征。 因此是一个绝对的具有k个可能类别的变量被编码为长度为k的特征向量。
将类别特征进行表示一个最好的办法就是使用一组比特位来表达。每一位代表一个可能的类别。 如果该变量不能一次成为多个类别,那么该组中只有一位可以是1。 这被称为热编码,它在Scikit Learn中实现[sklearn.preprocessing.OneHotEncoder](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html)。 每个位都是一个特征。 因此是一个绝对的具有k个可能类别的变量被编码为长度为k的特征向量。
表5-1 对3个城市的类别进行独热编码
......@@ -24,7 +26,7 @@
|New York|0|1|0|
|Seattle|0|0|1|
热编码非常易于理解。 但它使用的是比严格必要的更多的一点。 如果我们看到k-1位是零,那么最后一位必须是1,因为变量必须具有k个值中的一个。 在数学上,可以写下这个约束条件为“所有位的和必须等于1”。
热编码非常易于理解。 但它使用的是比严格必要的更多的一点。 如果我们看到k-1位是零,那么最后一位必须是1,因为变量必须具有k个值中的一个。 在数学上,可以写下这个约束条件为“所有位的和必须等于1”。
等式 5-1. 独热编码```e1,e2,e3```限制条件。
......@@ -34,7 +36,7 @@
## dummy编码
单热编码的问题是它允许k个自由度,其中变量本身只需要k-1。 虚拟编码通过仅使用表示中的k-1个特征来消除额外的自由度。 公共汽车下面有一个特征,由全零矢量表示。 这被称为参考类别。 虚拟编码和单热编码都是在Pandas中以[pandas.get_dummies](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html)的形式实现的。
独热编码的问题是它允许k个自由度,其中变量本身只需要k-1。 虚拟编码通过仅使用表示中的k-1个特征来消除额外的自由度。 公共汽车下面有一个特征,由全零矢量表示。 这被称为参考类别。 虚拟编码和独热编码都是在Pandas中以[pandas.get_dummies](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html)的形式实现的。
表5-2 对3个城市的类别进行dummy编码
......@@ -154,7 +156,7 @@ array([ 500., -1000.])
|Seattle|-1|-1|
Effect编码与虚拟编码非常相似,但是在线性回归中更容易被拟合。例子5-2表达了运行机理。截距项表示目标的全球平均值变量,单个系数表示各个类别的平均值与全球平均值有多少差异。 (这被称为类别或级别的主要效果,因此名称为“效果编码”。)热编码实际上具有相同的截距和系数,但在这种情况下,每个城市都有线性系数。 在效果编码中,没有单一特征代表参考类别。 因此,参考类别的影响需要分别计算为所有其他类别的系数的负和。(查看[what is effect coding?](https://stats.idre.ucla.edu))
Effect编码与虚拟编码非常相似,但是在线性回归中更容易被拟合。例子5-2表达了运行机理。截距项表示目标的全球平均值变量,单个系数表示各个类别的平均值与全球平均值有多少差异。 (这被称为类别或级别的主要效果,因此名称为“效果编码”。)热编码实际上具有相同的截距和系数,但在这种情况下,每个城市都有线性系数。 在效果编码中,没有单一特征代表参考类别。 因此,参考类别的影响需要分别计算为所有其他类别的系数的负和。(查看[what is effect coding?](https://stats.idre.ucla.edu))
例子5-2 Effect编码的线性回归
......@@ -182,9 +184,9 @@ array([ 666.66666667, -833.33333333])
类别变量的优点和缺点
单热,虚拟和效果编码非常相似。 他们每个人都有优点和缺点。 单热编码是多余的,它允许多个有效模型一样的问题。 非唯一性有时候对解释有问题。该优点是每个特征都明显对应于一个类别。 此外,失踪数据可以编码为全零矢量,输出应该是整体目标变量的平均值。
独热,虚拟和效果编码非常相似。 他们每个人都有优点和缺点。 独热编码是多余的,它允许多个有效模型一样的问题。 非唯一性有时候对解释有问题。该优点是每个特征都明显对应于一个类别。 此外,失踪数据可以编码为全零矢量,输出应该是整体目标变量的平均值。
虚拟编码和效果编码不是多余的。 他们产生独特和可解释的模型。 虚拟编码的缺点是它不能轻易处理缺少数据,因为全零矢量已经映射到参考类别。它还编码每个类别相对于参考类别的影响,其中看起来很奇怪。 效果编码通过使用不同的代码来避免此问题参考类别。 但是,所有-1的矢量都是一个密集的矢量,对于存储和计算来说都很昂贵。 因此,Pandas和Scikit Learn等流行的ML软件包选择了虚拟编码或热编码,而不是效应编码。当类别数量变得非常多时,所有三种编码技术都会失效大。 需要不同的策略来处理非常大的分类变量。
虚拟编码和效果编码不是多余的。 他们产生独特和可解释的模型。 虚拟编码的缺点是它不能轻易处理缺少数据,因为全零矢量已经映射到参考类别。它还编码每个类别相对于参考类别的影响,其中看起来很奇怪。 效果编码通过使用不同的代码来避免此问题参考类别。 但是,所有-1的矢量都是一个密集的矢量,对于存储和计算来说都很昂贵。 因此,Pandas和Scikit Learn等流行的ML软件包选择了虚拟编码或热编码,而不是效应编码。当类别数量变得非常多时,所有三种编码技术都会失效大。 需要不同的策略来处理非常大的分类变量。
## 处理大量的类别特征
......@@ -193,7 +195,7 @@ array([ 666.66666667, -833.33333333])
对于这种类别特征处理的方案有:
1. 对编码不做任何事情。 使用便宜的训练简单模型。 在许多机器上将热编码引入线性模型(逻辑回归或线性支持向量机)。
1. 对编码不做任何事情。 使用便宜的训练简单模型。 在许多机器上将热编码引入线性模型(逻辑回归或线性支持向量机)。
2. 压缩编码,有两种方式
a. 对特征进行哈希--在线性回归中特别常见
......@@ -324,7 +326,7 @@ bin-counting的想法非常简单:而不是使用分类变量作为特征,
Bin-counting假定历史数据可用于计算统计。 表5-6包含分类变量每个可能值的汇总历史计数。 根据用户点击任何广告的次数以及未点击的次数,我们可以计算用户“Alice”点击任何广告的概率。 同样,我们可以计算任何查询 - 广告 - 域组合的点击概率。 在训练时,每当我们看到“爱丽丝”时,都使用她的点击概率作为模型的输入特征。 QueryHash-AdDomain对也是如此,例如“0x437a45e1,qux.net”。
假设有10,000个用户。 热编码会生成一个稀疏矢量长度为10,000,在列中对应于值的单个1当前数据点。 Bin-counting将所有10,000个二进制列编码为一个功能的真实值介于0和1之间。
假设有10,000个用户。 热编码会生成一个稀疏矢量长度为10,000,在列中对应于值的单个1当前数据点。 Bin-counting将所有10,000个二进制列编码为一个功能的真实值介于0和1之间。
除了历史点击概率外,我们还可以包含其他功能:原始计数本身(点击次数和非点击次数),对数比率或任何其他概率的衍生物。 我们的例子是预测广告点击率,通过率。 但该技术很容易应用于一般的二元分类。 它也可以使用通常的技术容易地扩展到多级分类将二元分类器扩展到多个类,即通过一对多优势比或其他多类标签编码。
......@@ -355,7 +357,7 @@ Bin-counting假定历史数据可用于计算统计。 表5-6包含分类变量
![](/images/chapter5/5-6.jpg)
图5-3 分类变量的热编码与二进制计数统计的说明。
图5-3 分类变量的热编码与二进制计数统计的说明。
在实施方面,垃圾箱计数需要在每个类别之间存储地图及其相关计数。 (其余的统计数据可以从中得到原始计数)。因此它需要O(k)空间,其中k是唯一值的数量的分类变量。
......@@ -509,7 +511,7 @@ c357dbff 33
* 对于在线学习有困难
* 会有数据泄露
正如我们所看到的,没有任何方法是完美的。 选择使用哪一个取决于所需的型号。 线性模型比较便宜,因此可以进行训练处理非压缩表示,例如热编码。 基于树的模型,另一方面,需要反复搜索右侧分割的所有特征,并且是因此限于小型表示,如箱计数。 功能哈希处于在这两个极端之间,但是由此产生的精确度有不同的报道。
正如我们所看到的,没有任何方法是完美的。 选择使用哪一个取决于所需的型号。 线性模型比较便宜,因此可以进行训练处理非压缩表示,例如热编码。 基于树的模型,另一方面,需要反复搜索右侧分割的所有特征,并且是因此限于小型表示,如箱计数。 功能哈希处于在这两个极端之间,但是由此产生的精确度有不同的报道。
# 六、降维:用 PCA 压缩数据集
> 译者:[@cn-Wziv](https://github.com/cn-Wziv)
>
> 校对者:[@HeYun](https://github.com/KyrieHee)
通过自动数据收集和特征生成技术,可以快速获得大量特征,但并非所有这些都有用。在[第 3 章](https://www.safaribooksonline.com/library/view/feature-engineering-for/9781491953235/ch03.html#chap-basic-text)
[第 4 章](https://www.safaribooksonline.com/library/view/feature-engineering-for/9781491953235/ch04.html#chap-tfidf)中,我们讨论了基于频率的滤波和特征缩放修剪无信息的特征。现在我们来仔细讨论一下使用*主成分分析*(PCA)进行数据降维。
......
# 七、非线性特征提取和模型堆叠
> 译者:[@friedhelm739](https://github.com/friedhelm739)
当在数据一个线性子空间像扁平饼时 PCA 是非常有用的。但是如果数据形成更复杂的形状呢?一个平面(线性子空间)可以推广到一个 *流形* (非线性子空间),它可以被认为是一个被各种拉伸和滚动的表面。
如果线性子空间是平的纸张,那么卷起的纸张就是非线性流形的例子。你也可以叫它瑞士卷。(见图 7-1),一旦滚动,二维平面就会变为三维的。然而,它本质上仍是一个二维物体。换句话说,它具有低的内在维度,这是我们在“直觉”中已经接触到的一个概念。如果我们能以某种方式展开瑞士卷,我们就可以恢复到二维平面。这是非线性降维的目标,它假定流形比它所占据的全维更简单,并试图展开它。
......
# 八、自动化特征提取器:图像特征提取和深度学习
> 译者:[@friedhelm739](https://github.com/friedhelm739)
视觉和声音是人类固有的感觉输入。我们的大脑是可以迅速进化我们的能力来处理视觉和听觉信号的,一些系统甚至在出生前就对刺激做出反应。另一方面,语言技能是学习得来的。他们需要几个月或几年的时间来掌握。许多人天生就具有视力和听力的天赋,但是我们所有人都必须有意训练我们的大脑去理解和使用语言。
有趣的是,机器学习的情况是相反的。我们已经在文本分析应用方面取得了比图像或音频更多的进展。以搜索问题为例。人们在信息检索和文本检索方面已经取得了相当多年的成功,而图像和音频搜索仍在不断完善。在过去五年中,深度学习模式的突破最终预示着期待已久的图像和语音分析的革命。
......@@ -60,8 +62,8 @@ SIFT最初是为对象识别的任务而开发的,它不仅涉及将图像正
```python
import matplotlib.pyplot as plt
import numpy as np from skimage
import data, color
import numpy as np
from skimage import data, color
# Load the example image and turn it into grayscale
image = color.rgb2gray(data.chelsea())
......@@ -76,8 +78,10 @@ gx[:, -1] = 0
gx[:, 1:-1] = image[:, :-2] - image[:, 2:]
# Same deal for the vertical gradient
gy = np.empty(image.shape, dtype=np.double) gy[0, :] = 0
gy[-1, :] = 0 gy[1:-1, :] = image[:-2, :] - image[2:, :]
gy = np.empty(image.shape, dtype=np.double)
gy[0, :] = 0
gy[-1, :] = 0
gy[1:-1, :] = image[:-2, :] - image[2:, :]
# Matplotlib incantations
fig, (ax1, ax2, ax3) = plt.subplots(3, 1,figsize=(5, 9),sharex=True,sharey=True)
......
# 附录、线性模型和线性代数基
> 译者:[@Sherlock-kid](https://github.com/Sherlock-kid)
## 线性分类概述
当我们有一个已经标记的数据集时,特征空间散布着来自不同类别的数据点。分类器的工作是将不同类别的数据点分开。它可以通过生成一个数据点与另一个数据点非常不同的输出来实现。例如,当这里只有两个类别的时候,一个好的分类器应该为一个类别产生大量的输出,而另一个则为小的输出。作为一个类别而不是另一个类别的点就形成了一个决策平面。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册