机器学习基石01:机器学习简介

在接触机器学习两年多的时间里,做的与深度学习相关的项目,基本上还只停留在“拿来用”的阶段,对于其背后诸如参数设置等需要数学解释性的原理并不清楚。比如目标检测算法,按照指定格式构建数据集,在训练的时候,模型表现并不好的时候如何调参,让模型的泛化能力得到提升,适合自己的任务。再比如论文中的公式推导和所用方法,很多都是传统机器学习中的概念和方法。如果不明白背后的原理,将寸步难行,遂决定从头开始复习机器学习相关算法,并将学习过程记录下来,方便复习。

鉴于本人能力水平有限,所以相关博文是以像我一样的小白的角度总结的,如有错误,恳请指出。相关博文会分为三部分:基本概念,公式推导,Python代码实现,力求将背后的原理理解清楚。关于课程资源,主要来自:吴恩达《机器学习》及相关笔记、周志华《机器学习》及相关笔记,林轩田《机器学习基石》《机器学习技法》及相关笔记、李航《统计学习方法》第二版及相关笔记、《Introductory Lectures on Convex Programming》、《PRML》。

1.机器学习的定义

1.1 西瓜书中的定义

傍晚小街路面上沁出微雨后的湿润,和熙的细风吹来,抬头看看天边的晚霞,嗯,明天又是一个好天气。走到水果摊旁,挑了个根蒂蜷缩、敲起来声音浊响的青绿西瓜,满心期待着皮薄肉厚瓢甜的爽落感。这两个例子中涉及很多基于经验做出的判断。可以看出,我们能做出有效的判断,因为我们已经积累了许多经验,而通过对经验的利用,就能对新情况做出有效的决策。机器学习正是这样的一门学科,人的“经验”对应计算机中的“数据”,让计算机来学习这些经验数据,生成一个算法模型(model),在面对新的情况中,计算机便能作出有效的判断,这便是机器学习。

1.2 Mitchell 《Machine Learning》中的定义

  • P:计算机程序在某任务类T上的性能。
  • T:计算机程序希望实现的任务类。
  • E:表示经验,即历史的数据集。

若该计算机程序通过利用经验E在任务T上获得了性能P的改善,则称该程序对E进行了学习。

1.3 林轩田《机器学习基石》中的定义

1.什么是“学习”?学习就是人类通过观察、积累经验,掌握某项技能或能力。就好像我们从小学习识别字母、认识汉字,就是学习的过程。而机器学习(MachineLearning),顾名思义,就是让机器(计算机)也能向人类一样,通过观察大量的数据和训练,发现事物规律,获得某种分析问题、解决问题的能力。机器学习可以被定义为:Improving some performance measure with experence computed from data. 也就是机器从数据中总结经验,从数据中找出某种规律或者模型,并用它来解决实际问题。

2.什么情况下会使用机器学习来解决问题呢?其实,目前机器学习的应用非常广泛,基本上任何场合都能够看到它的身影。其应用场合大致可归纳为三个条件:

  • 事物本身存在某种潜在规律
  • 某些问题难以使用普通编程解决
  • 有大量的数据样本可供使用

3.机器学习流程
在这里插入图片描述

  • 输入x
  • 输出y
  • 目标函数f,即最接近实际样本分布的规律
  • 训练样本data
  • 假设hypothesis,一个机器学习模型对应了很多不同的hypothesis,通过演算法A,选择一个最佳的hypothesis对应的函数称为矩g,g能最好地表示事物的内在规律,也是我们最终想要得到的模型表达式。

实际中,机器学习的流程图可以表示为:
在这里插入图片描述
对于理想的目标函数f,我们是不知道的,我们手上拿到的是一些训练样本D,假设是监督式学习,其中有输入x,也有输出y。机器学习的过程,就是根据先验知识选择模型,该模型对应的hypothesis set(用H表示),H中包含了许多不同的hypothesis,通过演算法A,在训练样本D上进行训练,选择出一个最好的hypothes,对应的函数表达式g就是我们最终要求的。一般情况下,g能最接近目标函数f,这样,机器学习的整个流程就完成了。

