(一)机器学习模型训练入门

发布于:2025-06-27 ⋅ 阅读:(17) ⋅ 点赞:(0)

机器学习笔记

一、机器学习模型训练入门

机器学习

机器学习的经典定义是从人工智能的发展角度提出的,旨在从人的经验中总结知识。1997年,Tom Mitchell在教科书中重新阐述了机器学习,即利用经验改善系统自身的性能

知识是通过经验凝练而成的,有了知识,我们做事能更快更好。机器学习旨在利用经验改善系统性能,人们不断尝试利用经验。但进行机器学习研究离不开计算机系统。任何经验在计算机系统中都以数据形式存在,因此机器学习要利用经验,就必须分析数据。从利用经验的出发点出发,研究分析数据的技术应运而生。如今,不同学科、领域都需要这些技术,使得机器学习变得非常热门和重要。

随着领域发展,机器学习主要研究智能数据分析的理论和方法。智能数据分析与传统统计学家、数学家所做的数据分析不同,它强调是从人工智能基础上产生,利用计算机来做数据分析的技术。智能数据分析可简单理解为用计算机算法进行数据分析。其重要性与前几年常说的大数据时代有很大关系。如今,人类收集、存储、传输、管理数据的能力大幅提升,每天产生大量数据。收集、管理数据后,自然希望利用数据价值。但数据本身不代表价值,需经过有效数据分析才能提取价值。

如今,这需利用机器学习。机器学习之所以重要,甚至在一定程度上超过了其原始在人工智能学科中的动机所产生的重要性,是因为对数据处理和数据分析的需求太大

典型的机器学习过程

我们现在可以用一张图来说明机器学习大概在做什么。

首先,我们收到很多历史数据,即已知结果的数据。假设我们要进行西瓜分类,将数据组织成表格形式,每一行对应一个对象或事件,每一列对应刻画对象或事件的属性或特征。例如,第一行表示一个西瓜的颜色是青绿色,纹理是蜷缩的。敲起来声音很浑浊,它是否是好西瓜呢?我们切开看过,它是好的,这就是已知结果。我们把关于结果的部分叫做类别标记,即label。请注意,label是一个术语,有些地方将其翻译为标签。从意义上讲,它确实是一个标签。但从翻译角度,因为label在英文中既可以用作名词,也可以用作动词,例如label一个样本。然而,在汉语中,“我们标签一个样本”是不通的。标记则既可以用作名词,也可以用作动词,因此我更愿意使用标记,或者强调为类别标记。当然,很多文献中也使用标签,这也是可以的。例如,第三个西瓜颜色青绿,纹理硬挺,敲声清脆,它是否是好瓜?我们切开看,知道它不好。这就是像刚才那两个例子中人看过、知道结果的数据。在我们的词汇中,这样的数据被称为训练数据

然后,我们经过训练过程,得到一个模型。在这个例子中,就是分类模型。得到这个模型后有什么用处呢?以后我们遇到新的数据,比如西瓜摊上还没切开的西瓜,它颜色是浅白色,纹理是蜷缩的,声音很浑浊,这个瓜好不好我们不知道。我们现在把这个描述输入给模型,模型就会给出一个输出。这就是刚才两个例子中所做的过程。

其中的关键是这个模型,我们现在所说的模型是一个抽象的概念。实际上,它可以理解为从数据中产生出来的东西,可以认为是一个神经网络,甚至认为是一条规则。在课程中,我们都称之为模型。但请注意,在一些其他的书籍或课程中,可能会有所区分。例如,在David Hunt写的一本书中,他提出适用于全局的称为模型,适用于局部的称为模式,即pattern。但这只是有些地方的说法,全局的叫模型,局部的叫模式。很多模式联系起来,也就变成了一个模型。因此,在我们的课程中,不做具体的区分。

从数据中产生出来,能够帮助预测未来事件的东西,我们都称之为模型从数据到模型最关键的一步是训练。所以这里需要用到学习算法。有说法称,计算机科学是关于算法的学问,从含义上讲,机器学习就是关于学习算法的设计、分析和应用。我们研究的核心是学习算法,而学习算法会直接影响我们获得什么样的模型。我们要关注的是模型的性质,即我们的结果,其性质很多时候来源于算法。而算法是否每次都能得到相同的模型呢?并非如此,因为算法应用于数据上,所以将这几方面联系起来,我们才能了解整个机器学习的过程,以及最终能得到什么。

这是大家在在学习过程中需要体会的,算法针对什么样的数据是有效的,这样的数据需要满足什么特点,以及它产生的模型在什么情况下会有效,这样的模型本身具有什么特点。这些都是大家特别需要去了解和把握的。在这个过程中,我们可以看到,刚才是在做分类,在现实生活中,我们遇到的各种各样的分类、预测、预报任务,如果抽象来看,在计算机帮助下,用数据驱动的方式解决,背后都在做这件事。

机器学习理论

机器学习适合解决哪些问题?这个要解决的问题一定是一个高度的不确定的、高度复杂性的、甚至你连怎么去做都不知道。

机器学习绝非瞎猜,其有坚实的理论基础,最重要的是Leslie Valiant教授在80年代建立的计算学习理论,为机器学习奠定了理论基础。因此在2010年获得了图灵奖。其中最重要的理论模型是PAC模型,即概率近似正确

我们现在建立一个模型,给定一个数据样本x,我们有一个模型f,f会对x进行判断,得到f(x)。我们希望f(x)非常接近真实结果y,如何表达这种准确性呢?我们希望f(x)与y的差别小于一个很小的数ε,例如0.0001,这已经非常准确了;如果差别为零,那绝对是准确的。我们希望得到这样的f(x),但并非每次都能得到,而是以很高的概率得到。这个概率应该大于等于1减去一个很小的数δ。如果δ非常小,概率就非常接近于1;如果德尔塔是零,就意味着每次都能得到。

理解这个式子后,应问两个问题:为什么我们不追求等于零?为什么是一个概率,而不是每次绝对能拿到?关于这两个问题,我们需要理解机器学习和人工智能所研究的问题的性质。机器学习通常在解决高度不确定、高度复杂的问题,甚至不知道如何解决。例如,故障诊断就是一个这样的问题。假设我们已经清楚地知道故障诊断的一个指标:温度高于90度就会出问题。这是一个确定性的规则,告诉我们一旦高于90度,就会出问题,这是确定的知识、规则或公式。

但在很多问题上,我们并没有这么清楚的知识,可能温度高于90度会出问题,低于90度也会出问题,而且很多因素共同作用才产生结果,而这些因素如何产生结果,我们并不清楚。当我们的知识无法精确给出结果时,我们会从数据中分析,希望从数据中获取答案。此时,我们不能期望结果绝对准确,因为这不是一个我们清楚了解的问题。大家注意,这仅是从问题性质方面的理解。

