本内容为个人学习心得。恩师陈老师。
本篇内容理论较多。
1. 机器学习的本质回顾
在正式开始之前,我们先回顾一下机器学习到底是在做什么。
机器学习主要研究的内容是关于在计算机上从数据产生模型的算法,也就是学习算法。有了学习算法,我们把经验数据提供给它,它就能基于这些数据产生模型;在面对新的情况时,模型会给我们提供相应的判断。

简单来说,机器学习就是在寻找一个合适的模型。
那么问题来了,我们怎么知道这个模型好不好呢?这就引出了本章的核心问题:如何量化和评估一个模型的优良?
2. 能够量化的指标
要评估一个模型,首先得有能够量化的指标。我们先来看几个最基础的名词。
2.1 错误率
错误率:分类错误的样本数占样本总数的比例。
如果在m个样本中有a个样本分类错误,则错误率E = a/m。
举个栗子,100个样本里有5个分类错了,那错误率就是5%。
2.2 误差
误差:学习器实际预测输出与样本的真实输出之间的差异。
误差又分为两种:
训练误差(经验误差):学习器在训练集上的误差;
泛化误差:在新样本上的误差。
我们真正希望得到的是泛化误差小的学习器,因为我们最终是要用它来预测新样本的嘛。但是我们事先不知道新样本是什么样的,所以实际上能做到的就是努力使经验误差最小化。
2.3 精度
精度:精度= 1 - 错误率,也就是acc = 1 - a/m。
错误率是5%的话,精度就是95%。
3. 什么是好的模型?
那么到底什么模型才算好呢?答案:泛化能力强!
泛化能力强的意思就是,模型能很好地适用于unseen instance(未见过的样本),比如错误率低、精度高。
然而尴尬的是,我们手上并没有事先知道的新样本...... 所以我们只能通过一些方法来 "估计" 模型的泛化能力。

4. 过拟合与欠拟合
好的学习器应该是什么样的?它应该从训练样本中尽可能学出适用于所有潜在样本的 "普遍规律",这样遇到新样本时才能做出正确的判断。
但是在实际训练中,会出现两种不好的情况:
4.1 欠拟合
欠拟合 :对训练样本的一般性质尚未学好。
简单来说就是学得 "太不够" 了,连训练集都没学好,更别说新样本了。就像一个学生上课没听懂,连课本例题都不会做,考试肯定也考不好。
4.2 过拟合
过拟合:把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,导致泛化能力下降。
简单来说就是学得 "太好" 了,好到把训练集里的噪音、特例都记住了,反而失去了一般性。就像一个学生把练习题的答案全背下来了,考试换个题型就不会了。
过拟合是机器学习中面临的关键障碍,各类算法都必须针对过拟合进行处理~

5. 模型选择
5.1 面临的问题
在现实任务中,我们会面临这样的问题:
有多种学习算法可供选择,到底选哪个?
同一个学习算法,使用不同的参数会得到不同的模型,参数怎么定?
5.2 解决方案
解决方案听起来很简单:
对候选模型的泛化误差进行评估,选择泛化误差最小的模型
但是问题来了------我们无法直接获得泛化误差,而训练误差又由于过拟合现象的存在不适合作为标准
那到底该怎么办?这就引出了模型选择的三个关键问题。
5.3 模型选择的三个关键问题
模型选择主要是回答三个关键问题:
如何获得测试结果? → 评估方法
如何评估性能优劣? → 性能度量
如何判断实质差别? → 比较检验
下面将一个一个来讲。
6. 评估方法
评估方法的关键点是:怎么获得 "测试集"(test set)?
测试集应该与训练集 "互斥",也就是说测试样本不能出现在训练集中,否则就相当于考试考了原题,评估结果就不准了。
模型选择的原则是:通过实验测试对学习器的泛化误差进行评估,根据评估结果进行模型选择。测试误差可以近似等于泛化误差,前提假设是测试样本也是从样本真实分布中独立同分布采样得到的。
常见的评估方法有三种:留出法、交叉验证法、自助法。
6.1 留出法 (hold-out)
留出法:把数据集分成两个互斥的集合,一个当训练集S,一个当测试集T。
例如二分类任务中,D包含1000个样本,S包含700个样本,T包含300个样本。
D=S∪T,S∩T=∅,在S上训练出模型,用T来评估测试误差,作为对泛化误差的估计。

