2.1 经验误差与过拟合
- 误差相关概念
- 错误率与精度:在分类任务里,错误率是指分类错误的样本数在样本总数中所占的比例。假设样本总数为,其中分类错误的样本数为
,那么错误率 。而精度则是分类正确的样本数占样本总数的比例,即精度 = 1 - 错误率,通常会以百分比的形式呈现,如 。 - 经验误差与泛化误差:学习器在训练集上所产生的误差被称为经验误差或者训练误差,而在新样本上的误差则叫做泛化误差。我们的目标是获得泛化误差小的学习器,因为这意味着它在面对未知数据时也能有较好的表现。然而,在实际操作中,由于我们事先并不清楚新样本的具体情况,所以往往只能尽力使经验误差最小化。
- 错误率与精度:在分类任务里,错误率是指分类错误的样本数在样本总数中所占的比例。假设样本总数为,其中分类错误的样本数为
- 过拟合与欠拟合
- 过拟合:当学习器把训练样本学得过于透彻,以至于将训练样本特有的一些非普遍特性也当作所有潜在样本都具备的一般性质时,就会出现过拟合现象。这会导致学习器在训练集上表现出色,但在新样本上的泛化性能却大幅下降 。过拟合的产生通常是由于学习能力过于强大,例如复杂的模型可能会过度捕捉训练数据中的噪声和细节。过拟合是机器学习面临的一个关键难题,难以完全避免,因为机器学习所处理的问题往往是 NP 难甚至更难的,如果能够彻底避免过拟合,那么通过经验误差最小化就可以轻松获得最优解,这意味着 “”,但目前普遍认为 “
”。 - 欠拟合:与过拟合相反,欠拟合是指学习器对训练样本的一般性质还没有充分学习。这可能是因为学习能力不足,比如简单的模型无法捕捉到数据中的复杂规律。欠拟合相对较容易克服,例如在决策树学习中可以通过扩展分支,在神经网络学习中增加训练轮数等方式来改善。
- 过拟合:当学习器把训练样本学得过于透彻,以至于将训练样本特有的一些非普遍特性也当作所有潜在样本都具备的一般性质时,就会出现过拟合现象。这会导致学习器在训练集上表现出色,但在新样本上的泛化性能却大幅下降 。过拟合的产生通常是由于学习能力过于强大,例如复杂的模型可能会过度捕捉训练数据中的噪声和细节。过拟合是机器学习面临的一个关键难题,难以完全避免,因为机器学习所处理的问题往往是 NP 难甚至更难的,如果能够彻底避免过拟合,那么通过经验误差最小化就可以轻松获得最优解,这意味着 “”,但目前普遍认为 “
- 模型选择问题:在实际应用中,我们常常会面临多种学习算法的选择,而且即使是同一种学习算法,不同的参数配置也会产生不同的模型。我们希望选择泛化误差最小的模型,但由于无法直接获取泛化误差,而训练误差又因为过拟合现象的存在不能作为可靠的选择标准,所以就需要借助合适的模型评估与选择方法来确定最优的模型。
NP 问题:
想象你是一个快递员,每天要送很多包裹。有一天老板给你一个挑战:
问题1(简单任务):“把包裹按大小排序摆好。”
你发现只要两两比较,很快就能排好序。这种容易解决的问题就叫P问题(Polynomial Time,多项式时间可解)。
问题2(困难任务):“找到一条最短路线,经过所有客户家且不重复走。”
这就是著名的旅行商问题。如果客户少(比如5家),你还能试遍所有路线找最短的;但如果客户有100家,可能的路线比宇宙原子还多,算到天荒地老也算不完。这种很难快速找到答案的问题,就叫NP问题。
NP问题的核心特点:
- 验证容易:如果我给你一条路线,你很快能验证它是否最短(比如用导航测距离)。
- 求解困难:但要自己找到这条路线,可能需要试遍所有可能性。
现实中的NP问题例子:
- 数独(填数字容易验证,但解起来难)
- 密码破解(验证密码是否正确很快,但穷举所有密码极慢)
- 课程排课(检查课表是否冲突容易,但安排无冲突课表很难)
终极谜题(P vs NP问题):
科学家们争论:这些NP问题是否其实都有快速解法,只是我们还没发现?如果某天有人证明P=NP,意味着所有能快速验证的问题都能快速解决,密码学将崩溃,物流/医药等领域会巨变。但目前大多数人相信P≠NP,这类问题本质就是难的。
总结:
NP 问题就像"解谜游戏"——验证答案简单,但找到答案可能需要穷举所有可能性。它们代表了计算复杂性理论中"容易验证但难以解决"的有趣现象。
2.2 评估方法
为了有效评估模型的泛化能力,需要使用合适的评估方法。
2.2.1 留出法
- 方法:将数据集划分为训练集和测试集(如 80% 训练,20% 测试)。
- 优点:
- 简单易行,适用于大数据集。
- 缺点:
- 数据划分不同,可能导致结果不稳定。
2.2.2 交叉验证法
折交叉验证(k-fold Cross-validation)
-
步骤:
- 数据集随机划分为 ( k ) 份。
- 依次选择 1 份 作为测试集,其余 ( k-1 ) 份作为训练集。
- 训练并测试 ( k ) 次,每次记录模型表现。
- 计算所有 ( k ) 次测试结果的平均值,作为最终性能指标。
-
常见的 k 值:
- 5 折交叉验证(5-fold CV):较快,计算成本低,常用于中等数据集。
- 10 折交叉验证(10-fold CV):最常用,能够较好平衡计算开销和评估稳定性。
- 20 折及以上:适用于数据量极少的情况,但计算成本较高。
-
优缺点:
- 优点:提高模型稳定性,充分利用数据,减少过拟合。
- 缺点:计算开销较大,尤其当 ( k ) 较大时,需要训练多次。
留一法(Leave-One-Out Cross-validation, LOO-CV)
-
特殊情况:( k = m )(数据集有 ( m ) 个样本)。
-
方法:
- 每次选取 1 个样本作为测试集,剩下的 ( m-1 ) 个样本用于训练。
- 训练并测试 ( m ) 次,计算所有测试结果的平均值。
-
优缺点:
- 优点:最大限度地利用数据,每个样本都被用于训练和测试,适用于小样本场景。
- 缺点:计算成本极高,训练模型 ( m ) 次,尤其对于大数据集不可行。
分层 k 折交叉验证(Stratified k-fold Cross-validation)
-
适用场景:类别不均衡(如二分类任务中正负样本比例严重失衡)。
-
方法:
- 在每次划分时,保持类别分布一致,确保训练集和测试集中类别比例相同。
-
优缺点:
- 优点:提高评估的稳定性,避免数据分布不均导致的偏差。
- 缺点:略微增加计算复杂度,但一般开销不大。
重复 k 折交叉验证(Repeated k-fold Cross-validation)
-
方法:
- 进行 k 折交叉验证,重复多次(如 10 次)。
- 每次随机划分数据集,增加评估的可靠性。
- 最终计算所有重复实验的均值和方差。
-
优缺点:
- 优点:进一步减少数据划分带来的不确定性。
- 缺点:计算成本增加。
时间序列交叉验证(Time Series Cross-validation)
-
适用场景:时间序列数据,如股票预测、天气预报。
-
方法:
- 不能随机划分数据,必须保证时间顺序。
- 训练集只能使用过去的数据,测试集使用未来的数据。
- 滑动窗口(Rolling Window)方法:
- 设定窗口大小,每次向前滑动一部分数据进行训练和测试。
-
优缺点:
- 优点:保证时间序列数据的时间一致性,避免数据泄露。
- 缺点:只能使用历史数据进行训练,数据利用率相对较低。
交叉验证的应用场景
| 交叉验证方法 | 适用场景 | 计算成本 |
|---|---|---|
| k 折交叉验证 | 通用方法,适用于大部分任务 | 中等 |
| 留一法(LOO) | 小样本数据集 | 高 |
| 分层 k 折交叉验证 | 类别不均衡问题 | 略高 |
| 重复 k 折交叉验证 | 提高评估可靠性 | 高 |
| 时间序列交叉验证 | 时序数据,如股票预测 | 低 |
交叉验证的优缺点
-
优点
- 充分利用数据:比单次划分(留出法)更稳定,提高训练数据的使用率。
- 减少数据划分偏差:避免测试集的不同划分导致评估不稳定。
- 提高泛化能力:避免过拟合,提高模型对新数据的适应性。
-
缺点
- 计算开销大:需要训练多个模型,特别是 LOO 和 Repeated k-fold 方法。
- 模型训练时间长:对于深度学习等复杂模型,训练时间可能大幅增加。
2.2.3 自助法
自助法(Bootstrapping)是一种随机重采样技术,主要用于小数据集或无法进行多次实验的场景。它的核心思想是从原始数据集中有放回地采样,生成多个不同的训练集,从而估计模型的泛化能力。
为什么需要自助法?
在实际应用中,我们往往面临以下问题:
- 数据量不足:留出法和交叉验证法都需要预留一部分数据用于测试,导致训练数据减少,影响模型表现。
- 数据难以获取:某些领域(如医学、生物学)获取数据的成本很高,无法收集大量样本。
- 结果不稳定:当数据集较小时,单次划分数据集可能导致评估结果不稳定。
自助法通过重采样,能够最大限度地利用已有数据,提高模型的稳定性和泛化能力。
自助法的工作原理
1 采样方法
- 假设原始数据集包含
个样本: - 从中随机“有放回”地抽取
个样本,构成新的训练集 。 - 有放回采样意味着:某个样本可能被选中多次,也可能完全未被选中。
- 未被抽中的样本构成测试集
,用于评估模型。
2 包外估计(Out-of-Bag, OOB)
由于是有放回采样,每次抽取的训练集不包含所有样本,通常会有部分样本未被选中:
- 在数据量足够大的情况下,每个样本被选中的概率:
当
,可以近似计算: - 这意味着,约 36.8% 的样本不会被抽中,可以作为测试集。
- 这部分未被选中的数据称为 “包外数据”(Out-of-Bag, OOB),可用于评估模型的泛化能力,类似于交叉验证。
自助法的优缺点
- 优点
- 适用于小数据集:通过重采样,提高数据的使用率,适用于样本稀缺的场景(如医学诊断、生物实验)。
- 无需额外划分测试集:由于 OOB 估计的存在,不需要额外预留测试数据,提高数据利用率。
- 适用于集成学习(Bagging):例如,随机森林(Random Forest) 使用自助法构造多个决策树,每棵树的训练数据都是自助采样得到的。
- 缺点
- 数据分布可能失真:由于某些样本可能被多次选中,而某些样本可能从未出现,导致训练集的分布与原始数据集不完全一致。
- 训练数据的多样性下降:训练集和原始数据集的差异较大,可能影响模型的学习效果。
- 不适用于大规模数据集: 对于大数据集,交叉验证往往更稳定,而自助法可能会增加计算开销。
自助法 vs 交叉验证
| 方法 | 特点 | 适用场景 | 计算开销 |
|---|---|---|---|
| 自助法(Bootstrapping) | 有放回采样,生成多个训练集 | 数据少、Bagging方法 | 低 |
| 交叉验证(Cross-validation) | k 折拆分数据集,训练 k 次 | 数据量充足的模型评估 | 高 |
| 留出法(Hold-out) | 一次性划分训练/测试集 | 大规模数据 | 低 |
2.2.4 参与最终模型
- 调参的必要性:学习算法的参数配置影响模型性能,需进行参数调节。
- 调参方法:对每个参数选定范围和变化步长,从候选值中选择,是计算开销和性能估计的折中。
- 最终模型构建:模型选择完成后,用全部数据集 D 重新训练模型,得到最终提交给用户的模型;模型评估与选择中用于评估测试的数据集称为验证集。
算法参数(超参数)与模型参数
算法参数是指算法本身的一些参数(也称超参数),例如 近邻的近邻个数 、支持向量机的参数 。算法配置好相应参数后进行训练,训练结束会得到一个模型,例如支持向量机最终会得到 和 的具体数值(此处不考虑核函数),这就是模型参数,模型配置好相应模型参数后即可对新样本做预测。
2.3 性能度量
性能度量是衡量模型泛化能力的评价标准,反映任务需求,不同性能度量会导致不同的模型评判结果。
2.3.1 误差率(Error Rate)与精度(Accuracy)
在机器学习的分类任务里,错误率和精度是评估模型性能的常用指标。
- 错误率:它指的是分类错误的样本数量在样本总数中所占的比例。假设样本总数是 ,其中分类错误的样本数为 ,那么错误率
的计算方式就是 。 - 精度:精度表示分类正确的样本数占样本总数的比例,它与错误率相关,计算公式为精度 =
错误率,一般会以百分比形式呈现,例如 。
在更普遍的情形下,考虑数据分布 和概率密度函数 时,错误率和精度有更复杂的数学描述方式:
- 错误率的一般描述:
。这里的 是指示函数,当括号里的条件成立,也就是 为真时, 取值为 1;反之则取值为 0。这个公式的含义是,对数据分布 中的每个样本 ,如果模型 对它的预测结果 与真实标记 不一致,就按照概率密度函数 进行加权累计,从而得到在整个数据分布上的错误率。 - 精度的一般描述:
。同样基于指示函数,当 为真时, 取值为 1,再结合概率密度函数 进行加权累计,得到精度。并且可以看出,在这种一般描述下,精度依然等于 减去错误率。
这两个指标的适用范围很广,无论是二分类任务(比如判断邮件是否为垃圾邮件),还是多分类任务(比如识别图像中的物体是猫、狗还是其他动物),都可以用错误率和精度来评估模型的表现。
2.3.2 查准率、查全率与 F1
在分类问题中,查准率(Precision) 和 查全率(Recall) 是两个非常重要的指标,尤其适用于类别不均衡问题(如垃圾邮件检测、医疗诊断)。然而,它们之间往往存在权衡,因此引入 F1-score 来作为一个综合评价指标。
混淆矩阵(Confusion Matrix)
在二分类任务中,混淆矩阵 是计算 Precision、Recall 和 F1-score 的基础。
| 实际类别 \ 预测类别 | 预测为正类(Positive) | 预测为负类(Negative) |
|---|---|---|
| 实际为正类(Positive) | TP(真正例) | FN(假负例) |
| 实际为负类(Negative) | FP(假正例) | TN(真负例) |
其中:
- TP(True Positive):正确预测的正例(模型正确地将正样本预测为正类)。
- FN(False Negative):错误预测的正例(模型将实际为正的样本预测为负类,导致漏报)。
- FP(False Positive):错误预测的负例(模型将实际为负的样本预测为正类,导致误报)。
- TN(True Negative):正确预测的负例(模型正确地将负样本预测为负类)。
查准率(Precision)
2.1 定义:查准率(Precision) 衡量的是模型预测为正类的样本中,真正为正类的比例:
即:
2.2 示例假设某个分类器预测了一组数据:
- 实际正例(Positive)= 50 个
- 实际负例(Negative)= 50 个
- 预测为正类的样本数 = 40 个
- 其中 35 个是正确预测的(TP = 35)。
- 5 个是误报(FP = 5)。
计算查准率:
解释:模型预测的 40 个正类中,87.5% 确实是正例,说明误报较少。
2.3 适用场景 :当误报(FP)代价较高时,Precision 重要:
- 垃圾邮件检测:误把正常邮件当垃圾邮件(误报 FP)可能导致重要邮件丢失。
- 自动驾驶目标检测:误把非行人识别为行人可能导致不必要的刹车。
查全率/召回率(Recall)
3.1 定义:查全率(Recall) 衡量的是所有实际正类中,被正确预测为正类的比例:
即:
3.2 示例:假设实际正例共有 50 个:
- 模型正确预测了 35 个(TP = 35)。
- 但误判了 15 个为负类(FN = 15)(漏报)。
计算查全率:
解释:模型应该识别出 50 个正类,但只正确找到了 70%(35 个),有 30% 被漏检。
3.3 适用场景:当漏报(FN)代价较高时,Recall 重要:
- 医疗诊断:如果病人有癌症但被误判为健康人(FN),可能会错失治疗机会。
- 安全检测:如果恐怖分子被漏检(FN),可能会导致安全风险。
Precision vs. Recall
| 指标 | 公式 | 解释 | 适用场景 |
|---|---|---|---|
| 查准率(Precision) | 在所有被预测为正的样本中,真正为正的比例 | 适用于减少误报(FP)代价高的任务,如垃圾邮件过滤 | |
| 查全率(Recall) | 在所有实际正例中,被正确识别的比例 | 适用于减少漏报(FN)代价高的任务,如医疗诊断 |
Precision vs. Recall 的权衡
- 提高 Precision(减少 FP),可能会降低 Recall(增加 FN)。
- 提高 Recall(减少 FN),可能会降低 Precision(增加 FP)。
- 两者不能同时优化,需要平衡。
F1-score(综合 Precision 和 Recall)
5.1 定义:F1-score 作为Precision 和 Recall 的调和均值,用于综合评估模型的性能:
F1-score 越高,说明 Precision 和 Recall 之间的平衡越好。
5.2 示例如果:
(0.875) (0.7)
则:
5.3 适用场景:适用于 Precision 和 Recall 需要平衡的任务:
- 文本分类
- 目标检测(如自动驾驶)
- 欺诈检测(需要兼顾误报和漏报)
总结
-
Precision(查准率) 衡量预测为正的样本中真正为正的比例,适用于误报(FP)代价高的情况。
-
Recall(查全率) 衡量所有实际正类中被正确识别的比例,适用于漏报(FN)代价高的情况。
-
F1-score 作为综合指标,适用于 Precision 和 Recall 都重要 的情况。
-
如果 FP 代价高,选择 Precision(如垃圾邮件检测)。
-
如果 FN 代价高,选择 Recall(如医疗诊断)。
-
如果 Precision 和 Recall 需要平衡,选择 F1-score(如欺诈检测)。