第二方面,我们从计算要求的角度来理解。无论是学习人工智能还是计算机的同学,都应该学过算法。在计算机学科中,甚至在数学领域,都非常关心一个问题:P是否等于NP。我们必须要有这样的观念,明确当前考虑的问题是什么性质。P问题是什么?是在多项式时间内能找到问题的解。粗略且不精确地来说,P问题是判定问题。实际上,还有更严格的定义。在多项式时间内,给定一个问题,你能找到其解。NP问题则是在多项式时间内,给定一个解,你能判断它是否是解。那么,大家想想,机器学习研究的是什么样的问题呢?

以谷歌搜索为例,你提供一个查询关键词,它给出搜索结果。但是,你能否在多项式时间复杂度内得到最佳结果?甚至,你能否在多项式时间内判断它是否是最优的?实际上,我们经常处理的问题难度已经超出了NP问题。大家能理解这一点吗?也就是说,我们经常处理的问题,即使给了你解,你也无法在多项式时间内验证解的优劣。这会导致什么问题呢?如果我们的要求过于苛刻,比如要求每次运行都能得到确定的最佳答案,那实际上就是在构造性地证明P等于NP,甚至包括P之外的所有问题。

能理解吗?这是从计算的角度去理解。为什么我们做不到绝对准确呢?既然无法做到,那我们就退一步,希望结果尽可能地接近。虽然还不是绝对接近,但如果再放宽要求,比如多次运行中,有多少次能做到,那就很好了。所以,在机器学习的学习中,大家一定要牢记,我们是以很高的概率得到一个很好的模型,这基于两个前提,即概率近似正确

基本术语

现在我们先看训练数据部分,会遇到很多术语。这一列是关于yes or no的术语。

首先,这些术语很容易理解,我们拿到的所有数据构成了一个集合,即表数据或训练数据。刚才说了,我们拿到的数据用来建立模型,建立模型的过程称为训练。现在有一个词叫测试,测试指的是什么呢?测试的英文术语是Test。它是指拿到模型后,给一组新的数据,用这个数据去判断该模型判断是否正确。使用模型还会衍生出两个含义:一个含义是,模型做好之后,想判断模型有多好,就用另外一部分数据进行测试。这就像给大家上课,一个学期后考察大家学得好不好,最后出一套考题,大家在这套考题上做,我来判断好坏。

有两件事要把握:第一,测试是为了了解模型的性能,所以测试数据的结果我是知道的,就像卷子的答案我一定是知道的,否则没法评分。同时,为了得到比较客观的结果,这些题目应该一开始没有给过你们,不能说考试前一周说,大家看我这有30道复习题,搞完了最后考了100分,是不是全会了呢?不是,你只会了这30道题,这是一个过于乐观的测试。所以我们通常在测试时,测试数据和训练数据应该是分开的,这两者应该是不等的。测试数据是我一开始就留出来的,这是我们对测试数据的要求。测试是把模型拿来用,这个用既可能是考察模型好不好,也可能是给一个输入让模型给出结果,这就是测试。

第二,我们要理解一个词叫Instance示例。我们看这个表的这一行,前面部分是在描述输入部分,如颜色、纹理等,最后有一个结果是示例,示例只包括前面的部分。比如看西瓜颜色青绿色、纹理清晰、形状蜷缩,这就叫instance。如果我把这个好不好给你,这就叫example样例所以example是有结果的,instance是没有结果的,这是两者的区别

sample样本这个词比较含糊。有时候我们会说这一条就是一个sample,有时候我们会说整个拿到的数据集是一个样本,因为可以想象拿到的数据集是所有可能数据中的一个采样,我们把它叫做一个样本。所以这要根据上下文来理解。

属性是指什么?这里面的颜色是青绿色,这个颜色就叫一个属性。有时候我们也把它叫一个特征,属性的英文是attributes,特征是feature。属性值是什么呢?比如这个颜色是青绿色,那西瓜这个部分是青绿,这就是它的属性值,是在这个属性上的取值。

接下来我们有个词叫属性空间,这是怎么理解呢?我们将每个属性视为坐标轴,例如颜色轴、根蒂轴和声音轴。此时,任何西瓜若用这三个属性描述,都会在空间中对应一个点。从代数角度看,这即为一个向量。因此,我们称之为特征向量,而属性所张成的空间,我们称之为属性空间。同时,我们也可称之为样本空间,因为所有样本均存在于此空间中。所以,我们也称之为属性空间、样本空间或输入空间,以及相应的特征向量。

我们刚才已解释,此外,我们还有标记空间或输出空间。这意味着输出,例如,若仅为yes和no,则可视为标记。但实际上,现实问题更为复杂。例如,进行多元回归时,每个轴都代表一个实值,此时输出也是一个标记。这就是输出空间中的一个向量。

关于模型部分,大家需理解:所谓的模型,实际上是我们找到的某种规律。例如,若找到颜色为青绿色、耕地蜷缩且敲起来声音浑浊的西瓜即为好西瓜,这便是一个规则。若将此规则视为模型,则它揭示了关于好西瓜的规律。模型实际上揭示了我们要判断的结果的规律。这个规律可能是显式的,如颜色青绿色等条件;也可能是隐式的,如神经网络。但无论如何,只要给它西瓜,它就能判断好坏。因此,模型本身包含了一个规律。但这个规律是否一定正确呢?不一定,因此实际上形成了一种假设。每个模型都对应着关于西瓜好坏的一个假设,我们称之为hypothesis。当我们提到hypothesis时,应理解为指我们学到的模型。对于一个问题,我们可以形成多个hypothesis。真正的真相,我们称之为ground truth。实际上,我们要学习的是:例如,若abcd等条件代表好西瓜,而其他条件代表坏西瓜,那么这就是ground truth,即正确答案。假设模型学到的是一个关于结果的可能规律,该规律不一定正确,若正确则为真相。以刚才的问题为例,|f(x) - y|在模型中的f(x)是我们的假设,即学到的假设,而y就是 ground truth则是真相。通常,当我们收集到数据(x、y)时,x通常被写成向量的形式,作为输入,y则是样本x的ground truth。因为y是关于样本真实结果,即样本是真的还是假的,是好的还是坏的,所以真实的结果被称为ground truth。

接下来,我们讲学习器。在书中或课程中,学习器可以理解为学到的模型,这是从学习的角度考虑的。当给定一个学习算法、数据和参数设置时,它产生出的就是模型。因此,从这个角度来看,学习器是一个学习算法对数据参数给定后的实例化结果。粗略地说,分类的模型被称为分类器,回归的模型被称为回归器。这里我们统一称为学习器。

