评估机器学习模型的几种方法(验证集的重要性)

摘要:
机器学习模型的评估是什么?机器学习的目的是得到一个可以推广的模型,也就是说,一个在以前从未见过的数据上表现良好的模型。过度合身是核心难点。您只能控制可以观察到的内容,因此能够可靠地测量模型的泛化能力非常重要。如何衡量泛化能力,即如何评估机器学习模型。评估模型的重点是将数据分为三组:训练集、验证集和测试集。根据训练数据训练模型,并根据验证数据评估模型。找到最佳参数后

什么是评估机器学习模型    

  机器学习的目的是得到可以泛化(generalize)的模型,即在前所未见的数据上表现很好的模型,而过拟合则是核心难点。你只能控制可以观察的事情,所以能够可靠地衡量模型的泛化能力非常重要。  

如何衡量泛化能力,即如何评估机器学习模型。

评估模型的重点是将数据划分为三个集合:训练集、验证集和测试集。在训练数据上训练模型,在验证数据上评估模型。一旦找到了最佳参数,就在测试数据上最后测试一次。

为什么需要验证集

  原因在于开发模型时总是需要调节模型配置,比如选择层数或每层大小[这叫作模型的超参数(hyperparameter),以便与模型参数(即权重)区分开]。这个调节过程需要使用模型在验证数据上的性能作为反馈信号。这个调节过程本质上就是一种学习:在某个参数空间中寻找良好的模型配置。因此,如果基于模型在验证集上的性能来调节模型配置,会很快导致模型在验证集上过拟合,即使你并没有在验证集上直接训练模型也会如此。
  造成这一现象的关键在于信息泄露(information leak)。每次基于模型在验证集上的性能来调节模型超参数,都会有一些关于验证数据的信息泄露到模型中。如果对每个参数只调节一次,那么泄露的信息很少,验证集仍然可以可靠地评估模型。但如果你多次重复这一过程(运行一次实验,在验证集上评估,然后据此修改模型),那么将会有越来越多的关于验证集的信息泄露到模型中。
  最后,你得到的模型在验证集上的性能非常好(人为造成的),因为这正是你优化的目的。你关心的是模型在全新数据上的性能,而不是在验证数据上的性能,因此你需要使用一个完全不同的、前所未见的数据集来评估模型,它就是测试集。你的模型一定不能读取与测试集有关的任何信息,既使间接读取也不行。如果基于测试集性能来调节模型,那么对泛化能力的衡量是不准确的。
将数据划分为训练集、验证集和测试集可能看起来很简单,但如果可用数据很少,还有几种高级方法可以派上用场。

我们先来介绍三种经典的评估方法:简单的留出验证、K 折验证,以及带有打乱数据的重复 K 折验证。

1. 简单的留出验证
留出一定比例的数据作为测试集。在剩余的数据上训练模型,然后在测试集上评估模型。
如前所述,为了防止信息泄露,你不能基于测试集来调节模型,所以还应该保留一个验证集。

评估机器学习模型的几种方法(验证集的重要性)第1张

留出验证的伪代码:

1、将原有数据集打乱顺序shuffle_data
2、将打乱的数据集的一部分(一般为10%-20%)定义为验证集valify_data
3、剩余的数据定义为训练数据train_data
4、根据需求建模 model
5、训练模型model.train(train_data)
6、在验证集上评估模型model.evaluate(valify_data)
7、调节模型
8、重复5、6、7直到模型在验证集上表现良好
9、在测试集上测试模型

  这是最简单的评估方法,但有一个缺点:如果可用的数据很少,那么可能验证集和测试集包含的样本就太少,从而无法在统计学上代表数据。这个问题很容易发现:如果在划分数据前进行不同的随机打乱,最终得到的模型性能差别很大,那么就存在这个问题。

2. K 折验证
  K 折验证(K-fold validation)将数据划分为大小相同的 K 个分区。对于每个分区 i ,在剩余的 K-1 个分区上训练模型,然后在分区 i 上评估模型。最终分数等于 K 个分数的平均值。对于不同的训练集 - 测试集划分,如果模型性能的变化很大,那么这种方法很有用。与留出验证一样,这种方法也需要独立的验证集进行模型校正。

评估机器学习模型的几种方法(验证集的重要性)第2张

伪代码

将原来的数据平均k份
根据需求建模 model
for i in range(k)
    将第 i 份数据作为验证集,其他k-1份数据作为训练集
    在训练集上训练模型
    在验证集上【】评估模型
