1.3 特征工程是什么
终于说到本书的主题了。
是的,本书的主题是特征工程。我们将着眼于清洗和组织数据的过程,为机器学习流水线服务。除了这些概念,我们还会介绍如何用数学公式和神经理解的方式看待数据转换,但是现在暂时不涉及。让我们从概念开始入手吧。
特征工程(feature engineering)是这样一个过程:将数据转换为能更好地表示潜在问题的特征,从而提高机器学习性能。
为了进一步理解这个定义,我们看看特征工程具体包含什么。
❏ 转换数据的过程:注意这里并不特指原始数据或未过滤的数据,等等。特征工程适用于任何阶段的数据。通常,我们要将特征工程技术应用于在数据分发者眼中已经处理过的数据。还有很重要的一点是,我们要处理的数据经常是表格形式的。数据会被组织成行(观察值)和列(属性)。有时我们从最原始的数据形式开始入手,例如之前服务器日志的例子,但是大部分时间,要处理的数据都已经在一定程度上被清洗和组织过了。
❏ 特征:显而易见,这个词在本书中会很常用。从最基本的层面来说,特征是对机器学习过程有意义的数据属性。我们经常需要查看表格,确定哪些列是特征,哪些只是普通的属性。
❏ 更好地表示潜在问题:我们要使用的数据一定代表了某个领域的某个问题。我们要保证,在处理数据时,不能一叶障目不见泰山。转换数据的目的是要更好地表达更大的问题。
❏ 提高机器学习性能:特征工程是数据科学流程的一部分。如我们所见,这个步骤很重要,而且经常被低估。特征工程的最终目的是让我们获取更好的数据,以便学习算法从中挖掘模式,取得更好的效果。本书稍后将详细讨论机器学习的指标和效果,但是现在我们要知道的是,执行特征工程不仅是要获得更干净的数据,而且最终要在机器学习流水线中使用这些数据。
你一定在想:为什么我应该花时间阅读一本大家都不喜欢的事情的书?我们觉得,很多人之所以不喜欢特征工程,是因为他们常常看不到这些工作的益处。
大部分公司会同时招聘数据工程师和机器学习工程师。数据工程师主要关注准备和转换数据,而机器学习工程师一般拥有算法知识,知道如何从清洗好的数据中挖掘出模式来。
这两种工作一般是分开的,但是会交织在一起循环进行。数据工程师把数据集交给机器学习工程师,机器学习工程师则会说结果不好,让数据工程师进一步转换数据,反反复复。这种过程不仅单调重复,而且影响大局。
如果工程师不具备特征工程和机器学习两方面的知识,则整个流程很有可能不会那么有效。因此本书应运而生。我们会讨论特征工程,以及特征工程和机器学习如何直接相关。这个方法是以结果为导向的,我们认为,只有能提高机器学习效果的技术才是有用的技术。现在我们来深入了解数据、数据结构和机器学习的基础知识,以确保术语的统一性。
数据和机器学习的基础知识
一般来说,我们处理的数据都是表格形式的,按行列组织。可以将其想象成能在电子表格程序(例如Microsoft Excel)中打开。数据的每行又称为观察值(observation),代表问题的一个实例或例子。例如,如果数据是关于股票日内交易的,那么每个观察值有可能是一小时内整体股市和股价的涨跌。
又例如,如果数据是关于网络安全的,那么观察值也许是可能的黑客攻击,或者是无线网络发送的一个数据包。
下表是网络安全领域的示例数据,确切地说是网络入侵领域。
可以看到,每行(每个观察值)都是一次网络连接,有4个属性:DateTime(日期)、Protocol(协议)、Urgent(紧急)和Malicious(恶意)。我们暂时不深入研究每个属性,先观察以表格形式给出的数据结构。
因为大部分数据都是表格形式的,也可以看看一种特殊的实例:数据只有一列(一个属性)。例如,我们要开发一个软件,输入房间的一张图像,它会输出房间中是否有人。输入的数据矩阵有可能只有一列——房间照片的链接(URL),别的什么都没有。
例如,下面的表格中只有一列,列标题是“照片URL”。表格中数据的值(这些URL仅为示例,并不指向真的图片)对数据科学家而言具有相关性。
输入的数据有可能只有一列,像这个例子一样。在创建图像分析系统时,输入有可能仅仅是图像的URL。作为数据科学家,我们要从这些URL中构建特征。
数据科学家要准备好接受并处理多或少、宽或窄(从特征上讲)、完整或稀疏(可能有缺失值)的数据,并准备好在机器学习中应用这些数据。现在是时候讨论机器学习了。机器学习算法是按其从数据中提取并利用模式、以基于历史训练数据完成任务的能力来定义的。是不是摸不到头脑?机器学习可以处理很多类型的任务,因此我们不给出定义,而是继续深入探讨。
大体上,我们把机器学习分为两类:监督学习和无监督学习。两种算法都可以从特征工程中获益,所以了解每种类型非常重要。
1.监督学习
一般来说,我们都是在监督学习(也叫预测分析)的特定上下文中提到特征工程。监督学习算法专门处理预测一个值的任务,通常是用数据中的其他属性来预测余下的一个属性。以如下表示网络入侵的数据集为例。
还是前文用到的数据集,这次我们在预测分析的上下文中深入探讨。
注意,数据集有4个属性:DateTime、Protocol、Urgent和Malicious。假设Malicious属性包含代表该观测值是否为恶意入侵的值。所以在这个小数据集中,第1次、第2次和第4次连接都是恶意入侵。
进一步假设,在这个数据集中,我们要尝试用3个属性(DateTime、Protocol和Urgent)准确预测Malicious属性。简单地说,我们想建立一个系统,将DateTime、Protocol和Urgent属性的值映射到Malicious的值。监督学习问题就是这样建立起来的:
Network_features = pd.DataFrame({'datetime': ['6/2/2018', '6/2/2018', '6/2/2018', '6/3/2018'], 'protocol': ['tcp', 'http', 'http', 'http'], 'urgent': [False, True, True, False]}) Network_response = pd.Series([True, True, False, True]) Network_features >>
datetime protocol urgent 0 6/2/2018 tcp False 1 6/2/2018 http True 2 6/2/2018 http True 3 6/3/2018 http False Network_response >> 0 True 1 True 2 False 3 True dtype: bool
在监督学习中,我们一般将数据集中希望预测的属性(一般只有一个,但也不尽然)叫作响应(response),其余属性叫作特征(feature)。
也可以认为,监督学习是一种利用数据结构的算法。我们的意思是,机器学习算法会试图从很漂亮整洁的数据中提取模式。但是之前我们讨论过,不应该想当然地认为进入流水线的数据都是干净的:特征工程由此而来。
你可能会问:如果我们不做预测,机器学习又有什么用呢?问得好。在机器学习可以利用数据结构之前,我们有时需要调整乃至创造结构。无监督学习在这里大放异彩。
2.无监督学习
监督学习的目的是预测。我们利用数据的特征对响应进行预测,提供有用的信息。如果不是要通过探索结构进行预测,那就是想从数据中提取结构。要做到后者,一般对数据的数值矩阵或迭代过程应用数学变换,提取新的特征。
这个概念有可能比监督学习更难理解,我们在此提供一个例子来阐明。
•无监督学习的例子:市场细分
假如我们的数据集很大(有100万行),每行是一个人的基本特征(年龄、性别等)以及购买商品的数量(代表从某个店铺购买的商品数)。
这是营销数据集的一个样本,每行代表一个顾客,每人有3个基本属性。我们的目标是将这个数据集细分成不同的类型或聚类,让执行分析的公司更好地理解客户资料。
这里只显示了100万行数据的前8行,全部数据令人望而生畏。我们当然可以对该数据集进行基本的描述性统计分析,例如计算所有数值列的均值和标准差等。不过,如果想把100万人划分为不同的类型,方便市场部门更好地理解不同的消费人群、为每类人更精准地投放广告呢?
每种类型的顾客都有独一无二的特征。例如,有可能20%的顾客属于年轻富裕阶层,他们的年龄较小、买的商品数量较多。
此类分析和类型的创建属于无监督学习的一个特殊类别,称作聚类,后文中将详细讨论这种机器学习算法。目前我们知道,聚类会创造一个新的特征,将顾客划分到不同类型或聚类中。
以上是应用聚类算法后的数据集。注意在最后有一个新的聚类特征,表示这个算法认为此人属于哪个类型。我们的想法是,同一类型的人行为相似(年龄、性别和购买行为等相仿)。也许聚类6可以叫作年轻消费者。
这个聚类的例子显示,我们不一定需要输出预测值,可以只是深入了解数据,添加有价值的新特征,甚至删除不相关的特征。
注意,这里将所有的列都称为特征,因为无监督学习没有响应,我们没有做预测。
现在是不是清楚一些了?我们反复讨论的特征就是本书的重点。特征工程包括理解并转换监督学习和无监督学习中的特征。