接下来,还有几个关于输出部分的术语。如果输出是离散的,如yes或no,则称为分类;如果输出是连续的,如0到1之间,则称为回归。有时,分类可能是二分类,如好坏,也可能是多分类,如大中小三类。二分类是研究的最基本问题,因为所有多分类问题都可以分解成若干个二分类问题。因此,分类问题是机器学习研究的最基本问题。其他问题可以通过扩展分类问题得到类似结果。在学习机器学习这门课时,我们讨论的大多数算法都是以分类为例,特别是以二分类为典型。在二分类中,涉及两类样本,如西瓜和不好的西瓜。我们通常称一类为正类,另一类为负类。但请注意,负类不一定指不好的西瓜。不一定。你也可以把坏西瓜当成正类,这只是对类别a和b的抽象说法。抽象后,a可以是正的,b可以是负的,或者a是负的,b是正的。我们通常假设这两类是可交换的,这个假设非常重要。

可交换意味着这两类满足的分布和很多性质是相似的。例如,在数据集中,这两类的比例应该差不多,比如100个数据中,50个是a,50个是b,那么ab正负可以交换。但如果有一类特别多,另一类特别少,交换后性质就会发生变化。还有几个术语是关于我们考虑的学习任务,如监督学习(带标签)无监督学习(无标签)。监督学习有时也被称为有导师的学习,无监督学习有时被称为无导师学习。

在数据中拿到样例的结果部分,我们未获取到该部分,即无监督学习部分,仅有部分监督学习数据。也就是说,拿到的数据里没有期望结果的是无监督学习。大家会提到,监督学习很清晰,比如有很多西瓜,有好的和坏的,通过判断来确定未来西瓜的好坏,这是监督学习。而无监督学习则是给定一堆西瓜,好坏不告知,那么能做什么呢?难道还能判断什么是好,什么是坏吗?连好坏是什么都没被告知,显然无法判断好坏了。那这时能怎么做呢?可能做的是把这些西瓜分成很多堆,比如根据颜色、产地、大小分成不同堆,这就是聚类。分成很多堆之后,可能再做进一步的处理,这就是非监督学习。所以大家现在要知道,我们输出结果时不知道的,这是在做非监督学习,监督学习的典型任务是预测和分类回归,非监督学习的典型任务有哪些呢?类似于离散类别的聚类,我们把数据分成若干个离散类别,也有可能处理连续数据,即在做密度估计,判断什么样的数据更多,什么样的数据更少。比如判断在座各位同学的身高分布,哪些地方特别多,哪些地方特别少,这就是密度估计。

还有一个非常关键的点,机器学习要处理的是未来的新数据,不是仅仅做好模型,而是要把未来数据也处理好,这属于模型训练好之后,模型的应用阶段。我们通常说叫unseen instance,即未见样本。为什么能处理新的、未见过的数据呢?我们有一个基本假设,即拿到的所有数据都来自一个潜在的分布,实际上假定了数据背后有一个规律,我们看到的数据都是从这个规律中抽出来的。所以数据一定符合这个规律,只不过训练数据是从所有数据中获取的一部分,而未来要判断的数据同样也是从这个分布中来的。所以通过训练数据,把整个分布把握得比较好,新的数据就能处理好了。这是我们机器学习的基本假设,它不是随便给未来什么东西都能做,而是假设未来要处理的数据和原来的数据来自同一个分布。而这个分布是什么,我们不知道。我们把它叫做未知分布,然后有一个重要假定,所有数据都是从这个分布来的,这叫做独立同分布。每个样本摘下来都是满足独立同分布的,它们都是独立的,且从同一个分布产生。这一点为什么重要呢?如果这一点不满足,机器学习无法利用概率统计提供的工具。除非我们认为每个样本都是独立同分布抽取的,这样每个样本可视为独立随机事件,其出现频率可逼近概率。若不能假定样本为独立同分布,则无法用独立随机事件出现的频率逼近概率。

从统计推断其原始概率分布的工具本身就要打问号,这会带来巨大障碍。目前所有学习都基于独立同分布的假设,但现实中未必如此。例如,第一个客户在淘宝买帽子,第二个客户在淘宝买珠宝,他们是否真的是独立同分布?他们不一定独立,第一个人可能是第二个人的朋友,第二个人是因为第一个人告知才在淘宝购买,此时不能用独立同分布建模。这方面的研究是机器学习最前沿的内容之一,如何突破独立同分布的假设,往往需要引入现代数学技术或对原有概率统计技术进行改进。作为入门课程,大家需了解这些事情,但基础仍需从独立同分布开始,即每个样本可视为独立随机事件。

最后一个词是泛化,泛化指模型处理新数据的能力,能力越强,泛化能力越强,可理解为推广。泛化有对应术语specialization泛化是从特殊到一般,特化是从一般到特殊。我们常强调模型的泛化性能,即模型处理新数据的能力。以后关心的重点是得到处理新数据能力强的模型。泛化实际上指模型对新数据的处理能力。理论上,有时需推导泛化界即模型误差的最小可能值。若发现最好结果都无限差,则说明此事无法用机器学习解决。机器学习的基本理论会告诉我们哪些事不能做,例如泛化误差在最好情况下不小于50%,则不应花钱去做,因为与随机猜测无异。若最好能做到0.2,则可努力设计有效算法,但并非一定能做到,只是有可能。这是理论对我们的指导,告诉我们哪些事不能做,哪些事通过努力可能做到什么程度。

归纳偏好

机器学习算法在学习过程中必定需要某种类型的偏好,这里要介绍一个非常重要的概念,称为inductive bias,即归纳偏好(偏好及模型权重)。该词直译为“偏好”,表达的是对某一事物有特别的喜好。考虑一个简单情况,只有两种可能,一种是a,一种是b。对于具体的学习算法,当a和b都能完美地解释训练数据时,算法必须做出选择。

由于不同的学习算法在面临这种情况时的选择不同,这导致了算法之间的差异。虽然各种学习算法在形式上可能差异很大,如决策树、神经网络、支持向量机等,但本质上都需要做出某种选择,即相信哪种模型更好或哪种假设更合理

通常采用的最基本准则叫奥卡姆剃刀准则,这一准则在自然科学和工程学中都是最基本的研究方法论。其基本想法是“若非必要,勿增实体”。简单来说,当我们发现多个假说或模型都能完美解释观察时,我们选择最简单的。在物理学和化学中,当多种理论能解释实验现象时,我们认为最简单的就是好的。在机器学习中,训练样本可视为现实世界反映出来的现象。如果有多个模型都能很好地解释这一现象,我们选择最简单的模型。例如,在当前问题中,我们很可能选择a这条更平滑、更简单的曲线。因为写出其函数方程式时阶数可能更低,所以我们倾向于选择它。这一思想在机器学习中非常重要。

许多算法在取舍时,通常偏好更平滑、变化不极端的结果。但如果事情这么简单,我们就无需过多追究。然而,需要注意的是,最简单的一个并不总是那么明显。事情本身并不简单。例如,考虑一个曲线方程,y=ax^2+bx+c这是一个曲线方程。另外,y=ax^3+c,这也是一个曲线方程,一个是二阶,另一个是三阶,可以说二阶的更简单;但也可以从另一个角度看,前一个方程里只有a和c两个系数,可能更简单。到底哪一个更简单呢?所以,这本质上不是一个简单的问题。

