"> "> 机器学习-概述 | Yufei Luo's Blog

机器学习-概述

什么是机器学习

机器学习是近20多年兴起的一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法。因为学习算法中涉及了大量的统计学理论,机器学习与统计推断学联系尤为密切,也被称为统计学习

目前,机器学习技术已经渗透进各种不同的领域,例如手机上的垃圾短信过滤、淘宝主页上的商品推荐、银行的智能客服机器人、AlphaGo能够学会下围棋,等等。而且可以预见的是,随着芯片算力以及人类产生数据量的快速增长,这一技术在自动驾驶、生物医药、工业4.0等等领域将会得到更加广泛的应用。

那么,究竟如何定义机器学习?关于机器学习的定义有多种不同的表达方法,比如:

  • 假设用P来评估计算机程序在某个任务T上的性能,如果一个程序通过利用经验E在任务T上获得了性能改善(即P有所提高),则我们就说关于T和P,该程序对E进行了学习。(Machine Learning, Tom Mitchell)
  • 机器学习是一系列能够从数据中自动识别出模式的方法,在此之后便可以基于这些被发现的模式去预测未来的数据,或是在非确定的条件下执行一些策略。(Machine Learning: A Probabilistic Perspective)
  • 机器学习所研究的主要内容,是关于在计算机上从数据中产生“模型”的算法,即学习算法。有了学习算法,我们把经验数据提供给它,它就能基于这些数据产生模型。在面对新的情况时,模型会给我们提供相应的判断。(机器学习,周志华)

相关名词

这一部分内容中,给出了机器学习中涉及到的一些名词的解释。

  • 数据集:一组记录的集合,其中每一条记录是关于一个事件或者对象的描述。例如邮箱里的所有邮件便可以作为一个数据集。我们可以使用\(D=\{\boldsymbol{x}_1,\boldsymbol{x}_2,\dots,\boldsymbol{x}_n\}\)来表示含有\(n\)条记录的数据集。
  • 样本(示例):数据集里面的一条记录。例如邮件组成的数据集中的其中一封邮件。
  • 特征(属性):反映事件或者对象在某方面的表现或者性质的事项。例如一封邮件中是否包含“中奖”这一关键词便属于一个特征。相应地,这一属性上的取值被称为属性值。
  • 样本空间(属性空间,特征空间):由事件的所有特征张成的一个多维空间。每一个样本都可以在这一空间中找到自己的对应位置。一个样本有多少个特征,相应的样本空间便为多少维。
  • 特征向量:由于每一个样本在样本空间里面都能找到一个位置,这一位置也对应于一个坐标向量。因此一个示例也被称为一个特征向量。对于每个样本,我们可以用\(\boldsymbol{x}_i=(x_{i1},x_{i2},\dots,x_{id})\)来表示;每个示例具有\(d\)个属性,对应于样本的维数;\(x_{ij}\)代表了\(\boldsymbol{x}_i\)在第\(j\)个属性上的取值。

分类