“平衡点”(Break-Even Point,简称BEP)就是这样一个度量,它是“查准率=查全率”时的取值,
2.3.3 ROC与AUC
ROC 曲线(接收器操作特征曲线)
-
定义:
ROC(Receiver Operating Characteristic)曲线最初起源于雷达信号检测领域,用于衡量信号与噪声的区分能力。如今,在机器学习中,它主要用来评估二分类模型的性能。ROC 曲线以假正例率(FPR)为横轴、真正例率(TPR,又称灵敏度/召回率)为纵轴,通过改变分类阈值,绘制出模型在各个阈值下的表现情况。 -
关键指标:
- 真正例率(TPR): 表示所有真实正例中被正确预测为正例的比例(类似 Recall),其计算公式为
其中 TP(True Positive)为真实为正且预测为正的样本数,FN(False Negative)为真实为正但预测为负的样本数。
- 假正例率(FPR): 表示所有真实负例中被错误预测为正例的比例,其计算公式为
其中 FP(False Positive)为真实为负但预测为正的样本数,TN(True Negative)为真实为负且预测为负的样本数。
- 真正例率(TPR): 表示所有真实正例中被正确预测为正例的比例(类似 Recall),其计算公式为
-
曲线构建:
对于一个分类模型,通常会输出一个概率或得分。我们可以选取不同的阈值,将得分高于阈值的样本判定为正例,不同阈值下就会有不同的 TPR 和 FPR,进而在二维坐标系上形成一条曲线。理想情况下,完美分类器的 ROC 曲线会直接从 (0,0) 上升到 (0,1) 再平移到 (1,1);而随机猜测的模型则对应对角线(FPR = TPR)。
AUC(ROC 曲线下的面积)
-
定义:
AUC(Area Under the Curve)就是 ROC 曲线下的面积,用一个单一的数值来量化模型的整体分类性能。AUC 的取值范围通常在 0 到 1 之间,其中:- AUC = 1: 模型完美区分正负样本。
- AUC = 0.5: 模型的表现与随机猜测一样。
- AUC < 0.5: 模型的预测还不如随机猜测(如果出现这种情况,通常只需将模型预测结果反转即可)。
-
概率解释:
一个直观的理解是:AUC 表示“在随机选取一个正例和一个负例时,模型将正例排在负例前面的概率”。例如,AUC = 0.8 意味着有 80% 的概率模型会给正例更高的得分。
为什么使用 ROC 与 AUC
-
不受阈值影响:
与直接使用准确率不同,ROC 曲线考虑了模型在不同阈值下的表现,使得我们可以更全面地了解模型的分类能力,尤其适用于类别不平衡的情况。 -
直观可视化:
ROC 曲线可以直观地展示真正例率和假正例率之间的权衡,通过曲线下的面积(AUC)还可以方便地比较不同模型的性能。 -
应用场景:
在医学诊断、信用评分、异常检测等任务中,通常关心的是在控制误报率(FPR)的前提下,尽可能提高检测率(TPR)。ROC 和 AUC 为这类问题提供了有效的评估工具。
如何绘制 ROC 曲线与计算 AUC
-
获得预测得分:
模型通常会输出一个表示样本属于正类的概率或得分。 -
设定不同阈值:
将阈值从 0 到 1(或覆盖所有可能的得分值)进行遍历,每个阈值下计算对应的 TPR 和 FPR。 -
绘制曲线:
在二维坐标系中以 FPR 为横轴、TPR 为纵轴绘制各个点,然后将这些点连接起来就形成了 ROC 曲线。 -
计算 AUC:
通常使用数值积分(例如梯形法)计算 ROC 曲线下的面积,即为 AUC 的值。
总结
- ROC 曲线 提供了一种可视化工具,可以展示模型在不同阈值下的真正例率与假正例率之间的权衡。
- AUC 则将这种性能转换为一个数值,反映模型将正例排在负例前面的概率,是衡量分类器整体表现的重要指标。
- 对于机器学习初学者来说,理解这两个概念有助于更全面地评估模型,而不仅仅依赖于单一的准确率指标。

