机器学习西瓜书——第02章模型评估和选择

本文是关于周志华老师编写的机器学习书籍『西瓜书』的第二章模型评估和选择。

主要的内容有:经验误差与过拟合、模型的评估方法(留出法/交叉验证/自助法)、性能度量(查准率/查全率/F1/ROC曲线等), 部分内容待更新.

2.1 经验误差与过拟合

误差

错误率: 分类错误的样本数 a a a 占样本总数 m m m 的比例称为"错误率"(error rate).

e r r o r r a t e = a m error rate = \frac{a}{m} errorrate=ma

与之相对的是精度(accuracy):

a c c u r a c y = 1 − a m accuracy = 1 - \frac{a}{m} accuracy=1ma

学习器在训练集上的误差称为训练误差(training error)或经验误差(empirical error); 而在新样本上的误差称为泛化误差(generalization error).

我们最『想』得到『泛化误差』尽可能的小, 但是我们在训练的时候并不知道新样本, 所以『实际上』能做的是使得『经验误差』尽可能的小.

过拟合

当我们训练模型学习训练样本的时候, 将训练样本学的"太好", 除了学习到数据集的普遍规律, 还将训练数据集的一些自身特点学习到了, 导致泛化性能下降, 这种现象称为过拟合(overfitting); 反之就是欠拟合(underfitting), 训练样本的普遍规律也没有学会.

简单来说就是: 只会硬板照抄的学生 和 不好好学习的后进生.

欠拟合是学习的不够好, 一般来说比较好解决, 例如在决策树中扩展分支, 在神经网络中增加训练轮数等.

但是过拟合却是不可避免的, 只能做到缓解和减小其风险. 因为机器学习面临的问题是NP难, 但是有效算法是在有限时间内完成的, 不能完成 N P = P NP=P NP=P 的证明.

那么, 实际上有各种算法以及各种参数来训练模型, 如何选择? 这就是模型选择; 如何评估模型训练的好坏呢? 这就模型评估.

2.2 评估方法

通过实验, 设置测试组对学习器的泛化误差来对模型进行选择. 需要一个测试集(testing set), 在学习器上得到的测试误差(testing error)与泛化误差近似.

保证测试集中的数据尽可能未在训练集中出现.

那么对于一个包含m个样本数据集D, 既要训练, 又要测试, 那么需要合适的划分方法得到训练集和测试集.

留出法(hold-out)

留出法直接将数据集划分为两个互斥的集合, 一个作为训练集S, 一个作为测试集T.

需要注意的是: 训练集和测试集的划分要尽可能的保持数据分布一致, 避免因为数据划分过程引入额外的偏差, 从而对最终的结果产生影响.

例如将男性的数据集作为训练集, 然后去评估女性的数据集得到的泛化误差, 很明显是不合理的. 应尽量保持男女同比例.

一般划分数据的时候保留类别比例, 通常称为"分层采样"(stratified sampling). 虽然按照比例进行划分比较合适, 但是依旧可能会出现一些问题.

例如购物消费数据降序排序, 划分前70%作为训练集,后30%作为测试集. 虽然此时男女比例可能是等比例划分的, 但是消费能力却是截然不同, 所以这种方式显然还欠缺考虑.

所以在使用留出法的时候, 通常使用若干次随机抽样的方式进行划分, 然后对这几次的评估数据取均值.

以上是为了更好使用留出法的一些方法, 但是留出法本身有一个固有缺陷: 训练集S较大时, 模型可以训练的更接近数据集D的模型, 但测试集T较小, 导致评估结果不够稳定; 若测试集T大了, 那么训练集S训练出的模型可能和数据集D差别较大, 从而降低了评估结果的保真性(fidelity).

但是也没有完美的解决方法, 一般划2/3~4/5进行训练, 剩余作为测试.

交叉验证(cross validation)