在测试集上测试模型

数据量小的时候,k 可以设大一点,这样训练集占整体比例就比较大,不过同时训练的模型个数也增多。 
数据量大的时候,k 可以设小一点。

3、带有打乱数据的重复 K 折验证

  如果可用的数据相对较少,而你又需要尽可能精确地评估模型,那么可以选择带有打乱数据的重复 K 折验证(iterated K-fold validation with shuffling)。具体做法是多次使用 K 折验证,在每次将数据划分为 K 个分区之前都先将数据打乱。最终分数是多次 k 折交叉验证再求均值,例如:10 次 10 折交叉验证,以求更精确一点。注意,这种方法一共要训练和评估 P×K 个模型(P是重复次数),计算代价很大。


  除此之外还有一种比较特殊的交叉验证方法,有人将其叫做Bootstrapping。通过又放回的抽样,抽取与train_data相同数量的数据作为新的训练集。即在含有 m 个样本的数据集中,每次随机挑选一个样本,再放回到数据集中,再随机挑选一个样本,这样有放回地进行抽样 m 次,组成了新的数据集作为训练集。

优点是训练集的样本总数和原数据集一样都是 m,并且仍有约 1/3 的数据不被训练而可以作为测试集。 
缺点是这样产生的训练集的数据分布和原数据集的不一样了,会引入估计偏差。 

免责声明:文章转载自《评估机器学习模型的几种方法(验证集的重要性)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇6.requests编写企查查爬虫scss初学小结(转阮一峰老师SASS用法指南http://www.ruanyifeng.com/blog/2012/06/sass.html)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

机器学习(二十一)— 特征工程、特征选择、归一化方法

  特征工程:特征选择,特征表达和特征预处理。 1、特征选择   特征选择也被称为变量选择和属性选择,它能够自动地选择数据中目标问题最为相关的属性。是在模型构建时中选择相关特征子集的过程。   特征选择与降维不同。虽说这两种方法都是要减少数据集中的特征数量,但降维相当于对所有特征进行了重新组合,而特征选择仅仅是保留或丢弃某些特征,而不改变特征本身。 降维常...

机器学习:R语言中如何使用最小二乘法

细内容见上一篇文章:http://www.cnblogs.com/lc1217/p/6514734.html 这里只是介绍下R语言中如何使用最小二乘法解决一次函数的线性回归问题。 代码如下:(数据同上一篇博客)(是不是很简单????) > x<-c(6.19,2.51,7.29,7.01,5.7,2.66,3.98,2.5,9.1,4.2) &...

机器学习优化器总结

一、梯度下降法 1、标准梯度下降法(GD) 公式:Wt+1=Wt−ηtΔJ(Wt) 其中,WtWt表示tt时刻的模型参数。 从表达式来看,模型参数的更新调整,与代价函数关于模型参数的梯度有关,即沿着梯度的方向不断减小模型参数,从而最小化代价函数。 基本策略可以理解为”在有限视距内寻找最快路径下山“,因此每走一步,参考当前位置最陡的方向(即梯度)进而迈出下一...

spark Pipeline,逻辑回归、svm等算法交叉验证

交叉验证应用与各种算法中,用于验证超参数的最优值。 常用的算法有逻辑回归、神经网络、ALS、SVM、决策树等。 Spark中采用是k折交叉验证 (k-fold cross validation)。举个例子,例如10折交叉验证(10-fold cross validation),将数据集分成10份,轮流将其中9份做训练1份做验证,10次的结果的均值作为对算法...

解释深度学习在安全领域中的应用

摘要: 虽然深度学习在各个领域显示出巨大的潜力,但缺乏透明度限制了它在安全或关键安全领域的应用。现有的研究试图开发解释技术,为每个分类决策提供可解释的解释。不幸的是,当前的方法是针对非安全性任务(例如,图像分析)进行优化的。它们的关键假设在安全应用程序中经常被违反,导致解释的保真度很差。 本文提出了一种用于安全应用的高保真度解释方法LEMNA。给定一个输入...

[软件过程/软件生命周期模型]软件过程的工具链【待续】

0 宣言:DevOps & RUP统一过程建模 1 项目管理 (需求管理 / 缺陷管理 / ...) 禅道(前身:bugfree) [在线协作] JIRA(项目与事务跟踪工具) 与禅道类同,但又不同,有明显的Scrum敏捷风格 Microsoft Project [离线维护] 在线文档 or Excel 2 系统建模 2....