如果按照模型训练时人类监督的类型和量来进行分类的话,机器学习模型可以分为下面这些类型:

  • 监督学习:每个用于训练算法的训练数据\(\boldsymbol{x_i}\)(此处的黑体代表它是一个向量,下面不再赘述)包含了一个标签\(y_i\)。也就是说,监督学习具有明确的训练目标,就是尽可能使得模型在预测未知数据的标签时更准确,因此模型的训练效果也比较容易衡量。

    如果标签\(y_i\)是离散型(或称为类别型)的变量,此时的训练任务被称为分类,例如垃圾邮件辨别系统区分一个邮件是否为垃圾邮件;如果\(y_i\)是连续型变量,此时的训练任务被称为回归,例如一个汽车价格预测模型。

    常见的监督学习算法包括但不限于:

    • 线性模型:如线性回归、逻辑回归、支持向量机、线性判别分析等
    • 树模型:决策树(回归树和分类树)、梯度提升树等
    • K近邻算法
    • 朴素贝叶斯算法
  • 非监督学习:与监督学习相反,每个用于训练算法的训练数据\(\boldsymbol{x_i}\)并不包含标签。非监督学习没有明确的训练目的,它的目标是揭示数据的一些内在性质或者规律,为进一步的数据分析提供基础。因此对于非监督学习的效果比较难以评判。例如音乐软件的私人FM自动选取歌曲的方式便属于非监督学习。

    常见的非监督学习算法包括但不限于:

    • 聚类:K均值、层次聚类、密度聚类
    • 可视化和降维:主成分分析、核主成分分析
    • 关联性规则学习:Apropri算法
    • 概率模型估计:如高斯混合模型、概率图模型等
  • 半监督学习:一些算法可以处理部分带标签的训练数据,通常是大量不带标签的数据加上小部分带标签的数据。多数的半监督学习算法是监督学习算法和非监督学习算法的结合。

  • 主动学习:一些算法会主动地挑选出未标记的样本,并请求人工提供这些数据的标注,之后便会使用这些标记的数据来训练模型。主动学习的过程通常需要进行多轮的迭代,直至达到某一个停止准则。主动学习与半监督学习的区别在于,半监督学习不需要人工的干预,而主动学习则会主动向外界提出标注请求。

  • 强化学习:强化学习与上述方法都不同。它的学习系统被称为一个智能体,它处在一个特定的环境内。智能体在某个时刻处于一个状态,它要选择一个动作去执行,进入到另一个状态,并在这一过程中得到奖励或者惩罚。智能体需要自己去学习一个选择动作的策略,以获得长久的最大奖励。例如AlphaGo便是使用强化学习训练出来的。

机器学习三要素

对于一个特定的机器学习方法来说,模型、策略和算法为它的三要素。不同的学习方法之间的不同,主要来自于其模型、策略、算法的不同,这三者确定之后,机器学习的方法也就确定了。下面我们以监督学习为例,对它们进行详细的解释。

模型

首先,我们需要考虑的是学习什么样的模型。对于监督学习来说,模型就是所要学习的条件概率分布或者决策函数。比如线性回归模型就是要学习决策函数\(y=\sum_{i=1}^{n}w_{i}x_{i}+b\);逻辑回归模型就是要学习条件概率分布\(P(Y=0|\boldsymbol{x})=\frac{1}{1+exp(\sum_{i=1}^{n}w_{i}x_{i}+b)}\)

模型的假设空间包含了所有可能的条件概率分布或者决策函数。假设决策函数是上述的线性回归模型,那么模型的假设空间就是所有\(w_i\)\(b\)的取值所构成的函数集合。通常来说,假设空间中的模型有无穷多个。

如果我们用\(X\)\(Y\)表示输入空间\(\mathcal{X}\)\(\mathcal{Y}\)上的变量,用\(\mathcal{F}\)表示假设空间,模型的参数向量为\(\theta\in\boldsymbol{R}^n\)(参数向量的取值空间被称为参数空间)。当模型为决策函数时,假设空间\(\mathcal{F}\)为一个参数向量决定的函数族,可以记作: \[ \mathcal{F}=\{f|Y=f_{\theta}(X),\theta\in\boldsymbol{R}^n\} \] 当模型为条件概率分布时,假设空间\(\mathcal{F}\)是一个参数向量决定的条件概率分布族,可以记作: \[ \mathcal{F}=\{P|P_{\theta}(Y|X),\theta\in\boldsymbol{R}^n\} \]

策略

在定义了模型的假设空间之后,接下来我们需要考虑使用什么样的策略(或是叫准则),从假设空间中选择最优的模型。模型选择的策略就相当于是机器学习算法在学习过程中的某一种偏好,通常被称为归纳偏好,在下文中将详细介绍这一概念。

损失函数

对于监督学习来说,当我们从假设空间\(\mathcal{F}\)中选取了模型\(f\)作为决策函数,对于给定的输入\(X\),由\(f(X)\)给出相应的输出\(Y\)。但是这个输出的预测值\(f(X)\)通常与真实值\(Y\)之间存在不一致,因此我们需要使用一个损失函数(又称为代价函数)来度量预测错误的程度。损失函数是\(f(X)\)\(Y\)的非负实值函数,记作\(L(Y,f(X))\)。对于同样的模型表达式来说,在模型训练时使用不同的损失函数也会最终得到不同的函数表达式。