在机器学习里,特别是涉及不同模型时,模型背后的假设什么是更简单的不一样,这并不容易判断。所以我们虽然有这样一个简单的准则,但大家要注意,在实际应用中,情况变化太多。这就导致机器学习里有那么多算法,这些算法采用不同的假设和偏好。大家经常会问,什么样的算法比较好。最关键的一点是,学习算法的归纳偏好是否和问题本身匹配,实际上决定了这个算法在这个任务上的表现。如果搞机器学习时间长了,不会说哪个算法好,而会说真正起作用的不是算法,而是背后的假设。你的商品是什么?实际上是说你的偏好是什么?这个偏好是否和当前问题更合适?比方说,当我们要考虑一个故障诊断问题时,如果这个故障很长时间都不太可能出现,那么两个方法都可能选用。如果有一个方法非常频繁地发生变化,那么这时我们可能应该选用另一个。实际上,你的偏好和当前问题更匹配,我们必须要对问题有一个清楚的认识。

NFL定理

当有两个算法时,能否判断谁比谁更好?

例如,在拥有五个训练数据点的情况下,两条曲线均能完美穿过。从训练数据来看,两者表现一致。若询问a和b哪个更好,很可能最简单的、最平滑的算法更好,因为未来测试样本可能是未出现在训练数据中的,该算法能完全穿过,因此a更好,b不太好。但是否存在这种情况:测试样本点恰好未出现在a上,而出现在b上,此时b似乎更好?我们难以判断哪种情况更可能出现。即,有时a算法更好,有时b算法更好,这个结论究竟是巧合还是必然结果?

机器学习中有一个非常重要的定理,“没有免费的午餐”。在我们这个领域,这是一条定理,简称NFL,全称可译为“没有免费的午餐定理”,名字很有趣。但它具体说的是什么呢?它指的是,如果一个算法la在某些问题上比另一个算法lb好,那么必然存在另一些问题上,lb会比la好。即,两个算法,如果有些问题上a比b好,那么一定存在另一些问题上b比a好。这听起来很有意思,因为任何事物都可以作为算法,随机猜测也是一种算法。比如,让你分类,你什么都不做,随机猜测,这也是一种算法。结果,一个非常巧妙设计的算法,在有些问题上可能比随机猜测好,但在另一些问题上,随机猜测可能更好。然而,在现实中,我们做机器学习时,必须针对具体问题来考虑。只要算法能在特定问题上表现好就行。例如,如果我们考虑出行问题,比如去北京新街口,坐飞机更好;而到南京新街口,骑车则更好。因此,必须针对非常具体的问题,才能讨论算法的好坏,否则无法判断。因此,脱离具体问题空泛地谈论哪种学习算法更好是没有任何意义的。比如,询问现在机器学习有什么最好的算法,并要求尝试,这是完全错误的。可能在你的问题上表现非常好的算法,恰恰是大家认为非常拙劣的算法,这种情况完全可能。大家现在都公认很好的算法,在你的问题上可能恰恰不适用。现在很多流行的算法,意味着对较多问题做得比较好,但绝非所有问题都适用。在实际应用中,往往需要考虑特殊问题,因此我们要具体问题具体分析,只有明确要解决的问题,才能考虑什么算法更适合。这点大家要明白。

第二点,大家要明白的是,在做机器学习时,这个问题和一般人理解的不同。比如一般人理解分类和推荐是问题,但在我们这一行,这还不叫一个问题。只有输入域X和输出域Y都确定,需要找到f:X→Y时,这才是一个问题。比如推荐问题,腾讯推荐游戏和淘宝推荐衣服就是不同的问题。因为用来刻画它们的属性完全不同,意味着获得的数据和面临的数据分布也完全不同,而在数据分布上,建模可能用到的技术就需要不同。所以大家要理解,当我们谈到问题时,心里一定要明确x是什么,y是什么,只有x和y都确定了,这才是一个问题。X是我们的输入空间,Y是我们的输出空间。如果不谈x不谈y,只是泛泛地说分类或推荐,这对我们搞机器学习的人来说,这还不是一个问题。这个意思大家要记在心里。

那么好了,下面我们来看一看学机器学习要学什么呢?很多人谈机器学习就会说,里面有很多算法,有没有把算法学会。确实,很多机器学习的书籍都是这样。我在十几年前的一个报告里说过,十七八年前,我看机器学习这本书时,和看传统的物理、数学学科的书非常不一样。比如数学,一开始会告诉你一些基本的假设,这是公设。比如两条平行线、平行公设等等。在这个基础之上发展出很多很多东西,好像是一个体系。而在机器学习里面好像不是这样的,我们先讲某一大类的东西,比如决策树,又讲一大类东西,神经网络,又讲一大类的支持向量机,这就会给人一种感觉,说机器学习里面是不是就是这些算法?很多种算法,那这样的话,我把每种算法都搞熟悉了,不就好了吗?但其实有了刚才这个认识,大家就要知道了,所谓的这十大算法、二十大算法,一些基本的招数和套路,比方说我们就说十个算法吧。那么“没有免费午餐”定理就告诉我们,对每一个算法一定有它非常不擅长的问题。那是不是这个不擅长的问题,就全部被这十个算法全部覆盖到的,绝不可能。我们现实世界里面碰到的问题是各种各样、形形色色的,甚至可以说是无限的。你用这种有限数目的算法去应对无限的问题,那肯定在大多数时候是不好的。

有的企业里,一些工程师学习一段时间后便尝试所有著名的十个机器学习算法,但发现效果不佳,便认为机器学习不可靠,这是一种错误的认识。实际上,学习十大算法或二十大算法,就像学习降龙十八掌和打狗棒法,并不意味着能解决所有问题。当遇到新问题时,我们更需要的是按需设计、度身定做。根据问题的特点,这些特点可能是以往算法未曾考虑过的,专门设计出一个解决方案,这往往才是最好的方法。这就像降龙十八掌和打狗棒法虽好,但并非万能,我们仍需学习其精华。在解决一些问题时,与企业合作时,工程师常问我们最终用了什么算法。其实很难说这是一个已存在的算法,它可能结合了神经网络的形式、支持向量机对某个问题的理解,以及决策树的思想方式。这有点像无招胜有招,但前提是必须先掌握这些招数。只有先了解这些,才能在需要时灵活运用。因此,一开始学习时要掌握这些套路,但最终解决问题时,最重要的是按需设计、度身定做。就像裁缝根据每个人的身形来制作衣服一样。如果没有足够的资金去聘请高明的裁缝,那就只能到商店里买成衣,但那些是别人已经做好的,只有大号、中号、小号可供选择,试穿后觉得差不多就穿走,但这可能已经不是最好的解决方案了。

泛化能力

我们要学一个好的模型,但什么模型好呢?这个问题不易回答。我们希望模型能很好地适用于未见过的样本,即unseen instance。但什么是“好”呢?

