TensorFlow从零开始学
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 机器学习

1.2.1 什么是机器学习

机器学习(Machine Learning)是让计算机能够自动地从某些数据中总结出规律,并得出某种预测模型,进而利用该模型对未知数据进行预测的方法。它是一种实现人工智能的方式,是一门交叉学科,综合了统计学、概率论、逼近论、凸分析、计算复杂性理论等。

目前机器学习的研究和应用大概集中在如图1-1所示的领域。

图1-1 机器学习的研究和应用领域

其中,机器学习让统计学习得到延伸;模式识别侧重于“感知”特征,而机器学习则会“学习”特征;数据挖掘领域中用到的算法也经常可在模式识别和机器学习中应用。计算机视觉、语音识别和自然语言处理(这里特指文本处理)目前是机器学习领域最热门的三大方向。

●计算机视觉是一门研究如何让机器替代人的眼睛,对“看到”的图片进行分析、处理的科学,在图像分类、人脸识别、车牌识别、目标检测及自动驾驶等均有十分广泛的应用。

●目前基于深度学习的语音识别和语音合成技术已经非常成熟,应用随处可见,如智能音箱、实物机器人(例如早教机器人)及虚拟人物等。

●自然语言处理旨在使用自然语言处理技术让计算机“读懂”人类的语言,相关应用有机器翻译、智能客服、垃圾信息识别等。

目前,机器学习大致可以分为以下几类。

(1)有监督学习(Supervised Learning):当我们已经拥有一些数据及数据对应的类标时,就可以通过这些数据训练出一个模型,再利用这个模型去预测新数据的类标,这种情况称为有监督学习。有监督学习可分为回归问题和分类问题两大类。在回归问题中,我们预测的结果是连续值;而在分类问题中,我们预测的结果是离散值。常见的有监督学习算法包括线性回归、逻辑回归、K-近邻、朴素贝叶斯、决策树、随机森林、支持向量机等。

(2)无监督学习(Unsupervised Learning):在无监督学习中是没有给定类标训练样本的,这就需要我们对给定的数据直接建模。常见的无监督学习算法包括K-means、EM算法等。

(3)半监督学习(Semi-supervised Learning):半监督学习介于有监督学习和无监督学习之间,给定的数据集既包括有类标的数据,也包括没有类标的数据,需要在工作量(例如数据的打标)和模型的准确率之间取一个平衡点。

(4)强化学习(Reinforcement Learning):从不懂到通过不断学习、总结规律,最终学会的过程便是强化学习。强化学习很依赖于学习的“周围环境”,强调如何基于“周围环境”而做出相应的动作。

具体分类如图1-2所示。

图1-2 机器学习的分类

1.2.2 用机器学习解决问题的一般流程

用机器学习解决问题的一般流程如图1-3所示。

图1-3 用机器学习解决问题的一般流程

(1)收集数据

业界有一句非常流行的话:“数据和特征决定了机器学习的上界,而模型和算法只是去逼近这个上界”,由此可见,数据对于整个机器学习项目来说至关重要。当我们面临一个实际的问题时,如果既有想法,又有一些相关数据,有可能是有用的,也有可能是无用的,则这里的数据收集是指根据需求从已有数据中找出我们真正需要的数据;而如果只有想法,没有数据,则这里的数据收集是指对数据的搜寻和整理等,如利用网络爬虫技术从互联网爬取数据,或因学习和研究的便利而使用公开数据集。

输入数据较简单,此处略写。

(2)数据预处理

无论是我们自己收集的数据还是公开数据集,通常都会存在各种各样的问题,例如数据不完整、格式不一致、存在异常数据,以及正负样本数量不均衡等。因此,需要对数据进行一系列的处理,如清洗、转换、规范等之后才能拿来使用,这个过程即为数据预处理。

(3)特征工程