2.机器学习的相关术语

  • 所有记录的集合为:数据集。

  • 每一条记录为:一个实例(instance)样本(sample)

  • 例如:色泽或敲声,单个的特点为特征(feature)属性(attribute)

  • 对于一条记录,如果在坐标轴上表示,每个西瓜都可以用坐标轴中的一个点表示,一个点也是一个向量,例如(青绿,蜷缩,浊响),即每个西瓜为:一个特征向量(feature vector)

  • 一个样本的特征数为:维数(dimensionality),该西瓜的例子维数为3,当维数非常大时,也就是现在说的“维数灾难”。

    计算机程序学习经验数据生成算法模型的过程中,每一条记录称为一个“训练样本”,同时在训练好模型后,我们希望使用新的样本来测试模型的效果,则每一个新的样本称为一个“测试样本”。定义:

  • 所有训练样本的集合为:训练集(trainning set),[特殊]。

  • 所有测试样本的集合为:测试集(test set),[一般]。

  • 机器学习出来的模型适用于新样本的能力为:泛化能力(generalization),即从特殊到一般。

    西瓜的例子中,我们是想计算机通过学习西瓜的特征数据,训练出一个决策模型,来判断一个新的西瓜是否是好瓜。可以得知我们预测的是:西瓜是好是坏,即好瓜与差瓜两种,是离散值。同样地,也有通过历年的人口数据,来预测未来的人口数量,人口数量则是连续值。定义:

  • 预测值为离散值的问题为:分类(classification)

  • 预测值为连续值的问题为:回归(regression)

我们预测西瓜是否是好瓜的过程中,很明显对于训练集中的西瓜,我们事先已经知道了该瓜是否是好瓜,学习器通过学习这些好瓜或差瓜的特征,从而总结出规律,即训练集中的西瓜我们都做了标记,称为标记信息。但也有没有标记信息的情形,例如:我们想将一堆西瓜根据特征分成两个小堆,使得某一堆的西瓜尽可能相似,即都是好瓜或差瓜,对于这种问题,我们事先并不知道西瓜的好坏,样本没有标记信息。定义:

  • 训练数据有标记信息的学习任务为:监督学习(supervised learning),容易知道上面所描述的分类和回归都是监督学习的范畴。
  • 训练数据没有标记信息的学习任务为:无监督学习(unsupervised learning),常见的有聚类和关联规则。

3.模型的评估与选择

3.1 误差与过拟合

我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error)。定义:

  • 在训练集上的误差称为训练误差(training error)经验误差(empirical error)
  • 在测试集上的误差称为测试误差(test error)
  • 学习器在所有新样本上的误差称为泛化误差(generalization error)

显然,我们希望得到的是在新样本上表现得很好的学习器,即泛化误差小的学习器。因此,我们应该让学习器尽可能地从训练集中学出普适性的“一般特征”,这样在遇到新样本时才能做出正确的判别。然而,当学习器把训练集学得“太好”的时候,即把一些训练样本的自身特点当做了普遍特征;同时也有学习能力不足的情况,即训练集的基本特征都没有学习出来。我们定义:

  • 学习能力过强,以至于把训练样本所包含的不太一般的特性都学到了,称为:过拟合(overfitting)
  • 学习能太差,训练样本的一般性质尚未学好,称为:欠拟合(underfitting)

可以得知:在过拟合问题中,训练误差十分小,但测试误差教大;在欠拟合问题中,训练误差和测试误差都比较大。目前,欠拟合问题比较容易克服,例如增加迭代次数等,但过拟合问题还没有十分好的解决方案,过拟合是机器学习面临的关键障碍。

在这里插入图片描述

3.2 评估方法

在现实任务中,我们往往有多种算法可供选择,那么我们应该选择哪一个算法才是最适合的呢?如上所述,**我们希望得到的是泛化误差小的学习器,理想的解决方案是对模型的泛化误差进行评估,然后选择泛化误差最小的那个学习器。但是,泛化误差指的是模型在所有新样本上的适用能力,我们无法直接获得泛化误差。因此,通常我们采用一个“测试集”来测试学习器对新样本的判别能力,然后以“测试集”上的“测试误差”作为“泛化误差”的近似。**显然:我们选取的测试集应尽可能与训练集互斥

如上所述:我们希望用一个“测试集”的“测试误差”来作为“泛化误差”的近似,因此我们需要对初始数据集进行有效划分,划分出互斥的“训练集”和“测试集”。下面介绍几种常用的划分方法:

3.2.1 留出法

将数据集D划分为两个互斥的集合,一个作为训练集S,一个作为测试集T,满足D=S∪T且S∩T=∅,在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。需要注意的是:训练/测试集的划分要尽可能保持数据分布的一致性,以避免由于分布的差异引入额外的偏差,常见的做法是采取分层采样(stratified sampling)。 例如通过对D进行分层采样而获得含70%样本的训练集S和含30%样本的测试集T,若D包含500个正例,500个反例,而分层采样得到的S应包含350个正例,350个反例,而T则包含150个正例和150个反例;若S、T中的样本类别差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差。

