1.1 通过示例了解数据科学
为了说明为特定数据构建学习算法的周期和挑战,我们考虑一个真实的例子。大自然保护协会正在与其他捕鱼公司合作,来共同监测捕捞活动并保护未来的渔业。大自然保护协会希望在未来使用摄像头来扩大这一监控范围。但是因为部署这些摄像头所产生的数据量非常巨大,而且手动处理的成本非常高,所以大自然保护协会想要开发一种学习算法来自动检测不同种类的鱼并分类,以加速视频审查过程。
图1.1所示的是保护协会部署的摄像头所拍摄的图像样本,这些图像将用于构建系统。
图1.1 大自然保护协会部署的摄像头拍摄到的画面
在这个例子中,我们的目标是分离不同的物种,包括渔船所捕获的金枪鱼、鲨鱼等。作为一个说明性的例子,把这个问题限制在金枪鱼和月鱼两个物种(见图1.2)中。
图1.2 金枪鱼类(左)和月鱼类(右)
在将问题限制在仅包含两种类型的鱼之后,我们可以从集合中抽取一些随机图像来发现这两种类型之间的一些物理差异。主要考虑以下物理差异。
- 长度:相对于月鱼,金枪鱼更长。
- 宽度:月鱼比金枪鱼宽。
- 颜色:月鱼比金枪鱼更红,金枪鱼往往是蓝色和白色等。
我们可以将这些物理差异作为特征来帮助学习算法(分类器)来区分这两种鱼类。
对象的解释性特征是我们在日常生活中用来区分周围的物体的东西。即使是婴儿也可以使用这些解释性特征来了解周围环境,数据科学也是如此。为了建立一个可以区分不同对象(例如鱼类)的学习模型,我们需要给它一些解释性特征来学习(例如鱼的长度)。为了使模型更加确定并减少错误,我们可以在一定程度上增加对象的解释性特征。
因为这两种鱼类之间存在物理差异,所以这两种不同的鱼类种群有不同的模型或描述。因此,分类任务的最终目标是让分类器学习这些不同的模型,然后将这两种类型中的一种作为输入。分类器将通过选择最适合该图像的模型(金枪鱼模型或月鱼模型)来对它进行分类。
在这种情况下,摄像头收集到的金枪鱼和月鱼图像将作为分类器的知识库。最初,知识库(训练样本)将被标记。所以说,对于每幅图像,我们会预先知道它是金枪鱼还是月鱼。分类器将使用这些训练样本来对不同类型的鱼进行建模,然后我们可以使用训练阶段中已构建的分类器来自动标记在训练阶段中没有见到的未标记的鱼。这种未标记的数据通常称为未知数据。整个训练阶段的周期如图1.3所示。
图1.3 训练阶段周期
下面讨论分类器的训练阶段是如何工作的。
- 预处理:在这一步中,我们将尝试使用相关的分割方法从图像中分割鱼。
- 特征提取:在通过去掉背景将鱼从图像中分割出来之后,测量每幅图像的物理差异(长度、宽度、颜色等),最后会得到图1.4所示的结果。
图1.4 两种鱼的长度直方图
我们会将这些数据输入分类器中,以对不同类别的鱼进行建模。
如前所述,用户可以通过之前提出的诸如长度、宽度和颜色这些物理差异(特征)来区分金枪鱼和月鱼。
用户也可以利用长度特征来区分两种鱼。因此,我们可以通过观察鱼的长度并判断它是否超过某一个值(length*)来区分不同的鱼类。
所以,基于训练样本,我们可以得出下面的规则。
If length(fish)> length* then label(fish) = Tuna
Otherwise label(fish) = Opah
为了求length*,我们可以设法测量训练样本的长度。假定用户测量了样本的长度并得到了图1.4所示的直方图。
在这个案例中,我们可以根据长度得出一条规则并用它来区分金枪鱼和月鱼。在这个特定的例子中,length*为7。所以先前的规则可以更新为:
If length(fish)> 7 then label(fish) = Tuna
Otherwise label(fish) = Opah
读者可能注意到了,这两个直方图存在重叠,因此这并不是一个很好的结果,这是因为长度特征并不能完全用于区分这两种类型。用户可以考虑纳入诸如宽度等特征,并把它们结合起来。如果我们设法测量训练样本的宽度,可能会得到图1.5所示的直方图。
图1.5 两种鱼的宽度直方图
可以看出,只根据一个特征是不能得出准确的结果的,输出模型将会做出很多错误的分类。我们可以设法结合这两个特征,并得到一些合理的模型。
如果结合这两个特征,我们就可能得到图1.6所示的散点图。
图1.6 两种鱼的长度和宽度子集之间的组合
结合长度和宽度特征的数值,可以得到图1.6所示的散点图。图中浅色点表示金枪鱼,深色点表示月鱼,我们可以认为中间这条黑线是用以区分两种鱼的规则或者决策边界。
举例来说,如果一条鱼的相关数值落在这个决策边界的上方,它就是一条金枪鱼;否则,我们就预测它为一条月鱼。
用户可以设法增加规则的复杂度以避免任何可能的错误,这样做会得到一个新的散点图,如图1.7所示。
图1.7 增加决策边界的复杂度来避免训练数据的错误分类
这个模型的好处是在训练样本上错误分类的数量接近于0,而实际上这并不是使用数据科学的目的。数据科学的目的是搭建一个能够在未知数据上泛化并表现良好的模型。为了判断该模型是否能够良好地泛化,我们将引入一个称为测试阶段的新阶段。在这个阶段里,用户给训练好的模型一张没有贴标签的图片,希望模型能给这张图片贴上一个正确的标签(金枪鱼或者月鱼)。
数据科学的最终目的是建立一个能够在生产中(而不是在训练集上)表现良好的模型。所以当我们看到模型在训练集中表现良好时,如图1.7所示,不要高兴得太早。大多数情况下,这种模型在识别图像中的鱼种类时表现得并不好。这种模型只在训练数据集上表现良好的状况称为过拟合,许多从业者都掉进了这个陷阱。
与其提出一个复杂的模型,不如让用户用一个相对不太复杂的并且能够在测试阶段泛化的模型。图1.8所示的是一个不太复杂的模型,该模型可以进一步减少错误分类的数量并且可以很好地泛化未知的数据。
图1.8 使用一个不太复杂的模型以便于可以在测试样本(未知数据)上泛化