目前在机器学习或深度学习相关的书籍中,很少会有专门把特征工程拿出来单独介绍的(在一些与数据分析或数据挖掘相关的书籍中可能会介绍得相对多一些)。的确,对于整个机器学习的项目来说,特征工程只是其中很小的一部分工作,但是千万不能忽略这“很小的一部分工作”的重要性。一个机器学习任务的成功与否往往在很大程度上取决于特征工程。简单来说,特征工程的任务是从原始数据中抽出最具代表性的特征,从而让模型能够更有效地学习这些数据。通常我们可以使用scikit-learn这个库来处理数据和提取特征,scikit-learn是机器学习中使用非常广泛的第三方模块,本身封装了很多常用的机器学习算法,同时还有很多数据处理和特征提取相关的方法。

(4)训练和测试模型

处理好数据之后,就可以选择合适的机器学习算法进行模型训练了。可供选择的机器学习算法有很多,每个算法都有自己的适用场景,那么如何选择合适的算法呢?

首先,要对处理好的数据进行分析,判断数据是否有类标,若有类标,则应该考虑使用有监督学习的相关算法,否则可以作为无监督学习问题处理;其次,判断问题类型,属于分类问题还是回归问题;最后根据问题的类型选择具体的算法训练模型。实际工作上会使用多种算法,或者相同算法的不同参数进行评估。

此外,还要考虑数据集的大小,若数据集小,训练的时间较短,则通常考虑采用朴素贝叶斯等轻量级算法,否则就要考虑采用SVM等重量级算法,甚至考虑使用深度学习的算法。

(5)模型的评估

常用的模型评估方法及相关的评估指标可参见1.2.5节介绍。

到此已经介绍了机器学习的大致流程和相关方法,接下来将进一步介绍其中重要环节——数据预处理、特征工程,以及模型的选择与评估。

1.2.3 数据预处理

根据数据类型的不同,数据预处理的方式和内容也不尽相同,这里简单介绍几种较常用的方式。

(1)归一化

归一化指将不同变化范围内的值映射到一个固定的范围里,例如,常使用min-max等方法将数值归一化到[0,1]的区间内(有些时候也会归一化到[-1,1]的区间内)。归一化的作用包括无量纲化假设要对人进行分类,人的身高和体重这两个信息是同等重要的,但是身高和体重的单位和取值范围是不一样的,这会造成数据不好统一处理,归一化就能解决这一问题。、加快模型的收敛速度,以及避免小数值的特征被忽略等。

(2)标准化

标准化指在不改变数据原分布的前提下,将数据按比例缩放,使之落入一个限定的区间,让数据之间具有可比性。需要注意的是,归一化和标准化各有其适用的情况,例如在涉及距离度量或者数据符合正态分布的时候,应该使用标准化而不是归一化。常用的标准化方法有z-score等。

(3)离散化

离散化指把连续的数值型数据进行分段,可采用相等步长或相等频率等方法对落在每一个分段内的数值型数据赋予一个新的统一的符号或数值。离散化是为了适应模型的需要,有助于消除异常数据,提高算法的效率。

(4)二值化

二值化指将数值型数据转换为0和1两个值,例如通过设定一个阈值,当特征的值大于该阈值时转换为1,当特征的值小于或等于该阈值时转换为0。二值化的目的在于简化数据,有些时候还可以消除数据(例如图像数据)中的“杂音”。

(5)哑编码

哑编码,又称为独热编码(One-Hot Encoding),作用是对特征进行量化。例如某个特征有三个类别:“大”“中”和“小”,要将这一特征用于模型中,必须将其数值化,很容易想到直接给它们编号为“1”“2”和“3”,但这种方式引入了额外的关系(例如数值间的大小关系),“误导”模型的优化方向。一个更好的方式就是使用哑编码,例如“大”对应编码“100”,“中”对应编码“010”,“小”对应编码“001”。如果将其对应到一个三维的坐标系中,则每个类别对应一个点,且三个点之间的欧氏距离相等,均为

1.2.4 特征工程

特征工程的目的是把原始的数据转换为模型可用的数据,主要包括三个子问题:特征构造、特征提取和特征选择。

