Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

B.8 测试集与交叉验证

文本分类的训练和测试流程与语言模型中所见的流程相同:用训练集训练模型,再用开发测试集(也称开发集,devset)调节一些参数,并总体上决定哪个模型最好。当我们得到自认为最佳的模型后,就在此前从未见过的测试集上运行它并报告性能。

使用开发集可以避免对测试集过拟合,但固定划分训练集、开发集和测试集又会产生另一个问题:为尽量保留大量训练数据,测试集(或开发集)可能小到不足以具有代表性。如果既能用全部数据训练,又能用全部数据测试,岂不是更好?我们可以通过交叉验证做到这一点。

在交叉验证中,先选择一个数 kk,把数据划分为 kk 个互不相交的子集,称为(fold)。选择其中一折作为测试集,在其余 k1k-1 折上训练分类器,然后计算测试集错误率;接着换另一折作为测试集,再在其余 k1k-1 折上训练。这个抽样过程重复 kk 次,对 kk 次运行所得的测试集错误率取平均,得到平均错误率。如果选择 k=10k=10,就会训练 10 个不同模型(每个使用 90% 的数据),测试 10 次并对 10 个值求平均。这称为 10 折交叉验证

交叉验证唯一的问题是:因为全部数据都参与测试,整个语料库必须保持盲态。我们不能查看任何数据来启发可能的特征,也不能笼统地观察数据中发生了什么,因为那等于窥视测试集;这种作弊会让我们高估系统性能。然而,查看语料库、理解其中情况对设计 NLP 系统十分重要。怎么办?因此,常见做法是先建立固定的训练集和测试集,再在训练集内部进行 10 折交叉验证,而测试集仍按常规方式计算错误率,如图 B.7 所示。

图 B.7 10 折交叉验证。