Single

自然语言处理中训练集、开发集、测试集划分原则和使用方法

自然语言监督学习中,当我们选择了一个数据集后,通常需要将该数据集划分为训练集、开发集和测试集。

训练集:用于训练模型,从而使我们设计的模型中的参数得到更新
测试集:用于测试我们的模型的结果如何,比如和其他模型的结果相比提高了多少精度
开发集比较有趣,因为在有的实验中它并不一定存在。

举例来说,曾经我做了一个关于词向量的实验,得到了一个新的词向量,那么我需要和现有的词向量生成方法进行对比,比如Word2Vec和Glove,在一个Case Study中做了一个情感二分类的实验,在分类器相同的情况下,我的词向量分类结果比Word2Vec和GloVe要高,那么可以说我的方法生成的词向量比Word2Vec和Glove要好。

在这个Case Study中,我只用到了训练集和测试集,并没有使用到开发集,训练集用于训练分类器,测试集用于衡量分类器的准确性。

考虑另外的一个情形,如果仅仅将数据集分割为训练集和测试集则是错误的。

在一个文档级别的情感分类中,我设计一个分类模型,如果我仅仅将数据集划分为训练集和测试集,那么我完全可以按照以下方式来做从而使我的模型在测试集合上具有很高的分类精度。

1.使用训练集训练模型,测试集上验证分类结果,如果精度低,看看是模型哪部影响了结果
2.修改模型,调整参数,再训练,验证
3.重复1和2的过程,直到得到一个很高的结果

这样得到的模型只能说明我的模型在我所划分的测试集合上结果很好,但是却并不能说明我的模型具有很好的泛化能力,如果用于新的数据,这个模型不见得就好。

这时就需要将原来的数据集划分为3个集合:训练集、开发集和测试集

像上面的模型修改,调整,我们需要在开发集上进行,当在开发集上验证得到了较好的结果后,再和其他的模型在测试集上进行分类比较,如果你的模型在测试集上的分类结果比其他模型要好,这时才能说明你的模型比其他模型好。

然而当前很多自然领域的论文,包括很多顶级的论文却并没有遵循这一开发流程,以最近看的一篇论文为例(为避嫌,此处不写原文标题):
原文在实验部分这样写道“We randomly select 20% of the original training data as the development set and only use the remaining 80% for training. ”
该论文主要讲他设计了一个模型来提高了Aspect级别的情感分类,从结果来看他的结果是最好的,但问题在于他的模型结构和里面所使用的各种参数很可能是通过那20%的开发集来进行反馈调整和修改形成的,那么他的模型肯定在这20%的数据集上最好,其他的模型的结果就不好,自然最后的比较并没有多大的说服力。

那么什么时候要开发集,什么时候可以不用呢?

如果你需要使用一定的数据来验证你的模型,从而根据验证结果来修改调整你的模型,此时你是需要一个开发集的,反之则不用。

例一中,我们仅仅要验证哪个词向量更好,由于分类器相同,训练集相同,不存在分类器模型调整,因此可以不用开发集。

如何划分数据集?

通常是在数据集中随机取数据。

如果只需要训练集和测试集,则比例是80%:20%

如果需要训练集,开发集和测试集,则比例是80%:10%:10%

暂无评论

发表评论