构建机器学习模型的一个重要环节是评价模型在新的数据集上的性能。模型过于简单时,容易发生欠拟合(high bias);模型过于复杂时,又容易发生过拟合(high variance)。为了达到一个合理的 bias-variance 的平衡,此时需要对模型进行认真地评估。本文将介绍两个十分有用的cross-validation技术,holdout cross-validation 以及 k-fold cross-validation,这些方法将帮助我们获得模型关于泛化误差(generalization error)的可信的估计,所谓的泛化误差也即模型在新数据集上的表现。

holdout validation

from sklearn.cross_validation import train_test_split

使用 holdout 方法,我们将初始数据集(initial dataset)分为训练集(training dataset)和测试集(test dataset)两部分。训练集用于模型的训练,测试集进行性能的评价。然而,在实际机器学习的应用中,我们常常需要反复调试和比较不同的参数设置以提高模型在新数据集上的预测性能。这一调参优化的过程就被称为模型的选择(model selection):select the optimal values of tuning parameters (also called hyperparameters)。然而,如果我们重复使用测试集的话,测试集等于称为训练集的一部分,此时模型容易发生过拟合。

一个使用 holdout 方法进行模型选择的较好的方式是将数据集做如下的划分:

  • 训练集(training set);

    The training set is used to fit the different models

  • 评价集(validation set);

    The performance on the validation set is then used for the model selection

  • 测试集(test set);

    The advantage of having a test set that the model hasn’t seen before during the training and model selection steps is that we can obtain a less biased estimate of its ability to generalize to new data. 下图阐述了 holdout cross-validation 的工作流程,其中我们重复地使用 validation set 来评估参数调整时(已经历训练的过程)模型的性能。一旦我们对参数值满意,我们就将在测试集(新的数据集)上评估模型的泛化误差。

holdout 方法的弊端在于性能的评估对training set 和 validation set分割的比例较为敏感

k-fold validation

在 k-fold cross_validation,我们无放回(without replacement)地将训练集分为 k folds(k个部分吧),其中的 k-1 folds 用于模型的训练,1 fold 用于测试。将这一过程重复 k 次,我们便可获得 k 个模型及其性能评价。

我们然后计算基于不同的、独立的folds的模型(s)的平均性能,显见该性能将与holdout method相比,对training set的划分较不敏感。一旦我们找到了令人满意的超参的值,我们将在整个训练集上进行模型的训练。

因为k-fold cross-validation 是无放回的重采样技术,这种方法的优势在于每一个采样数据仅只成为训练或测试集一部分一次,这将产生关于模型性能的评价,比 hold-out 方法较低的variance。下图展示了 k=10k=10 时的 k-fold 方法的工作流程。

k-fold cross-validation 的 kk 值一般取10,对大多数应用而言是一个合理的选择。然而,如果我们处理的是相对较小的训练集的话,增加 kk 的值将会非常实用。因为如果增加 kk,更多的训练数据(N×(1−1k)N\times (1-\frac1{k}))得以使用在每次迭代中,这将导致较低的 bias在评估模型的泛化性能方面。然而,更大的 kk 将会增加cross-validation的运行时间,生成具有更高higher variance 的评价因为此时训练数据彼此非常接近。另一方面,如果我们使用的是大数据集,我们可以选择更小的 kk,比如 k=5k=5,较小的 kk 值将会降低在不同folds上的refitting 以及模型评估时的计算负担。

一个 k-fold cross-validation 的特例是 LOO(leave-one-out) cross-validation method。在LOO中,我们取 k=nk=n,如前所述,LOO尤其适用于具有小规模的数据集上。

对于 k-fold cross-validation 的一中改进是 stratified k-fold cv method,该方法可以产生更好的 bias以及variance 评价,尤其当 unequal class proportions。

实践

from sklearn.cross_validation import StratifiedKFold
kfolds = StratifiedKFold(y=y_train, n_folds=10, random_state=1)
scores = []
for i, (train, test) in enumerate(kfolds):# train.shape 将是 test.shape的接近9倍clf.fit(X_train[train], y_train[train])score = clf.score(X_train[test], y_train[test])scores.append(score)print('Fold: %s, class dist.: %s, Acc: %.4f' %(i+1, np.bincount(y_train[train]), score))
print('CV accuracy: %.4f +/- %.4f' % (np.mean(scores), np.std(scores)))