2.3.4 代价敏感错误率与代价曲线
-
问题背景
- 传统的性能度量(如错误率、准确率、ROC、AUC等)都隐含假设所有错误的代价相同,但在实际应用中,不同错误往往造成不同后果。例如,在医疗诊断中,把病人误判为健康与把健康人误判为病人的影响截然不同。
-
代价矩阵的引入
真实类别 预测类别 - 第0类 预测类别 - 第1类 第0类 0 第1类 0 - 为了量化不同错误的损失,引入了代价矩阵(cost matrix)。对于二分类问题,通常用一个 2×2 的矩阵表示:
- 当真实类别为 0(正例)而预测为 1 时,代价为 cost₀₁
- 当真实类别为 1(负例)而预测为 0 时,代价为 cost₁₀
- 正确分类(对角线上的元素)代价为 0
- 关键在于代价比值,反映了哪一种错误更加严重。
- 为了量化不同错误的损失,引入了代价矩阵(cost matrix)。对于二分类问题,通常用一个 2×2 的矩阵表示:
-
代价敏感错误率的定义
- 在非均等代价的情形下,目标不再是简单地最小化错误数,而是最小化总体代价。代价敏感错误率通过将不同错误乘以相应的代价后再求和,得到一个加权的错误率。例如:
- 这样一来,模型在评估时就会考虑不同错误带来的实际影响。
- 令 与 分别代表样例集 的正例子集和反例子集
- 表示将正例误判为反例的代价
- 表示将反例误判为正例的代价
- 为指示函数,满足括号内条件时取值为 1,否则为 0
- 在非均等代价的情形下,目标不再是简单地最小化错误数,而是最小化总体代价。代价敏感错误率通过将不同错误乘以相应的代价后再求和,得到一个加权的错误率。例如:
-
代价曲线(Cost Curve)的构建与意义
- 由于传统的ROC曲线仅反映错误率(即均等代价下的表现),在非均等代价下它不能直接体现模型的期望总体代价。为此,引入了代价曲线。
- 在非均等代价的背景下,ROC曲线无法直接体现学习器的期望总体代价,而代价曲线则能实现这一目的。代价曲线图的横轴是取值范围为的正例概率代价,计算公式为:
- 其中 是样例为正例的概率;
- 纵轴是取值范围为 的归一化代价,计算公式为:
- 这里的
是之前定义的假正例率 是假反例率 - 绘制方法:
- 首先,利用模型在测试集上的预测得到一个 ROC 曲线上的点,其坐标为 (FPR, TPR);
- 根据 TPR 计算出 FNR(FNR = 1 − TPR);
- 在代价平面上,对应于该 ROC 点,绘制一条直线段,该线段连接点 (0, FPR) 与 (1, FNR);
- 整个代价曲线就是将 ROC 曲线上各个点“映射”到代价平面后,各线段下界所围成的区域,其面积反映了在所有操作条件下模型的期望总体代价。
- 通过代价曲线,我们可以直观地看到不同阈值下的代价变化,从而选择使得总体代价最小的分类阈值,也能在代价敏感的场景下比较不同模型的表现。
-
总结
- 在代价敏感的情形下,单纯追求错误率或AUC可能会忽略实际损失的差异。代价敏感错误率通过引入代价矩阵,对不同错误加权后进行评价;而代价曲线则提供了一种可视化手段,将ROC曲线在非均等代价下“转换”为反映期望总代价的图形工具。
- 这两种方法帮助我们更贴近实际应用需求,使模型评估与选择时能够考虑到业务中不同错误带来的不同风险和损失。