同时,由于划分的随机性,单次的留出法结果往往不够稳定,一般要采用若干次随机划分,重复实验取平均值的做法。例如进行100次随机划分,每次产生一个训练/测试集用于实验评估,100次后就得到100个结果,而留出法返回的则是这100个结果的平均。我们希望评估的是用D训练出的模型的性能,但留出法需划分训练/测试集,这就会导致一个窘境。常见的划分为:大约2/3-4/5的样本用作训练,剩下的用作测试。

3.2.2 交叉验证法

将数据集D划分为k个大小相同的互斥子集,满足D=D1∪D2∪…∪Dk,Di∩Dj=∅(i≠j),同样地尽可能保持数据分布的一致性,即采用分层抽样的方法获得这些子集。交叉验证法的思想是:每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集,这样就有K种训练集/测试集划分的情况,从而可进行k次训练和测试,最终返回k次测试结果的均值。交叉验证法也称“k折交叉验证”,k最常用的取值是10,下图给出了10折交叉验证的示意图。
在这里插入图片描述

与留出法类似,将数据集D划分为K个子集的过程具有随机性,因此K折交叉验证通常也要重复p次,称为p次k折交叉验证,常见的是10次10折交叉验证,即进行了100次训练/测试。特殊地当划分的k个子集的每个子集中只有一个样本时,称为“留一法”,显然,留一法的评估结果比较准确,但对计算机的消耗也是巨大的。

3.2.3 自助法

我们希望评估的是用整个D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而导致的估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度又太高了。“自助法”正是解决了这样的问题

自助法的基本思想是:给定包含m个样本的数据集D,每次随机从D 中挑选一个样本,将其拷贝放入D’,然后再将该样本放回初始数据集D 中,使得该样本在下次采样时仍有可能被采到。重复执行m 次,就可以得到了包含m个样本的数据集D’。可以得知在m次采样中,样本始终不被采到的概率取极限为:
在这里插入图片描述
这样,通过自助采样,初始样本集D中大约有36.8%的样本没有出现在D’中,于是可以将D’作为训练集,D
\D’作为测试集。自助法在数据集较小,难以有效划分训练集/测试集时很有用,但由于自助法产生的数据集(随机抽样)改变了初始数据集的分布,因此引入了估计偏差在初始数据集足够时,留出法和交叉验证法更加常用。

3.2.4 调参与最终模型

大多数学习算法都有些参数(parameter) 需要设定,参数配置不同,学得模型的性能往往有显著差别,这就是通常所说的"参数调节"或简称"调参" (parameter tuning)。

学习算法的很多参数是在实数范围内取值,因此,对每种参数取值都训练出模型来是不可行的。常用的做法是:对每个参数选定一个范围和步长λ,这样使得学习的过程变得可行。例如:假定算法有3 个参数,每个参数仅考虑5 个候选值,这样对每一组训练/测试集就有53= 125 个模型需考察,很多强大的学习算法有大量的参数需要设定,这将导致极大的调参工程量,以至于在不少的应用任务中,参数调得好不好往往对最终模型性能有关键性影响。

给定包含m个样本的数据集D,在模型评估与选择过程中由于需要留出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型。因此,在模型选择完成后,学习算法和参数配置已经选定,此时应该用数据集D重新训练模型,这个模型在训练过程中使用了所有m个样本,这才是我们最终提交给用户的模型。

另外,需要注意的是,我们通常把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常称为**“验证集”(validation set)**。例如,在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。

3.3 性能度量

对机器学习的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要有衡量模型泛化能力的评价标准,这就是性能度量(performance measure)。性能度量是衡量模型泛化能力的评价标准,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果。

在回归任务中,即预测连续值的问题,最常用的性能度量是**“均方误差”(mean squared error)**,很多的经典算法都是采用了MSE作为评价函数。
在这里插入图片描述

3.3.1 错误率与精度

错误率与精度既适用于二分类任务,也适用于多分类任务。易知:错误率+精度=1。

错误率(Error rate):分类错误的样本数占样本总数的比例;
精度(Accuracy):分类正确的样本数占样本总数的比例。
在这里插入图片描述
在这里插入图片描述

3.3.2 查准率(precision)/查全率(recall)/F1分数(F1 score)

