• 评估机器学习模型-摘抄


    综述

    通常,不会在训练模型的相同数据上 对模型进行评估。因为,随着训练的进行,模型在训练数据上的性能始终在提高,但在前所未见的数据上的性能则不再变化or开始下降。

    机器学习的目的是得到可以泛化的模型,即在前所未见的数据上表现很好的模型,所以,如何可靠地衡量模型的泛化能力非常重要,下述内容主要介绍如何衡量模型的泛化能力

    此外,提升模型泛化性的难点是过拟合,后续会介绍!

    train/valid/test

    评估模型时,将数据划分成3个集合:train/valid/test。
    train:在该数据集上,训练模型;
    valid:在该数据集上,评估模型;
    test:一旦找到了最佳参数,就在该数据集上,最后测试一次。

    A. 为什么需要test数据?

    (1.)在开发模型时,总是要调节模型配置,比如层数、每层大小(超参数),这个调节过程要用模型在valid数据上的性能 作反馈信号,该过程本质是一种学习:在某个参数空间中,寻找良好的模型配置
    (2.)所以,基于模型在valid上的性能 调节模型配置,很快会使模型在valid上过拟合,即使 你没在valid上直接训练模型 也会如此。造成这一现象的关键是信息泄露:每次基于模型在valid上的性能调节模型超参数,都有一些关于valid的数据信息泄漏到模型中
    (3.)即使最后得到的模型在valid上的性能很好,因为这正是你优化的目的;而我们关心的是 模型在全新数据上的性能,而不是在valid上的性能。因此,需要用一个完全不同的、前所未见的数据来评估模型,即test数据集。
    (4.)你的模型一定不能读取与test数据有关的任何信息,即使是间接读取也不行 。如果基于test数据的性能 调节模型,那么对泛化能力的衡量是不准确的

    B. 可用数据较少,如何划分train/valid/test?

    (1.)最简单的留出验证
    一旦调节好超参数,就在所有非test数据上,从头开始训练最终模型
    该评估方法的缺点:如果可用的数据很少,则valid和test数据包含的样本就太少,无法从统计学上代表数。
    具体通过实验 发现该问题的方式:如果再划分数据前 进行不同的随机打乱,最终得到的模型性能差别很大,就存在这个问题。

    (2.)K折验证
    为了解决上述 不同划分“trian-test”得到的模型性能变化很大 的问题,引入“K折验证”。
    K折验证,即将数据划分成大小相同的K个分区,对每个分区i,在剩余的K-1个分区上训练模型,然后在分区i上评估模型。最终分数=K个分数的平均值。

    K个模型train训练+valid评估,得到最优超参数;
    用该超参数,在train+valid上 再训练一个模型M;
    用模型M 在test上做评估!

    (3.)带有打乱数据的重复K折验证
    做法:多次使用K折验证,在每次将数据划分为K个分区之前,都先将数据打乱。最终分数是每次K折验证分数的平均值。

    评估模型的注意事项

    数据代表性

    通常,要求train和test都能代表当前数据,所以,划分数据集前,应该随机打乱数据;以免出现mnist数据集train只包含1-7的数字,test只包含9的数字,这种可笑错误。

    时间箭头

    如果想要根据过去 预测未来,则划分数据时 不应该随机打乱数据,因为打乱会造成时间泄漏:你的模型将在未来数据上 做训练。该情况,应该确保test数据的时间 都晚于train数据

    数据冗余

    数据中的某些样本 出现了多次,则打乱数据 并划分train/valid会导致两个数据集间的数据冗余,就会出现在部分train数据上评估模型性能效果的问题。即一定要确保train和valid间 没有样本交集

  • 相关阅读:
    【前端】使用json-server报错
    【算法面试必刷Java版七】链表中环的入口结点
    机器学习强基计划4-4:详解半朴素贝叶斯分类AODE原理(附Python实现)
    纯血鸿蒙APP实战开发——阅读翻页方式案例
    人工智能之Tensorflow编程模型
    Homebrew国内和国外如何自动安装(Mac & Linux)
    操作系统 应用题 例题+参考答案(考研真题)
    【LeetCode每日一题】——445.两数相加 II
    SSM+JSP实现《吃货联盟外卖系统》
    java94-cpu随机调用线程测试
  • 原文地址:https://blog.csdn.net/cymy001/article/details/126032695