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

什么是评估机器学习模型    app

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

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

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

为何须要验证集测试

 

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

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

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

留出验证的伪代码:code

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

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

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

伪代码

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

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

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

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


 

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

优势是训练集的样本总数和原数据集同样都是 m,而且仍有约 1/3 的数据不被训练而能够做为测试集。 缺点是这样产生的训练集的数据分布和原数据集的不同了,会引入估计误差。 

相关文章
相关标签/搜索