错误率和精度虽然常用,但不能满足所有的需求,例如:在推荐系统中,我们只关心推送给用户的内容用户是否感兴趣(即查准率),或者说所有用户感兴趣的内容我们推送出来了多少(即查全率)。因此,使用查准/查全率更适合描述这类问题。对于二分类问题,分类结果混淆矩阵与查准/查全率定义如下:
在这里插入图片描述

  • 查准率/精确率/精度 P:表示被分为正例的示例中实际为正例的比例。
  • 查全率/召回率 R:召回率是覆盖面的度量,度量有多个正例被分为正例。
  • 对于**二分类任务(正例positive、负例negative)**有:
    • 灵敏度(sensitive):sensitive = TP/P,表示的是所有正例中被分对的比例,衡量了分类器对正例的识别能力。与召回率等值。
    • 特效度(specificity):specificity = TN/N,表示的是所有负例中被分对的比例,衡量了分类器对负例的识别能力。

为了进一步理解,下图的解释更详细。二元分类的**混淆矩阵(confusion matrix)**形式:在这里插入图片描述
查准率和查全率是一对矛盾的度量。例如我们想让推送的内容尽可能用户全都感兴趣,那只能推送我们把握高的内容,这样就漏掉了一些用户感兴趣的内容,查全率就低了;如果想让用户感兴趣的内容都被推送,那只有将所有内容都推送上,这样查准率就很低了。

“P-R曲线”正是描述查准/查全率变化的曲线,P-R曲线定义如下:根据学习器的预测结果(一般为一个实值或概率)对测试样本进行排序,将最可能是“正例”的样本排在前面,最不可能是“正例”的排在后面,按此顺序逐个把样本作为“正例”进行预测,每次计算出当前的P值和R值,如下图所示:
在这里插入图片描述
P-R曲线如何评估呢?若一个学习器A的P-R曲线被另一个学习器B的P-R曲线完全包住,则称:B的性能优于A。若A和B的曲线发生了交叉,则谁的曲线下的面积大,谁的性能更优。但一般来说,曲线下的面积是很难进行估算的,所以衍生出了
“平衡点”(Break-Event Point,简称BEP)
即当P=R时的取值,平衡点的取值越高,性能更优。

P和R指标有时会出现矛盾的情况,这样就需要综合考虑他们,最常见的方法就是F-Measure,又称F-Score。F-Measure是P和R的加权调和平均,即:
在这里插入图片描述
特别地,当β=1时,也就是常见的F1度量,是P和R的调和平均,当F1较高时,模型的性能越好。
在这里插入图片描述
有时候我们会有多个二分类混淆矩阵,例如:多次训练或者在多个数据集上训练,甚至是多分类任务,每两两类别的组合都对应一个混淆矩阵(很多分类任务论文的实验评估方法会用这种)······ 总之,我们希望在n个二分类混淆矩阵上综合考察查准率和查全率。那么,估算全局性能的方法有两种,分为宏观和微观。简单理解,宏观就是先算出每个混淆矩阵的P值和R值,然后取得平均P值macro-P和平均R值macro-R,再算出Fβ或F1;而微观则是计算出混淆矩阵的平均TP、FP、TN、FN,接着进行计算P、R,进而求出Fβ或F1。
在这里插入图片描述

3.3.3

很多机器学习是为测试样本产生一个实值或概率预测,然后将这个预测值与分类阈值进行比较,若大于阈值则分为正例,否则分为反例。这个实值或者概率预测的好坏,直接决定了学习器的泛化能力。根据这个实值或者预测结果,可以将测试样本进行排序,“最可能”是正例的排在最前面,“最不可能”是正例的排在最后面。分类过程相当于在排序中以某个“截断点”将样本分为两部分,前一部分判作正例,后一部分则作反例。ROC曲线正是从这个角度出发来研究学习器的泛化性能,根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值,分别以他们为横、纵坐标作图,就得到了ROC曲线(受试者工作特征 Receiver Operating Characteristic),它与P-R曲线十分类似,都是按照排序的顺序逐一按照正例预测,不同的是ROC曲线以“真正例率”(True Positive Rate,简称TPR)为横轴,纵轴为“假正例率”(False Positive Rate,简称FPR),ROC偏重研究基于测试样本评估值的排序好坏。
在这里插入图片描述
在这里插入图片描述
简单分析图像,可以得知:当FN=0时,TN也必须0,反之也成立,我们可以画一个队列,试着使用不同的截断点(即阈值)去分割队列,来分析曲线的形状,(0,0)表示将所有的样本预测为负例,(1,1)则表示将所有的样本预测为正例,(0,1)表示正例全部出现在负例之前的理想情况,(1,0)则表示负例全部出现在正例之前的最差情况。