2.4 比较检验
虽然我们可以通过实验评估方法得到学习器在测试集上的性能指标,但直接“比大小”来比较学习器性能并不可靠。原因有三个:
- 泛化性能与测试集性能的差异: 测试集上测得的性能指标并不一定能反映学习器的泛化能力。
- 测试集的选择影响结果: 不同大小或不同样本组成的测试集会得到不同的性能结果,即使是同一大小的测试集,样本的随机抽取也会导致结果波动。
- 算法随机性: 许多机器学习算法本身具有随机性,同样的参数设置在同一测试集上多次运行也可能得到不同结果。
因此,需要采用统计假设检验来比较学习器的性能,通过检验结果判断观察到的性能差异是否在统计意义上显著,从而推断出一个学习器在泛化性能上是否真正优于另一个。
2.4.1 假设检验
1. 基本概念
在假设检验中,我们希望检验学习器的泛化错误率 是否符合某个假设,比如 。但由于泛化错误率是未知的,我们只能通过测试错误率 来推测它的分布。通常情况下,泛化错误率和测试错误率相近,因此可以依据测试结果进行推断。
2. 二项分布原理
如果学习器的泛化错误率为 ,那么在单个样本上犯错的概率也是 。对于一个包含 个测试样本的测试集:
- 其中 个样本被误分类,其概率分布符合二项分布:
- 该分布描述了测试错误率的波动情况。例如,当 时,误分类样本数最可能是 3。
- 表示从 个不同元素中取出 个元素的组合数。其中 通常是样本总数, 是测试错误率, 即被误分类的样本数量。它反映的是在 个样本里,出现 个误分类样本这种情况的组合方式数量。
- ,该概率表达式用于衡量在泛化错误率为 的情况下,出现测试错误率为 这种结果的可能性大小,进而参与到后续的二项检验等判断过程中,帮助推断学习器的泛化性能。
3. 二项检验:检验泛化错误率是否小于某个值
-
假设和目标
假设我们认为一个模型的真实错误率 ε 不会超过某个阈值 ε₀(例如 0.3)。
目标就是用测试数据来判断这个假设是否合理。 -
测试错误率和二项分布
当我们用 m 个样本测试模型时,每个样本的错误与否都可以看作一次“试验”,符合二项分布。
因此,观测到的错误数(或测试错误率)具有一定的随机性,即使模型真实错误率确实不超过 ε₀,实际测试中也可能偶尔出现较高的错误率。 -
置信度与显著性水平
我们设定一个显著性水平 α(例如 0.05),那么置信度就是 1 - α(例如 95%)。
这意味着,我们希望在 95% 的情况下,观测到的测试错误率不会超过一个“临界值”。 -
计算临界值
为了判断是否拒绝假设,我们计算一个临界值 ,这个值表示在 的概率范围内可能出现的最大错误率。公式为:
s.t.是“subject to”的简写。这段数学表达的意思是:
- 对于每一个可能的错误率 ε,我们计算从“
”到 m 个错误的概率总和; - 找出最大的 ε(即临界值 ),使得这个概率总和刚好小于 α。
- 直观上,这个 就对应于二项分布图中非阴影部分的右边界。

