Python机器学习开发实战
上QQ阅读APP看书,第一时间看更新

1.2 机器学习相关概念

在正式进入学习之前,我们首先对机器学习的相关概念做一个梳理,这些概念将贯穿于之后的学习过程中。

根据是否有明确的学习目标(因变量Y),我们将机器学习分为有监督学习(Supervised Learning)和无监督学习(Unsupervised Learning)。有监督学习常被称为分类(Classification),而无监督学习常被称为聚类(Clustering)。

1.2.1 机器学习中的数据

在机器学习中,处理的数据格式和Excel表格或者结构化数据表格相同,只是对细节的叫法有所差异。

假设我们有表1.1这样的表格,首先,在Excel中,我们会简单地使用行和列来对应相应的数据;在结构化数据库中我们将一行称为一条记录,将一列称为一个字段。

在表1.1中,一共有3行4列数据。在机器学习中,我们将行称为样本(Sample)或者实例(Instance);将列称为特征(Feature)或者属性(Attribute)。如何理解特征或者属性呢?特征和属性其实就是每个样本的特点,比如在表1.1中,每个样本都会有性别、体重、身高三个特征。如果此时给出一组数据,只有身高和体重,那么我们就可以根据身高和体重,来判断这个同学的性别。

在本书中,我们统一将行称为样本,将列称为特征。

表1.1 机器学习中的数据

但是在实际工作中,数据并不总像表1.1中那么工整,这就需要对原始数据进行一系列清洗和转换。这个清洗和转换的过程被称为数据的预处理。

数据的预处理包含以下几个步骤。

1.数据清洗

得到的数据有时会很“脏”,比如有缺失值、有异常值,如表1.2所示。

表1.2 脏数据处理

可以看到,学号100001的同学的体重是空值;学号100003同学的身高高得异常。当我们遇到这样的样本时,最简单的方法就是将这些样本点去掉;但是这样会浪费该样本点其他已有的信息,特别是在只有少量样本的情况下。

除了删除异常样本点,还可以进行插值操作,即将空值和异常值插补为一个比较合适的值,比如可以用该特征的均值进行插值。

2.特征提取

通过表1.3的数据,我们想通过每个人的喜好、体重、身高来预测其性别。我们不会将“篮球”“乒乓球”“足球”直接输入给模型,而要将它们转换成数字,如表1.4所示,例如,将篮球替换为0,将乒乓球替换为1,将足球替换为2。这样做的原因是:算法的本质是数值的计算。

表1.3 未经处理的数据

表1.4 用数字替代喜好的类别

但是这样的转换仍有问题,如果这样编号,似乎就在暗示篮球和足球的距离比较大,而乒乓球与两者的距离较小,都是1,如表1.5所示。

表1.5 不同类别的距离

但显然没有这样的距离差距,三者之间的距离是相同的。那么我们应该如何表示这样的关系呢?在机器学习中,这种情况经常用one-hot编码来处理。经过one-hot编码之后,该数据就变成了表1.6所示的样子。

表1.6 one-hot编码后的数据

这样编码之后,各个类别的距离就都相等了。

在文本处理过程中,我们会将文本处理成表1.6所示的结构化数据表,将每个词作为一个特征;在图像处理过程中,我们会将一个像素作为一个特征来处理。具体方法可以参考本书第12章——K最近邻分类的相关知识以及手写字体识别的实战案例。

1.2.2 训练集和测试集

我们得到数据之后,并不直接将所有的数据都用来进行模型训练,因为对这样训练出来的模型,我们无法知道它的优劣。如果等到投入生产时才知道,那就为时已晚了。

所以我们要将数据分为训练集和测试集。训练集顾名思义就是训练模型用的数据,一般我们在整体数据中随机采样获得训练集;而测试集则是整体数据中除去训练集的部分。

训练集和测试集的大小并没有固定的比例,如9∶1或8∶2,这样的分法都是可以的,甚至可以只用一个样本作为测试集。

具体的操作方法可以参考本书第6章的相关知识。

1.2.3 欠拟合与过度拟合

欠拟合是指所训练的模型在训练集中就已表现得很差,即准确度很低。

过度拟合则是指所训练的模型在训练集上表现得非常优秀,可以有效地区分每一个样本,但在测试集上表现得十分糟糕。

所以我们在训练模型的时候,不能一味追求训练集上好的模型指标,而要在测试集上不断调试。

1.2.4 人工智能、机器学习、深度学习

人工智能(Artificial Intelligence,AI)、机器学习(Machine Learn)和深度学习(Deep Learn)是最近火热的词语,但是很多读者并不清楚它们之间的关系,我们可以简单地认为人工智能包含了机器学习,而机器学习又包含了深度学习。

人工智能更偏向于应用方面,比如语音识别、图像识别、智能聊天机器人等;而机器学习则更偏向于理论,比如图像识别技术应用的是卷积神经网络(CNN)的机器学习算法,本书中也会用到机器学习中的K最近邻算法来做简单的字体识别;深度学习则是机器学习的一个分支,可以简单地理解为深度学习就是有多个隐藏层的神经网络算法。