你可能有一个基本理解,比如错误率低、精度高。做100次,如果能做对99次,就比做对80次要好。但问题并非这么简单。比如,在推荐场景中,若你是淘宝电商,希望机器学习系统能做好推荐。若我手机上只看到五个东西,且都是我想要的,就满足了需求。至于第六个及以后是否好,我不关心。但对另一个人来说,若他在电脑上能看到15个,前五个好还不重要,前15个都好才行。

这两个结果完全不同。当然,我们最希望的是一个东西对所有标准都好,但这太困难了,甚至大多数情况下不可能,或代价太昂贵。所以我们要做的是搞清楚你到底要什么,然后给你。我们不用关心对别人来说好不好,这与我们刚才说的no free launch思想一致。若你只关心前五个推荐是否正确,就不用关心第六个及以后的推荐。

这实际上是我们做机器学习的人在看待问题上的一个世界观或方法论。大家对一门学科深入之后,会觉得这门学科看待问题有自己的角度。很多人认为做机器学习就是给数据就跑算法,出结果,若结果不好就再给一个。其实并非如此,我们通常会先搞清楚你到底要什么,只有明确了这一点,才知道要给你什么。

所以模型评估和选择需要解决两个问题:一方面要知道你到底要什么,另一方面要知道给的是不是你要的。这两个问题从技术表现形式上看,可能拆解为更具体的技术问题。总的来说,我们要知道一个模型的泛化能力强,对新的未见数据的处理能力强。但问题是,就算知道你想要什么,若手上没有未见数据,怎么知道给的东西在未见数据上表现特别好,真的是你想要的呢?

过拟合与欠拟合

我们要引进几个概念:泛化误差和经验误差。我们知道,我们需要的是模型在未来数据上表现良好,即泛化能力强。这是机器学习的核心,并非仅在训练数据上表现良好。如果只需在训练数据上表现好,我们无需做任何事,只需存储数据即可。我们要求的是在新的、未见过的数据上表现良好,这种性能称为泛化性能,刻画其误差的称为泛化误差。另外,我们给出的数据称为训练数据经验数据,在训练数据上产生的误差称为训练误差。要知道,训练误差是我们能直接面对的。例如,我们有一个包含四条样本的数据集,如果全部预测正确,则训练误差为零,训练集精度为100%。但此时泛化误差是多少我们并不知道。我们能控制的是训练集上的结果,但我们的目标是未来的结果。因此,我们必须在这两者之间找到某种联系。如果两者完全没有联系,机器学习学科就不复存在,因为给出的结果与未来完全无关。也就是说,只有未来的数据和现在的数据遵循相同的规律时,我们才能期望建立一个好的机器学习模型,我们必须在这个假设下工作,即新数据和已有数据遵循同一规律

第二,我们如何知道根据已有数据找出的模型是否真正发掘了隐含规律?这是我们现在要考虑的问题。我们能控制经验误差,那么是否在训练数据上误差最小就意味着我们真正找出了隐含规律?换句话说,经验误差是否越小越好,训练误差是否越小越好?很遗憾,答案是否定的。为什么呢?因为在机器学习中会出现一个问题,称为过拟合。有的地方也将其翻译为“过配”,因为“fit”本身就有匹配的意思,所以这两种翻译都可以接受。

大家要把过拟合这个概念记在心里。那么,过拟合是什么呢?我给大家举一个例子,这很容易理解。假设我们有一个训练数据集,这里只有两片树叶。我给一个算法,让它学习一个模型,这个模型要做什么呢?就是今后我给它一个东西时,它能判断是不是树叶。大家明白了吧?训练数据是这两片树叶,训练出一个模型,以后我给你一个新东西,你告诉我它是不是树叶。

现在我们训练出一个模型,这个模型能力特别强。它甚至发现,比如这个树叶有锯齿,而这两个没有锯齿,所以当我们给它看没有锯齿的树叶时,它说这不是树叶。为什么呢?因为这两个树叶没有锯齿。其实这就是在发生过拟合,它在学习训练数据中的特性,而这些特性恰好不是普遍规律。比如我们现在拿到的这两片训练树叶都有锯齿,这是训练集所满足的一个特有性质。但这个特有性质并非一般规律,我们的模型却错误地将其视为一般规律,认为所有树叶都有锯齿,这就叫过拟合。反过来,还有一种叫欠拟合的情况,即有些重要的东西还没学出来,比如模型发现两片树叶都是绿色的后,拿一个绿色的东西就认为它是树叶,这就叫欠拟合。一开始我们什么都没学到,这就是欠拟合,会犯错误。但有时候我们学到了太多不该学的东西,这就是过拟合。

所以我们在学习时经常会看到U形曲线,按学习进程来看,这是一个误差变化过程。一开始误差会非常大,因为还没学到什么东西;随着学习进步,性能逐渐变好,误差逐渐下降,这一阶段是欠拟合。但当我们学到一定程度后,再继续学下去。就可能会把训练数据里的特性,包括一些不该学的东西都学出来,这时模型就会变坏,出现过拟合,这是在未来数据上的表现。而在训练数据上,训练误差好像一直在下降,但在测试或考虑未来时,一开始是下降,到了后来却上升了。这告诉我们训练误差并不是越小越好。当训练误差太小时,可能已经把不该学的东西学进去了。那我们真正应该学出来的是什么呢?

很清楚,我们应该在这个地方给出现在的结果。但问题是怎么判断应该停在这里,给出结果。没有完美的解决方案,这是个一般的结论,而且以后也不要指望有完美的解决方案。为什么呢?很容易想,如果有完美的解决方案,就意味着我们能确定最好的模型并给出。这相当于把一个甚至比NP问题还困难的问题在多项式时间里用算法跑出一个结果,即把最好结果给出。其实你已经构造性地证明了P等于NP,甚至P等于更难的问题。所以只要我们相信P和NP是不等的,就不要指望有完美的解决方案。所以我们的机器学习始终在和这件事做斗争。而不同的算法在用不同的机制与这件事做斗争。换个角度想,如果过拟合现象不存在,那么机器学习这个学科还需要存在吗?也不需要了,因为有一个训练集就足够了。在训练集上使模型达到零误差即可,这是理想情况。此事并不复杂,无需专门学问研究如何达成。

需铭记,过拟合是机器学习的核心问题。从这一角度看,所有算法和技术都在缓解,注意是缓解,而非解决过拟合问题。未来学习具体算法时,应思考两个问题:该算法如何工作,它依靠什么缓解过拟合?缓解过拟合的策略在何种情况下会失效?若能清晰回答这两个问题,便已把握要点。需明确该算法适用场景,这是学习新算法时的根本问题,应时刻牢记并自问:这套方法如何缓解过拟合?了解该缓解技术在何时失效后,便知在何种情况下不应使用该技术。

三大问题

既然有了过拟合和欠拟合的理解,我们现在回到之前的问题。首先,我们需要明确想要的结果是什么。其次,要考虑如何得到这个结果。这对应到我们要考虑的几个问题。