在机器学习中,常用的损失函数有:

  1. 0-1损失函数: \[ L(Y,f(x))=\begin{cases}1, &Y\ne f(x)\\ 0, &Y=f(x)\end{cases} \]

  2. 平方损失函数: \[ L(Y,f(x))=(Y-f(X))^2 \]

  3. 绝对损失函数: \[ L(Y,f(x))=|Y-f(X)| \]

  4. 对数损失函数: \[ L(Y,P(Y|X))=-\log P(Y|X) \]

由于模型的输入、输出\((X,Y)\)是随机变量,遵循联合分布\(P(X,Y)\),因此损失函数的期望是: \[ R_{exp}(f)=E_{p}[L(Y,f(X))]=\int_{\mathcal{X}\times\mathcal{Y}}L(y,f(x))P(x,y)dxdy \] 这是理论上模型\(f(X)\)关于联合分布\(P(X,Y)\)的平均意义下的损失,称为期望风险或者期望损失。但是联合分布\(P(X,Y)\)是未知的,因此我们无法直接计算\(R_{exp}(f)\)。而且,如果我们知道了联合分布\(P(X,Y)\),可以从联合分布直接求出条件概率分布\(P(Y|X)\),也就不需要学习了。

因此在实际中,我们通常计算经验损失来代替期望损失的计算。给定训练数据集\(T=\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\}\),模型\(f(X)\)关于训练数据集的平均损失便成为经验风险或者经验损失,记作\(R_{emp}(f)\)\[ R_{emp}(f)=\frac{1}{N}\sum_{i=1}^{N}L(y_i,f(x_i)) \] 根据大数定律,当样本容量\(N\)趋近于无穷时,经验风险便会趋近于期望风险,因此一个很自然的想法便是使用经验风险去估计期望风险。但是现实中训练样本数目有限,甚至很小,所以用经验风险估计期望风险常常并不理想,因此要对经验风险进行一定的矫正。

经验风险最小化和结构风险最小化

在假设空间、损失函数以及训练数据集确定的情况下,经验风险也就可以确定。经验风险最小化策略认为,经验风险最小的模型就是最优的模型。根据这一策略,求最优模型就是求解最优化问题: \[ \min_{f\in \mathcal{F}}\frac{1}{N}\sum_{i=1}^{N} L(y_{i},f(x_{i})) \] 当样本容量足够大时,经验风险最小化能够保证有很好的学习效果。例如极大似然估计就是经验风险最小化的一个例子。但是当样本容量很小时,经验风险最小化的学习效果就未必很好,容易产生”过拟合“现象。

为了防止过拟合,可以使用的另一种策略被称为结构风险最小化,它等价于正则化。结构风险\(R_{srm}(f)\)就是在经验风险的基础上,加上表示模型复杂度的正则化项(或叫惩罚项):\(R_{srm}(f)=\frac{1}{N}\sum_{i=1}^{N}L(y_i,f(x_i))+\lambda J(f)\)。其中,\(J(f)\)代表模型的复杂度,是定义在假设空间\(\mathcal{F}\)上的泛函。模型\(f\)越复杂,\(J(f)\)就越大,反之则越小。\(\lambda \ge 0\)是系数,用来权衡经验风险和模型复杂度。结构风险最小化策略便是认为结构风险最小的模型就是最优的模型,因此选择最优模型便是求解最优化问题: \[ \min_{f\in \mathcal{F}}\frac{1}{N}\sum_{i=1}^{N} L(y_{i},f(x_{i})) + \lambda J(f) \]

结构风险小则需要经验风险和模型复杂度同时都较小,这样的模型往往对训练数据以及未知的测试数据都有较好的预测效果。例如贝叶斯估计中的最大后验概率估计就是结构风险最小化的一个例子。