先将数据集划分为k个大小相同的互斥子集, 每个子集尽可能保持数据分布的一致性(分层抽样). 每次使用k-1个子集进行训练, 剩下的一个子集作为测试集. 从而获得k次测试结果并取均值. 所以通常也称为k-折交叉验证(k-fold cross validation).

同样的, 为减小样本划分带来的影响, 通常使用p次随机划分, 然后取这p次k折交叉验证结果的均值.

其中, 若令k=m,那么则会得到留一法(Leave-One-Out, LOO), 显然由于划分唯一, 不受随机划分的影响. 实际效果和训练集几乎相似, 但是同样有一个固有缺陷: 数据集较大时, 训练时间开销太大.

所以: 没有免费的午餐定理同样适用.

自助法(bootstrapping)

对给定的包含m个样本的数据集D, 进行m次抽样放回的过程, 得到数据集D’. 这个过程会使得某些样本可能会出现多次, 而某些样本却不会出现. 简单估计始终不被抽样的概率是 ( 1 − 1 m ) m (1-\frac{1}{m})^m (1m1)m, 取极限得到:

lim ⁡ m → ∞ ( 1 − 1 m ) m ↣ 1 e ≈ 0.368 \lim_{m\rightarrow \infin}{(1-\frac{1}{m})^m} \rightarrowtail \frac{1}{e} \approx 0.368 mlim(1m1)me10.368

将未出现约36.8%的数据作为测试集即可, 那么训练模型的时候使用m个样本作为训练集,测试集依旧有约1/3的数据作为测试.

在数据集较小, 难以有效划分的时候比较有效.

并能从初始数据集中产生多个不同的训练集, 对于集成学习等方法有很大好处.

但在划分的时候改变了初始数据集的分布, 引入估计偏差, 所以在数据量足够的时候, 留出法和交叉验证更常用.

调参与最终模型

大部分的学习算法都需要一些参数进行设定, 参数的配置不同, 学习的模型往往有显著差距, 对参数(parameter)进行设定的过程称为参数调节或调参(parameter tuning).

参数是在一定范围内进行取值, 并根据一定的步长进行调节. 那么我们最终的参数也只可能在我们划分的离散值中, 往往不一定能够达到"最佳", 但这也平衡了开销和性能.

我们的调参是根据训练集S进行调参的, 最终的模型应该更根据选定的参数在完整的数据集中进行测试, 将最终的结果进行提交.

通常将实际中遇到的数据称为测试数据, 而模型评估和选择中使用的数据集称为验证集(validation set).

2.3 性能度量

那么对机器学习训练泛化性能的评估, 就是接下来的性能度量(performance measure). 不同的性能度量得到的评判标准也不同, 所以模型的"好坏"是相对的, 取决于算法和数据, 还取决于模型的任务需求.

回归任务常用均方误差(mean squared error, MSE):

E ( f ; D ) = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E(f; D) = \frac{1}{m} \sum^m_{i=1}{(f(x_i)-y_i)^2} E(f;D)=m1i=1m(f(xi)yi)2

其中, f ( x i ) f(x_i) f(xi)是模型对样本 x i x_i xi的预测, y i y_i yi是真实标记.

查准率、查全率与F1

我们关心的问题有时候不仅仅是错误率或精度.

例如我们不关心有多少比例的瓜判断错误, 而更加关心挑出的西瓜中有多少的比例是好瓜.

此时就引入了查准率(precision)和查全率(recall):

  • 查准率: 预测为正例中有多少是真的正例;
  • 查全率: 实际为正例的有多少被预测为正例.

对于二分类问题, 可将结果分为: 真正例(true positive)、假正例(false positive)、真反例(true negative)和假反例(false negative). 由此组成混淆矩阵(confusion matrix).
请添加图片描述
查 准 率 P = T P T P + F P 查准率P = \frac{TP}{TP+FP} P=TP+FPTP

查 全 率 R = T P T P + F N 查全率R = \frac{TP}{TP+FN} R=TP+FNTP