cross-validation:从 holdout validation 到 k-fold validation相关推荐

  1. 交叉验证(cross validation)是什么?K折交叉验证(k-fold crossValidation)是什么?

    交叉验证(cross validation)是什么?K折交叉验证(k-fold crossValidation)是什么? 交叉验证(cross validation)是什么?  交叉验证是一种模型的验 ...

  2. 验证曲线( validation curve)是什么?如何绘制验证曲线( validation curve)?验证曲线( validation curve)详解及实践

    验证曲线( validation curve)是什么?如何绘制验证曲线( validation curve)?验证曲线( validation curve)详解及实践 验证曲线( validation ...

  3. 机器学习代码实战——K折交叉验证(K Fold Cross Validation)

    文章目录 1.实验目的 2.导入数据和必要模块 3.比较不同模型预测准确率 3.1.逻辑回归 3.2.决策树 3.3.支持向量机 3.4.随机森林 1.实验目的 使用sklearn库中的鸢尾花数据集, ...

  4. 不使用机器学习的机器视觉_如何在约10分钟内开始使用机器学习

    不使用机器学习的机器视觉 by Tirmidzi Faizal Aflahi 通过提尔米兹·法扎尔·阿弗拉希 With the rise of Machine Learning inside indu ...

  5. Keras Tutorial: Deep Learning in Python

    This Keras tutorial introduces you to deep learning in Python: learn to preprocess your data, model, ...

  6. K-Fold Cross Validation

    2019独角兽企业重金招聘Python工程师标准>>> 1: K Fold Cross Validation In the previous mission, we learned ...

  7. UA MATH574M 统计学习 Variable Selection:Cross Validation

    UA MATH574M 统计学习 Variable Selection:Cross Validation LOOCV LOOCV score的计算 K-fold CV Generalized CV 故 ...

  8. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:六点半起床 juejin.im/post/685654110 ...

  9. Silverlight实例教程 - Validation数据验证开篇

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  10. OAF_EO系列2 - Validation数据校验验证机制(概念)

    2014-06-12 Created By BaoXinjian 一.摘要 1. 在Update数据之前,我们往往要对待更新的记录进行有效性的校验,校验级别包括 Attribute Level Val ...

最新文章

  1. protobuf简单序列化反序列化示例
  2. mysql闪退或者can not connect 127.0.0.1
  3. PyQt5 笔记6 -- 对话框(QDialog)
  4. python闭包怎么理解_Python:闭包的理解
  5. xposed 修改参数_【Android 原创】2020春节红包第三题Xposed框架Hook的应用
  6. ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)
  7. WS-*协议栈及相关概念
  8. JSON应用场景与实战
  9. Qt GUI编程 基础入门
  10. macOS升级到Big Sur之后Goland提示找不到svn命令
  11. Objective C TCP 通讯实例
  12. 远程控制软件teamviewer简介
  13. WLAN RTT (IEEE 802.11mc)
  14. Excel应用技巧之二——常用函数
  15. Glide源码分析以及三级缓存原理
  16. promise.then链式调用顺序
  17. python2 与 python3 共存
  18. springboot集成快递100实现查询快递,面单打印;面单取消
  19. mysql ndb 安装_mysql NDB的安装配置使用示例
  20. 用技术赋能城市管理,景联文科技提供城市治理多场景数据采集服务!

热门文章

  1. MySQL 的DDL DML DQL DCL细节解析 知道这些就够了
  2. reduceByKey与GroupByKey,为什么尽量少用GroupByKey
  3. hadoop yarn如何启动聚合日志
  4. Linux下安装mysql(CentOS7)
  5. java求最大子数组 (分治算法)
  6. 深度学习代码实战——基于RNN的手写数字分类
  7. 数据结构和算法详解(二)——线性表(数组、链表、栈、队列)
  8. 类和对象编程(三):构造函数析构函数
  9. Blog运用感想 (ZT)
  10. html post与get的区别,post 和get请求的区别(html)