机器学习(七)——机器学习诊断

机器学习(六)——正则化

当我们训练得到了一个模型之后,我们如何评估它?如何决定下一步要执行怎样的操作对我们的模型进行调整?本文将简要介绍机器学习诊断。

1. 训练集、验证集、测试集

相信接触过机器学习深度学习的都知道训练集、验证集、测试集这三个名词,本人在初次接触机器学习的时候,一直以为训练集就是用来训练模型的,验证集和测试集是分别用来验证和测试模型的。当时我只是从字面上来理解,后来学习了之后才对它们有较为清晰的认识,才知道为什么要对数据做这样的划分。

1.1 数据划分的意义

如果我们将所有的样本数据用来训练模型,通过最小化损失函数,我们得到了一个在样本数据上表现不错的模型。我们训练模型的目的是为了使模型在真实环境中得到较好的效果,而不仅仅是在我们的样本数据上呈现较好的效果,所以我们需要防止模型出现过拟合的问题,提高模型的泛化能力。但如我们之前提到的,如果模型出现了过拟合的问题,这个时候我们怎么判断模型是否存在过拟合的问题?

如果我们将样本数据的一部分划分出来作为测试集,并使用测试集来判断我们模型的泛化能力,计算模型在测试集上的误差,并最小化该误差。这个想法似乎不错,而且这也确实是一种划分数据的方法,一般采用训练集:测试集 = 8 : 2。但是,如果我们的模型针对测试集数据出现了过拟合的情况,又该怎么办呢?

我们再将训练集数据的一部分划分出来作为验证集,使用训练集训练模型,然后在验证集上评估模型,找到最合适的参数,然后在测试集上测试一次得到误差,这样就解决了先前提到的问题。一般采用训练集 : 验证集 : 测试集 = 6 : 2 : 2,当数据量是万级以上时,也可以将比例调整为98 : 1 : 1

需要说明的是,在进行数据划分时要随机划分数据,一般打乱数据后再划分。

1.2 模型选择

(1)假设使用训练集得到a个模型;
(2)对这a个模型,在验证集上使用交叉验证计算验证误差;
(3)选择验证误差最小的模型;
(4)对于选出来的模型,在测试集上计算推广误差。

1.3 交叉验证 Cross Validation

交叉验证就是以某种方式把原始数据分为训练集和验证集,使用训练集训练模型,使用验证集测试训练得到的模型性能。

常用的交叉验证方法
(1)K-fold交叉验证
将样本数据分为K组,每次保留一组作为验证集,剩余K-1组作为训练集训练模型,交叉验证重复K次,即每一组都会作为验证集验证一次,最后对所有的评估结果取平均作为最终评分。一般K取5或10。

(2)留一验证LOOCV
每次只保留原始数据中的一项数据进行验证,剩余的作为训练集,重复执行直到样本数据中的每一项数据都被当做验证。

更多关于交叉验证的内容可参考:链接

2. 偏差和方差

在之前介绍正则化的时候,我们提到了模型欠拟合时存在高偏差,过拟合时存在高方差。从一张图直观的理解一下高偏差和高方差:
注:图片来自网络,侵删。在这里插入图片描述
把我们的模型比作射击运动员的话,就像上图的射击结果:
(1)如果射击结果的偏差较大,即射击位置偏离靶心过远,就说这个运动员的命中率很低。
(2)如果射击结果方差较大,即射击的位置很分散不集中,就说这个运动员的射击水平很不稳定。
对应到我们的模型上,当模型存在高偏差问题时,模型的预测准确率会很低;当模型存在高方差问题时,模型会很不稳定。

我们在估计模型误差时,会认为:误差 = 偏差 + 方差,所以我们希望模型的偏差和误差都尽可能的小,这样我们的模型误差就会越小。接下来我们就看看偏差和方差是如何影响模型的。

假设在训练集和验证集上的误差分别为 J t r a i n ( θ ) J_{train}(\theta) Jtrain(θ) J c v ( θ ) J_{cv}(\theta) Jcv(θ),计算公式为:
J t r a i n ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J_{train}(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})^2 Jtrain(θ)=2m1i=1m(hθ(x(i))y(i))2
m m m是训练集中的样本数据数量, x ( i ) x^{(i)} x(i) y ( i ) y^{(i)} y(i)是训练集中的样本数据和输出标记。
J c v ( θ ) = 1 2 m c v ∑ i = 1 m c v ( h θ ( x c v ( i ) ) − y c v ( i ) ) 2 J_{cv}(\theta) = \frac{1}{2m_{cv}}\sum_{i=1}^{m_{cv}}(h_{\theta}(x_{cv}^{(i)})-y_{cv}^{(i)})^2 Jcv(θ)=2mcv1i=1mcv(hθ(xcv(i))ycv(i))2
m c v m_{cv} mcv是验证集中的样本数据数量, x c v ( i ) x_{cv}^{(i)} xcv(i) y c v ( i ) y_{cv}^{(i)} ycv(i)是验证集中的样本数据和输出标记。

