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

什么是评估机器学习模型    

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

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

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

为什么需要验证集

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

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

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 个分数的平均值。对于不同的训练集 - 测试集划分,如果模型性能的变化很大,那么这种方法很有用。与留出验证一样,这种方法也需要独立的验证集进行模型校正。

伪代码

将原来的数据平均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 的数据不被训练而可以作为测试集。 
缺点是这样产生的训练集的数据分布和原数据集的不一样了,会引入估计偏差。

原文地址:https://www.cnblogs.com/zuoshoushizi/p/10111722.html

时间: 2024-10-08 15:55:38

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

在进行机器学习建模时,为什么需要验证集(validation set)?

在进行机器学习建模时,为什么需要评估集(validation set)? 笔者最近有一篇文章被拒了,其中有一位审稿人提到论文中的一个问题:”应该在验证集上面调整参数,而不是在测试集“.笔者有些不明白为什么除了训练集.测试集之外,还需要额外划分一个验证集.经过查找资料,在<Deep Learning with Python>这本书上面我发现了比较好的解释,于是将这部分内容摘录在本博文中,并且翻译为中文. 下文摘自<Deep Learning with Python>4.2小节,翻译如

django 自定义用户user模型的三种方法

来源:http://www.jb51.net/article/57527.htm django version: 1.7.1 最简单的推荐:使用abstractuser扩充fields 复制代码代码如下: profiles/models.py from django.db import modelsfrom django.contrib.auth.models import AbstractUserfrom django.utils.translation import ugettext_laz

用两种方法验证邮箱的合法性(最新)

代码: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.title=@"验证邮箱的合法性"; //最全面的验证邮箱的方法,用两种方法一起测试 NSString *email=@"[email protected]"; NSLog(@"---%i--",[self validateEmail:emai

字典转模型的三种方法之四:总结

模型 1 // 2 // YSFoodTypeModule.h 3 // YSUiSplitViewController 4 // 5 // Created by ys on 15/12/12. 6 // Copyright (c) 2015年 ys. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 @interface YSFoodTypeModule : NSObject 12 13 @proper

pytorch 建立模型的几种方法

利用pytorch来构建网络模型,常用的有如下三种方式 前向传播网络具有如下结构: 卷积层-->Relu层-->池化层-->全连接层-->Relu层 对各Conv2d和Linear的解释如下 Conv2d的解释如下 """ Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True) in_channels(int

ThinkPHP学习笔记 实例化模型的四种方法

创建Action类 [php] <?php class NewObjectAction extends Action{ public function index(){ //1.创建一个基础模型 //      //一:实例化一个系统的数据库操作类 //      //new Model('User')相当于M('User'),在Model中放置一个需要操作的表 //      //1命名: //      //  thinkphp默认的有表名前缀,如果为think_user:则在Model中可

字典转模型的三种方法之三:MJExtension全自动字典模型互转

1 #import "YSHomeViewController.h" 2 #import "UIImage+YS.h" 3 #import "UIBarButtonItem+YS.h" 4 #import "YStitleButton.h" 5 #import "AFNetworking.h" 6 #import "YSaccountTool.h" 7 #import "YSa

字典转模型的三种方法之二:KVC

1 -(NSArray *)tgs 2 { 3 NSString *path = [[NSBundle mainBundle]pathForResource:@"tgs" ofType:@"plist"]; 4 NSMutableArray *tgsArray = [NSMutableArray array]; 5 NSArray *tgsDicts = [NSArray arrayWithContentsOfFile:path]; 6 for (NSDiction

解释机器学习模型的一些方法(三)——理解复杂的机器学习模型

在这一部分中我们所要展现的技术,可以为非线性.非单调的响应函数生成解释.我们可以把它们与前两部分提到的技巧结合起来,增加所有种类模型的可解释性.实践者很可能需要使用下列增强解释性技巧中的一种以上,为他们手中最复杂的模型生成令人满意的解释性描述. 代理模型 图14.  为了解释复杂神经网络而使用代理模型的示意图 代理模型是一种用于解释复杂模型的简单模型.最常见的建立方法是,对原始输入和复杂模型给出的预测值建立简单线性回归或者决策树模型.代理模型中所展示的系数.变量重要性.趋势以及交互作用,是复杂模