机器学习将数据拟合到数学模型中来获得结论或者做出预测。这些模型吸纳特征作为输入。特征就是原始数据某方面的数学表现。在机器学习流水线中特征位于数据和模型之间。特征工程是一项从数据中提取特征,然后转换成适合机器学习模型的格式的艺术。这是机器学习流水线关键的一步,因为正确的特征可以减轻建模的难度,并因此使流水线能输出更高质量的结果。从业者们认为构建机器学习流水线的绝大多数时间都花在特征工程和数据清洗上。然后,尽管它很重要,这个话题却很少单独讨论。也许是因为正确的特征只能在模型和数据的背景中定义。由于数据和模型如此多样化,所以很难概括项目中特征工程的实践。
尽管如此,特征工程不仅仅是一种临时实践。工作中有更深层的原则,最好就地进行说明。本书的每一章都针对一个数据问题:如何表示文本数据或图像数据,如何降低自动生成的特征的维度,何时以及如何规范化等等。把它看作是一个相互联系的短篇小说集,而不是一本长篇小说。每章都提供了大量现有特征工程技术的插图。它们一起阐明了总体原则。
掌握主题不仅仅是了解定义并能够推导出公式。仅仅知道这个机制是如何工作的以及它可以做什么是不够的。它还必须包括理解为什么要这样设计,它如何与其他技术相关联,以及每种方法的优缺点是什么。掌握就是要准确地知道如何完成某件事,对底层原则有一个感觉,并将其整合到我们已知的知识网络中。一个人通过读一本相关的书并不会成为某个东西的主人,尽管一本好书可以打开新的门。它必须涉及实践——将想法用于实践,这是一个反复的过程。随着每一次迭代,我们都会更好地了解这些想法,并在应用这些想法时变得越来越娴熟和富有创造性。本书的目标是促进其思想的应用。
本书首先尝试传授感觉,其次是数学。我们不是只讨论如何完成某些事情,而是试图引导发现原因。我们的目标是提供观点背后的感觉,以便读者了解如何以及何时应用它们。对于以不同方式学习的人们来说,有大量的描述和图片。提出数学公式是为了使感觉更加精确,并且还可以将本书与其他现有的知识结合起来。
本书中的代码示例在 Python 中给出,使用各种免费和开源软件包。NumPy 库提供数字向量和矩阵操作。Pandas 是一个强大的数据框架,是 Python 中数据科学的基石。Scikit-learn 是一个通用机器学习软件包,涵盖了广泛的模型和特征变换器。Matplotlib 和 Seaborn 的样式库提供了绘图和可视化。你可以在我们的 github 仓库中找到这些例子作为 Jupyter notebooks。
前几章开始较缓慢,为刚刚开始使用数据科学和机器学习的人们提供了一个桥梁。第 1 章从数字数据的基本特征工程开始:过滤,合并,缩放,日志转换和能量转换以及交互功能。第 2 章和第 3 章深入探讨了自然文本的特征工程:bag-of-words,n-gram 和短语检测。第 4 章将 tf-idf 作为特征缩放的例子,并讨论它的工作原理。围绕第 5 章讨论分类变量的高效编码技术,包括特征哈希和 bin-counting,步伐开始加速。当我们在第 6 章中进行主成分分析时,我们深入机器学习的领域。第 7 章将 k-means 看作一种特征化技术,它说明了模型堆叠的有效理论。第 8 章都是关于图像的,在特征提取方面比文本数据更具挑战性。在得出深度学习是最新图像特征提取技术的解释之前,我们着眼于两种手动特征提取技术 SIFT 和 HOG。我们在第 9 章中完成了一个端到端示例中的几种不同技术,为学术论文数据集创建了一个推荐器。
作者建议本书中的插图最好以彩色显示。真的,你应该在第 7 章中打印出彩色版本的“瑞士卷”,然后粘贴到你的书中。你的审美意识会感谢我们。
特征工程是一个广泛的话题,每天都在发明更多的方法,特别是在自动特征学习方面。为了将本书的范围限制在一个可管理的大小,我们不得不做一些削减。本书没有讨论音频数据的傅里叶分析,但它是一个与线性代数中的特征分析密切相关的美丽主题(我们在第 4 章和第 6 章中会介绍)。我们也忽略了与傅立叶分析密切相关的随机特征的讨论。我们通过对图像数据的深度学习来介绍特征学习,但不会深入到积极开发中的众多深度学习模型中。超出范围的还有先进的研究思路,如随机投影,复杂文本特征模型(如 word2vec 和 Brown 聚类)以及潜在空间模型(如潜在狄利克雷分析和矩阵分解)。如果这些话对你来说毫无意义,那么你很幸运。如果特征学习的前沿是你的兴趣所在,那么这可能不是为你准备的书。
本书假设掌握了基本机器学习概念的知识,例如“什么是模型”和“什么是矢量”。它并不要求掌握了数学或统计学。线性代数,概率分布和优化的经验是有帮助的,但不是必需的。
在深入研究特征工程之前,让我们花点时间看看整个机器学习流水线。这将帮助我们更好地了解应用的大方向。为此,让我们从数据和模型等基本概念入手。
我们所说的数据是对现实世界现象的观察。例如,股票市场数据可能涉及对每日股票价格的观察,个别公司的收益公告,甚至专家的意见文章。个人生物识别数据可以包括我们的心率,血糖,血压等的测量数据。客户情报数据包括诸如:“Alice 在周日买两本书”,“Bob 浏览网站上的这些页面”和“查理点击了上周的特别优惠链接”。我们可以在不同领域得到无数的数据例子。
我们为什么收集数据?因为数据可以帮助我们回答很多问题。这些问题可能是:“我应该投资哪些股票?”,“我怎么样才能活得更健康?”,或者“我如何理解顾客变化的口味,以便我的企业能够更好的服务他们?”。
从数据中获取答案的路途充满了谜题。最开始充满希望的方法可能行不通。最初只是一个预感却可能是最佳解决方案。数据的工作流程通常是一个多阶段的迭代过程。例如,股票价格是在交易所观察到的,由汤普森路透社等中间人汇总,存储在数据库中,由公司购买,在 Hadoop 集群中转换为 Hive 存储,通过脚本从商店中抽出,进行二次抽样,由另一个脚本处理和清理,转储为文件,转换为可以在 R,Python 或 Scala 中最喜欢的建模库中尝试的格式,将预测转储回 csv 文件,由评估程序分析,迭代多次,最后由生产团队用 C++ 或 Java 重写,运行所有数据,并将最终预测输出到另一个数据库。
然而,如果我们暂时忽略工具和系统的混乱,我们可能可以看到上述过程涉及到的两个数学实体,它们是机器学习的黄油和面包:模型和特征。
尝试着从数据中了解世界就像用不完整的拼图以及一堆额外的碎片拼凑出现实。这就是数学模型,特别是统计模型的由来。统计语言中包含许多频繁数据特征的概念:误差,冗余或者缺失。误差数据是测量中的错误导致的。冗余数据意味着数据的多个方面传达完全相同的信息。例如,星期几可以作为“星期一”,“星期二”,...“星期天”的分类变量存在,并且再次被包括为 0 到 6 之间的整数里。如果某些数据点中不存在这种星期几的信息,那么这个数据就产生了缺失。数据的数学模型描述数据不同方面的关系。举个例子。一个预测股票价格的模型可能是一个将公司收益历史、过去股票价格和行业映射到预测股票价格的公式。推荐音乐的模型可能考量了用户的相似处,然后给欣赏很多同样歌曲的用户推荐一样的艺术家。
数学公式将数量相互关联。但是原始数据通常不是数字。(“爱丽丝周三买了‘指环王’三部曲”的行为不是数字,她后来对这本书的评论也不是。)必须有一样东西把两者连接在一起。这就是特征的由来。
特征是原始数据的数学表示。有很多方法可以将原始数据转换为数学测量值,这也是为什么特征最终看起来与许多事情相似。自然的,特征必须来自可用数据的类型。可能它们与模型相关联的事实也没那么明显;一些模型更适合某些类型的特征,反之亦然。正确的特征应该与手头的任务相关并且容易被模型摄取。特征工程是指给定数据、模型和任务是制定最佳特征的过程。
特征的数量也是很重要的。如果没有足够的信息特征,模型就无法完成最终的任务。如果存在太多的特征,或者如果它们大多数是无关紧要的,那么训练这个模型会更加的棘手并且代价更多。在训练过程中可能会出现一些错误影响模型的表现。
特征和模型位于原始数据和期望的观察结果之间。在机器学习工作流程中,我们不仅挑选模型,还挑选特征。这是一个双节杆,一个选择会影响另一个。良好的特征使后续的建模步骤变得简单,并且所得到的模型能更容易实现所需的任务。糟糕的特征可能需要更复杂的模型才能达到相同的性能水平。在本书的其余部分中,我们将介绍不同类型的特征,并讨论它们对不同类型数据和模型的优缺点。不要犹豫,让我们开始吧!