结构风险最小化相当于是“奥卡姆剃刀”原则的一种体现,它是自然科学研究中一种常用的基本原则,即如果有多个假设与观察一致,则选最简单的那个

NFL定理与归纳偏好

在机器学习中,有一个定理叫做“没有免费的午餐”(No Free Lunch)。它的意思是指,假如有两个学习算法A和B,如果A在某个问题上比B表现地更好,那么必然存在另一些问题B比A表现地更好(由于数学证明比较复杂,故此处只说明一个定性的结论)。

这一定理的一个重要前提是,所有问题出现的机会相等,或者所有的问题同等重要。但是在实际情况下,我们通常只关注自己正在试图解决的问题,并找出较好的解决方案;但是至于这个解决方案在别的问题或者是相似的问题上是否为好方案我们并不关心。

因此,这一定理最重要的寓意是让我们意识到,如果脱离具体问题去谈什么学习算法更好是毫无意义的。如果要考虑所有潜在的问题,那么所有的算法一样好。要谈论算法的相对优劣,必须要针对于具体的学习问题,学习算法自身的学习策略(也就是归纳偏好)与问题是否相配往往会起到决定性的作用。

在学习完成之后得到的模型,其实就对应于假设空间中的某一个假设。归纳偏好指的是机器学习模型在学习过程中对于某种类型假设的偏好,这样的偏好用于在学习过程中确定什么样的模型更好。例如在结构风险最小化问题中,我们会倾向于选择经验风险和模型复杂度同时较小的模型,这便属于一种归纳偏好。

其它的归纳偏好还包括KNN模型中假设相近样本倾向于同一类别、SVM模型中最大化边界宽度等。对于神经网络来说,一些网络结构的设计其实也是归纳偏好的体现,例如卷积神经网络认为信息具有空间局部性,循环神经网络认为信息的输入顺序对于结果会有影响,Attention机制认为输入信息中的关键部分才对结果有很大的影响,等等。

算法

算法指的是学习模型的具体计算方法,也就是用什么方法去求解最优模型。这时,问题便可以归结为最优化问题。如何保证找到全局最优解,并使得求解的过程变得高效,就成为了一个重要问题。像梯度下降法、遗传算法、模拟退火算法等优化算法都可以用作模型的求解,有时也需要开发独自的最优化算法。

模型评估与选择

当我们确定了模型种类与训练策略,并使用特定算法训练出机器学习模型之后,我们需要评估模型的效果如何,并选出最终的模型。接下来我们以监督学习为例,说明模型评估与选择中的一些方法与准则。需要注意的是,对于非监督学习等其它种类的模型而言,它们的模型选择方法相较于监督学习也有着较大的差别。

过拟合与欠拟合

机器学习的目的就是让学到的模型不仅可以对已知数据而且对未知数据都有很好的预测能力。为了达到这个目的,我们希望模型能够从用于训练的数据中学习到适用于未知数据的“普遍规律”(或是说具有更好的泛化能力),这样才能在遇到未知数据时做出更好的判别。

但是如果模型在训练的时候“用力过猛”,把训练样本学习的太好了的时候,很可能会把训练样本自身的一些特点当成是整个样本空间都会具有的一般性质。这样会导致模型在训练样本上的表现很好,但是在碰到未知数据的时候预测效果很差,出现所谓的过拟合现象。

发生过拟合的因素很多,最常见的就是模型参数太多,从而使得学习能力过于强大。一般来说,过拟合是无法彻底避免的,因此只能想办法去缓解这一现象。也正是因为这样,各类机器学习的模型也都会带有一些针对于过拟合的措施。缓解过拟合现象的方法包括但不限于:

  • 使用参数更少的模型,比如使用线性模型而不是高阶多项式模型、减少数据的特征数目
  • 收集更多的训练数据
  • 减少训练数据的噪声,例如去除异常值和修改数据错误
  • 模型训练过程使用正则化手段