●特征构造一般是在原有特征的基础上做“组合”操作,例如,对原有特征进行四则运算,从而得到新的特征。

●特征提取指使用映射或变换的方法将维数较高的原始特征转换为维数较低的新的特征。

●特征选择即从原始的特征中挑选出一些具有代表性、使模型效果更好的特征。

其中,特征提取和特征选择最为常用。

(1)特征提取

特征提取又叫作“降维”,目前线性特征的常用提取方法有主成分分析(Principle Component Analysis,PCA)、线性判别分析(Linear Discriminant Analysis,LDA)和独立成分分析(Independent Component Analysis,ICA)。

① 主成分分析

主成分分析是一种经典的无监督降维方法,主要思想是用“减少噪声”和“去冗余”来降维。具体来说:

●“减少噪声”指在将维数较高的原始特征转换为维数较低的新特征的过程中保留维度间相关性尽可能小的特征维度,这一操作实际上是借助协方差矩阵实现的;

●“去冗余”指把“减少噪声”操作之后保留下来的维度进行进一步筛选,去掉含有“特征值”较小的维度,使得留下来的特征维度含有的“特征值”尽可能大,特征值越大,方差就会越大,进而所包含的信息量就会越大。

主成分分析完全无参数限制,也就是说,结果只与数据有关,而用户是无法进行干预的。这是它的优点,同时也是缺点。针对这一特点,Kernel-PCA被提出,使得用户可以根据先验知识预先对数据进行非线性转换,因而成为当下流行的方法之一。

② 线性判别分析

线性判别分析是一种经典的有监督降维算法,主要思想是借助协方差矩阵、广义瑞利熵等实现数据类别间距离的最大化和类别内距离的最小化。二分类线性判别分析中,二维特征是通过一系列矩阵运算实现从二维平面到一条直线的投影的,同时借助协方差矩阵、广义瑞利熵等实现类间数据的最大化与类内数据的最小化。从二分类推广到多分类,是通过在二分类的基础上增加“全局散度矩阵”来实现最终目标优化函数设定的,从而实现类间距离的最大化和类内距离的最小化。显然,由于它是针对各个类别做的降维,所以数据经过线性判别分析降维后,最多只能降到原来的类别数减1的维度。

因此,线性判别分析除实现降维外,还可以实现分类。另外,对比主成分分析可以看出,线性判别分析在降维过程中着重考虑分类性能,而主成分分析着重考虑特征维度之间的差异性与方差的大小,即信息量的大小。

③ 独立成分分析

独立成分分析的主要思想是在降维的过程中保留相互独立的特征维度。这比主成分分析更进一步,在保证特征维度之间不相关的同时保证相互独立。不相关只是保证了特征维度之间没有线性关系,而并不能保证它们之间是独立的。

独立成分分析正因为以保证特征维度之间的相互独立为目标,往往会有比主成分分析更好的降维效果,目前已经被广泛应用于数据挖掘、图像处理等多个领域。

(2)特征选择

不同的特征对模型的影响程度不同,我们要选择出对模型影响大的特征,移除不太相关的特征,这个过程就是特征选择。特征选择的最终目的是通过减少冗余特征来减少过拟合、提高模型准确度、减少训练时间。特征选择是对原始特征取特征子集的操作,而特征提取则是对原始特征进行映射或者变换操作,以得到低维的新特征。

特征选择在特征工程中十分重要,往往可以在很大程度上决定模型训练结果的好坏。常用的特征选择方法包括过滤式(Filter)、包裹式(Wrapper)及嵌入式(Embedding)。

① 过滤式

过滤式特征选择一般通过统计度量的方法来评估每个特征和结果的相关性,以对特征进行筛选,留下相关性较强的特征。其核心思想是:先对数据集进行特征选择,再进行模型的训练。过滤式特征选择是独立于算法的。正因此,过滤式特征选择拥有较高的通用性,可适用于大规模数据集;也正因此,过滤式特征选择在分类准确率上的表现欠佳。常用的过滤式特征选择方法有Pearson相关系数法、方差选择法、假设检验、互信息法等,这些方法通常是单变量的。

