1.1 为何选择机器学习
在“智能”应用的早期,许多系统使用人为制订的“if”和“else”决策规则来处理数据,或根据用户输入的内容进行调整。想象有一个垃圾邮件过滤器,其任务是酌情将收到的某些邮件移动到垃圾邮件文件夹。你可以创建一个关键词黑名单,所有包含这些关键词的邮件都会被标记为垃圾邮件。这是用专家设计的规则体系来设计“智能”应用的一个示例。人为制订的决策规则对某些应用来说是可行的,特别是人们对其模型处理过程非常熟悉的应用。但是,人为制订决策规则主要有两个缺点。
· 做决策所需要的逻辑只适用于单一领域和单项任务。任务哪怕稍有变化,都可能需要重写整个系统。
· 想要制订规则,需要对人类专家的决策过程有很深刻的理解。
这种人为制订规则的方法并不适用的一个例子就是图像中的人脸检测。如今,每台智能手机都能够检测到图像中的人脸。但直到2001年,人脸检测问题才得到解决。其主要问题在于,计算机“感知”像素(像素组成了计算机中的图像)的方式与人类感知面部的方式有非常大的不同。正是由于这种表征差异,人类想要制订出一套好的规则来描述数字图像中的人脸构成,基本上是不可能的。
但有了机器学习算法,仅向程序输入海量人脸图像,就足以让算法确定识别人脸需要哪些特征。
1.1.1 机器学习能够解决的问题
最成功的机器学习算法是能够将决策过程自动化的那些算法,这些决策过程是从已知示例中泛化得出的。在这种叫作监督学习(supervised learning)的方法中,用户将成对的输入和预期输出提供给算法,算法会找到一种方法,根据给定输入给出预期输出。尤其是在没有人类帮助的情况下,给定前所未见的输入,算法也能够给出相应的输出。回到前面垃圾邮件分类的例子,利用机器学习算法,用户为算法提供大量电子邮件(作为输入),以及这些邮件是否为垃圾邮件的信息(作为预期输出)。给定一封新邮件,算法就能够预测它是否为垃圾邮件。
从输入/输出对中进行学习的机器学习算法叫作监督学习算法(supervised learning algorithm),因为每个用于算法学习的样例都对应一个预期输出,好像有一个“老师”在监督着算法。虽然创建一个包含输入和输出的数据集往往费时又费力,但监督学习算法很好理解,其性能也易于测量。如果你的应用可以表示成一个监督学习问题,并且你能够创建包含预期输出的数据集,那么机器学习很可能可以解决你的问题。
监督机器学习任务的示例如下。
识别信封上手写的邮政编码
这里的输入是扫描的手写数字,预期输出是邮政编码中的实际数字。想要创建用于构建机器学习模型的数据集,你需要收集许多信封。然后你可以自己阅读邮政编码,将数字保存为预期输出。
基于医学影像判断肿瘤是否为良性
这里的输入是影像,输出是肿瘤是否为良性。想要创建用于构建模型的数据集,你需要一个医学影像数据库。你还需要咨询专家的意见,因此医生需要查看所有影像,然后判断哪些肿瘤是良性的,哪些不是良性的。除了影像内容之外,甚至可能还需要做额外的诊断来判断影像中的肿瘤是否为癌变。
检测信用卡交易中的诈骗行为
这里的输入是信用卡交易记录,输出是该交易记录是否可能为诈骗。假设你是信用卡的发行单位,收集数据集意味着需要保存所有的交易,并记录用户是否上报过任何诈骗交易。在这些例子中需要注意一个有趣的现象,就是虽然输入和输出看起来相当简单,但三个例子中的数据收集过程却大不相同。阅读信封虽然很辛苦,却非常简单,也不用花多少钱。与之相反,获取医学影像和诊断不仅需要昂贵的设备,还需要稀有又昂贵的专家知识,更不要说伦理问题和隐私问题了。在检测信用卡诈骗的例子中,收集数据要容易得多。你的顾客会上报诈骗行为,从而为你提供预期输出。要获取所有欺诈行为和非欺诈行为的输入/输出对,你只需等待即可。
本书会讲到的另一类算法是无监督学习算法(unsupervised learning algorithm)。在无监督学习中,只有输入数据是已知的,没有为算法提供输出数据。虽然这种算法有许多成功的应用,但理解和评估这些算法往往更加困难。
无监督学习的示例如下。
确定一系列博客文章的主题
如果你有许多文本数据,可能想对其进行汇总,并找到其中共同的主题。事先你可能并不知道都有哪些主题,或者可能有多少个主题。所以输出是未知的。
将客户分成具有相似偏好的群组
给定一组客户记录,你可能想要找出哪些客户比较相似,并判断能否根据相似偏好对这些客户进行分组。对于一家购物网站来说,客户分组可能是“父母”“书虫”或“游戏玩家”。由于你事先并不知道可能有哪些分组,甚至不知道有多少组,所以并不知道输出是什么。
检测网站的异常访问模式
想要识别网站的滥用或bug,找到异常的访问模式往往是很有用的。每种异常访问模式都互不相同,而且你可能没有任何记录在案的异常行为示例。在这个例子中你只是观察流量,并不知道什么是正常访问行为和异常访问行为,所以这是一个无监督学习问题。
无论是监督学习任务还是无监督学习任务,将输入数据表征为计算机可以理解的形式都是十分重要的。通常来说,将数据想象成表格是很有用的。你想要处理的每一个数据点(每一封电子邮件、每一名客户、每一次交易)对应表格中的一行,描述该数据点的每一项属性(比如客户年龄、交易金额或交易地点)对应表格中的一列。你可能会从年龄、性别、账号创建时间、在你的购物网站上的购买频率等方面来描述用户。你可能会用每一个像素的灰度值来描述肿瘤图像,也可能利用肿瘤的大小、形状和颜色进行描述。
在机器学习中,这里的每个实体或每一行被称为一个样本(sample)或数据点,而每一列(用来描述这些实体的属性)则被称为特征(feature)。
本书后面会更详细地介绍如何构建良好的数据表征,这被称为特征提取(feature extraction)或特征工程(feature engineering)。但你应该记住,如果没有数据信息的话,所有机器学习算法都无法做出预测。举个例子,如果你只有病人的姓氏这一个特征,那么任何算法都无法预测其性别。这一信息并未包含在数据中。如果你添加另一个特征,里面包含病人的名字,那么你预测正确的可能性就会变大,因为通过一个人的名字往往可以判断其性别。
1.1.2 熟悉任务和数据
在机器学习过程中,最重要的部分很可能是理解你正在处理的数据,以及这些数据与你想要解决的任务之间的关系。随机选择一个算法并将你的数据输入进去,这种做法是不会有什么用的。在开始构建模型之前,你需要理解数据集的内容。每一种算法的输入数据类型和最适合解决的问题都是不一样的。在构建机器学习解决方案的过程中,你应该给出下列问题的答案,或者至少要将这些问题记在脑中。
· 我想要回答的问题是什么?已经收集到的数据能够回答这个问题吗?
· 要将我的问题表示成机器学习问题,用哪种方法最好?
· 我收集的数据是否足够表达我想要解决的问题?
· 我提取了数据的哪些特征?这些特征能否实现正确的预测?
· 如何衡量应用是否成功?
· 机器学习解决方案与我的研究或商业产品中的其他部分是如何相互影响的?
从更大的层面来看,机器学习算法和方法只是解决特定问题的过程中的一部分,一定要始终牢记整个项目的大局。许多人浪费大量时间构建复杂的机器学习解决方案,最终却发现没有解决正确的问题。
当深入研究机器学习的技术细节时(本书会讲到这些细节),很容易忽视最终目标。我们虽然不会详细讨论上面列出的问题,但仍然鼓励你记住自己在开始构建机器学习模型时做出的假设,无论是明确的还是隐含的假设。