2.1 诊断偏差和方差

首先来看训练集和验证集的损失函数误差图:
横轴:degree——高次方项的次数
纵轴:损失函数误差
(注:图片来自吴恩达老师的PPT)
在这里插入图片描述
我们会看到:
(1)训练集:degree较小时,模型拟合程度低(欠拟合),误差较大;degree逐渐增大,拟合程度逐渐提高,误差减小。
(2)验证集:degree较小时,模型拟合程度低(欠拟合),误差较大;随着degree的增大,误差先减小后增大,转折点就是模型开始过拟合训练数据集的时候。

2.2 正则化和偏差方差

如果为损失函数添加了正则项,那么模型的损失函数就是:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 + λ 2 m ∑ j = 1 n θ j 2 J(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_{\theta}(x^{(i)}) - y^{(i)})^2 + \frac{\lambda}{2m}\sum_{j=1}^n\theta_j^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2+2mλj=1nθj2

选择不同的 λ \lambda λ值对方差和偏差有影响。

来看一下训练集和验证集的损失函数误差图:
横轴: λ \lambda λ的大小
纵轴:损失函数误差
在这里插入图片描述
我们可以看到:
(1)训练集: λ \lambda λ较小时,训练集误差较小(过拟合); λ \lambda λ逐渐增大,训练集的误差不断增大(欠拟合)。
(2)验证集: λ \lambda λ较小时,验证集的误差较大(过拟合); λ \lambda λ逐渐增大,验证集的误差先减小后增大,转折点就是最合适的 λ \lambda λ的值的位置。

3. 学习曲线

3.1 什么是学习曲线

学习曲线是学习算法的一个很好的合理检验;它是将训练集误差和验证集误差作为训练集样本数据量m的函数,绘制而成的图表。

3.2 学习曲线能告诉我们什么

我们可以通过学习曲线来判断算法是否处于偏差、方差问题。假设 m m m为样本数据量。
1.欠拟合(高偏差问题)
当模型存在高偏差问题时,随着 m m m越来越大,训练集误差和验证集误差都没有较大的改变。
在这里插入图片描述

2.过拟合(高方差问题)
假设使用一个高次多项式模型,而且正则化程度较低。若模型存在高方差问题,随着 m m m的增大,验证集误差与训练集误差之间的差距逐渐缩小。即当验证集误差远大于训练集误差时,增大训练集的样本数量可以提高模型效果。
在这里插入图片描述

3.3 下一步怎么做

根据学习曲线我们就能知道下一步要做什么了。我们可以知道我们的模型此时是存在欠拟合(高偏差问题)还是过拟合(高方差问题),从而采取相应的措施:
1.解决欠拟合(高偏差)问题
(1)获得更多的特征
(2)增加多项式特征(degree)
(3)减小正则化程度
2.解决过拟合(高方差)问题
(1)获取更多的训练样本数据
(2)减少特征数量
(3)增大正则化的程度

4. 误差分析

4.1 类偏斜的误差度量

类偏斜:训练集中有非常多的同一类的样本实例,只有很少或者没有其他种类的样本实例。

比如:在预测肿瘤是良性的还是恶性的,我们的训练集中有99.5%的样本数据是良性肿瘤的数据,剩余0.5%的样本数据时恶性肿瘤的数据。此时就说我们的样本数据存在类偏斜情况。

若此时我们在所有情况下都预测肿瘤是良性的,那就只有0.5%的误差;若我们设计算法训练得到的模型有1%的误差,那么此时的误差大小是不能作为评价算法效果的依据的。

对于这种情况,我们引入查准率和查全率指标。

4.2 查准率和查全率

4.2.1 混淆矩阵

对于二分类问题,我们用0代表negative(假),用1代表positive(真),那么真实值和预测值之间就会有这样的关系:

  1. True Positive: 预测为真,实际为真
  2. True Negative:预测为假,实际为假
  3. False Positive:预测为真,实际为假
  4. False Negative:预测为假,实际为真

