【机器学习】模型评估与选择-西瓜书第二章知识点整理


前言

前一段时间在看书的过程中并没有做笔记,知识点忘得很快。故此,在学习周华志老师的《机器学习》一书时,计划每两天学习一个章节并结合吴恩达机器学习的内容做笔记分享到博客上。

本文内容非本人原创,只是为了满足自己的学习需要进行的系统整理。


一、误差、欠拟合、过拟合

  • 错误率(error rate):如果在m个样本中有a个样本分类错误,错误率 E = a / m E=a/m E=a/m
  • 精度(accuracy): 精度 = 1 - 错误率,即 1 − a / m 1 - a/m 1a/m

一般地,把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”(error),学习器在训练集上的误差称为“训练误差”(training error)或“经验误差”(empirical error),在新样本上的误差称为“泛化误差”(generalization error)。

  • 欠拟合(underfitting):学习器对训练样本的一般性质尚未学好。
  • 过拟合(overfitting):学习器把训练样本自身的一些特点当做了所有潜在样本都会具有的一般性质。

我们希望得到的是泛化误差小的学习器,然而,我们事先并不知道新样本是什么样的,实际能做的是努力使经验误差最小化。同时,我们要防止“过拟合”(overfitting)。

二、评估方法

我们无法直接获得泛化误差,训练误差由于过拟合现象的存在不适合作为标准。

为此,需要使用一个“测试集”(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”(testing error)作为泛化误差的近似。注意,测试集应该尽可能与训练集互斥。

对一个包含m个样例的数据集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\} D={(x1,y1),(x2,y2),...,(xm,ym)},可以通过对 D D D进行适当的处理,从中产生出训练集 S S S和测试集 T T T,下面介绍几种常见的做法。

1.留出法

  • 留出法(hold-out):直接将数据集 D D D划分为两个互斥的集合,其中一个集合作为训练集 S S S,另一个作为测试集 T T T,即 D = S ∪ T , S ∩ T = ∅ D=S\cup T,S\cap T=\varnothing D=ST,ST=。在训练集上对模型进行训练,然后在测试集上评估测试误差,作为对泛化误差的估计。一般将大约 2 / 3 ∼ 4 / 5 2/3\sim4/5 2/34/5的样本用于训练集,剩余样本用于测试(测试集至少应含有30个样例)。

需要注意的是,训练/测试集的划分要尽量保证数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。例如,在分类任务中至少要保持样本的类别比例,可以通过“分层采样”(stratified sampling)实现。

在python的scikit-learn中,可以通过train_test_split()方法的参数stratify实现
	X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify = cancer.target, random_state = 0)

然而,即便在给定训练/测试集的样本比例后,仍存在多种划分方式对初始数据集 D D D进行分割,不同的划分将导致不同的训练/测试集,模型评估的结果也会有差别。因此,单次使用留出法得到的估计结果往往不够稳定,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

2. k k k折交叉验证

  • 交叉验证法(cross validation):将数据集 D D D划分为 k k k个大小相似的互斥子集,即 D = D 1 ∪ D 2 ∪ . . . ∪ D k , D i ∩ D j = ∅ ( i ≠ j ) D=D_1\cup D_2\cup ... \cup D_k, D_i\cap D_j = \varnothing (i\neq j) D=D1D2...Dk,DiDj=(i=j)。每个子集都通过分层采样得到。每次用 k − 1 k-1 k1个子集的并集作为训练集,余下的那个子集作为测试集;这样获得 k k k组训练/测试集,从而可进行 k k k次训练和测试,最终返回的是这 k k k个测试结果的均值。

在这里插入图片描述
上图展示了10折交叉验证法以及 p p p k k k折交叉验证法。

留一法(LOO)不受随机样本划分的影响,因为 m m m个样本只有唯一的方式划分 m m m个子集,它的评估结果往往被认为比较准确,但在数据集较大时,其计算开销太大。

3.自助法

  • 自助法(bootstrapping):以自助采样法(bootstrap sampling)为基础,给定包含 m m m个样本的数据集 D D D,对它进行采样产生数据集 D ′ D' D:每次随机从 D D D中挑选一个样本,将其拷贝放入 D ′ D' D,然后将该样本放回,使其在下次采样时仍有可能被采集到;重复执行该过程 m m m次,我们就得到了包含 m m m个样本的数据集 D ′ D' D。将 D ′ D' D用作训练集, D − D ′ D-D' DD用作测试集。

显然, D D D中有一部分样本会在 D ′ D' D中重复出现,而另一部分样本不会出现。样本在 m m m次采样中始终不被采集到的概率是 ( 1 − 1 / m ) m (1-1/m)^m (11/m)m,取极限得到 1 / e ≈ 0.368 1/e\approx 0.368 1/e0.368。这意味着我们有约 1 / 3 1/3 1/3的没有在训练集中出现的样本用于测试。