与过拟合相反的概念叫做欠拟合,它指的是模型的学习能力不足,不仅在训练样本上的表现很差,而且对于未知数据的预测误差也很大。解决欠拟合的方法包括但不限于:

  • 选择参数更多的模型
  • 对训练数据做特征工程,用更好的特征训练学习算法
  • 减小正则化对模型的限制

下图为过拟合与欠拟合的一个示意图,其中\(M\)代表多项式的最高次数。我们可以看到,当\(M=0\)\(1\)时,拟合效果明显不够好,此时属于欠拟合;\(M=3\)时的拟合效果较好;而当\(M=9\)时出现了明显的过拟合。

过拟合与欠拟合

数据集的划分

目的

为了避免训练好的模型出现严重的欠拟合或者过拟合现象,同时也为了验证模型的泛化能力,我们一般不会将全部数据集都用于模型的训练过程,而是将其分成训练集和测试集两部分。训练集用于模型的训练过程,而测试集用于验证模型的泛化能力。而当模型有超参数时,还需要额外分出一个验证集,用于选择合适的超参数。

需要说明的是,这一部分介绍的数据集划分方法主要是为了评估模型的效果,训练出的模型并不能直接作为最终的模型使用。需要根据评估结果,选择出最优模型及其对应的参数,然后使用全部的数据再重新进行训练,从而得到最终的模型。

留出法

留出法是最简单的划分数据集的办法,它直接将数据集划分为两个互斥的集合,其中一个作为训练集,另一个作为测试集。例如一个1000条样本的数据集,将其划分为700个样本的训练集与300个样本的测试集。

这种方法虽然简单,但是也要注意一些问题。首先,我们需要保证训练集和测试集的划分要尽可能地保持数据分布的一致性,从而避免因为数据划分引入的额外偏差而对最终结果产生影响。例如在一个二分类的任务中,正例的样本数占70%,反例的样本数占30%,那么训练集与测试集中的正反样本比例也应该大致为7:3。这种保留类别比例的采样方式通常也被称为是分层采样

另外一个问题在于,对于初始数据集的分割方式有许多种,这些不同的划分会导致不同的训练/测试集,也相应地会导致模型评估的结果可能有所差别。因此,在使用留出法时,我们通常采用若干次随机划分,重复进行实验评估之后取平均值作为最终结果。

此外,我们也需要考虑训练集与测试集样本数量的比例。如果训练集包含绝大多数样本,那么评估结果可能不够稳定与准确;但是如果测试集包含的样本太多,那么最终训练出的模型与使用整个数据集训练出的模型可能有较大差别,从而降低了结果的保真性。这一问题没有完美的解决方案,通常训练集与测试集样本数量的比例在67%:33%到80%:20%之间。

交叉验证法

交叉验证法首先将数据集划分为\(k\)个大小相似的互斥子集,其中每个子集都尽可能地保持数据分布的一致性。然后,每次用其中\(k-1\)个子集的并集作为训练集,余下的子集作为测试集,这样就可以获得\(k\)组训练/测试集。之后便可以进行\(k\)次的训练与测试,最终返回这\(k\)个测试结果的均值。

交叉验证

这种方法评估结果的稳定性和保真性很大程度上取决于\(k\)的取值,为了强调这一点我们通常把交叉验证法称为“\(k\)折交叉验证”。\(k\)最常用的值为10,其他常用的值还有5、20等。

与留出法相似,将数据集划分为\(k\)个子集时同样存在多种划分方式,为了减小因样本划分不同带来的差别,\(k\)折交叉验证通常也要随机使用不同的划分重复多次。

交叉验证的一个特例叫做留一法,即每个样本都作为一个子集。留一法不受随机样本划分的影响,因为子集的划分方式唯一;同时留一法中被实际评估的模型与整个数据集训练出的模型非常接近,评估结果往往被认为是比较准确的(注意不是一定!)。但是这种方法的缺陷在于数据集比较大时,训练模型的开销可能是难以忍受的。

自助法