将这四种关系对应画出来,我们就能得到:
在这里插入图片描述
这个就是混淆矩阵,它展现了真实值和预测值之间的四种关系。

4.2.2 查准率和查全率

查准率( p r e c i s i o n precision precision)和查全率( r e c a l l recall recall)有的地方将它们称作“精准率”和“召回率”。通常使用这两个指标来衡量二分类的模型效果。它们对应的计算公式为:
p r e c i s i o n = T P T P + F P precision = \frac{TP}{TP+FP} precision=TP+FPTP
r e c a l l = T P T P + F N recall = \frac{TP}{TP+FN} recall=TP+FNTP

借用西瓜书中的话来理解查准率和查全率:
如果把算法的预测过程比作挑西瓜
(1)查准率:算法挑出来的西瓜中,有多少比例是好西瓜;
(2)查全率:所有的好西瓜中,有多少比例被算法挑了出来。

4.2.3 查准率和查全率之间的权衡

我们在预测时当然希望算法的查准率和查全率能够保持相对的平衡,这样有利于我们更好更方便的取评估模型。然而事实会如我们所愿吗?

例子:不同阈值对查准率和查全率的影响
我们思考之前预测肿瘤的例子:
(1)当 h θ ( x ) > = 0.5 h_{\theta}(x) >= 0.5 hθ(x)>=0.5时,预测为1;
(2)当 h θ ( x ) < 0.5 h_{\theta}(x) < 0.5 hθ(x)<0.5时,预测为0。
这里的0.5就是阈值。倘若我们采用不同的阈值,对查准率和查全率有什么影响呢?

假设图中的蓝色点表示良性肿瘤,红色点表示恶性肿瘤。
当采用0.5为阈值时,我们计算precision和recall:
(1) p r e c i s i o n = 5 1 + 5 = 5 6 precision = \frac{5}{1+5} = \frac{5}{6} precision=1+55=65
(2) r e c a l l = 5 0 + 5 = 1 recall= \frac{5}{0+5}=1 recall=0+55=1
在这里插入图片描述
若采用0.7作为阈值,我们计算precision和recall:
(1) p r e c i s i o n = 4 0 + 4 = 1 precision = \frac{4}{0+4} =1 precision=0+44=1
(2) r e c a l l = 4 1 + 4 = 4 5 recall= \frac{4}{1+4}=\frac{4}{5} recall=1+44=54
在这里插入图片描述

若采用0.4作为阈值,我们计算precision和recall:
(1) p r e c i s i o n = 5 2 + 5 = 5 7 precision = \frac{5}{2+5} =\frac{5}{7} precision=2+55=75
(2) r e c a l l = 5 0 + 5 = 1 recall= \frac{5}{0+5}=1 recall=0+55=1
在这里插入图片描述
由此可见不同的阈值对于查准率和查全率是有影响的:

模型PrecisionRecall
阈值为0.5的 m o d e l 1 model_1 model1 5 6 \frac{5}{6} 651
阈值为0.7的 m o d e l 2 model_2 model21 4 5 \frac{4}{5} 54
阈值为0.4的 m o d e l 2 model_2 model2 5 7 \frac{5}{7} 751

那么此时问题来了:我们怎么根据precision和recall来评估我们这三个模型的效果?这两个指标发生冲突时,我们很难在模型之间进行比较。在这里介绍 F 1 S c o r e F_1 Score F1Score:
F 1 S c o r e = 2 P R P + R F_1 Score = 2 \frac{PR}{P+R} F1Score=2P+RPR
其中P代表查准率,R代表查全率。其取值范围为0~1.

其实 F 1 S c o r e F_1 Score F1Score p r e c i s i o n precision precision r e c a l l recall recall的调和平均值,它兼顾了二者:
1 F 1 = 1 2 ( 1 p r e c i s i o n + 1 r e c a l l ) \frac{1}{F_1} = \frac{1}{2}(\frac{1}{precision}+\frac{1}{recall}) F11=21(precision1+recall1)
这样我们就能根据模型的 F 1 S c o r e F_1 Score F1Score在模型之间进行比较评估。对应到本例中,我们就可以通过计算 m o d e l 1 model_1 model1 m o d e l 2 model_2 model2 m o d e l 3 model_3 model3 F 1 S c o r e F_1 Score F1Score的值来对这三个模型进行评估,选出最合适的那一个。

5. ROC曲线

5.1 什么是ROC曲线