自助法在数据集较小、难以有效划分训练/测试集时很有用,它在集成学习中(例如:随机森林)中也有应用。然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足够大时,留出法和交叉验证法更常用。

4.调参与最终模型

调参的常用做法:对每一个参数选定一个范围和变化步长

训练集、验证集、测试集的常规分配: 6 : 2 : 2 6:2:2 622

三、性能度量

性能度量(performance measure) 是衡量模型泛化能力的评价标准。

回归任务 中,均方误差(mean squared error) 是最常用的性能度量。
E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E(f;D)=\frac{1}{m} \sum_{i=1}^m (f(x_i)-y_i)^2 E(f;D)=m1i=1m(f(xi)yi)2

以下内容介绍 分类任务 中常用的性能度量。

1.错误率与精度

错误率和精度是分类任务中最常用的两种性能度量,既适用于二分类任务,也适用于多分类任务。

  • 对样例集 D D D,分类错误率定义为: E ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) ≠ y i ) E(f;D)=\frac{1}{m}\sum_{i=1}^{m} \mathbb{I}(f(x_i)\neq y_i) E(f;D)=m1i=1mI(f(xi)=yi)
  • 精度定义为: a c c ( f ; D ) = 1 m ∑ i = 1 m I ( f ( x i ) = y i ) = 1 − E ( f ; D ) acc(f;D)=\frac{1}{m}\sum_{i=1}^{m}\mathbb{I}(f(x_i)=y_i)\\ =1-E(f;D) acc(f;D)=m1i=1mI(f(xi)=yi)=1E(f;D)

2.查准率、查全率、 F 1   s c o r e F_1\ score F1 score

当我们关心学习器对特定类别的判断情况,或处理不对称性分类(偏斜类)的性能度量时,错误率与精度无法满足我们的需求。此时,查准率/准确率(precesion)与查全率/召回率(recall)可以帮助我们。

图源:吴恩达机器学习
查准率与查全率分别定义为:

  • 查准率 P P P P = T r u e   P o s t i v e P r e d i c t e d   P o s t i v e = T P T P + F P P=\frac{True\ Postive}{Predicted\ Postive}=\frac{TP}{TP+FP} P=Predicted PostiveTrue Postive=TP+FPTP
  • 查全率 R R R R = T r u e   P o s t i v e A c t u a l   P o s t i v e = T P T P + F N R=\frac{True\ Postive}{Actual\ Postive}=\frac{TP}{TP+FN} R=Actual PostiveTrue Postive=TP+FNTP

图源:《机器学习》周志华

查准率和查全率是一对矛盾的度量,有时我们需要在二者之间做权衡。 P R PR PR曲线会根据不同的回归算法具体模型改变。若一个学习器的 P R PR PR曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者,例如上图中,A优于C。如果两个学习器的 P R PR PR曲线发生了交叉,例如上图中的A与B,则难以断言二者优劣,只能在具体的查准率或查全率条件下进行比较。如果一定要在二者中分出优劣,比较合理的度量是“平衡点”(Break-Event Point)。

更常用的,我们采用 F 1   s c o r e F_1\ score F1 score进行决策。

  • F 1   s c o r e F_1\ score F1 score F 1   s c o r e = 2 P R P + R = 2 T P 样例总数 + T P − N P F_1\ score = \frac{2PR}{P+R}=\frac{2TP}{样例总数+TP-NP} F1 score=P+R2PR=样例总数+TPNP2TP
  • F β   s c o r e F_\beta\ score Fβ score F β   s c o r e = ( 1 + β 2 ) P R β 2 P + R F_\beta\ score = \frac{(1+\beta^2)PR}{\beta^2P+R} Fβ score=β2P+R(1+β2)PR
    F β   s c o r e F_\beta\ score Fβ score F 1   s c o r e F_1\ score F1 score的一般形式,能让我们表达出对查准率和查全率的不同偏好。其中 β > 0 \beta>0 β>0度量了查全率对查准率的相对重要性, β > 1 \beta>1 β>1时查全率有更大影响, β < 1 \beta<1 β<1时查准率有更大影响。

3. R O C ROC ROC A O C AOC AOC

大多数的回归学习算法是对测试数据返回一个 [ 0 , 1 ] [0,1] [0,1]之间的输出值,将输出值与阈值 0.5 0.5 0.5进行比较,如果输出值大于阈值,则预测其为正类,否则预测其为反类。根据输出值,可以将测试样本进行排序,“最可能”是正类的排在最前面,“最不可能”是正类的排在最后面。这样,分类过程就相当于在这个排序中以某个“截断点”(cut point)将样本分为两部分。

在不同的应用场景下,我们可以根据实际需求来选择不同的截断点。如果更重视查准率,则在排序中靠前的位置进行截断;如果更重视查全率,则在排序中靠后的位置进行截断。因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏。

