• 机器学习基础:模型评估


    目录

    1. 什么是一个优秀的分类器

    2. 选择测试数据集

    2.1 切分训练测试集

    2.1.1 简单随机划分(random handout)

    2.1.2 留一法(leave-one-out)

    2.1.3 留一法交叉验证(leave-one-out cross validation)

    2.1.4 重复随机分段采样(repeated random subsampling)

    2.1.5 K-折交叉验证(K-fold cross validation)

    2.2 数据集切分时的样本类别

    2.2.1 解决方案:分层(垂直)采样

    2.3 归纳学习假说和归纳偏差

    2.4 验证集(validation set)

    3. 评估方法(evaluation methods)

    3.1 评估指标(evaluation metrics)

    3.1.1 positive样本 v.s. negative样本

    3.1.2 正确率和错误率(Accuracy & Error Rate)

    3.1.3 错误降低率(error rate reduction)

    3.2 Precision & Recall

    3.3 F-score

    3.4 Sensitivity & Specificity

    3.5 多分类模型评估(Multiclass evaluation)

    4. 模型比较:基线(baselines)和基准(benchmarks)

    4.1 常见的基线


    1. 什么是一个优秀的分类器

    监督下的分类器学习是将属性映射到类标签上 。

    我们训练分类器的目标是泛化:将正确的类别标签分配给从未见过的实例(预测)。

    如何确定一个好的分类器?

    • 在一些训练数据上进行训练 。
    • 在测试数据上进行测试(在训练期间未见过)。
    • 在测试数据上评估性能。

    基本评价指标:准确度

    准确度 Accuracy=\frac{Number of correctly labeled test instances}{Total number of test instances}

    在很多情况下,这是适用的,但是我们在下面的内容将不仅仅局限于此,本文会给出一些场景,帮助你理解,为什么很多时候accuracy的评价指标是远远不够的。


    判断题

    思考在下面的场景下,accuracy的衡量标准是否会失效:

    我们现在使用 100 个样本,患癌症的人label=1, 不患癌症的label=0;假设人群中有1%的人罹患癌症,现在构建了一个模型,预测一个人会不会得癌症,这个模型没有经过任意训练,它也只能输出一个结果,就是0


    错:由于患癌症的人在人群中的比例本身就低,用accuracy衡量这个模型的精度是没有意义的。如果一个模型预测所有的样本为不患癌症,这个模型的精度也可能达到 90% 甚至更高。

    思考下面的场景,描述的是正确的还是错误的?

    两个模型在同一个测试集上有相同的accuracy,是否代表他们学到了同样程度的信息?


    错:即使两个模型的学习程度不同,它们在同一个测试集上也可能得到相同的accuracy

    如果两个模型在同一个测试集上有相同的错误模式(即判错的样本是完全重合的)他们是否学到了同样程度的信息?


    错:即使一些样本对这两个模型来说都是困难的样本,那也不代表这些困难样本让这两个模型分类错误的原因是相同的,可能第一个模型是因为一部分特征没有学习好而分错,第二个模型因为另外一部分特征没有学习好而分错。

    一个模型在一个测试集上比另外一个模型高,是否就代表在另一个测试集上也会同样比另外一个模型高?


    第三个问题则更加错误,因为一个测试集上的结果好,一方面可能这个测试集的样本更加有利于第一个模型的学习结果,也有可能第一个模型在某些情况下效果特别好,甚至存在过拟合的情况,那么这个时候如果换一个数据集,其结果未必就比第二个好。

    2. 选择测试数据集

    • 让分类器在训练集上(training set)训练,在测试集(testing set)上测试
    • 那么如何科学的划分训练和测试集呢?

    2.1 切分训练测试集

    为什么不把数据全部用来训练?

    如果你不划分出来测试集,你就没有办法对模型的精度进行验证,进而无法通过参数调整来让模型有更好的表现。

    为什么不能用训练的数据来测试?

    因为模型正是使用训练样本进行训练,如果测试数据中包含了训练样本,模型的精度会很高,但这是一种欺骗和作弊,这个很高的精度不能代表真实的精度。因此在测试集中绝对不能出现用来训练的样本。

    2.1.1 简单随机划分(random handout)

    最简单的方法来划分:

    • 训练集 / 测试集 = 0.5:0.5\:\:\: or\:\:\: 0.8:0.2\:\:\: or\:\:\: 0.9:0.1
    • 将训练集和测试集按照这个比例进行随机划分,训练一个模型。

    2.1.2 留一法(leave-one-out)

    只留1个样本用来测试,将数据集中的其他所有样本用来训练
     

    2.1.3 留一法交叉验证(leave-one-out cross validation)

    适用情况:

    留一法交叉验证通常用在数据量比较小的情况下。

    原因:

    当数据量本来就很小的时候,留出过多的样本测试会导致训练样本缺乏而训练不充分;而且只有数据量小的情况下才能支撑复杂度这么高的运算。

    具体描述:

    假设数据集中一共有N个样本,将1个样本作为测试集,剩下的N-1样本作为训练集,训练一个模型。再选择另一个样本作为测试集,其他所有样本作为训练集再训练另外一个模型。如此重复,直到整个数据集中所有的数据都完成这个过程;

    这个过程中一共会生成N个模型,每个模型都被N-1个训练样本和1个测试样本训练和测试过;

    将这N个模型的精度进行取平均运算,得到的结果就是最终的精度结果。

    2.1.4 重复随机分段采样(repeated random subsampling)

    具体描述:

    假设一个数据集有N个样本,从样本集合中随机采样出60 %用作训练,另外40%用作测试,训练一个模型。将这个过程重复m次,最终得到了m个模型,这m个模型的精度均值作为模型的最终精度。

    存在的问题:

    由于采样是随机的,所以有部分样本可能在训练这个m个模型的过程中没有被随机到。就会导致训练样本没有完全充分地利用。

    相对于一次性随机划分(random handout)的方法,这种方法也更可靠,但是计算量要大很多,因为要进行多次划分和多个模型的训练。

    2.1.5 K-折交叉验证(K-fold cross validation)

    将数据集均等划分成K份,第1份作为验证集,剩下K-1份作为训练集,得到第一个模型M_{1} ;同样的方法,将这个K份中的第2份作为验证集,剩下K-1份作为训练集,训练第二个模型M_{2}, 如此重复,一共训练K个模型,而所有的样本也都充分利用了。

    K一般选择5或者10;因为太大了对训练很不友好,训练过程太耗时

    2.2 数据集切分时的样本类别

    我们是否应该保持训练集和测试集中的样本类别分布是相同的?

    训练和测试数据中的各个类别的样本比例不一样,比如猫狗分类的数据集如果训练集里面有80%是猫的样本,20%是狗的样本。而测试集中80% 是狗的样本,20%是猫的样本这样就很麻烦,因为这样训练出来的模型在训练集上表现会很差。

    2.2.1 解决方案:分层(垂直)采样

    让训练和测试集上的数据具有相同的分布。相同的分布的意思就是:每个类占总样本的比例是一样的。


    例子:

    我们想研究大学生的某些行为,假设全国有 21000000 学生,抽取 4000 个人来进行研究。

    通过对这 21000000 学生进行统计后发现:主修英语的学生占12%,主修科学的学生占28%,主修计算机科学的学生占24%,主修工程的学生占21%,主修数学的学生占15%。

    因此,为了让 4000 个样本可以代替 21000000 人,我们必须保证随机抽取的 4000 个人中各个学科学生的比例也是:英语的学生占12%,主修科学的学生占28%,主修计算机科学的学生占24%,主修工程的学生占21%,主修数学的学生占15%;

    上面这个过程就是一个分层采样的过程,我们按照学科一共采样了 5 个不同的层(类)的学生。

    2.3 归纳学习假说和归纳偏差

    数据训练对于一个模型是重要的,但模型的假设也很重要。

    归纳学习假说(Inductive learning hypothesis)

    当一个模型经过大量的数据训练后,会对没有见过的样本依然存在泛化性。

    但是如果模型的假设是错误的,大量的数据训练之后,决定只能是更加错误的。


    例子:

    朴素贝叶斯的假设就是:各个属性之间是相互独立的。

    如果我们的数据样本由100个属性组成,这100个属性都是相互独立的,那么在这种情况下我们采用朴素贝叶斯再加上大量的数据支持,最后的预测结果就会非常好。但如果这些属性之间的关联性是比较强的,朴素贝叶斯的假设就与数据本身存在不可调和的根本性问题,这个时候即使用很大量的数据进行训练,最终的结果也会很不好。


    归纳偏差(inductive bias)

    这一类由于假设错误而导致结果不好的问题我们称为归纳偏差。

    因此对于不同的问题和场景,我们应该选择最合适的假设来构建模型。

    2.4 验证集(validation set)

    有些时候,我们不仅需要把数据集切分成训练集和测试集,我们还需要额外切分一个验证集。

    验证集可以简单地看做是:训练集的测试集,因为在训练的过程中我们需要根据训练过的阶段性模型在验证机上的精度表现来实时调整模型的参数和超参数从而获得更好的结果或者模型是否收敛
    在很多情况下,我们也会不区分验证集和测试集。

    3. 评估方法(evaluation methods)

    3.1 评估指标(evaluation metrics)

    前面提到的accuracy是我们常用的一个衡量模型优劣的重要指标。


     

    3.1.1 positive样本 v.s. negative样本

    在二分类问题中,我们通常区分正样本和负样本。

    假设我们要让我们的模型区分一张图片是 “猫”还是“非猫”,我们不仅要给所有数据中的猫label=1,我们还需要给那些“非猫”的样本label=0

    这个道理其实很简单,想让模型理解什么是 “猫”首先就要告诉他,哪些特征是 “非猫”,因此任何一个分类问题,一定都存在正样本和负样本,在这个猫和非猫的分类问题中,那些label=1的图片就是正样本(positive),label=0的图片就是负样本(negative)

    • 阳性案例分类为「阳性」(真阳性,TP
    • 阳性案例分类为「阴性」(假阴性,FN
    • 阴性案例分类为「阳性」(假阳性,FP
    • 阴性案例分类为「阴性」(真阴性,TN

    3.1.2 正确率和错误率(Accuracy & Error Rate)

    正确率是所有Ture的情况除以样本总数(正负样本都判断正确)
    错误率是所有False的情况除以样本总数(正样本分类成负样本,负样本分类成正样本的情况)
     

    3.1.3 错误降低率(error rate reduction)

    这是一个用于模型间比较的概念和评估指标。

    如果Error\: \: rate\: \: reduction > 0代表现在的模型优于原来的模型,反之则证明现在的模型比原来的模型更差。

    3.2 Precision & Recall

    accuracy在很多情境下是不足以表征模型水平的,例如:

    我们已经开发了两种机器学习方法来检测疾病。 我们在1000个病例中测试了每种算法(其中1 %的人患有这种疾病)。每个模型的准确率都是99 %

    当我们观察Error表格的时候发现:

    Model 2将所有病人都预测为没有患疾病,由于本身只有1 %人患了这种疾病,所以Model 2的准确度依然很高。

    这种情况下使用accuracy就不足以表征模型水平了。


    针对上面的问题,有两种比accuracyerror rate更有意义的衡量指标: 

    Precision衡量的是:在所有分类器分类出来的阳性样本中,有多少是真正阳性的。

    Recall衡量的是:在所有真正为阳性的样本中,有多少被分类器分类成阳性。


    Precision:用的是一列计算 。

    Recall:用的是一行计算 。

    3.3 F-score

    在理想情况下,我们希望precisionrecall都越接近1越好。

    High\: \: precision + low \: \: recall:该模型需要大量证据来表示“阳性”(严格),较低的假阴性率。

    Low \: \: precision + high\: \: recall:该模型不需要太多证据就可以显示“阳性”,较低的假阳性率。

    因此我们通过把precisionrecall结合起来作为一个模型的评估指标也是一种方法:

    F-score

    3.4 Sensitivity & Specificity

    Sensitivityrecall的另一个名称——模型能够检测到的真实阳性病例的比例(在所有真正为阳性的样本中,有多少被分类器分类成阳性)。

    Specificity:模型能够检测到的真实阴性病例的比例。

     Specificity:用的是第二行计算。

    3.5 多分类模型评估(Multiclass evaluation)

    我们把下面这个表格叫做混淆矩阵(cofusion matric):

    我们之所以能够画出这个2\times 2的矩阵,是因为我们处理的二分类问题,把一类看做是positive样本,另一类是negative 样本。

    那对于多分类的情况下,我们怎么来构成这个混淆矩阵呢?

    在这个多分类任务的图表中,我们容易得出结论,那就是这个表格对角线上的值都是他们的 True\: \: positive的情况;那其他三种状态的样本跑到哪里了呢?

    其实当我们面对多分类的情况,我们只要把其中的一类看做是positive( label=1)样本,其他的所有类都看作negative(label=0)样本,就可以得到混淆矩阵的数值了。

    结合上图来看:

    当我们要求以pedestrianpositive样本的混淆矩阵的时候,我们把road,sidewalk等其他类都看作是label=0的样本,就可以将二分类的混淆矩阵扩展到多分类问题中。这种评估方法也叫 one \: \: v.s.\: \: rest

    接下来我们可以以同样的方法求算所有类的混淆矩阵,并求出每个类的precisionrecall。然后我们将每个类的precisionrecall进行求平均,即可得到整个多分类模型的指标。


    Total \: \: accuracy:对角单元格(正确的分类)的总和除以整个表的总和。

    Macro-averaging

    计算每个classPR并取其平均值。

    其中c代表了所有的classesi是第iclass

    Micro-averaging

    将所有实例合并为一个池。

    Weighted\: \: averaging

    计算每个类别的PR,并取其平均值,按每个classi中的实例比例\frac{n_{i}}{N}加权。

    不同类的样本可能会存在不均衡的情况,因此采用加权平均的方式,样本量大的类别,我们就在计算整体 precisionrecall 的时候给与更多的权重。

    4. 模型比较:基线(baselines)和基准(benchmarks)

    baselines =简单的天真方法,我们希望任何机器学习方法都能击败它。

    例如:随机猜测。

    benchmarks=既定的竞争对手的技术,我们要与之比较我们的方法。
    例如:目前在排行榜上表现最好的算法 。

    在实践中,人们对这些术语的用法并不严格(两者有时统称为基线)。

    4.1 常见的基线

    Random \: \: baseline

    • 从现有标签中均匀地猜测一个类别标签。
    • 根据训练集的类别分布来猜测标签。

    Zero-R \: \: baseline

    • 总是猜测训练集中最常见的标签

    Other \: \: baselines

    • Regression——总是猜测平均值
    • Object\: \: detection——总是猜测图像的中间位置

    baseline举例:

    假设一个回归模型 (regression model)的通过训练后的输出数据范围在[ 1 - 5 ]之间。

    baseline1

    我们选择一个模型,他只做一件事情,就是随机地给出一个1 -5之间的数据作为自己预测的结果。

    baseline2

    这个模型做的事情则更简单,他每次给出的输出值都是3

    计算一下这两个baseline距离真实值到底差多少:

    通过计算得到baseline2的误差比baseline1要小

  • 相关阅读:
    HashMap不安全后果及ConcurrentHashMap线程安全原理
    NeRF-VAE:将场景看作一个分布【ICML‘2021】
    28 【事件传播】
    excel数据丢失怎么办?表格文件恢复的3个方法
    【git】gitlab安装、备份
    Java面试题200+大全(合适各级Java人员)
    【springBoot】统一功能处理
    富文本文案存储翻译方案
    python个人博客毕业设计开题报告
    HTML5 新增的input 表单属性
  • 原文地址:https://blog.csdn.net/Abner98414/article/details/124544927