- 判断测试结果
- 如果实际测试得到的错误率 小于这个临界值 ,说明在 1 - α(比如 95%)的置信水平下,我们没有足够的证据拒绝“
”的假设。 - 反之,如果 大于 ,就说明实际错误率过高,低于置信度要求的范围内出现这种错误率的概率非常小,因此我们可以拒绝原假设,认为模型的真实错误率大于
。
- 如果实际测试得到的错误率 小于这个临界值 ,说明在 1 - α(比如 95%)的置信水平下,我们没有足够的证据拒绝“
4. t检验:当有多个测试结果时
背景:当使用交叉验证或多次留出法进行测试时,会得到多个测试错误率值 。
- 计算测试错误率的均值和方差:
- 计算 t 统计量:
该统计量服从自由度 的t 分布。
双边假设检验:
- 若 在 t 分布的临界范围 内,则不能拒绝假设 ,即泛化错误率可能等于 。
- 若 超出临界范围,则拒绝假设,认为泛化错误率与 存在显著差异。
常用显著性水平 :
- 0.05(95% 置信度)
- 0.1(90% 置信度)
5. 结论
- 二项检验 适用于单次测试,用于判断泛化错误率是否小于某个值。
- t检验 适用于多次测试(如交叉验证),用于判断泛化错误率是否与某个值显著不同。
- 通过假设检验,我们可以更科学地评估模型的泛化能力,而不依赖单次测试结果。
2.4.2 交叉验证 t 检验
1. 为什么要比较两个学习器?
假设你有两个算法(学习器)A和B,你想知道它们在解决某个问题时哪一个更好。通常,我们用“测试错误率”来衡量一个学习器在新数据上的表现。为了获得较稳定的估计,我们常常使用交叉验证,把数据分成若干份,多次重复训练和测试。
2. k 折交叉验证与成对 t 检验
k 折交叉验证
- 步骤:将数据集分成 k 个折(子集)。每一折轮流作为测试集,其余作为训练集。
- 得到结果:对于每一折 i,算法 A 和 B 分别得到测试错误率
和 。
为什么使用配对(paired)t检验?
- 配对数据:因为在同一折中,两个算法用的是完全相同的训练集和测试集,所以每一折得到的误差可以直接“配对”比较。
- 差值的计算:对每一折,计算两个算法的误差差值
- 假设检验:如果两个算法性能相同,那么每一折的差值理论上应该为 0。接下来,我们可以计算这些差值的平均值(记为 )和标准差(记为 ),构造t统计量:
- 决策:在给定显著性水平 下,查找自由度为 的 t 分布临界值 :
- 如果 ,则不能拒绝“两个算法性能相同”的假设;
- 如果 ,则认为两个算法的性能存在显著差异,通常错误率较低的那个算法更好。
3. 关于独立性问题与 5×2 交叉验证
独立性问题
- 问题:标准的 k 折交叉验证中,不同折之间的训练集存在重叠,这意味着不同折得到的错误率其实并不是完全独立的。这样可能会使 t 检验对“零假设”(两个算法性能相同)的拒绝概率估计得不准确(偏高)。
5×2 交叉验证的改进
为了解决上述独立性问题,可以采用“5×2 交叉验证”,具体做法如下:
-
重复5次2折交叉验证:
- 每一次都将数据随机打乱,然后分成两折。
- 每次 2 折交叉验证会产生两对结果,也就是说,对于第i次实验,你会得到两个差值:
(第一折的差值)和 (第二折的差值)。
-
计算差值的统计量:
- 均值 :文中建议取第一次2折交叉验证得到的两个差值的平均值
(这里的描述可能有些简化,但核心思想是利用差值的均值来反映算法间的平均性能差异)。 - 方差 :对每一次2折实验,都计算这两个差值的离散程度,即
- 均值 :文中建议取第一次2折交叉验证得到的两个差值的平均值
-
构造t统计量:
- 综合 5 次 2 折实验的方差,构造 t 统计量:
- 这里 0.2 实际上是来自于 2 折交叉验证(每次 2 个样本)的换算因子,而整个统计量服从自由度为 5 的t分布。
-
检验显著性:
- 根据所选的显著性水平(例如 对应的临界值为 2.5706,或 对应的临界值为2.0150),判断:
- 如果 小于临界值,则认为没有足够证据表明两个算法有显著性能差异;
- 否则,认为性能存在显著差别,并且通常错误率较低的那个算法更优秀。
- 根据所选的显著性水平(例如 对应的临界值为 2.5706,或 对应的临界值为2.0150),判断:
总结
- 基本思想:我们比较两个算法时,不仅关注平均性能(错误率),还需要考虑结果的波动性和统计显著性。
- 配对 t 检验:利用同一数据分割得到的结果配对,计算它们的差值,然后用 t 检验判断差值的平均值是否显著偏离 0。
- 5×2 交叉验证:为了减少因训练集重叠带来的依赖性问题,通过重复随机划分数据为两折的方法,得到更可靠的统计检验结果。
2.4.3 McNemar 检验
McNemar 检验的本质是比较两个分类器在同一组数据上的分类差异,尤其关注它们在不同情况下的错误模式。让我们用一个直观的例子来理解这个过程。
假设的场景
假设我们有 100 个样本,我们想比较 学习器 A 和 学习器 B 在这些样本上的表现。每个样本的分类结果可能有以下四种情况:
- A 和 B 都分类正确(
):两个模型都对某个样本分类正确。 - A 正确, B 错误(
):A 分类正确, 但 B 预测错误。 - A 错误, B 正确(
):A 分类错误, 但 B 预测正确。 - A 和 B 都分类错误(
):两个模型都对某个样本分类错误。
我们可以把这些结果放到 列联表(contingency table) 中:
| 算法B | 算法A - 正确 ( |
算法A - 错误 ( |
|---|---|---|
| 正确 | ||
| 错误 |
在这个表格里:
表示 A 预测正确但 B 预测错误 的样本数。 表示 A 预测错误但 B 预测正确 的样本数。
McNemar 检验的核心思想
如果 A 和 B 性能完全相同,我们可以假设 它们错误的样本应该是随机分布的,也就是说:
- A 纠正了 B 的错误的次数(
) - B 纠正了 A 的错误的次数(
)
应该是 相等的(即
McNemar 检验的目标就是:检验
如何进行 McNemar 检验
-
计算统计量:
这里:
- 分子 代表两个学习器在分类不同样本上的 错误差异。
- 分母
代表 两个学习器在不同样本上的错误总数。 - 这个统计量服从 自由度为 1 的卡方分布( 分布)。
-
设定显著性水平
并查找临界值:- 如果
(95% 置信度),那么临界值是 3.8415。 - 如果
(90% 置信度),那么临界值是 2.7055。
- 如果
-
判断结论:
- 如果计算出来的
< 临界值,那么不能拒绝假设,说明两者性能没有显著差异。 - 如果计算出来的
> 临界值,那么拒绝假设,说明A 和 B 的性能确实有显著差异,并且错误率较小的那个更优。
- 如果计算出来的
举个例子
假设:
- A 纠正了 B 的错误 20 次(
) - B 纠正了 A 的错误 10 次(
)
计算:
查找临界值:
- 选择
(95% 置信度)对应的临界值 3.8415。
比较:
- 2.7 < 3.8415,所以我们 不能拒绝 “A 和 B 具有相同性能”的假设,即它们的差异不显著。
但如果
总结
- McNemar 检验用于比较两个分类器的性能是否存在显著差异。
- 关注
(A 纠正 B 的错误)和 (B 纠正 A 的错误)的差异,如果两者相差很大,说明两者性能不同。 - 计算检验统计量
,再与 卡方分布的临界值比较,决定是否拒绝假设:- 若
小于临界值,说明两者性能无显著差异。 - 若
大于临界值,说明两者性能有显著差异,且错误率较低的那个更优。
- 若
2.4.4 Friedman检验与Nemenyi后续检验
Friedman 检验和 Nemenyi 后续检验是一组用于多个学习器(算法)性能比较的非参数统计方法。它们通常用于多个模型在多个数据集(或多个不同任务)上的性能排名比较,判断这些模型是否存在显著差异。
1. 为什么需要 Friedman 检验?
当我们想要比较 多个学习器(如 A、B、C、D) 的表现时,通常会使用多个数据集来评估它们。
- 如果 只有两个学习器(如 A 和 B),我们可以用 McNemar 检验 或 配对 t 检验。
- 但如果 有多个学习器,直接使用 t 检验进行多次两两比较会导致 错误率累积,影响结论的可靠性。
- 因此,我们需要一个 适用于多个学习器 的统计检验方法,这就是 Friedman 检验。
2. Friedman 检验的核心思想
Friedman 检验是一种 非参数检验,用于比较 多个学习器 在 多个数据集 上的排名是否存在显著差异。
核心步骤
-
排名:
- 对于 每个数据集,根据模型的表现(如错误率、准确率),将模型从最好到最差进行排名。
- 最好的模型排名为 1,第二好的排名为 2,依此类推。
- 若有多个模型表现相同,则取平均排名。
-
计算 Friedman 统计量:
- 计算所有模型的 平均排名(在所有数据集上的平均排名)。
- 计算 Friedman 统计量
,用于判断模型之间的整体排名是否存在显著差异。
-
判断是否显著:
- 通过
分布 或 F 分布 计算 p 值。 - 如果 p 值 < 设定的显著性水平(如 0.05),说明至少有一个学习器的排名显著不同,不能认为它们表现一致。
- 通过
-
如果 Friedman 检验显著,则进行 Nemenyi 后续检验。
3. Nemenyi 后续检验
Friedman 检验只能告诉我们 至少有一个学习器的排名不同,但它 不能告诉我们哪个学习器的差异最大。
因此,我们需要使用 Nemenyi 后续检验 来进一步 比较不同学习器之间的具体差异。
核心思想
- Nemenyi 检验用于进行两两比较,判断哪些学习器之间的排名差异足够大,从而认为它们确实表现不同。
- 计算 临界差值(CD, Critical Difference),如果 两个学习器的排名差大于 CD,则认为它们的性能显著不同。
计算临界差值(CD)
其中:
是 Nemenyi 分布的临界值(由显著性水平 和算法个数 决定)。 是算法数量(比如 4 个算法 A、B、C、D)。 是数据集的数量。
判断显著性
- 如果两个学习器的排名差 > CD,则认为它们的性能存在显著差异。
- 如果排名差 ≤ CD,则认为它们性能没有显著差异。
4. 示例
假设我们有 4 个分类器(A、B、C、D),在 6 个数据集上的排名如下:
| 数据集 | A | B | C | D |
|---|---|---|---|---|
| 1 | 1 | 2 | 3 | 4 |
| 2 | 2 | 3 | 1 | 4 |
| 3 | 1 | 2 | 4 | 3 |
| 4 | 3 | 1 | 2 | 4 |
| 5 | 2 | 3 | 1 | 4 |
| 6 | 1 | 3 | 2 | 4 |
| 平均排名 | 1.67 | 2.33 | 2.17 | 4.00 |
步骤
-
Friedman 检验:
- 计算 Friedman 统计量
。 - 假设 p 值 = 0.01,小于 0.05,意味着 至少有一个模型的排名显著不同。
- 计算 Friedman 统计量
-
Nemenyi 检验:
- 计算 临界差值(CD),假设 CD = 1.0。
- 计算学习器之间的排名差:
- A vs D:
→ A 显著优于 D。 - B vs D:
→ B 显著优于 D。 - C vs D:
→ C 显著优于 D。 - A vs B:
→ A 和 B 无显著差异。 - A vs C:
→ A 和 C 无显著差异。 - B vs C:
→ B 和 C 无显著差异。
- A vs D:
最终结论:
- A、B、C 之间没有显著差异。
- A、B、C 都显著优于 D,说明 D 可能是表现最差的算法。
5. 总结
| 检验方法 | 作用 |
|---|---|
| Friedman 检验 | 检验多个学习器的排名是否有显著差异。 |
| Nemenyi 后续检验 | 如果 Friedman 检验显著,则用 Nemenyi 进一步进行两两比较,找出哪些学习器之间存在显著差异。 |
适用场景
- 适用于多个学习器的比较(如 3 个以上)。
- 适用于多个数据集上的测试结果比较。
- 适用于不满足正态分布假设的情况(非参数方法)。
2.5 偏差与方差
1. 基本概念
-
偏差(Bias):表示模型的平均预测与真实值之间的差距。也就是说,如果我们对同一输入点使用很多不同的训练数据训练模型,再把这些模型的预测取平均,偏差就是这个平均预测与真实值之间的差异。
- 直观理解:想象你在瞄准靶子,偏差就像你每次射箭的平均位置与靶心的距离。如果平均位置离靶心很远,则说明系统性地“偏”了,也就是偏差大。
-
方差(Variance) :表示由于不同训练集造成的模型预测差异,也就是模型对数据微小变化的敏感程度。
- 直观理解:回到射箭例子,方差反映的是每次射出的箭散布有多大。如果箭群散布范围很大,则说明模型受训练数据波动的影响较大,即方差高。
-
噪声(Noise):表示数据本身的随机误差或固有的不确定性,是无论模型多好都无法消除的部分。
- 直观理解:噪声类似于风、环境干扰等因素,哪怕你技术再好,外部不可控的因素也会引入一定误差。
2. 偏差-方差分解的数学含义
对测试样本 ,令 为 在数据集中的标记, 为 的真实标记, 为训练集 上学得模型 在 上的预测输出。在回归任务中,我们用以下三个公式来定义它们:
-
模型的期望预测
表示对同一输入 ,在所有可能的训练集 下得到的预测平均值。
-
偏差
表示平均预测与真实值 之间的平方差。
-
方差
表示不同训练集下预测值与平均预测之间的波动程度。
-
噪声
表示训练数据中观测标签 与真实标签 的固有差异。
将这三部分合并,我们可以得到模型在输入 上的期望泛化误差为:
推导过程:
于是,
这就是偏差-方差分解的核心:
- 偏差反映了模型本身的拟合能力(是否能捕捉数据的真实趋势)。
- 方差反映了模型对不同训练数据敏感程度(是否会因为数据的波动而变化太大)。
- 噪声反映了问题本身的难度和数据中的随机性。
3. 直观例子:瞄靶子的比喻
假设你在进行射箭训练,目标是射中靶心:
- 高偏差低方差:你的箭总是集中在某个固定位置,但离靶心较远(比如一直偏左)。这种情况说明你训练不足或模型过于简单,无法准确捕捉正确方向,这就类似于欠拟合。
- 低偏差高方差:你的箭的平均位置可能接近靶心,但每次射出的箭分布很散(有时中靶,有时偏离很远)。这种情况说明你的模型虽然有能力拟合数据,但对数据中的微小变化非常敏感,容易过拟合。
- 理想情况:既低偏差又低方差,箭群集中且命中靶心,模型既能准确捕捉数据趋势,又对数据噪声不敏感。
4. 偏差-方差窘境(Trade-off)
在实际应用中,降低偏差往往会使方差增加,反之亦然。
- 如果模型太简单(例如线性模型去拟合明显非线性的数据),可能会导致高偏差,因为它不能捕捉数据的真实结构。
- 如果模型过于复杂(例如高次多项式),它可能在训练数据上表现极好(低偏差),但对不同数据的波动过于敏感(高方差),导致在新数据上表现不佳。
这就是偏差-方差窘境:在有限的数据和资源下,如何找到一个既不过于简单也不过于复杂的平衡点,是机器学习中常见的挑战。
5. 总结
- 偏差-方差分解帮助我们理解泛化误差的来源:
- 偏差描述模型平均预测与真实值的差距;方差描述不同训练集下预测的波动;噪声则是数据本身不可避免的随机性。
- 在设计和选择模型时,需要在偏差和方差之间找到一个合适的平衡,从而获得较好的泛化性能。
通过这种分解,我们不仅能评估一个模型在新数据上的错误率,还能分析错误来源,进而改进模型(例如通过正则化来降低过拟合引起的高方差)。