2.2 理解机器学习的工作流程
如前所述,机器学习就是通过建立数学模型来理解数据。当我们赋予机器学习模型调整其内部参数的能力时,学习就进入了这个过程;我们可以调整这些参数,以使模型更好地解释数据。在某种意义上,这可以理解为模型从数据中学习。一旦模型掌握了足够多的知识——不管这意味着什么——我们可以要求模型解释新观测到的数据。
一个典型的分类过程,如图2-1所示。
图2-1 一个典型的分类过程
让我们一步一步分解吧!
首先,需要注意的是,总是把机器学习问题分成(至少)两个不同的阶段:
- 训练阶段:在这个阶段,我们的目标是在一组数据(我们称为训练数据集)上训练一个机器学习模型。
- 测试阶段:在这个阶段,我们在一组新的、从未见过的数据上(我们称为测试数据集)评估学习到(或最终确定)的机器学习模型。
将数据分解成训练集和测试集的重要性不容小觑。我们总是在一个独立的测试集上评估我们的模型,因为我们感兴趣的是我们的模型对新数据的泛化能力。最后,无论是机器学习还是人类学习——这难道不是学习的全部意义吗?回忆一下你在学校的时候,那时你还是个学生:在家庭作业中解决的问题,在期末考试中几乎不会以完全相同的形式出现。这同样也应该适用于机器学习模型;我们对模型记忆一组数据点的能力不太感兴趣(比如一道家庭作业题),但是我们想知道模型如何利用所学的知识来解决新问题(比如在期末考试中出现的试题)并解释新的数据点。
注意
通常,高级机器学习问题的工作流程包括一个称为验证数据集的第三组数据。目前,这种区分并不重要。通常通过进一步划分训练集形成一个验证集。验证集用于模型选择等高级概念,当我们熟练地构建机器学习系统时,我们将讨论验证集(见第11章)。
接下来要注意的是:机器学习实际上是关于数据的。数据以原始形式输入前面描述的工作流程图(不管这意味着什么)并在训练阶段和测试阶段使用。数据可以是从图像和电影到文本文档和音频文件的任何形式。因此,在数据的原始形式中,数据可能由像素、字母、单词,甚至更糟糕的纯比特构成。显而易见,使用这种原始形式的数据可能不太方便。我们必须找到对数据进行预处理的方法,以便把数据转换成易于解析或易于使用的形式。
数据预处理分为两个阶段:
- 特征选取:这个阶段识别数据中的重要属性(或特征)。图像的特征可能位于边缘、角点,或脊的位置。你可能对OpenCV提供的一些更高级的特征描述符——例如,快速鲁棒性特征(Speeded Up Robust Features,SURF);或者方向梯度直方图(Histogram of Oriented Gradients,HOG)——已经很熟悉了。尽管这些特征可以应用于所有图像,但是对于特定的任务来说,这些特征可能并不是那么重要(或者这些特征工作得并不是那么好)。例如,如果我们的任务是区分清水和脏水,那么最重要的特征可能是水的颜色,使用SURF或者HOG特征对我们的帮助可能不是很大。
- 特征提取:这个阶段实际上是将原始数据变换到所期望的特征空间的过程。Harris运算符就是一个例子,它允许我们提取一张图像中的角点(即一个选中的特征)。
一个更高级的主题是创造有用信息特征的过程,即特征工程。毕竟,在人们可以选择主流特征之前,必须先有人创造出这些特征。通常,对于算法的成功,特征工程比算法本身的选择更重要。我们将在第4章中全面地讨论特征工程。
提示
不要让命名约定把你弄糊涂了!有时,很难区分特征选择和特征提取,这是由命名方式导致的。例如,SURF既表示特征提取又表示特征的实际名称。尺度不变特征变换(Scale Invariant Feature Transform,SIFT)也如此,这是一个特征提取器,可以生成SIFT特征。可是,这两种算法都申请了专利,不能够用于商业目的。我们不会共享这两种算法的代码。
最后需要说明的一点是:在监督学习中,每个数据点都必须有一个标签。标签识别一个数据点属于某一类事物(如猫或狗),或者具有某个特定的值(如房价)。最终,监督学习系统的目标是预测测试集中所有数据点的标签(如图2-1所示)。我们通过使用带标签的数据在训练数据中学习规则,然后在测试集中测试性能来实现这一任务。
因此,要构建一个有效的机器学习系统,我们必须先学习如何加载、存储和操作数据。如何使用OpenCV和Python来实现这个目标呢?