② 包裹式

包裹式特征选择通常把最终机器学习模型的表现作为特征选择的重要依据,一步步筛选特征。这一一步步筛选特征的过程可以被看作目标特征组合的搜索过程,而这一搜索过程可应用最佳优先搜索、随机爬山算法等。目前比较常用的一种包裹式特征选择法是递归特征消除法,其原理是使用一个基模型(如随机森林、逻辑回归等)进行多轮训练,每轮训练结束后,消除若干权值系数较低的特征,再基于新的特征集进行新的一轮训练。

由于包裹式特征选择是根据最终的模型表现来选择特征的,所以它通常比过滤式特征选择有更好的模型训练表现。但是,由于训练过程时间久,系统的开销也更大,一般来说,包裹式特征选择不太适用于大规模数据集。

③ 嵌入式

嵌入式特征选择同样根据机器学习的算法、模型来分析特征的重要性,从而选择比较重要的N个特征。与包裹式特征选择最大的不同是,嵌入式特征选择将特征选择过程与模型的训练过程结合为一体,这样就可以更高效且快速地找到最佳的特征集合。简而言之,嵌入式特征选择将全部的数据一起输入模型中进行训练和评测,而包裹式特征选择一般一步步地筛选和减少特征进而得到所需要的特征维度。常用的嵌入式特征选择方法有基于正则化项(如Lasso)和基于树模型的特征选择(如GBDT)。

1.2.5 模型的评估和选择

1.评估方法

我们肯定希望训练得到的模型在新的数据集上总能表现出很好的性能,因此我们希望模型能够尽可能多地学习到有代表性的样本数据的特征。在机器学习中有两个常见的现象,分别是“过拟合”和“欠拟合”。当模型把训练数据的特征学习得“太好”的时候,往往会出现“过拟合”的现象,与之相对的就是“欠拟合”,即模型没有学习好训练数据的特征。图1-4所示的是一个简单的例子。

图1-4 “过拟合”和“欠拟合”示例

(从左至右依次为:理想情况、欠拟合和过拟合)

无论是“过拟合”还是“欠拟合”,都不是我们希望看到的。“欠拟合”通常是由于模型过于简单或者学习不够充分等原因导致的,相对来说比较容易解决。而“过拟合”一般是由于数据中的“噪声”或者模型将训练数据特有的一些特征当成了该类数据都会具有的一般特征而导致的,通常容易出现在训练数据过少、模型过于复杂或者参数过多的情况中。

为了得到一个效果好的模型,通常会选择多种算法,对每种算法都会尝试不同的参数组合,并比较哪一种算法、哪一种参数设置更好,这就是模型的选择,并有一些相应的评价方法和标准来对选择的模型进行评估,即模型的“性能度量”。

在介绍具体的模型评估方法之前,先澄清两个问题:什么是“参数”和“超参数”;怎么划分“训练集”“测试集”和“验证集”。

“参数”即模型需要学习的内容,是模型“内部”的变量,比如模型的权重矩阵和偏置。而“超参数”指在一个模型中可以人为设定和修改的参数,例如神经网络的层数、学习率及隐藏层神经元的个数等。实际操作中,我们除选择具体的模型外(例如,选择LSTM还是选择Bi-LSTM),还要选择模型的“超参数”。