第一,拿到一个模型后,如何评估其在未来的表现?关键是我们没有未来的数据,即unseen data,那么如何知道模型在未来的表现呢?这就涉及到评估方法。由于没有未来的数据,我们如何评估模型在未来的表现?需要设计一种评估方法。

第二,性能度量指的是我们真正需要的是什么?并不是做100次或99次就足够了。例如,在信用卡欺诈检测问题中,100万次交易可能只有十次欺诈。如果一个模型对所有交易都预测为非欺诈,其精度可达99.9%,但这个模型是我们所需要的吗?绝对不是。因为它无法检测出欺诈交易,所以做100次对99次并不足够。我们必须理解任务可能有哪些刻画标准,以便在碰到新问题时,甚至可能自己发明出最适合该问题的度量标准。但首先,需要了解以前有哪些度量标准。

第三,我们都知道机器学习做的是概率近似正确。我们得到的模型在概率意义上可能是好的,但有没有可能某次表现得特别好,而在大多数情况下表现糟糕?如果仅凭一次就信任模型,结果在实际使用时却是在大多数情况下表现糟糕,那就麻烦了。因此,我们还需要引入一些比较检验,在统计意义上评估模型的好坏。在第二章中,我们要解决这三个具体技术问题。解决这些问题后,就会明确自己想要的是什么。如何保证给出的解决方案就是所需要的?

接下来,我们将逐一梳理这三个问题,大家明白这三点即可。虽然书中列举了很多内容,但只是想告诉大家有哪些可能性,并非所有可能性都包括在内。在未来工作时,你们可能面临各种可能性,很可能需要发明一些东西。发明这些东西的思路是什么呢?可以从这些原始的方法中衍生出来。明白我的意思吗?比如,我告诉你们有一些性能度量,书上和课上提到了十种度量方法,那你们是否认为在以后的所有任务中只有这十种度量呢?可能不是。你可能需要根据自己的任务新发明、新设计一种度量方法。而如何设计它呢?你可以从已有的方法中得到一些启发。明白我的意思吗?我们现在一步一步来,继续前进。

评估方法

第一个问题是,我们如何获取测试结果?需注意,我们仅有一个用户提供的训练数据,但需判断该模型在未来的表现。那么,我们如何得到这一结果?

关键问题在于如何获取测试集?测试集代表未来我们未见过的数据,即训练时未见过的数据。首先,需遵循原则,测试集应与训练集互斥。若训练时给出30道题,测试时从中挑选10道题,测试结果会过高估计模型能力,这不是恰当的估计。因此,测试集应与训练集完全不同,才能客观评估模型结果。但问题在于,我们手上只有一个数据集,应如何处理?首先,需了解常见方法,主要有三种:第一种是留出法,第二种是交叉验证,第三种是自助法

第一种留出法非常简单,假设训练数据有100个样本,将其分为两部分,一部分用于训练,另一部分用于测试。例如,从100个数据中取80个训练模型,用20个测试模型表现。这就是最简单的留出法。使用留出法时,需注意以下几点。

第一,需确保训练集和测试集数据分布的一致性。例如,在进行两类分类时,若训练数据有50个好瓜和50个坏瓜,则训练集的80个瓜中应包含40个好瓜和40个坏瓜。另外,测试的20个瓜中应包含10个好瓜和10个坏瓜。绝不能出现训练集80个瓜中50个好瓜都在,而测试集20个瓜却全是坏瓜的情况,否则测试结果将不准确。这种根据类别均匀分布的采样方法称为分层采样

第二,大家都知道,从100个样本中切出20个用于测试,每次切分方式的不同会对结果产生很大影响。例如,一次切分可能得到一个误差估计为1。下次切分可能得到不同的误差估计如2。这两个结果很可能不一致,因此不应轻信任何一个,而应多次重复实验,求平均值。通常,进行这种可靠的测试需要重复100次,以确保随机切分导致的差异被平均掉。否则,性能差异可能是由于切分不同导致的,不同切分得到的模型本来就不一样,更不用说用不同测试集进行测试也会导致结果不一致。因此,需去除数据切分造成的影响。

第三,测试集的大小需适中,既不能太大也不能太小。这里需理解holdout测试的缺陷是什么。假设这是完整的数据,包含100个样本,我们训练出一个模型,命名为M100。我们希望评估其未来性能,即error100,但此值无法直接获得,尽管相关值可获得,但该值本身也无法直接获取。目前我们进行如下操作:假设数据分为80%和20%两部分,我们基于80%的数据训练模型M80,并使用M80对error80进行估计。此后,我们使用此模型进行近似计算error100,但这里存在一个问题。如果测试数据使用过多,则训练的模型将偏离最终实际使用的模型。实际上,我们最终应使用全部100个样本训练的模型。然而,你使用80个样本训练的模型,并声称此模型在特定算法上表现良好,但这并不确定。可能80个样本时此算法表现最佳,但使用90个样本时,另一个算法可能更好。因此,我们实际上是在使用此模型近似其性能,随着训练样本数的减少,近似能力会下降。最理想的情况是使用全部100个样本进行训练,因此训练样本数不能太小,否则近似能力会越差。另一方面,测试结果的准确性与测试集的大小有关。测试集越小,测试结果可能越不准确。实际上,我们希望测试集能大一些,以提高测试准确性。然而,这里存在不可调和的矛盾。通常,我们采用经验方法,使用20%或三分之一的数据作为测试集,其余数据用于训练。如果测试集过小,如使用一半数据,则训练集与测试集的差异可能已很大。假设我们有两个算法L1和L2,经过测试后发现L1的error小于L2,此时我们应如何选择?我们选择L1算法,认为L1在此数据集上表现较好。但并不意味着我们可以直接将此模型交付给用户。确定算法后,应使用所有数据重新训练L1模型,然后将最终模型交付给用户。因此,训练-测试过程实际上只是起到选择算法的作用,选定后应合并所有数据重新训练模型,再提交给用户。这是holdout测试的基本流程。

第二种方法是考虑后道测试的一个问题:在训练和测试过程中,可能存在永远未被使用到的数据。例如,每次随机挑选20%的数据作为测试集,即使挑选100次,也可能有数据被遗漏。也有可能这个数据永远没出现在测试数据集里面,而未来处理问题时,这样的问题其实挺重要。若未测试过,未来可能很糟糕。比如这门课有100个知识点,其中两个知识点很重要且常用,但我每次随机选十个或二十个来测试。那两个重要知识点可能未被测试到,导致性能非常糟糕,最终得到的是过于乐观的估计。解决实际问题时发现那两个知识点一塌糊涂,就有问题了。最理想的是所有知识点都已全面检查,模型在训练集中的所有数据性能都已考察,这样下面的做法就能解决这个问题。这叫k折交叉验证法,“fold”也翻译成“背”或“折”,这是翻译差异。