自助法以自助采样法为基础,又被称为有放回采样。给定一个包含\(m\)个样本的数据集\(D\),每次从中挑选一个样本记录到数据集\(D'\)后再放回\(D\),使其在下次采样时还能被采到;重复执行该过程\(m\)次,我们就得到了一个包含\(m\)条样本的数据集\(D'\),这便是自助采样的结果。

显然\(D\)中的一部分样本会在\(D'\)中多次出现,而另一部分样本不出现。而样本在\(m\)次采样中始终不被采到的概率是\((1-\frac{1}{m})^{m}\),取极限之后为\(\frac{1}{e}\approx 0.368\),也就是说\(D\)中的样本约有36.8%没有出现在采样数据集\(D'\)中。因此,我们可以将\(D'\)作为训练集,\(D\backslash D'\)作为测试集。

自助法在数据集较小、难以有效划分训练和测试集时很有用;此外自助法可以从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大好处。但是自助法产生的数据集改变了初始数据集的分布,这就引入了估计偏差。因此在数据量足够的时候,更常用留出法和交叉验证法。

超参数调节

大多数的学习算法都有些参数需要设定(通常被称为超参数),参数的设置不同,最终学得的模型性能往往有很大差别。例如我们在使用结构风险作为损失函数时,其中的\(\lambda\)便为一个超参数。因此在进行模型评估与选择时,除了要对适用的学习算法进行选择,还要对算法参数进行设定,这便是通常所说的超参数调节或者简称调参。

为了对模型的超参数进行调整,我们对原始数据集的分法也需要相应地做出调整:原始数据集将被分为训练集、验证集和测试集三个部分。接下来,使用训练集对模型进行训练,并根据验证集上的表现来选取超参数。在选择出合适的超参数之后,将训练集与验证集合起来,对模型重新进行训练,并将这一模型作为最终的模型。测试集则被用于最终评估模型的泛化能力如何。在实际操作中,训练集、验证集和测试集的比例通常为60%:20%:20%。

使用到验证集的原因是,如果我们基于训练集上的误差去调整超参数,那么这一超参数就相当于是对于训练集来说的一个最优值,无法得知使用这一超参数训练出来的模型在遇到未知数据时的表现如何。也就是说,这样就相当于是超参数选择上的过拟合。

模型评估方法

概述

不同的学习方法会给出不同的模型。对于监督学习而言,当损失函数给定时,模型在训练集上基于损失函数的训练误差、以及测试集上基于损失函数的测试误差,自然也就成了学习方法评估的标准。需要注意的是,模型训练时使用的损失函数与测试时使用的损失函数未必一致。