这两个度量往往相互制约, 总是一高一低.

我们对学习器的预测样例的结果进行排序, 排在前面的样例认为是"最可能"为正例的样本, 按顺序逐个把样本作为正例进行预测, 则每个可计算出当前的查全率和查准率. 以此作为坐标轴可以绘制"P-R曲线".
P-R图

根据曲线, 我们可以发现A和B曲线包含C曲线, 那么可以认为训练得到曲线C的模型相对较差; 而A和B曲线发生了交叉, 那么性能的优劣则不好判断.

引入"平衡点"(Break-Event Point, BEP)的概念, 在『查全率=查准率』处取得平衡点, 那么可以认为 A 优于 B.(挺草率的说)

更常用的是F1常量:

F 1 = 2 × 1 1 P + 1 R = 2 × P × R P + R F1 = 2 \times \frac{1}{\frac{1}{P} + \frac{1}{R}} = \frac{2 \times P \times R}{P + R} F1=2×P1+R11=P+R2×P×R

在特定场景, 模型对于查全率和查准率的要求不同, 所以会赋予不同的权重来进行调整, 使得更符合模型的需求.

F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R F_\beta = \frac{(1+\beta^2) \times P \times R}{(\beta^2 \times P) + R} Fβ=(β2×P)+R(1+β2)×P×R

多分类

以上是针对二分类问题提出了混淆矩阵, 那么对于多分类问题呢?

一种方法是两两形成混淆矩阵, 先计算得到各自的查全率和查准率, 再将取均值, 得到"宏查准率"(macro-P)和"宏查全率"(macro-R), 再计算"宏F1"(macro-F1).

还有一种方法是各个混淆矩阵元素先取均值, 得到TP、FP、TN、FN的均值, 然后再基于这些均值计算得到"微查准率"(micro-P)和"微查全率"(micro-R), 再计算"微F1"(micro-F1).

ROC与AUC

很多的学习器是为了产生一个预测实值或概率预测, 然后将该概率预测与一个分类阈值(threshold)进行比较, 对测试样本进行排序, 最有可能的正例排在前面, 最不可能的正例排在最后面, 通过阈值将样本分为两部分.

一般情况下, 我们根据任务需求来采用不同的截断点. 更重视"查准率", 则选择排序靠前的位置进行截断, 更重视"查全率", 则选择排序靠后的位置进行截断. 那么对排序质量的好坏直接影响了学习器在不同任务下的泛化性能的好坏. ROC曲线就是来研究学习器泛化性能的有力工具.

『ROC曲线』原理与『P-R曲线』类似, 对学习器的预测样例的结果进行排序, 排在前面的样例认为是"最可能"为正例的样本, 按顺序逐个把样本作为正例进行预测, 则每个可计算出当前的真正例率(True Positive Rate, TPR)和假正例率(False Positive Rate, FPR):

  • 真正例率: 实际正例预测为正例的数量占所有实际正例的比例;
  • 假正例率: 实际反例预测为正例的数量占所有实际反例的比例.

T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP

F P R = F P T N + F P FPR = \frac{FP}{TN + FP} FPR=TN+FPFP

混淆矩阵
如果要比较不同学习器的优劣, 就看ROC曲面下的面积AUC(Area Under ROC Curve).

代价敏感错误率与代价曲线

// todo

2.4 比较检验

假设检验

交叉验证 t 检验

McNemar 检验

Friedman 检验与 Nemenyi 后续检验

2.5 偏差与方差

个人收获

这一章主要是在讲如何对数据集进行划分, 如何评估模型的性能, 包括我还没完全捋清楚的假设检验部分, 都是在对模型性能的好坏进行评价, 对模型的可行性, 真实性进行分析.

这些东西正是之后支撑我们来判断一个模型是好是坏, 是否可行的依据. 目前只是大概的了解了概念, 到了实际应用的时候还是要回过头来回顾前两章.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值