先看其做法,假设有100个数据,若做十折交叉验证,就分成十个完全一样大的子集,编号一到十。D1是1到10、D2是11到20、以此类推,最后D10是91到100。做十次测试,每次把一个子集拿出来做测试集,其余九个做训练集。比如第一次用第十个做测试,前九个做训练;下一次用第九个做测试,其他九个做训练。这样轮转,正好做十次。这样做后,整个数据集中的每个数据都在测试集中用过,即都看过算法或模型在该知识点上的表现。这就叫十折交叉验证或tenfold cross-validation。结果取平均值,但划分十个子集时有个问题。不同的切分可能导致数据变化,这个变化可能导致模型性能受扰动。所以随机切分十次,这样做就叫十乘十的交叉验证。其实做了100次实验,和刚才的留出法一样。还可以问,假设100个样本,用M90逼近M100,肯定比用M80逼近M100更准。若做到极致,每次只留一个样本来测试,其他99个用于训练,即用M99的估计逼近M100的估计,是否应该更准?这种做法叫留一法,简称LOO。每次留一个数据测试,其余99个用于训练。这样训练的模型和最终用所有数据得到的模型应高度相似,甚至一致。这样做是否更准?不是的。No free lunch,在机器学习中,每个环节并非绝对,测试时仅用一个样本,即便训练模型与真实模型近似,测试仍可能有偏差。例如,假设班级有100名同学,男女各半,若用模型判断新来者性别,仅因班级男女比例真实,随机猜测精度也仅50%。是吧?此道理在于,若符合人类男女真实采样比例,随机猜测精度为50%。若用“男生多则判为男生,女生多则判为女生”的简单模型,随机猜测精度应为50%。但若用LOO方法测试,如留出一个男生做测试,模型可能判断来者为女生。对不对?因班级正好50个女生,49个男生,模型判断错误。同理,留出一个女生时,模型也可能判断来者为男生。此时测试结果为零,模型精度为零。因此,没有最好的评估测试方法,各种方法都有其适用与不适用之处。大家需理解此点。

还有一种有趣的方法叫自助法用于解决数据不足的问题。当需用100个样本做模型,但数据少于100时,若每次用99个样本做模型,则仅留出一个样本不合适;若多留一些,则又与真实情况不符。自助法基于有放回采样或可重复采样,即bootstrap sampling。其做法是在训练时模拟有放回地从数据中采样,以得到接近100个样本的训练集,同时保留那些没被训练集选中的部分样本作为测试集。想象一个盒子,里面有10个球,每次摸一个球,再放回盒子,多次重复。这样,有的球会被多次摸到,有的球可能一次都没被摸到。但无论如何,你都可以从盒子中取出10个球。通过这种方式,原本假设有100个数据做模型,现在就能采样出一个数据集,用100个样本做模型,同时未出现的数据可以作为测试集。未出现的数据大概会有多少呢?

可以做一个简单的估计,对于m个样本,有放回的取M次。它不出现的可能性是多少,取m个球,每次取球时它都未被取到,概率为(1-1/m),共取m次,即(1-1/m)的m次方。当m非常大时,概率为1/e,即约0.368,意味着约36.8%的数据在取出的集合中未出现。现在,我们可用这部分未出现的数据进行测试,这种测试称为out of bag estimation即“包外估计”。因此,当看到有人使用out of bag estimation时,便知他们采用的是这种测试方法。原本有100个样本,可闭眼重复采样100个用于训练模型,然后用原本未取到的样本进行测试,这也是一种很好的技术。在特定场合下,这种方法很有用。但说说它的缺陷,最重大的缺陷是改变了训练数据的分布。原本十个样本应同等重要,但模型可能认为某些样本更重要(那些被重复取到的样本),导致模型在高估方面存在问题。训练分布发生了变化,但有时若认为训练分布稍作改变不太重要,或者数据量不够时,这种方法也挺好。因此,一定要考虑使用的场景。bootstrap是一种非常有用的技术,以后还会接触到。在第八部分讲解ensemble methods集成学习方法时,这是关键技术之一。看似简单的可重复采样过程,实际上在统计和概率研究中有深刻内涵。为此,著名统计学大师Ephron还专门写了一本书,名为《budstruck》,专门讲解bootstrap背后的道理。

调参与验证集

调参数需区别两件事,一是超参数,即算法本身的参数,二是模型参数。超参数由人设定,模型参数由算法学习。例如,使用多项式函数逼近数据,多项式次数即为超参数,需用户设定;而多项式中的系数则为模型参数,由算法确定。现在有两个多项式,L1=ax^2+bx+c,L2=ax+b,若用户设定多项式函数次数为2,则算法使用二次函数L1来拟合数据,此时算法需确定的是二次项系数a、一次项系数b和常数项c,这些即为模型参数。超参数和参数本质上都是参数,模型选择即调参数的过程。调参数本身就是在做模型选择,每个模型可视为一种参数配置,即算法对数据的一种实例化。例如,在学习过程中确定的a、b、c值即构成一个模型。调参数过程即是在评估不同模型的好坏,从而进行选择。

评估方法可应用于调参数过程。例如,在训练神经网络时,可评估每一轮的训练结果,判断当前神经网络性能。若下一轮性能与当前相近,则无需继续训练。每一轮训练都产生一个模型,因此调参数即是在进行模型选择。选择不同算法也是在进行模型选择,模型选择覆盖了机器学习中很多变量的确定过程,算法本身和算法参数都可视为变量。模型选择在机器学习中具有广泛性,涉及任何需要确定的变量。在模型确定过程中,实际上也在进行模型选择。有时使用“验证集”这一说法,以与测试集区分,验证集专门用于调参数。将整个数据切成三部分,分别用于训练、验证和测试,验证用于评估模型性能。

考虑调参数需求后,从训练集中切出一部分用于调参数,调好结果后再用于评估,这部分称为验证集,是训练集中专门留出的用于调参数的部分集合,也是一种测试集,其测试目的是确定参数设置是否合适。参数选定后,将训练集和验证集合起来得到模型,再将模型放到测试集上测试其性能。初学者在机器学习时容易犯的错误是直接用最后用来评估性能的集合调参数,然后选取表现最好的模型,这是绝对错误的。测试集必须在训练过程中未使用过,调参数过程也是训练的一部分,因此调参数的数据应从训练数据中获取,而非测试数据

性能度量

我们接下来讨论如何评估性能优劣,这需要通过性能度量来确定什么样的模型是好的。我们先看看已经有哪些方法。首先,我们刚才提到,同一个算法对同一个数据得出的模型,可能对a好,但对b不一定好,因为它们可能追求的目标不同。例如,我们来做选西瓜的任务,假设瓜摊上有100个瓜。作为最终顾客,我只有十块钱,想买十个瓜,我希望这十个瓜都是好的。至于剩下我没买的瓜,无论它们是好是坏,都与我没关系。即使另外90个瓜被误判为坏瓜,其中有好瓜,但我没钱买,所以我只关注我买的这部分。而对于另一个收西瓜的公司,它希望把所有瓜都收走。因此,它的目的是一个好瓜都不漏,这与我的目的显然不同。虽然看起来都是挑西瓜,都是分类任务,但对谁好显然是不同的。

