前言
《机器学习》,又称西瓜书,是南京大学教授周志华教授编著的一本机器学习领域的经典教材。《机器学习》系统地介绍了机器学习的基本理论、常用算法及其应用。全书内容丰富,涵盖了机器学习的多个重要方面,包括监督学习、无监督学习、强化学习等主要学习范式。《机器学习》适合计算机科学、人工智能、数据科学等相关专业的本科生、研究生以及对机器学习感兴趣的自学者。无论是初学者希望系统地学习机器学习的基础知识,还是有一定基础的研究人员和从业者希望深入了解前沿技术,这本书都能提供有价值的参考。
在接下来的日子里,我将每周精心打磨一章内容,全方位、多角度地为大家剖析书中精髓。无论是复杂难懂的算法,还是晦涩难解的公式,我都会以通俗易懂的方式逐一解读,力求让每一位读者都能轻松掌握其中的奥秘。让我们一起在知识的海洋中遨游,探索机器学习的无限魅力!
第一章:西瓜书《机器学习》全网最详细解读 第一章:绪论_机器学习 西瓜书-CSDN博客
在本系列中:
- 重点内容将使用加粗或者红字显示
- 普通内容使用普通颜色显示
- 示例使用蓝色显示
-
-11
2.1 经验误差与过拟合
错误率和精度是衡量分类模型性能的两个重要指标。
- 错误率(error rate):表示分类错误的样本数占样本总数的比例,用公式
表示,其中 a 是分类错误的样本数,m 是样本总数;
- 精度(accuracy):则是 1 -错误率,即
,它反映了模型正确分类样本的能力,精度越高,说明模型的分类效果越好。
更一般地,我们把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”(error)
- 经验误差(empirical error)是指学习器在训练集(旧样本)上的误差,反映了模型对已知训练样本的拟合程度。
- 泛化误差(generalization error)则是指学习器在新样本(如测试集)上的误差,衡量了模型对未知数据的预测能力。
你可以理解为:经验误差是做课本例题的准确率(课本例题是你熟悉的,所以你会做),而泛化误差是考试的准确率(考试题目不一定是你熟悉的,这才是真正考验水平的测试)
假设我们正在开发一个模型,用于预测水果的甜度。我们有一些水果的样本数据,包括它们的特征(如颜色、大小、品种等)和对应的甜度评分。
- 我们从市场上收集了100个苹果,测量了它们的颜色、大小和甜度评分。我们用这些数据训练了一个模型,希望它能根据苹果的颜色和大小预测甜度。训练完成后,我们在这100个苹果上测试模型,发现模型预测的甜度与实际甜度非常接近,误差很小。在这个例子中,模型在训练数据上的表现很好,即经验误差很低。这说明模型能够很好地拟合训练数据。
- 假设我们用训练好的模型去预测其他市场上新收集的苹果的甜度。这些新苹果的颜色和大小可能与训练数据中的苹果略有不同。我们发现,虽然模型在训练数据上表现很好,但在这些新苹果上,预测的甜度与实际甜度之间存在较大的误差。在这个例子中,模型在新数据上的表现不如在训练数据上好,泛化误差较高。这说明模型虽然在训练数据上拟合得很好,但在新的、未见过的数据上表现不佳。
-
我们实际希望得到的,是在新样本上能表现得很好的学习器(即泛化误差低)。为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”,这样才能在遇到新样本时做出正确的判别。然而,当学习器把训练样本学得“太好”了的时候,很可能已经把训练样本自身的一些特点当作所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降。
- 过拟合(overfitting)是指模型在训练数据上表现得非常好,几乎能够完美拟合训练数据,误差极小,但在新的、未见过的测试数据上表现很差,其泛化能力差。这是因为模型过于复杂,学习到了训练数据中的噪声和细节,而没有捕捉到数据的本质规律。
- 欠拟合(underfitting)则是指模型在训练数据上就表现不佳,误差较大,同时在测试数据上也表现不好。这是由于模型过于简单,无法充分捕捉数据中的规律,导致对训练数据的拟合不足。
比如一个学生经常做课本例题,他对每一道例题都了如指掌,关于课本例题的小考常年满分,但他遇到期末考试就露馅了,成绩惨不忍睹,这就是过拟合。
而另一个学生连课本例题都不会做,期末考试更是惨不忍睹,这就是欠拟合
在实际应用中,我们需要通过调整模型复杂度、选择合适的算法、使用正则化等方法来平衡过拟合和欠拟合,以获得具有良好泛化能力的模型。
欠拟合通常是因为学习能力低下而导致的,这一点可以较容易克服,然而过拟合是无法彻底避免的,所能做的只有运用各种方法来缓解,常见的缓解过拟合的方法有正则化与dropout等。
缓解欠拟合的方法:
- 增加模型复杂度:如对于神经网络,可以增加网络的层数或每层的神经元数量。
- 改进特征工程:重新审视和选择更合适的特征,或对特征进行归一化、标准化等操作。
- 减少正则化强度:如果模型中使用了正则化(如L1、L2正则化),可以适当降低正则化系数。
- 增加训练轮数:欠拟合可能是因为训练时间不足,模型尚未学习到数据中的规律。
- 调整学习率:确保学习率既不过高也不过低,以便模型能够有效地学习。
缓解过拟合的方法
- 增加训练数据量:更多的数据可以帮助模型更好地学习数据的真实分布,减少对训练数据细节的依赖。
- 使用正则化:L1和L2正则化通过惩罚模型的复杂度,限制模型对训练数据的过度拟合。
- 降低模型复杂度:简化模型结构,例如减少神经网络的层数或每层的神经元数量。
- 使用早停法(Early Stopping):在训练过程中监控验证集的误差,当误差不再下降时提前停止训练。
- 数据增强(Data Augmentation):在图像分类任务中,通过旋转、裁剪、翻转等方法增加数据的多样性。
- 使用Dropout:Dropout是一种随机丢弃神经元的方法,可以减少模型对特定训练样本的依赖,从而缓解过拟合。
-
如何理解过拟合是不可避免的?
了解即可
过拟合是无法彻底避免的,关于这一点,可大致这样理解:机器学习面临的问题通常是 NP 难甚至更难,而有效的学习算法必然是在多项式时间内运行完成,若可彻底避免过拟合,则通过经验误差最小化就能获最优解,这就意味着我们构造性地证明了“P=NP”;因此,只要相信“P ≠ NP”,过拟合就不可避免。
对于以上话的解释如下:
P和NP问题的背景
-
P问题:指的是在多项式时间内可以解决的问题。多项式时间意味着算法的运行时间与输入规模的多项式相关,例如
或
。简单来说,就是在有限时间可以解决的问题。
-
NP问题:指的是在多项式时间内可以验证其解是否正确的问题。NP问题不一定能在多项式时间内求解,但一旦给出一个解,可以在多项式时间内验证这个解是否正确。简单来说,就是在有限时间无法解决的问题。
-
P vs NP问题:是计算机科学中一个著名的未解决问题,即是否存在一个多项式时间算法可以解决所有NP问题。目前,大多数计算机科学家相信 P≠NP,即不存在这样的多项式时间算法。简单来说,我们认为在有限时间不可以解决NP问题。
机器学习的目标是找到一个模型,使其在新的、未见过的数据上表现良好(即泛化能力好)。然而,大多数机器学习问题本质上是NP难问题,甚至更难。这意味着找到最优解(即泛化误差最小的模型)在计算上是非常困难的,即在有限时间无法做到。如果我们能找到一个多项式时间算法来彻底避免过拟合(即通过最小化经验误差就能找到最优解),那么我们实际上就构造性地证明了P=NP,即在有限时间找到了最优解。换句话说,我们找到了一个多项式时间算法来解决一个NP难问题。
如果过拟合可以彻底避免,那么我们就能在有限时间找到一个算法,解决理论上有限时间中无法解决的问题(也就是相互矛盾),即在多项式时间内解决NP难问题,这与大多数计算机科学家的信念(P≠NP)相矛盾。因此,过拟合是机器学习中一个不可避免的问题,但可以通过一些策略来缓解其影响。
-
2.2 评估方法
那么,我们如何知道模型的好坏,如何知道模型是否过拟合?
通常,我们可通过实验测试来对学习器的泛化误差进行评估并进而做出选择。为此,需使用一个“测试集”(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”(testing error)作为泛化误差的近似。
- 训练集(training set)是用于训练模型的数据集。模型通过学习训练集中的数据,调整自身的参数,以最小化训练误差。
- 测试集(testing set)是用于评估模型性能的数据集。测试集通常在模型训练完成后使用,用于评估模型在未见过的数据上的表现。通常我们假设测试样本也是从样本真实分布中独立同分布采样而得,且应与训练集互斥。
- 验证集(validation set)是用于模型选择和超参数调整的数据集。它在训练过程中使用,帮助选择最佳的模型结构和超参数。
- 测试误差(testing error)是在测试集上计算的误差,通常被用作泛化误差的近似。
假设我们正在开发一个模型,用于根据房屋的特征(如面积、房间数量、位置等)来预测房价。我们有一些房屋的销售数据,包括这些特征和对应的售价。
假设我们用训练集训练了一个线性回归模型,发现模型在训练集上的表现很好。然后我们用验证集来调整模型的参数,比如正则化强度。我们尝试了不同的正则化强度,发现某个强度值使得模型在验证集上的表现最佳。最后,我们用测试集来评估这个调整后的模型,发现模型在测试集上的表现也很不错,这说明我们的模型不仅在训练数据上拟合得好,而且能够很好地泛化到新的数据上。
为了确保测试误差能够准确反映学习器的泛化能力,测试集应与训练集互斥,即测试样本不应出现在训练集中,且未在训练过程中使用过。
假设老师为了帮助同学们准备考试,提供了10道习题供同学们练习。考试时,老师又用同样的这10道题作为试题。这种情况下,考试的成绩能否有效反映出同学们学得好不好呢?
-
如果考试题目与练习题目完全相同,那么考试分数可能并不能真实反映同学们的学习效果。因为同学们可能只是记住了这10道题的答案,而不是真正理解了解题方法和知识点。
-
这种情况下,即使同学们在考试中得了高分,也不能说明他们真正掌握了知识,因为他们可能只是记住了特定的题目和答案,而不是学会了如何解决问题。
通过这个例子,我们可以看到,如果测试样本出现在训练集中,那么测试误差可能会低估模型的真实泛化误差。这是因为模型可能只是记住了测试数据的特征,而不是学会了如何泛化到新数据。因此,为了准确评估模型的泛化能力,测试样本应该尽可能不出现在训练集中,以确保测试误差能够真实反映模型对新样本的判别能力。
-
可是,如果我们只有一个包含 m 个样例的数据集 ,既要训练,又要测试,怎样才能科学的处理数据呢?
答案是:通过对 D 进行适当的处理,从中产生出训练集 S 和测试集 T。下面介绍几种常见的做法。
-
2.2.1 留出法
留出法:直接将数据集D划分为两个互斥的集合,其中一个作为训练集S,另一个作为测试集T。其数学形式为。我们在 S 上训练出模型后,接着用 T 来评估其测试误差,作为对泛化误差的估计。
以二分类任务为例,假定 D 包含 1000 个样本,将其划分为 S 包含 700 个样本,T 包含 300 个样本,用 S 进行训练后,如果模型在 T 上有 90 个样本分类错误,那么其错误率为 (90/300) × 100% = 30%,相应的,精度为 1 - 30% = 70%。
注意:训练集与测试集的划分要尽可能保证数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。如果从采样(sampling)的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为“分层采样”(stratified sampling)。
例如通过对 D 进行分层采样而获得含 70% 样本的训练集 S 和含 30% 样本的测试集 T,若 D 包含 500 个正例、500 个反例,则分层采样得到的 S 应包含 350 个正例、350 个反例,而 T 则包含 150 个正例和 150 个反例;若 S、T 中样本类别比例差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差。
单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值为留出法的评估结果。
例如进行 100 次随机划分,每次产生一个训练/测试集用于实验评估,100 次后就得到 100 个结果,而留出法返回的则是这 100 个结果的平均。
此外,我们希望评估的是用 D(完整数据集) 训练出的模型的性能,但留出法需划分训练/测试集,这就会导致一个窘境:若令训练集 S(划分的训练集) 包含绝大多数样本,则训练出的模型可能更接近于用 D 训练出的模型,但由于 T (划分的测试集)比较小,评估结果可能不够稳定准确;若令测试集 T 多包含一些样本,则训练集 S 与 D 差别更大了,被评估的模型与用 D 训练出的模型相比可能有较大差别,从而降低了评估结果的保真性(fidelity)。这个问题没有完美的解决方案,常见做法是将大约 2/3 ~ 4/5 的样本用于训练,剩余样本用于测试。
-
2.2.2 交叉验证法
交叉验证法:将数据集D划分为k个大小相似的互斥子集,每个子集都尽可能保持数据分布的一致性,即从D中分层采样得到。然后每次用k-1个子集的并集作为训练集,剩下的那个子集作为测试集,这样就可以得到k组训练/测试集,从而进行k次训练和测试,最终返回这k次测试的均值。其数学形式为:。显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于 k 的取值,为强调这一点,通常把交叉验证法称为“k 折交叉验证”(k-fold cross validation)。
假设我们有 10个样本,要进行 5折交叉验证。
-
划分数据:将这10个样本平均分成5份,每份2个样本。
-
第1份:样本1、样本2
-
第2份:样本3、样本4
-
第3份:样本5、样本6
-
第4份:样本7、样本8
-
第5份:样本9、样本10
-
-
交叉验证过程:
-
第1次:用第1份(样本1、样本2)作为验证集,其余4份(样本3-10)作为训练集,训练模型并记录验证集上的性能。
-
第2次:用第2份(样本3、样本4)作为验证集,其余4份(样本1、2和5-10)作为训练集,训练模型并记录性能。
-
第3次:用第3份(样本5、样本6)作为验证集,其余4份(样本1-4和7-10)作为训练集,训练模型并记录性能。
-
第4次:用第4份(样本7、样本8)作为验证集,其余4份(样本1-6和9-10)作为训练集,训练模型并记录性能。
-
第5次:用第5份(样本9、样本10)作为验证集,其余4份(样本1-8)作为训练集,训练模型并记录性能。
-
-
评估模型:将这5次验证的性能指标(如准确率)取平均值,得到模型的整体性能评估。
图 2.2 给出了 10 折交叉验证的示意图。
-
与留出法相似,将数据集 D 划分为 k 个子集同样存在多种划分方式。为减小因样本划分不同而引入的差别,k 折交叉验证通常要随机使用不同的划分重复 p 次,最终的评估结果是这 p 次 k 折交叉验证结果的均值,例如常见的有“10 次 10 折交叉验证”。
-
留一法(Leave-One-Out Cross-Validation, LOO) 是一种特殊的交叉验证方法,每次只留出一个样本作为验证集,其余所有样本作为训练集。
留一法的训练集与数据集D相比只差一个样本,故留一法中被实际评测的模型与期望评估的用D训练出的模型很相似,因此,留一法的评估结果往往被认为较准确。
假设我们有一个包含 5个样本 的数据集,每个样本都有一个特征和一个标签
对于这5个样本,我们将每个样本依次作为验证集,其余样本作为训练集,总共进行 5次迭代:
第1次迭代
-
验证集:样本1
-
训练集:样本2、样本3、样本4、样本5
-
操作:用训练集训练模型,然后在验证集(样本1)上评估模型性能,记录结果。
第2次迭代
-
验证集:样本2
-
训练集:样本1、样本3、样本4、样本5
-
操作:用训练集训练模型,然后在验证集(样本2)上评估模型性能,记录结果。
第3次迭代
-
验证集:样本3
-
训练集:样本1、样本2、样本4、样本5
-
操作:用训练集训练模型,然后在验证集(样本3)上评估模型性能,记录结果。
第4次迭代
-
验证集:样本4
-
训练集:样本1、样本2、样本3、样本5
-
操作:用训练集训练模型,然后在验证集(样本4)上评估模型性能,记录结果。
第5次迭代
-
验证集:样本5
-
训练集:样本1、样本2、样本3、样本4
-
操作:用训练集训练模型,然后在验证集(样本5)上评估模型性能,记录结果。
在完成这5次迭代后,我们得到了5个验证样本上的性能指标(例如,预测值与真实值的误差)。最后,将这5次迭代的性能指标汇总,计算平均值,得到模型的整体性能评估。
-
2.2.3 自助法
自助法(bootstrapping)的核心思想是从原始数据集中有放回地抽取样本,生成一个新的训练集。每次抽取的样本数量与原始数据集相同。
其数学形式是:给定包含 m 个样本的数据集 D,我们对它进行采样产生数据集 D′:每次随机从 D 中挑选一个样本,将其拷贝放入 D′,然后再将该样本放回初始数据集 D 中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行 m 次后,我们就得到了包含 m 个样本的数据集 D′,这就是自助采样的结果。简单来说,有放回的从盒子里拿小球,每次拿一个,记录为训练集数据,然后放回,不断重复;这样下来,训练集一定有重复的,而未出现在训练集的作为测试集。
假设我们有一个包含 5个样本 的数据集,样本编号为 1、2、3、4、5。
从原始数据集 {1, 2, 3, 4, 5} 中有放回地抽取5个样本,可能得到的训练集是:
-
训练集:{1, 3, 3, 4, 4},去重后为{1, 3, 4}
-
未被选中的样本(测试集):{2, 5}
显然,D 中有一部分样本会在 D′ 中多次出现,而另一部分样本不出现。一个样本在 m 次采样中始终不被采到的概率是 ,取极限得到
。即通过自助采样,初始数据集 D 中约有 36.8% 的样本未出现在采样数据集 D′ 中。详细证明过程如下:
于是我们可将 D′ 用作训练集,D∖D′ 用作测试集;这样,实际评估的模型与期望评估的模型都使用 m 个训练样本,而我们仍有数据总量约 1/3 的、没在训练集中出现的样本用于测试。这样的测试结果,亦称“包外估计”(out-of-bag estimate)。
注意:自助法在数据量较少,难以有效划分训练集和测试集的时候很有用,然而自助法改变了初始数据分布,引入了估计偏差,故在数据量足够的时候,留出法和交叉验证法更常用一些。
-
2.2.4 调参与最终模型
大多数学习算法都有些参数(parameter)需要设定,参数配置不同,学得模型的性能往往有显著差别。因此,在进行模型评估与选择时,除了要对适用学习算法进行选择,还需对算法参数进行设定,这就是通常所说的“参数调节”或简称“调参”(parameter tuning)。
给定包含 m 个样本的数据集 D,在模型评估与选择过程中由于需要留出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型。因此,在模型选择完成后,学习算法和参数配置已选定,此时应该用数据集 D 重新训练模型。这个模型在训练过程中使用了所有 m 个样本,这才是我们最终提交给用户的模型。
另外,需注意的是,我们通常把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常称为“验证集”(validation set)。例如,在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。(关于训练集、测试集、验证集部分的总结,可见2.2节开头)
-
-
2.3 性能度量
模型的性能度量是评估机器学习模型在特定任务上表现好坏的一系列指标。这些指标帮助我们了解模型在预测、分类或回归等任务中的准确性、可靠性以及泛化能力。不同的任务和应用场景可能需要不同的性能度量指标,但它们的共同目标是为模型的优劣提供量化评估,以便进行模型选择、调整和优化。
- 在分类任务中,常见的性能度量指标包括准确率、召回率、精确率、F1分数等。
- 对于回归任务,常用的性能度量指标有均方误差(MSE)、均方根误差(RMSE)和平均绝对误差(MAE)。
-
在预测任务中,给定样例集 ,其中
是示例
的真实标记。要评估学习器f的性能,就要把学习器预测结果 f(x)与真实标记 y 进行比较。
- 回归任务最常用的性能度量是“均方误差”(mean squared error)
- 更一般的,对于数据分布
和概率密度函数
,均方误差可描述为
本节下面主要介绍分类任务中常用的性能度量。
2.3.1 错误率和精度
错误率和精度,这是分类任务中最常用的两种性能度量,既适用于二分类任务,也适用于多分类任务。
- 错误率是分类错误的样本数占样本总数的比例,对样例集 D,分类错误率定义为
- 精度则是分类正确的样本数占样本总数的比例。
精度则定义为
更一般的,对于数据分布和概率密度函数
,错误率与精度可分别描述为
和
-
2.3.2 查准率、查全率、F1
错误率和精度虽常用,但并不能满足所有任务需求。例如在信息检索中,我们经常会关心“检索出的信息中有多少比例是用户感兴趣的”、“用户感兴趣的信息中有多少被检索出来了”。“查准率”(precision)与“查全率”(recall)是更为适用于此类需求的性能度量。
-
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(true positive)、假正例(false positive)、真反例(true negative)、假反例(false negative)四种情形,令 TP、FP、TN、FN 分别表示其对应的样例数,则显然有 TP + FP + TN + FN = 样例总数。分类结果的“混淆矩阵”(confusion matrix)如表 2.1 所示。
- 真正例(True Positive, TP):模型正确地将正样本预测为正样本的数量。
- 假正例(False Positive, FP):模型错误地将负样本预测为正样本的数量。
- 真反例(True Negative, TN):模型正确地将负样本预测为负样本的数量。
- 假反例(False Negative, FN):模型错误地将正样本预测为负样本的数量。
查准率 P 与查全率 R 分别定义为:
(预测为正例的里面有多少真的是正例)
(真的正例数据有多少被预测出来了)
查准率和查全率是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。通常只有在一些简单任务中,才可能使查全率和查准率都很高。
-
我们可以计算出所有情况下的查全率、查准率。以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称“P-R曲线”:
如何利用P-R曲线判断模型的优劣:
- 若一个学习器的 P-R 曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者,例如图 2.3 中学习器 A 的性能优于学习器 C;
-
比较 P-R 曲线下面积的大小,值越高,表示模型的分类性能越好。
-
“平衡点”(Break-Event Point,简称 BEP)是“查准率=查全率”时的取值,越往右上越好,例如图 2.3 中学习器 C 的 BEP 是 0.64,而基于 BEP 的比较,可认为学习器 A 优于 B,优于C。
-
度量:
,Nums表示样例总数。
也可以用如下公式表示: -
在一些应用中,对查准率和查全率的重视程度有所不同。
度量的一般形式——
,能让我们表达出对查准率/查全率的不同偏好,它定义为
,也可以用如下公式表示:
-
时退化为标准的
;
-
时查全率有更大影响;
-
时查准率有更大影响。
-
-
PR曲线特别适用于以下场景:
- 不平衡数据集:当数据集中正负样本比例严重失衡时,PR曲线能够更准确地反映模型对正类样本的识别能力。
- 关注正类表现:在某些应用场景中,如疾病诊断、欺诈检测、信息检索等,更关注正类样本的识别效果,PR曲线能够提供更清晰的性能可视化。
-
很多时候我们有多个二分类混淆矩阵,例如在多个数据集上进行训练/测试,希望估计算法的“全局”性能;我们希望在n个二分类混淆矩阵上综合考察查准率和查全率。
宏-F1():先在各混淆矩阵上分别计算出查准率和查全率,记为
,再计算平均值,这样就得到“宏查准率”(
)、“宏查全率”(
),以及相应的“宏-F1”(
):
微-F1():还可先将各混淆矩阵的对应元素进行平均,得到 TP、FP、TN、FN 的平均值,分别记为
、
、
、
,再基于这些平均值计算出“微查准率”(
)、“微查全率”(
)和“微-F1”(
):
-
2.3.3 ROC与AUC
ROC曲线(Receiver Operating Characteristic Curve)是一种用于评估二分类模型性能的工具。它通过展示模型在不同分类阈值下的真正类率(True Positive Rate, TPR)和假正类率(False Positive Rate, FPR)之间的关系,直观地反映了模型的分类能力。
AUC值是ROC曲线下的面积,用于量化模型的分类性能。AUC值越高,表示模型的分类性能越好。
ROC 曲线的纵轴是“真正例率”(True Positive Rate,简称 TPR),横轴是“假正例率”(False Positive Rate,简称 FPR),两者分别定义为
现实任务中通常是利用有限个测试样例来绘制 ROC 图,此时仅能获得有限个(真正例率,假正例率)坐标对,无法产生图 (a) 中的光滑 ROC 曲线,只能绘制出如图 (b) 所示的近似 ROC 曲线。
绘图过程很简单:给定个正例和
个反例,根据学习器预测结果对样例进行排序,然后把分类阈值设为最大,即把所有样例均预测为反例,此时真正例率和假正例率均为 0,在坐标 (0, 0) 处标记一个点。然后,将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。设前一个标记点坐标为 (x, y),当前若为真正例,则对应标记点的坐标为
;当前若为假正例,则对应标记点的坐标为
,然后用线段连接相邻点即得。然后我们可以进行一些光滑处理,得到图(a)。
-
如何利用ROC曲线判断模型的优劣:
- 若一个学习器的 ROC 曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者
-
比较 ROC 曲线下面积(AUC)的大小,值越高,表示模型的分类性能越好。
-
接下来,我们来讨论一下如何计算AUC:
AUC 可通过对 ROC 曲线下各部分的面积求和而得。假定 ROC 曲线是由坐标为 的点按序连接而形成,则 AUC 可估算为:
。
给定 个正例和
个反例,令
和
分别表示正、反例集合,则排序“损失”(loss)定义为:
。
-
对于每一个正例 x+ 和每一个反例 x−,计算 f(x+) 和 f(x−)。
-
如果 f(x+)<f(x−),则记一个“罚分”(即 I(f(x+)<f(x−))=1)。
-
如果 f(x+)=f(x−),则记0.5个“罚分”(即 I(f(x+)=f(x−))=1)。
-
将所有正例和反例对的罚分相加,得到总罚分。
-
将总罚分除以正例和反例数量的乘积 m+m−,得到平均排序损失。
容易看出, 对应的是 ROC 曲线之上的面积;若一个正例在 ROC 曲线上对应标记点的坐标为
,则 x 恰是排序在其之前的反例所占的比例,即假正例率。因此有
-
ROC曲线的作用
- 模型比较:通过比较不同模型的ROC曲线和AUC值,可以选择性能更好的模型。
- 阈值选择:通过ROC曲线,可以找到一个合适的分类阈值,使得模型在真正类率和假正类率之间达到平衡。
- 性能评估:ROC曲线和AUC值可以直观地反映模型在不同分类阈值下的性能,适用于不平衡数据集。
-
PR曲线与ROC曲线的区别
- 关注点不同:
- PR曲线关注模型对正类样本的识别能力,适用于不平衡数据集。
- ROC曲线关注模型对正负样本的整体分类能力,适用于类别分布较为平衡的数据集。
- 对不平衡数据的敏感性:
- PR曲线对正类样本的变化更为敏感。
- ROC曲线对正负样本的比例变化不敏感。
- 曲线形状和解释:
- PR曲线通常呈现“锯齿状”或“阶梯状”,因为精确率和召回率之间存在权衡。
- ROC曲线相对平滑,通过AUC值(曲线下面积)可以量化模型的整体性能。
-
2.3.4 代价敏感错误率与代价曲线
在现实任务中常会遇到这样的情况:不同类型的错误所造成的后果不同。例如在医疗诊断中,错误地把患者诊断为健康人与错误地把健康人诊断为患者,看起来都是犯了“一次错误”,但后者的影响是增加了进一步检查的麻烦,前者的后果却可能是丧失了拯救生命的最佳时机;再如,门禁系统错误地把可通行人员拦在门外,将使得用户体验不佳,但错误地把陌生人放进门内,则会造成严重的安全事故。为权衡不同类型错误所造成的不同损失,可为错误赋予“非均等代价”(unequal cost)。
以二分类任务为例,我们可根据任务的领域知识设定一个“代价矩阵”(cost matrix),如表 2.2 所示,其中表示将第 i 类样本预测为第 j 类样本的代价。一般来说,
;若将第 0 类判别为第 1 类所造成的损失更大,则
;损失程度相差越大,
与
值的差别越大。
-
前面介绍的一些性能度量大都隐式地假设了均等代价,并没有考虑不同错误会造成不同的后果。在非均等代价下,我们所希望的不再是简单地最小化错误次数,而是希望最小化“总体代价”(total cost)。“代价敏感”(cost-sensitive)错误率为:
在非均等代价下,ROC 曲线不能直接反映出学习器的期望总体代价,而“代价曲线”(cost curve)则可达到该目的。代价曲线图的横轴是取值为 [0, 1] 的正例概率代价:
,其中 p 是样例为正例的概率;纵轴是取值为 [0, 1] 的归一化代价:
,其中 FPR 是式 (2.19) 定义的假正例率,FNR = 1 - TPR 是假反例率。
代价曲线的绘制很简单:
-
确定代价平面:代价平面通常以假阴性率(False Negative Rate, FNR)为横轴,假阳性率(False Positive Rate, FPR)为纵轴。FNR定义为 FNR=1−TPR,其中TPR(True Positive Rate)是真阳性率。
-
从ROC曲线到代价平面:对于ROC曲线上的每个点 (TPR,FPR),我们可以计算出对应的FNR,然后在代价平面上绘制一条从 (0,FPR) 到 (1,FNR) 的线段。
-
计算线段下的面积:每条线段下的面积代表了在特定代价设置下的期望总体代价。这个面积可以通过计算线段与横轴之间的区域来得到。
-
绘制所有线段:将ROC曲线上的每个点都转化为代价平面上的一条线段,并计算每条线段下的面积。
-
计算期望总体代价:取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价。这个面积可以通过积分或求和的方法来计算。
-
代价曲线的意义
- 选择最优分类阈值:通过代价曲线,可以选择使得总代价最小的分类阈值,从而在实际应用中取得更好的性能。
- 模型比较:可以用于比较不同模型在代价敏感情况下的性能,选择最适合的模型
- 业务决策支持:帮助业务决策者理解模型的性能,并根据业务需求调整模型的阈值
-
-
2.4 比较检验
虽然PR曲线和MSE可以直观地展示模型的性能,但它们无法直接判断模型之间的性能差异是否具有统计显著性。比较检验通过统计方法(如t检验、交叉验证t检验等)来量化这种差异,并判断其是否显著。通过比较检验,可以避免偶然性的影响,支持科学决策,并为学术研究提供可靠的证据。
统计假设检验(hypothesis test)为我们进行学习器性能比较提供了重要依据。基于假设检验结果我们可推断出,若在测试集上观察到学习器 A 比 B 好,则 A 的泛化性能是否在统计意义上优于 B,以及这个结论的把握有多大。
为便于讨论,本节默认以错误率为性能度量,用 表示。
本节内容可以跳过,并非重点,也不建议多花时间,建议学完大学教辅《概率论与数理统计》后再看。总结而言,本节的目的就是设定一个假设(如测试误差是否可以代表泛化误差),收集数据并构造分布(如卡方分布、二项分布),然后计算统计量,将计算得到的统计量与分布表中的临界值进行比较以决定是否有足够的证据拒绝/接受这个假设(也就是测试误差是否可以代表泛化误差)。
-
2.4.1 假设检验
假设检验中的“假设”是对学习器泛化错误率分布的某种判断或猜想,例如“(测试集误差=泛化误差)”。现实任务中我们并不知道学习器的泛化错误率,只能获知其在测试集的错误率
。如果我们假设二者相等,那么就需要评估在多大的程度上可以认为二者相等。
二项分布
对于一个二分类问题,首先我们需要定义测试错误率:
图2.6是一个二项分布的示意图,用于展示在给定参数 m=10 (总样本数为10)和 ϵ=0.3 (错误率为0.3)下,误分类样本数的概率分布情况。 图中的纵轴显示了不同误分类样本数的概率值,其中误分类样本数为2、3、4的概率较高,接近0.25。而误分类样本数超过6的概率较小。
如果我们在实际验证过程中发现误分类样本数超过6(即图中的α比例的下界),那么我们可以认为ϵ=0.3这个假设并不正确。
那么如何设定错误率的范围?我们可使用“二项检验”(binomial test)来对“ε ≤ 0.3”(即“泛化错误率是否不大于0.3”)这样的假设进行检验。更一般的,考虑假设“ε ≤ ε0”,则在1-α的概率内所能观测到的最大错误率如下式计算。这里1-α反映了结论的“置信度”(confidence),直观地来看,相应于图2.6中非阴影部分的范围。
(注意课本公式有错误)
此时若测试错误率 小于临界值
,则根据二项检验可得出结论:在 α 的显著度下,假设“
”不能被拒绝,即能以 1-α 的置信度认为,学习器的泛化错误率不大于
;否则该假设可被拒绝,即在 α 的显著度下可认为学习器的泛化错误率大于
。
现在,我们有一个标准(临界值),比如说我们认为可以接受的错误率是5%。我们用测试错误率和这个标准比较,看看学习器的表现是否达到我们的期望。
-
如果测试错误率比我们定的标准要低,那么我们就可以说,我们有理由相信这个学习器在实际应用中的错误率也不会超过5%。这里的“有理由相信”是指我们有95%的信心(如果我们设定的显著度是5%的话)。
-
如果测试错误率高于我们定的标准,那么我们就没有足够的信心说学习器的实际错误率会低于5%,我们可能会认为它的表现不够好。
这个过程就像是在做一个判断:如果一个学生在模拟考试中的成绩很好,那么我们有理由相信他在真正的考试中也会表现不错。但如果模拟考试成绩不理想,我们就不能确定他在真正的考试中会表现如何,可能需要更多的训练和准备。
t分布
在很多时候我们并非仅做一次留出法估计,而是通过多次重复留出法或是交叉验证法等进行多次训练/测试,这样会得到多个测试错误率,此时可使用“t检验”(t-test)。
- 通过k折交叉验证。每次测试都会得到一个错误率。假定我们得到了k个测试错误率,
- 计算平均错误率和方差:
和
。
- 计算一个叫做t统计量
服从自由度为k-1的t分布,如图2.7所示。
-
显著性检验:我们使用t分布来确定
的值是否显著。如果我们计算出的
值在t分布的某个临界值之外,那么我们就可以说,学习器的泛化错误率与我们假设的
有显著差异。
标准化是将数据转换为一个标准尺度,使得不同数据集之间可以进行比较。在t检验中,我们通过计算t统计量来标准化样本均值与总体均值之间的差异。
通过这个过程,我们可以评估样本均值与总体均值之间的差异是否具有统计学意义。如果τ_t的值在某个显著性水平下足够大,那么我们就可以拒绝零假设(即样本均值等于总体均值的假设),认为样本均值与总体均值之间存在显著差异。这种方法在评估学习器的泛化性能时非常有用,因为它允许我们在有限的测试数据下,对学习器的性能进行合理的推断。
-
2.4.2 交叉验证t检验
对两个学习器A和B,若我们使用k折交叉验证法得到的测试错误率分别为和
,其中
和
是在相同的第i折训练/测试集上得到的结果,则可用k折交叉验证“成对t检验”(paired t-tests)来进行比较检验。这里的基本思想是若两个学习器的性能相同,则它们使用相同的训练/测试集得到的测试错误率应相同,即
。
-
对于每次测试,我们计算两个学习器的错误率之差,即
。这个差值表示在第i次测试中,学习器A比学习器B好多少(或者差多少)。
-
计算所有差值的平均值,即μ = (Δ1 + Δ2 + ... + Δk) / k。这个平均差值告诉我们,在所有测试中,学习器A平均比学习器B好多少。
-
计算这些差值的方差σ²,这告诉我们差值的分散程度。方差越大,表示差值之间的差异越大。
-
计算t统计量
,
-
如果
的绝对值大于t分布的临界值
(这个值取决于α和自由度k-1),那么我们拒绝原假设,认为两个学习器的性能有显著差异。
-
如果
的绝对值小于或等于临界值
,那么我们没有足够的证据拒绝原假设,可以认为两个学习器的性能没有显著差异。
-
这里
是自由度为k-1的t分布上尾部累积分布为α/2的临界值。
-
5×2交叉验证是做5次2折交叉验证,在每次2折交叉验证之前随机将数据打乱,使得5次交叉验证中的数据划分不重复。
- 对两个学习器A和B,第i次2折交叉验证将产生两对测试错误率,我们对它们分别求差,得到第1折上的差值
和第2折上的差值
。
- 为缓解测试错误的非独立性,我们仅计算第1次2折交叉验证的两个结果的平均值
,
- 对每次2折实验的结果都计算出其方差
。
- 用以下公式计算t统计量
,其服从自由度为5的t分布,其双边检验的临界值
-
如果计算出的
值大于临界值,那么我们拒绝零假设(即两个学习器的性能没有显著差异),认为两个学习器的性能有显著差异。
-
如果
值小于或等于临界值,那么我们不能拒绝零假设,即没有足够的证据表明两个学习器的性能有显著差异。
-
-
2.4.3 McNemar检验
对二分类问题,使用留出法不仅可估计出学习器A和B的测试错误率,还可获得两学习器分类结果的差别,即两者都正确、都错误、一个正确另一个错误的样本数,如“列联表”(contingency table)2.4所示。
若我们做的假设是两学习器性能相同,则应有,那么变量
应当服从正态分布,方差为
。
-
我们定义一个变量
,表示两个学习器错误率的绝对差值。
-
计算一个卡方统计量
,其服从自由度为1的
分布,即标准正态分布变量的平方。
-
给定显著度α,当以上变量值小于临界值
时,不能拒绝假设,即认为两学习器的性能没有显著差别;否则拒绝假设,即认为两者性能有显著差别,且平均错误率较小的那个学习器性能较优。
简单来说,这个过程就像是在说:“我们假设两个学习器表现一样好,然后我们看看它们实际表现的差异是否足够大,以至于我们可以确定它们实际上不一样。我们用一个统计方法来衡量这个差异,如果差异足够大,我们就说它们不一样;如果差异不够大,我们就说它们可能一样。”
-
2.4.4 Friedman 检验与 Nemenyi 后续检验
在很多时候,我们会在一组数据集上对多个算法进行比较。当有多个算法参与比较时,一种做法是在每个数据集上分别列出两两比较的结果,而在两两比较时可使用前述方法;另一种方法更为直接,即使用基于算法排序的Friedman检验。
假定我们用D_1、D_2、D_3和D_4四个数据集对算法A、B、C进行比较。
- 首先,使用留出法或交叉验证法得到每个算法在每个数据集上的测试结果,
- 然后在每个数据集上根据测试性能由好到坏排序,并赋予序值1, 2, …;若算法的测试性能相同,则平分序值。
- 然后,使用Friedman检验来判断这些算法是否性能都相同。若相同,则它们的平均序值应当相同。Friedman检验通过比较各算法的平均序值来判断是否存在显著差异。
- 假定我们在N个数据集上比较k个算法,令
表示第i个算法的平均序值,为简化讨论,暂不考虑平分序值的情况,则
服从正态分布,其均值和方差分别为
和
。
- 计算Friedman检验的统计量
,其在k和N都较大时,服从自由度为k-1的
分布。
-
给定显著性水平α,找到对应的卡方分布的临界值。
-
如果计算出的
值小于临界值,我们不能拒绝原假设,即认为所有算法的性能没有显著差异。
-
如果
值大于临界值,我们拒绝原假设,认为至少有两个算法的性能有显著差异。
-
然而,上述这样的“原始Friedman检验”过于保守,现在通常使用变量,其中
由上式得到。
服从自由度为k-1和(k-1)(N-1)的F分布。
-
若“所有算法的性能相同”这个假设被拒绝,则说明算法的性能显著不同。这时需进行“后续检验”(post-hoc test)来进一步区分各算法。常用的有Nemenyi后续检验。
- 计算出平均序值差别的临界值域
,
-
对于每一对算法,计算它们的平均序值之差。
-
如果这个差值超过了临界值域CD,那么我们拒绝“这两个算法性能相同”的假设,认为它们之间存在显著差异。
上述检验比较可以直观地用Friedman检验图显示,图中纵轴显示各个算法,横轴是平均序值。对每个算法,用一个圆点显示其平均序值,以圆点为中心的横线段表示临界值域的大小。然后就可从图中观察,若两个算法的横线段有交叠,则说明这两个算法没有显著差别,否则即说明有显著差别。从图2.8中可容易地看出,算法A与B没有显著差别,因为它们的横线段有交叠区域,而算法A显著优于算法C,因为它们的横线段没有交叠区域。
-
-
2.5 偏差和方差
对学习算法除了通过实验估计其泛化性能,人们往往还希望了解它“为什么”具有这样的性能。“偏差-方差分解”(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。它将模型的泛化误差分解为三个部分:偏差(Bias)、方差(Variance)和不可约误差(Irreducible Error)。
对测试样本 x,令 为 x 在数据集中的标记,y 为 x 的真实标记,f(x;D) 为训练集 D 上学得模型 f 在 x 上的预测输出。以回归任务为例:
- 学习算法的期望预测为:
- 使用样本数相同的不同训练集产生的方差为
,方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响
- 噪声为
,噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
- 期望输出与真实标记的差别称为偏差(bias),即
,偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了算法本身的拟合能力
-
接下来,我们对泛化误差进行拆解,为便于讨论,假定噪声期望为零,即。通过简单的多项式展开合并,可对算法的期望泛化误差
进行分解:
接下来我们进行推导:
- 第1-2行:拆分出算法的期望误差
- 第2-3行:将上式展开,展开方法类似于
,因为期望之间相互独立,所以加法式可以拆开(具体原理请自行查阅大学教辅《概率论与数理统计》)
- 第3-4行:前两项保留,第三项的两个差值的期望均为0,并且相互独立,而两个独立的数学期望相乘,结果为0;因此第三项消掉。
- 后续类似
- 因此我们将模型的误差分解为偏差、方差和噪声三项
可见
也就是说,泛化误差可分解为偏差、方差与噪声之和。
偏差-方差分解说明,泛化性能是由算法的学习能力(偏差)、数据集的影响(方差)以及学习任务本身的难度(噪声)所共同决定的。给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。
-
一般来说,偏差与方差是有冲突的,这称为偏差-方差窘境(bias-variance dilemma)。通过将模型的误差分解为偏差、方差和噪声,我们可以更直观地理解模型的泛化能力:
- 在训练不足时,学习器的拟合能力不够强,训练数据的扰动不足以使学习器产生显著变化,此时偏差主导了泛化误差;此时模型欠拟合,通常需要增加模型复杂度或改进特征工程。
- 随着训练程度的加深,学习器的拟合能力逐渐增强,训练数据发生的扰动渐渐能被学习器学到,方差逐渐主导了泛化误差;此时模型过拟合,通常需要减少模型复杂度、增加正则化或使用更多的训练数据。
- 误差是不可避免的,反映了学习问题本身的难度。
-
-
最后
亲爱的朋友们,非常感谢您抽出宝贵的时间阅读我的博客。在这里,我分享了一些自己学习的点滴。如果您在阅读过程中有所收获,或者觉得这些内容引起了您的共鸣,希望能得到您的一次点赞,这对我来说是莫大的鼓励。同时,如果您对我的分享感兴趣,不妨关注一下我的博客,这样就能及时收到我的更新通知,不错过更多有趣的内容。另外,如果这些文章对您有帮助,也可以收藏起来,方便日后查阅。您的支持是我不断前行的动力,再次感谢您的陪伴!