“训练集”“测试集”和“验证集”的划分是模型的选择和训练过程中的一个重要环节。“测试集”很好理解,当我们训练好一个模型之后,要想知道这个模型的泛化能力好不好,可以用模型在“测试集”上的表现来近似评估模型的泛化能力。“验证集”又是什么呢?举个简单的例子,假设有一个训练集A和一个测试集B,两个数据集没有重叠,用训练集A来训练模型,然后用测试集B来评估模型的“好坏”。此时可能会出现问题,即由于我们是以模型在测试集B上的表现来评价模型的“好坏”的,最后选择的模型可能刚好只能在测试集B上的表现比较好。因此,这样的模型是不具有代表性的。那么如何避免这个问题呢?方法就是再增加一个“验证集”,在选择模型的时候,使用“验证集”来评估模型的“好坏”。对于最终选定和训练好的模型,我们用“测试集”来评估模型的泛化能力。“训练集”“测试集”和“验证集”的数据均不能有重叠,通常三个数据集的划分比例为8∶1∶1。虽然在平时表述的时候,我们通常不会严格地区分“测试集”和“验证集”(一般习惯性地都用“测试集”表述),但是为了避免混淆并确保规范,在本书中统一使用“验证集”。

接下来介绍模型评估的常见方法:留出法、交叉验证法、留一法交叉验证法的一个特例。及自助法。

(1)留出法

留出法(Hold-out)是一种较为简单的方法,它直接将数据集D划分为训练集T和验证集V,集合T和集合V是互斥的,即D=TV,且TV=∅。

需要注意的是,为了确保“训练集”和“验证集”中数据分布的一致性,要使用“分层采样”划分数据集。举个简单的例子,假设数据集中有100个样本,其中有50个正例和50个负例,训练集T和验证集V的样本数比例为4:1,即训练集T有80个样本,验证集V有20个样本。若使用“分层采样”,则训练集T中应该有40个正例和40个负例,而验证集V中应该有10个正例和10个负例。

由于数据的划分具有随机性,通过一次划分数据集训练后得到的模型,在“验证集”上的表现不一定能体现出模型真正的效果,所以一般会多次划分数据集并训练模型,并取多次实验结果的平均值作为最终模型评估的结果。

留出法还存在一个问题,即“训练集”和“验证集”的比例该如何确定。这个问题在数据样本足够多的时候可以不用考虑,但在数据样本不是特别多的时候就会造成一定困扰,一般的做法是将数据的作为“验证集”。

(2)交叉验证法

交叉验证法(Cross Validation)将数据集D划分为k个大小相同但互斥的子集,即)。为了确保数据分布的一致性,这里我们同样使用“分层采样”划分数据集。

对于划分得到的k个数据集,我们每次使用其中的一个作为“验证集”,剩下的k-1个作为“训练集”,将得到的k个结果取平均值,作为最终模型评估的结果,我们称这种方法为“k折交叉验证”。和留出法一样,为了排除数据集划分的影响,我们对数据集D进行p次划分,每次划分得到k个子集,然后进行p次“k折交叉验证”,并取这p次“k折交叉验证”结果的平均值作为最终的结果。我们称这种方法为“pk折交叉验证”,常见的有“5次10折交叉验证”或“10次10折交叉验证”。

交叉验证法有一种特殊的情况,假设数据集大小为m,若使得k的值等于m,则把这种情况称为留一法,因为这时“验证集”中只有一个样本。留一法的优点是不存在数据集划分所产生的影响,但是当数据集较大时,对于样本数量为m的数据集,使用留一法就得训练m个模型,这会需要很大的计算开销。

(3)自助法

自助法是一种基于自助采样的方法,通过采样从原始数据集中产生一个训练集。假设数据集D包含m个样本,每次随机且有放回地从数据集D中挑选出一个样本添加到数据集D'中,重复进行m次后得到一个和原始数据集D大小相同的数据集D'。在数据集D中,样本在m次采样中均不被抽到的概率为,取极限可以得到:

求解式1-1可以得到其值为,约等于36.8%。因此,在m次采样后,数据集D中仍然有约36.8%的样本没有被抽到,我们可以用这些数据作为验证集,即T=D',V=D-D'。

自助法比较适用于样本数量较少的情况,因为即使划分了验证集也并没有减少训练集的数量;此外,使用自助法可以从原始数据集中产生出多个互不相同的训练集,这对集成学习很有帮助。自助法也有缺点,因为训练集的产生是随机采样得到的,所以数据样本分布的一致性就被破坏了。