使用留出法有几个注意事项:
保持数据分布一致性:例如采用分层采样,确保训练集和测试集中正负样本的比例和原数据集一致
多次重复划分:例如进行100次随机划分,取平均结果,减少单次划分的偶然性
测试集不能太大也不能太小:一般取1/5~1/3作为测试集
6.2 交叉验证法 (cross validation)
交叉验证法:将数据集D划分成k个大小相似的互斥子集,每次用k-1个子集作为训练集,剩下的1个作为测试集,重复k次,最终返回k次测试结果的平均值。
这种方法称为k折交叉验证,k常用的取值是10,也可以取5、20等。

交叉验证法的好处是几乎所有样本都参与了训练,同时又都被测试过,评估结果比较稳定可靠。
6.3 自助法 (bootstrap)
自助法:基于 "自助采样",亦称 "有放回采样"、"可重复采样"。
具体做法是:从m个样本的数据集D中,每次随机选一个样本复制到D'中,然后放回,重复m次,得到一个大小为m的数据集D'。
显然,D中有一部分样本会在D'中多次出现,而另一部分样本不出现。样本在m次采样中始终不被采到的概率约为36.8%。

于是我们可以:
D' 作为训练集
D\D'(约1/3没在训练集中出现的样本)作为测试集
这样得到的测试结果称为 "包外估计"(out-of-bag estimation)。

自助法适用于数据集较小、难以有效划分训练集和测试集的情况。
7. 调参与最终模型
模型评估与选择,除了选择算法,还要对参数进行设定,简称调参。
这里要区分两种参数:
算法的参数 :一般由人工设定,亦称 "超参数";
模型的参数:一般由学习确定。
参数调得好不好对最终性能有关键影响,调参往往是机器学习中最耗时的一步。
另外还要注意三个集合的区别:
训练集:用来训练模型参数;
验证集(validation set):用来调超参数;
测试集:用来评估最终模型的泛化能力。
算法参数选定后,要用 "训练集+验证集" 重新训练最终模型,这样可以充分利用所有数据。
8. 性能度量
8.1 性能度量的定义
性能度量 (performance measure) 是衡量模型泛化能力的评价标准,反映了任务需求。
使用不同的性能度量往往会导致不同的评判结果。什么样的模型是 "好" 的,不仅取决于算法和数据,还取决于任务需求。
比如回归(regression) 任务常用均方误差,分类任务常用错误率和精度,但在某些场景下(如疾病诊断),我们可能更关注查全率而不是整体精度。
均方误差: 
8.2 错误率VS精度
这两个我们前面已经讲过:
错误率:分类错误的样本数占总样本数的比例
精度:分类正确的样本数占总样本数的比例,精度=1-错误率
错误率:
精度:
这两个指标虽然直观,但在不平衡数据(比如正样本只占1%)的情况下会有误导性!!!
8.3 查准率VS查全率

对于二分类问题,我们可以把样本分为四类:
真正例(TP):实际为正,预测为正
假正例 (FP):实际为负,预测为正
真负例 (TN):实际为负,预测为负
假负例 (FN):实际为正,预测为负
基于这四个值,我们定义:
查准率(Precision,精确率):预测为正的样本中,实际为正的比例。P = TP / (TP + FP)
查准率关注的是 "预测为正的结果里有多少是对的",适合假阳性代价高的场景,比如垃圾邮件过滤(把正常邮件误判为垃圾邮件代价很高)。
查全率(Recall,召回率):实际为正的样本中,被预测为正的比例。R = TP / (TP + FN)
查全率关注的是 "真实的正样本有多少被找出来了",适合假阴性代价高的场景,比如疾病诊断(漏诊比误诊更可怕)。
查准率和查全率是一对矛盾的度量,一般来说,查准率高时查全率往往偏低,查全率高时查准率往往偏低。
8.4 PR图和BEP
PR 图:以查全率R为横轴、查准率P为纵轴画出的曲线。

根据学习器的预测结果按正例可能性大小对样本进行排序,并逐个把样本作为正例进行预测,可以得到P-R曲线。
如果一个学习器的P-R曲线被另一个学习器的曲线完全 "包住",则后者性能优于前者。比如学习器 A优于学习器C,学习器B优于学习器C。
但如果曲线交叉了(比如A和B),就不好直接比较了。这时候可以用BEP(Break-Event Point,平衡点),它是 "查准率 = 查全率" 时的取值,BEP越大模型越好。
8.5 F1分数
比BEP更常用的是F1度量,它是查准率和查全率的调和平均数:

F1 综合衡量了查准率和查全率的平衡,当两者同等重要时使用。
如果对查准率和查全率有不同偏好,可以使用Fβ:

其中β>1时查全率有更大影响,β<1时查准率有更大影响。
8.6 宏 xx vs 微 xx
如果能得到多个混淆矩阵(比如多次训练/测试的结果,或者多分类的两两混淆矩阵),有两种方式来综合计算:
宏 (macro-) :先在每个混淆矩阵上分别计算查准率、查全率、F1,再取平均值。
微 (micro-):先把所有混淆矩阵的 TP、FP、TN、FN 分别累加,再基于累计值计算查准率、查全率、F1。


宏平均对每个矩阵一视同仁,微平均受样本量大的类别影响更大,根据实际需求选择哦~
8.7 ROC与AUC
ROC(Receiver Operating Characteristic,受试者工作特征曲线):以假阳性率 (FPR) 为横轴、真阳性率 (TPR) 为纵轴的曲线。
TPR = TP / (TP + FN),也就是查全率
FPR = FP / (FP + TN)
ROC曲线反映了不同阈值下模型的分类能力,曲线越靠近左上角,模型性能越好。
AUC(Area Under the ROC Curve,ROC曲线下面积):ROC曲线下方的面积,取值0~1。
AUC越接近1,模型区分正负样本的能力越强;AUC=0.5相当于随机猜测。

8.8 非均等代价
在现实任务中,犯不同的错误往往会造成不同的损失。比如把癌症患者误判为健康(假阴性)的代价,远大于把健康人误判为疑似(假阳性)。
此时需要考虑 "非均等代价 "(unequal cost),使用代价敏感(cost-sensitive) 的错误率来评估模型,而不是简单地统计错误比例。

代价敏感 (cost-sensitive) 的错误率:
9. 比较检验
9.1 为什么需要比较检验?
在某种度量下取得评估结果后,是否可以直接比较数字大小来评判优劣呢?
答案是:NO!
原因有三:
测试性能不等于泛化性能
测试性能随着测试集的变化而变化
很多机器学习算法本身有一定的随机性
机器学习==>"概率近似正确"
所以我们需要用统计假设检验的方法来判断两个模型之间的差别是否 "显著"。
9.2 比较检验的理论基础
比较检验的理论基础是PAC(Probably Approximately Correct,概率近似正确) 学习模型,由Leslie Valiant(莱斯利・维利昂特)于1984年提出,他也因此获得了2010年图灵奖。


PAC的核心思想是:我们不要求学习器绝对正确,而是要求它以很高的概率近似正确。
渐渐地,研究者们意识到,仅有逻辑推理能力是不够的...
9.3 统计假设检验的方法
统计假设检验(hypothesis test)为学习器性能比较提供了重要依据,帮助我们判断差别是真实存在的还是偶然波动。
两学习器比较:
交叉验证t检验(基于成对t检验):适用于k折交叉验证,常用5×2交叉验证
McNemar检验(基于列联表,卡方检验):适用于同一测试集上两个学习器的比较
多学习器比较:
Friedman检验(基于序值,F检验):判断 "所有算法性能是否都相同"
Nemenyi后续检验(基于序值):在Friedman检验判断有显著差别后,进一步判断两两之间的差别
9.4 Friedman检验图
Friedman检验可以用图来直观展示:
横轴为平均序值,每个算法用圆点表示其平均序值;
线段为临界阈值的大小。

若两个算法的线段有交叠(如A和B),则说明没有显著差别;
若没有交叠(如A和C),则说明有显著差别,算法A显著优于算法C。
10. 误差来源:偏差-方差分解
"误差" 到底从哪儿来?对回归任务,泛化误差可以通过 "偏差-方差分解" 来拆解。

泛化误差 = 偏差 + 方差 + 噪声
偏差:期望输出与真实输出的差别,表达了学习算法本身的拟合能力;
方差:同样大小的训练集的变动所导致的性能变化,表达了数据扰动造成的影响;
噪声:训练样本的标记与真实标记有区别,表达了当前任务上任何学习算法所能达到的期望泛化误差下界。
也就是说,泛化性能是由学习算法的能力(偏差)、数据的充分性(方差)以及学习任务本身的难度(噪声)共同决定的。
10.1 偏差与方差的冲突
一般而言,偏差与方差存在冲突:
训练不足时:学习器拟合能力不强,偏差主导误差
随着训练程度加深:学习器拟合能力逐渐增强,方差逐渐主导
训练充足后:学习器拟合能力很强,方差主导,容易过拟合

这就解释了为什么模型不是训练得越久越好,训练到一定程度后继续训练反而会让泛化误差上升,这就是过拟合的过程。
科学的评估方法,才能选出真正泛化能力强的模型!
本文到此结束。欢迎来与我一同沟通交流哦~


