zoukankan      html  css  js  c++  java
  • K-Fold 交叉验证

    转载——原文地址 www.likecs.com

    1.K-Fold 交叉验证概念


    在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合的问题,就是模型可以很好的匹配训练数据,却不能很好在预测训练集外的数据。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分做为验证 (Validation) 数据,用来评估模型的训练效果。

    验证数据取自训练数据,但不参与训练,这样可以相对客观的评估模型对于训练集之外数据的匹配程度。模型在验证数据中的评估常用的是交叉验证,又称循环验证。它将原始数据分成 K 组 (K-Fold),将每个子集数据分别做一次验证集,其余的 K-1 组子集数据作为训练集,这样会得到 K 个模型。这 K 个模型分别在验证集中评估结果,最后的误差 MSE(Mean Squared Error) 加和平均就得到交叉验证误差。交叉验证有效利用了有限的数据,并且评估结果能够尽可能接近模型在测试集上的表现,可以做为模型优化的指标使用。

    2. 举例说明


    下面举一个具体的例子来说明 K-Fold 的过程,比如如下的数据

    [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
    
    

    分为 K=3 组后

    Fold1: [0.5, 0.2]
    Fold2: [0.1, 0.3]
    Fold3: [0.4, 0.6]
    
    

    交叉验证的时会使用如下三个模型,分别进行训练和测试,每个测试集误差 MSE 加和平均就得到了交叉验证的总评分

    Model1: Trained on Fold1 + Fold2, Tested on Fold3
    Model2: Trained on Fold2 + Fold3, Tested on Fold1
    Model3: Trained on Fold1 + Fold3, Tested on Fold2
    
    

    3. 应用讲解


    1、 将全部训练集 S 分成 k 个不相交的子集,假设 S 中的训练样例个数为 m,那么每一个子集有 m/k 个训练样例,相应的子集称作 {}。

    2、 每次从模型集合 M 中拿出来一个,然后在训练子集中选择出 k-1 个

    {}(也就是每次只留下一个),使用这 k-1 个子集训练后,得到假设函数。最后使用剩下的一份作测试,得到经验错误

    3、 由于我们每次留下一个(j 从 1 到 k),因此会得到 k 个经验错误,那么对于一个,它的经验错误是这 k 个经验错误的平均。

    4、 选出平均经验错误率最小的,然后使用全部的 S 再做一次训练,得到最后的

    核心内容:

    通过上述 1,2,3 步进行模型性能的测试,取平均值作为某个模型的性能指标

    根据性能指标来挑选出最优模型,再进行上述第 4 步重新进行训练,获得最终模型

    疑问解答:

    1. 为什么不直接拆分训练集与数据集,来验证模型性能,反而采用多次划分的形式,岂不是太麻烦了?

    我们为了防止在训练过程中,出现过拟合的问题,通行的做法通常是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。这样的直接划分会导致一个问题就是测试集不会参与训练,这样在小的数据集上会浪费掉这部分数据,无法使模型达到最优(数据决定了程性能上限,模型与算法会逼近这个上限)。但是我们又不能划分测试集,因为需要验证网络泛化性能。采用 K-Fold 多次划分的形式就可以利用全部数据集。最后采用平均的方法合理表示模型性能。

    1. 为什么还要进行所有数据集重新训练,是否太浪费时间?

    我们通过 K-Fold 多次划分的形式进行训练是为了获取某个模型的性能指标,单一 K-Fold 训练的模型无法表示总体性能,但是我们可以通过 K-Fold 训练的训练记录下来较为优异的超参数,然后再以最优模型最优参数进行重新训练,将会取得更优结果。

    1. 何时使用 K-Fold

    我的看法,数据总量较小时,其他方法无法继续提升性能,可以尝试 K-Fold。其他情况就不太建议了,例如数据量很大,就没必要更多训练数据,同时训练成本也要扩大 K 倍(主要指的训练时间)。

    4. 参考


    1.K-Fold 交叉验证 (Cross-Validation)
    2. 规则化和模型选择(Regularization and model selection)

  • 相关阅读:
    SVN中Revert changes from this revision 跟Revert to this revision
    bootstrap中如何使input中的小图标获得点击事件
    基于Bootstrap使用jQuery实现输入框组input-group的添加与删除-改进版
    MVC4 Controller 与 WebApi 的 Session 传值问
    MVC Razor与javascript混编(js中嵌入razor)
    Asp.net mvc怎么在razor里写js代码
    MVC后台数据赋值给前端JS对象
    ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)
    ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
    【记录】【solr】solr7.2.1原子更新
  • 原文地址:https://www.cnblogs.com/wangchangshuo/p/14772169.html
Copyright © 2011-2022 走看看