我们接下来以监督学习为例,来说明各种不同的模型评估方法。如果我们假设学习到的模型为\(Y=\hat{f}(X)\),训练误差就是模型在训练数据集上的平均损失:\(R_{emp}(\hat(f))=\frac{1}{N}\sum_{i=1}^{N}L(y_i,\hat{f}(x_i))\),其中\(N\)代表训练集的样本数量;而测试误差就是模型关于测试数据集的平均损失:\(e_{test}=\frac{1}{N'}\sum_{i=1}^{N'}L(y_i,\hat{f}(x_i))\),其中\(N'\)代表测试集的样本数量。

训练误差的大小一般是用来判定一个给定的问题是不是一个容易学习的问题;而测试误差的大小反映了学习方法对于未知的测试数据集的预测能力,因此测试误差小的方法具有更好的预测能力,是更有效的方法。

回归任务

在回归任务中,我们通常使用之前提到的平方损失函数和绝对损失函数作为判断标准。如果使用平方损失函数,最终计算出来的误差就被称为是均方误差(Mean Square Error,MSE)。如果使用绝对损失函数,计算出来的误差被称为是平均绝对误差(Mean Absolute Error)。此外,对于回归任务还可以使用一些其他的误差函数,例如折页损失(Hinge Loss)、Huber损失等。

分类任务

错误率与精度

在分类任务中,如果使用之前提到的0-1损失函数作为判断标准,那么最终计算出来的误差就相当于是错误率,即分类错误的样本数占样本总数的比例。与之相对应的概念为精度,指的是分类正确的样本数占样本总数的比例,即1-错误率。

查准率、查全率与\(F_{\beta}\)

错误率和精度虽然常用,但是不能满足所有的任务需求。例如我们建立了一个癌症预测模型,我们更关心的问题就变为了所有癌症病例中有多少被挑了出来;或者是在所有预测出来是癌症的病例中,有多少是真正得了癌症。此时我们便需要其他的度量方法。

对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(TP)、假正例(FP)、真反例(TN)、假反例(FN)这四种类型。它们组成的混淆矩阵如下:

真实情况 预测为正 预测为负
正例 TP FN
反例 FP TN

由此我们可以定义查准率\(P\)查全率\(R\)\[ P=\frac{TP}{TP+FP} \]

\[ R=\frac{TP}{TP+FN} \]

查准率又被称为准确率(Precision),查全率又被称为召回率(Recall)。二者是一对矛盾的度量:一般来说,查准率高的时候,查全率往往偏低;而查全率高时,查准率往往偏低。

在很多情形下,学习器的预测结果是一个概率,概率值越接近于1,则说明正例的概率越大。因此我们便可以根据概率值对样例进行排序,然后按照排序后的顺序逐个把样本作为正例来进行预测,则每次都能计算出当前的查全率和查准率。以查准率\(P\)为纵轴,查全率\(R\)为横轴进行作图,便可得到查准率-查全率曲线,简称\(P\)-\(R\)曲线,显示该曲线的图称为\(P\)-\(R\)图。下面为一个示意图:

P-R曲线

需要注意的是,现实任务中的\(P\)-\(R\)曲线通常是非单调、不平滑的,在很多局部有上下波动。\(P\)-\(R\)图可以直观地显示出学习器在样本总体上的查全率和查准率。如果一个学习器的\(P\)-\(R\)曲线被另一个学习器的曲线完全包住,则可以断言后者性能优于前者;如果两个学习器的\(P\)-\(R\)曲线发生交叉,则只能在具体的查准率和查全率条件下进行比较,或是比较\(P\)-\(R\)曲线下面积的大小。

为了综合考虑查准率和查全率,一种度量方式是查看平衡点的取值,即查准率=查全率时的取值。另一种更加常用的度量方式是\(F_{\beta}\): \[ F_{\beta}=\frac{(1+\beta^2)\times P \times R}{(\beta ^2\times P)+R} \] \(F_{\beta}\)其实是加权调和平均:\(\frac{1}{F_{\beta}}=\frac{1}{1+\beta^2}(\frac{1}{P}+\frac{\beta^2}{R})\),上式是化简后的结果。\(\beta >0\)度量了查全率和查准率的相对重要性,\(\beta=1\)时退化为标准的\(F_1\)\(\beta>1\)时查全率有更大的影响;\(\beta<1\)时查准率的影响更大。

如果我们进行多次的训练与测试、或是在多个数据集上进行训练与测试、又或者是执行多分类任务,这样便会得到多个二分类混淆矩阵。如果先在各个混淆矩阵上分别计算查准率与查全率,然后再计算它们的平均值,这样便会得到宏查准率、宏查全率以及宏F1;又或者是将各个混淆矩阵的对应元素进行平均,得到TP、FP、TN、FN的平均值,然后基于这些平均值便可计算出微查准率、微查全率和微F1。

ROC与AUC

我们在之前讨论\(P\)-\(R\)曲线时提到,它是通过对样本预测结果排序之后逐个作为正例绘制出来的。ROC曲线的绘制方式类似,但是它的纵轴为真正例率\(TPR=\frac{TP}{TP+FN}\),横轴为假正例率\(FPR=\frac{FP}{TN+FP}\)

进行学习器的比较时,与\(P\)-\(R\)图相似,如果一个学习器的ROC曲线被另一个学习器完全包住,则可以断言后者的性能更好;如果两个学习器的ROC曲线发生交叉,则比较ROC曲线下的面积,及AUC。

偏差与方差

偏差-方差分解试图对学习算法的期望泛化错误率进行拆解。对于测试样本\(\boldsymbol{x}\),令\(y_{D}\)\(\boldsymbol{x}\)在数据集中的标记(也就是说数据集中的标记可能不是真实标记,其中混杂有一些噪声的干扰),\(y\)\(\boldsymbol{x}\)的真实标记,\(f(\boldsymbol{x};D)\)为训练集\(D\)上学得的模型\(f\)\(\boldsymbol{x}\)上的预测输出。

我们以回归任务为例,使用不同的训练集\(D\)时,学习算法的期望预测为: \[ \bar{f}(\boldsymbol{x})=\mathbb{E}_{D}[f(\boldsymbol{x};D)] \] 使用样本数相同的不同训练集\(D\)产生的方差为: \[ var(\boldsymbol{x})=\mathbb{E}_{D}[(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x}))^{2}] \] 噪声为: \[ \epsilon^2=\mathbb{E}_{D}[(y_{D}-y)^2] \] 期望输出与真实标记的差别称为偏差,即: \[ bias^2(\boldsymbol{x})=(\bar{f}(\boldsymbol{x})-y)^2 \] 我们假定噪声的期望为0,即\(\mathbb{E}_D[y_D-y]=0\)。我们可以对算法的期望泛化误差进行分解,得到如下结果: \[ \begin{aligned} E(f;D)= & \mathbb{E}_{D}[(f(\boldsymbol{x};D)-y_D)^2] \\ = & \mathbb{E}_{D}[(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x})+\bar{f}(\boldsymbol{x})-y_D)^2] \\ = & \mathbb{E}_{D}[(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x}))^2]+\mathbb{E}_{D}[(\bar{f}(\boldsymbol{x})-y_D)^2]+\mathbb{E}_{D}[2(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x}))(\bar{f}(\boldsymbol{x})-y_D)] \\ = & \mathbb{E}_{D}[(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x}))^2]+\mathbb{E}_{D}[(\bar{f}(\boldsymbol{x})-y_D)^2] \\ = & \mathbb{E}_{D}[(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x}))^2]+\mathbb{E}_{D}[(\bar{f}(\boldsymbol{x})-y+y-y_D)^2] \\ = & \mathbb{E}_{D}[(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x}))^2]+\mathbb{E}_{D}[(\bar{f}(\boldsymbol{x})-y)^2]+\mathbb{E}_{D}[(y-y_D)^2]+2\mathbb{E}_{D}[(\bar{f}(\boldsymbol{x})-y)(y-y_D)] \\ = & \mathbb{E}_{D}[(f(\boldsymbol{x};D)-\bar{f}(\boldsymbol{x}))^2]+(\bar{f}(\boldsymbol{x})-y)^2+\mathbb{E}_{D}[(y-y_D)^2] \end{aligned} \] 上式也意味着: \[ E(f;D)=bias^2(\boldsymbol{x})+var(\boldsymbol{x})+\epsilon ^2 \] 也就是说,泛化误差可以分解为偏差、方差与噪声之和。其中,偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动造成的影响;噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。偏差-方差分解说明了,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。

给定学习任务,为了取得更好的泛化性能,需要使得偏差较小,即能够充分拟合数据;并使得方差较小,即使得数据扰动产生的影响小。但是一般来说,偏差和方差是有冲突的,这被称为是偏差-方差窘境(Bias-variance Dilemma)。下图便为这一现象的示意图:

偏差-方差窘境

给定一个学习任务,假设我们可以控制学习算法的训练程度,则在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化误差;随着训练程度加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐可以被学习器学到,方差主导了泛化错误率;在训练程度十分充足之后,学习器拟合能力非常强,训练数据发生的轻微扰动都会导致学习器发生显著变化,如果训练数据自身的非全局特性被学习器学到,则会发生过拟合。

参考

  1. 机器学习,周志华
  2. Hands on Machine Learning with Scikit-learn and TensorFlow
  3. Machine Learning: A Probabilistic Perspective
  4. 统计学习方法,李航
  5. Pattern Recognition and Machine Learning