现实中的任务通常都是有限个测试样本,因此只能绘制出近似ROC曲线。绘制方法:首先根据测试样本的评估值对测试样本排序,接着按照以下规则进行绘制。
在这里插入图片描述
同样地,进行模型的性能比较时,若一个学习器A的ROC曲线被另一个学习器B的ROC曲线完全包住,则称B的性能优于A。若A和B的曲线发生了交叉,则谁的曲线下的面积大,谁的性能更优。ROC曲线下的面积定义为AUC(Area Uder ROC Curve),不同于P-R的是,这里的AUC是可估算的,即AOC曲线下每一个小矩形的面积之和。易知:AUC越大,证明排序的质量越好,AUC为1时,证明所有正例排在了负例的前面,AUC为0时,所有的负例排在了正例的前面。
在这里插入图片描述

3.3.4 代价敏感错误率与代价曲线

上面的方法中,将学习器的犯错同等对待,但在现实生活中,将正例预测成假例与将假例预测成正例的代价常常是不一样的,例如:将无疾病–>有疾病只是增多了检查,但有疾病–>无疾病却是增加了生命危险。为权衡不同类型错误造成的损失,可为错误赋予**“非均等代价”(unequal cost)以二分类为例,由此引入了“代价矩阵”(cost matrix)**。
在这里插入图片描述
在这里插入图片描述
同样对于ROC曲线,在非均等错误代价下,演变成了“代价曲线”,代价曲线横轴是取值在[0,1]之间的正例概率代价,式中p表示正例的概率,纵轴是取值为[0,1]的归一化代价。
在这里插入图片描述
代价曲线的绘制很简单:设ROC曲线上一点的坐标为(TPR,FPR) ,则可相应计算出FNR,然后在代价平面上绘制一条从(0,FPR) 到(1,FNR) 的线段,线段下的面积即表示了该条件下的期望总体代价;如此将ROC 曲线土的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价,如图所示:
在这里插入图片描述

3.4 比较检验

常见的评估方法和性能度量标准可以根据数据集以及模型任务的特征,选择出最合适的评估和性能度量方法来计算出学习器的“测试误差“。但由于“测试误差”受到很多因素的影响,例如:算法随机性(例如常见的K-Means)或测试集本身的选择,使得同一模型每次得到的结果不尽相同,同时测试误差是作为泛化误差的近似,并不能代表学习器真实的泛化性能,那如何对单个或多个学习器在不同或相同测试集上的性能度量结果做比较呢?这就是比较检验。偏差与方差是解释学习器泛化性能的一种重要工具。

3.4.1 假设检验

在比较学习器泛化性能的过程中,统计假设检验(hypothesis test)为学习器性能比较提供了重要依据,即若A在某测试集上的性能优于B,那A学习器比B好的把握有多大。 为方便论述,本篇中都是以“错误率”作为性能度量的标准。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.2 交叉验证t检验

在这里插入图片描述
在这里插入图片描述

3.4.3 McNemar检验

在这里插入图片描述

3.4.4 Friedman检验与Nemenyi后续检验

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.5 偏差与方差

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
偏差-方差分解是解释学习器泛化性能的重要工具。在学习算法中,偏差指的是预测的期望值与真实值的偏差,方差则是每一次预测值与预测值得期望之间的差均方。实际上,偏差体现了学习器预测的准确度,而方差体现了学习器预测的稳定性。通过对泛化误差的进行分解,可以得到:

  • 期望泛化误差=方差+偏差
  • 偏差刻画学习器的拟合能力
  • 方差体现学习器的稳定性

易知:方差和偏差具有矛盾性,这就是常说的偏差-方差窘境(bias-variance dilamma),随着训练程度的提升,期望预测值与真实值之间的差异越来越小,即偏差越来越小,但是另一方面,随着训练程度加大,学习算法对数据集的波动越来越敏感,方差值越来越大。换句话说:在欠拟合时,偏差主导泛化误差,而训练到一定程度后,偏差越来越小,方差主导了泛化误差。因此训练要适度辄止。

参考:
https://github.com/Vay-keen/Machine-learning-learning-notes
https://github.com/RedstoneWill/HsuanTienLin_MachineLearning
https://github.com/fengdu78/lihang-code
https://github.com/SmirkCao/Lihang
https://github.com/Sophia-11/Machine-Learning-Notes
https://github.com/mml-book/mml-book.github.io
https://github.com/ctgk/PRML

发布了122 篇原创文章 · 获赞 94 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_39653948/article/details/104688667