受试者工作特征 R O C ROC ROC曲线 是从这个角度除法来研究学习器泛化性能的有力工具。
图源:《机器学习》周志华
R O C ROC ROC曲线的纵轴是“真正例率”(True Postive Rate, TPR),横轴是“假正例率”(False Postive Rate, FPR),二者定义如下。

  • 真正例率 T P R = T P A c t u a l   P = T P T P + F N TPR=\frac{TP}{Actual\ P}=\frac{TP}{TP+FN} TPR=Actual PTP=TP+FNTP
  • 假正例率 F P R = F P A c t u a l   N = F P F P + T N FPR=\frac{FP}{Actual\ N}=\frac{FP}{FP+TN} FPR=Actual NFP=FP+TNFP

P R PR PR曲线相似,若一个学习器的 R O C ROC ROC曲线被另一个学习器的曲线完全“包住”,则断言后者优于前者;若二者发生交叉,较为合理的判断依据是比较曲线下的面积,即 A U C AUC AUC(Area Under ROC)。 A U C AUC AUC的计算方式详见书籍。

4.代价敏感错误率

在实践中,不同类型的错误所造成的后果不同。为了在学习器中刻画不同类型错误带来的不同损失,可为错误赋予“非均等代价”(unequal cost)。

图源:《机器学习》周志华
如上图所示,以二分类任务为例,可以为其设定一个“代价矩阵”(cost matrix)。

在上文介绍的性能度量中,大都隐式的假设了均等代价,只简单的计算错误次数,并没有考虑不同错误会造成不同的后果。在非均等代价的假设下,我们要关注的是最小化总体代价而非最小化错误次数。假设上图中的第0类为正类、第1类为反类, D + D^+ D+ D − D^- D分别代表样例集 D D D的正例子集和反例子集,则“代价敏感错误率”(cost-sensitive error)为 E ( f ; D ; c o s t ) = 1 m ( ∑ x i ∈ D + I ( f ( x i ) ≠ y i ) × c o s t 01 + ∑ x i ∈ D − I ( f ( x i ) ≠ y i ) × c o s t 10 ) . E(f;D;cost)=\frac{1}{m}\Big (\sum_{x_i\in D^+}\mathbb{I}(f(x_i)\neq y_i)\times cost_{01}+\sum_{x_i\in D^-}\mathbb{I}(f(x_i)\neq y_i)\times cost_{10}\Big ). E(f;D;cost)=m1(xiD+I(f(xi)=yi)×cost01+xiDI(f(xi)=yi)×cost10).
图源:《机器学习》周志华

代价曲线解析详见书籍。

四、比较检验

1-4小节内容仍有未理解的地方,待更新。

1.假设检验

2.交叉验证t检验

3.McNemar检验

4.Friedman检验与Nemenyi后续检验

5.偏差、方差、学习曲线

以回归任务为例,学习算法的期望预测为 f ‾ ( x ) = E D [ f ( x ; D ) ] . \overline f(x)=\mathbb{E}_D[f(x;D)]. f(x)=ED[f(x;D)].
泛化误差 E ( f ; D ) = E D [ ( f ( x ; D ) − y D ) 2 ] E(f;D)=\mathbb{E}_D[(f(x;D)-y_D )^2] E(f;D)=ED[(f(x;D)yD)2]可以分解为偏差、方差与噪声之和。
E ( f ; D ) = b i a s 2 ( x ) + v a r ( x ) + ε 2 E(f;D)=bias^2(x)+var(x)+\varepsilon ^2 E(f;D)=bias2(x)+var(x)+ε2
其中,偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
b i a s 2 ( x ) = ( f ‾ ( x ) − y ) 2 bias^2(x)=( \overline f(x)-y)^2 bias2(x)=(f(x)y)2
方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响。
v a r ( x ) = E D [ ( f ( x ; D ) − f ‾ ( x ) ) 2 ] var(x)=\mathbb{E}_D[\big ( f(x;D)-\overline f(x)\big )^2] var(x)=ED[(f(x;D)f(x))2]
噪声表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
ε 2 = E D [ ( y D − y ) 2 ] \varepsilon ^2=\mathbb{E}_D[(y_D-y)^2] ε2=ED[(yDy)2]
偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的
图源:《机器学习》周志华

一般来说,偏差与方差是冲突的,这称为偏差-方差窘境(bias-variance dilemma)。

下图可以反应学习器的复杂程度和正则化程度对偏差、方差的影响

图源:吴恩达机器学习
图源:吴恩达机器学习
学习曲线可以帮助诊断高偏差/高方差,来判断下一步如何优化算法。
图源:吴恩达机器学习
图源:吴恩达机器学习

  • 获取更大的训练集:解决高方差问题
  • 尝试使用更少的特征:解决高方差问题
  • 尝试增加额外的特征:解决高偏差问题
  • 尝试增加多项式特征:解决高偏差问题
  • 尝试降低 λ \lambda λ:解决高偏差问题
  • 尝试增大 λ \lambda λ:解决高方差问题

摘抄自《机器学习》周志华、吴恩达机器学习、《Python机器学习基础教程》

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值