对于回归任务,我们通常使用均方误差作为度量。模型产生的结果f(x)与真实结果y的差别取平方,然后对所有样本m取均值,这就是均方误差。有时我们也称之为二次误差平方误差,其实是一回事。甚至在前面加个二分之一也没影响,因为所有算法和模型在计算时都会涉及这个常数项。那么,在前面加二分之一有什么好处呢?如果进行求导,这个常数项就会消掉,从而带来计算上的好处。

对于分类任务,最简单的度量是错误率。如果有m个样本,有多少次预测与真实结果不同,每次做错就扣一分。精度则是反过来,如果100个样本中做错了五个,精度Acc就是95%。错误率是5%,通常我们会乘以100,但这里我们忽略这个细节,直接用1减去错误率。然而,这两个度量太简单了。

很多时候,我们还需要更复杂的度量。就像我刚才说的挑西瓜的任务一样,对于分类结果,我们可以得到一个混淆矩阵。大家看这个表,这个方向是预测结果,另一个方向是真实情况。其中,true positive表示预测结果认为它是正例,真实结果也是正例,真正例用TP表示。false positive是什么呢?模型将实例判定为正例,实际上为反例,这是假正例FP。若模型判定为负例,实际上为正例,这是假负例FN。真正的正例即预测为正且实际为正,反对角线部分表示预测正确。需记住,TP代表true positive。看到tp即可理解为预测为正且实际为正。false positive则指预测为正但实际为假。

通过这四个概念,我们可以定义查准率Pre,即所有预测为正的实例中,真正为正的有多少。这类似于买瓜问题,预测出十个好瓜,实际有多少个是好瓜?查准率用precision表示,注意此处翻译与accuracy不同,以避免混淆。此外,还有查全率recall,表示所有正样本中有多少被找出。true positive是预测为正且实际为正,false negative是预测为负但实际为正。两者之和即所有正样本中,被预测出来的有多少个。以买瓜为例,若有100个西瓜,预测出10个是好的,这10个中有多少个真正是好的,即为查准率。若原本有20个好瓜,但只预测出10个,则查全率为50%。查准率和查全率共同刻画了算法的精度。

由于人有时难以同时关注查准率和查全率,我们需将两者结合。为此,我们定义了一个指标f值,有时也称为F1它是查准率和查全率的调和平均,即p分之一加r分之一除以二。学过基础数学的人都知道算术平均和几何平均。调和平均与它们不同,它不会使较小的值被完全忽视。例如,当a和b接近但不相等时,调和平均能体现出差异。

若对查准率、查全率均有不同偏好,认为两者都重要但查准率更重要,可在表达式中增加权重。当β>1时,查全率更重要;当β<1时,查准率更重要。直接记忆相关表达式可能较为困难,理解其推导过程则更为清晰。在表达式中增加系数β,可明确查准率与查全率的重要性,有助于进行取舍。例如,若认为查全率更重要,且查全率的重要性不超过查准率的两倍,大概1.5倍,可通过设定β值来平衡两者,这是一种综合考虑查准率与查全率的均衡方法。

比较检验

我们判断度量结果中0.9与0.88,并非0.9一定比0.88好,这需通过比较检验解决。在某种度量后得到评估结果,不能直接使用评估结果值进行判断,原因如下:首先,测试性能不等于泛化性能,泛化指未来数据,而测试仅基于给定集合,两者不同。其次,测试性能会随测试集变化而变化。同样100个样本,不同测试集与训练集组合,结构可能不同,难以确定哪种组合更可靠。第三,许多机器学习算法本身具有随机性,如深度神经网络,不同初始化结果可能导致性能差异。因此,不能简单通过一个值来判断。同时,回顾第一次课内容,机器学习旨在寻找概率近似正确的模型,而非确定最优解。

由于结果是概率性的,不能通过一次确定性比较决定一切。此时,我们通常依赖统计学界的假设检验方法,这是机器学习界借用的工具。我们假设a算法和b算法性能是否相同,然后观察实验结果,即判断能否拒绝该假设。若拒绝,则说明性能不同;若未拒绝,则说明性能相同。在座同学上学期已学完概率统计学,应记得此方法,但无需死记硬背具体假设检验过程。现代工具包中已包含此类调用,可直接使用,无需自行编写代码。更重要的是,需知道何时使用及原因。

接下来,我主要讲解比较两个学习器的思路,具体检验方法可自行翻阅书籍。比较两个学习器时,有几种不同思路。回顾之前内容,评估时首先使用误差、错误率和精度,这些是一个值。使用交叉验证时,如十折交叉验证,可比较a算法和b算法的性能。使用交叉验证时,实际上是在进行多次划分和评估,以更全面地评估算法性能。这是测试集,我们进行了多次测试。比如:对于算法a,有一个估计值A;对于算法b,有一个估计值b。如果两个算法没有显著区别,本质上是一回事,那么它们的误差应该相同。我们可以做减法,得到一个结果,这里将其称为σ。假设有十个这样的结果,它们应该符合一定的分布,均值应为零。因为两个算法表现相同,所以均值为零,但左右可能有浮动。有时算法a可能稍好,有时算法b可能稍好。例如,进行十次测试,正好有五次a比b好,五次b比a好,且每次的差距都相似。如果一次a比b好0.1,下次b比a好0.09,那么这两个算法就没有显著区别。因此,我们可以计算其σ的均值和标准差,来判断其是否属于某种分布。这样的检验在数理统计中是标准的成对t检验,即Student's t检验。我们刚才讲的是基于一个值的误差。

在评估时,我们遇到过两个值的情况,得到一个表,这边是true positive。实际上,如果把这两个算法看作是两个独立的方法,这个表就可以借用过来了,这叫做联立表。在这里,它不再表示true positive,而是表示两个算法都做出了正确的判断。这个部分表示你认为是对的,它也认为是对的,即YY;这个部分表示你认为不对,它也认为不对,即NN;这个部分表示第一个算法认为是对的,第二个算法认为不对YN;这个部分表示第一个算法认为不对,第二个算法认为是对的NY。可以看出,不一样的部分就是这个联立表的对角线部分。实际上,对于两分类的情况,不一样的部分就是这个对角线。那么,什么情况下这两个算法可能没有显著区别呢?很容易想到这样的例子:假设有100个样本,其中49个样本两个都判断为yes,49个两个都判断为no,只有一个样本一个算法判断为yes,另一个算法判断为no。考虑这两者的关系,可以用一个假设检验,即McNemar检验。考虑列联表后,关注负对角线上的两个点,然后基于卡方检验进行检验。


网站公告

今日签到

点亮在社区的每一天
去签到