表1-1是对上述模型评估方法的总结。

表1-1 常用的模型评估方法

2.性能度量

介绍完评估的方法,接下来了解用来衡量机器学习模型泛化能力的评价标准,即模型的性能度量(Performance Measure)。

(1)正确率(Accuracy)和错误率(Error Rate)

正确率与错误率是分类任务中常用的两个评价指标,很好理解。正确率是指分类器预测正确的数据样本数占验证集中样本总数的比例。相应地,错误率是指在验证集上,分类器预测错误的数据样本数占验证集中样本总数的比例。具体计算方式如下:

(2)查准率(Precision)、查全率(Recall)与F1

虽然正确率和错误率是常用的两个评价指标,但有时可能需要更细致的度量指标。举个例子,假设我们训练好了一个垃圾邮件分类的模型,可将垃圾邮件和正常邮件进行分类,这是一个简单的二分类模型。模型都不会是百分之百准确的,因此就需要有一个考量。有些用户希望尽可能地排除掉所有的垃圾邮件,哪怕偶尔将一些正常邮件误判为垃圾邮件;还有一些用户可能会有很多重要的邮件,所以他们希望这些重要的邮件都能被正常收到,哪怕收到少数垃圾邮件。这个时候我们关心的有两点:第一点,在分类得到的“正常邮件”中有多少是真正的正常邮件;第二点,在所有的正常邮件中,有多少被正确地分类了。这个时候,我们就需要有新的度量指标:查准率和查全率(也称为“召回率”)。

以二分类为例,对于分类器的分类结果,需要统计四种数据,如表1-2所示。

表1-2 计算查准率和查全率时需要统计的数据

令TP、FP、TN和FN分别表示上述四种情况所对应的数据样本个数,根据统计的数据,我们可以做出一张表,这张表称为“混淆矩阵(Confusion Matrix)”,如表1-3所示。

表1-3 二分类结果的混淆矩阵

查准率与查全率的定义分别如下:

相应地,正确率(Accuracy)和错误率(Error Rate)可以表示为

下面看一个简单的三分类的例子。假设实现猫、狗和兔子的分类,用训练好的模型对验证集(约定验证集中每个类别有1000个数据样本)进行判别,得到了如表1-4所示的混淆矩阵。

表1-4 三分类结果的混淆矩阵

对应上面的混淆矩阵,我们可以将其拆成三个二分类的矩阵,以猫为例,如表1-5所示。

表1-5 对于猫的二分类混淆矩阵

根据式1-4与式1-5可得:

在绝大多数情况下,查准率和查全率总是相对立的,当查准率高的时候,查全率往往会偏低,而当查全率高的时候,查准率又会偏低。对于前面提到的垃圾邮件过滤的例子,如果想尽可能地过滤掉垃圾邮件,那就免不了会把一些正常邮件也误判为垃圾邮件;如果想要尽可能地保留所有的正常邮件,那就免不了也会保留一些垃圾邮件。所以,在通常情况下,我们需要根据自己的实际需要来设定一个合适的阈值,使得查准率和查全率的平衡点能最好地满足需求。

在以正确率和错误率作为模型的评价指标时,可以简单地通过比较两个模型的正确率来判断孰优孰劣。在以查准率和查全率为评价指标时,要如何比较呢?常见的有两种方法:做P-R图和计算F1。本书选择介绍后者,这是一种更常用、更直接的度量方法,在阿里天池、Kaggle等比赛中,也经常使用F1作为模型的评价指标,它是查准率和查全率的一种加权平均。

F1度量的计算公式如下:

由于在不同情况下对查准率和查全率的侧重不同,所以需要有一个一般形式的F1度量,记为Fβ

在上式中,当β的值大于1时,代表模型的评价更侧重于查全率,当0<β<1时,模型的评价更侧重于查准率,当β=1时,Fβ等价于F1。