ROC 全称为Receiver Operating Characteristic Curve,受试者工作特征曲线。它是这样的一条曲线:
注:图片来自网络,侵删。
在这里插入图片描述
横轴为FPR : False Positive Rate,纵轴为TPR : True Positive Rate。ROC曲线反映了二者之间的关系。

5.2 FPR与TPR

F P R = F P T N + F P FPR = \frac{FP}{TN+FP} FPR=TN+FPFP
T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP
对FPR和TPR 的理解:
(1)FPR表示:实际值为假时,预测值为真的比例。
(2)TPR表示:实际值为真,预测值为真的比例。

对应到肿瘤预测的例子中,FPR表示患者的肿瘤是良性的但我们却将其预测为恶性,TPR表示患者的肿瘤是恶性的,我们给患者的预测结果也是恶性的。所以我们在预测时,希望FPR的值越小越好,TPR的值越大越好,但我们会发现这两个指标之间是互相影响的。假设我们不管三七二十一均认为患者的肿瘤是恶性的,那么TPR就会很高,但相应的,FPR也会升高。因此我们就会看到如同上图ROC曲线的例子,TPR升高时FPR也升高。

那么问题又来了,我们如何通过模型的ROC曲线来评估它的效果呢?

5.3 AUC

AUC 全称为Area Under Curve,在ROC曲线图中将其定义为ROC曲线下的面积。我们很难直接从ROC曲线图中判断哪个模型的效果好,因此AUC作为一个数值就能清晰的告诉我们模型的效果。关于为什么使用AUC作为评估指标可参考:链接

引用这篇文章中的话,AUC是一个概率值:当随机挑选一个正样本和负样本,算法根据计算得到的score将正样本排在负样本的前面的概率就是AUC的值。

补充:我刚开始对正负样本的概念不清除,所以在此记录一下。
针对分类问题,正样本就是我们希望正确分类出的类别对应的样本,负样本就是其他类别对应的样本。比如分类图片中的狗,那么分类时,狗的图片就是正样本,不是狗的图片就是负样本。
参考:机器学习中的正负样本

通常ROC曲线都位于(0,0) (1, 1)连线的上方,(0,0) (1, 1)连线形成的是随机分类器的ROC曲线,一般来说模型的效果都要好于随机分类器的效果,但也可能会出现相反的结果。
(1)AUC 极限接近1时,我们认为这是个完美分类器;
(2)0.5 < AUC < 1 时,说明模型效果优于随机分类器效果;
(3)AUC = 0.5 说明模型的效果和随机分类器的效果是一样的;
(4)AUC < 0.5 时,模型效果就很差,连随机分类器都不如,这时候可以考虑将预测结果取反。

总之AUC的值越高,说明模型的效果越好。

5.4 ROC曲线的优势

ROC曲线的一个明显优势是:当样本中的正负样本数据的分布出现变化时,ROC曲线几乎没有变化,也就是说ROC曲线很稳定。所以当我们的样本数据出现类偏斜时,或者正负样本数据分布出现较大波动时,ROC曲线能够保持不变。使用网络上的一张图片来做说明:(侵删)
在这里插入图片描述
图(a)与图(c)为ROC曲线,图(b)与图(d)为查准率-查全率曲线。(a)(b)展示了在正负样本分布平衡的情况下的ROC曲线和precision-recall曲线;(c)(d)展示了当负样本增加到原来的10倍以后的ROC曲线和precision-recall曲线。由此可见ROC曲线很稳定。

6. 总结

本文主要介绍了当获得了一个模型后,如何对模型效果进行评估。
(1)首先介绍了训练集、验证集、测试集,以及数据划分的意义和交叉验证;
(2)引入偏差和方差的概念,并介绍了偏差和方差对模型的影响,模型什么情况下会出现高偏差问题、什么情况下会出现高方差问题;
(3)之后介绍了学习曲线,介绍了学习曲线能反映什么信息,告诉我们接下来该怎么做;
(4)之后又引入了混淆矩阵、precision、recall,F1 Score等概念,最后又介绍了ROC曲线以及如何使用它来评估模型效果。

文章内容有些杂乱,对一些知识点做了简单的整理,并不是很详细。由于本人也是机器学习的初学者,文章可能存在错误与不足,欢迎大家的指正与补充!

参考内容:
[1] 训练集、验证集和测试集
[2] 机器学习基础(1)- ROC曲线理解
[3] 什么是ROC曲线?为什么要使用ROC?以及 AUC的计算

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值