当我们完成模型的构建后,需要通过某种评估方法来检验模型的好坏。

1 集合划分

在有监督学习中,我们会将数据集(or 样本)进行如下划分:

  • 训练集(train set):用于训练模型以及确定模型权重(普通参数)。
  • 验证集(validation set):用于确定网络结构以及调整模型的超参数。
  • 测试集(test set):用于检验模型的泛化能力。

具体划分比例通常为8:1:1

⚠️ 如果没有项目经验的,下面👇这部分可以跳过。

有一个重要的问题,当你在验证集上调整参数得到最优结果后,但用于测试集时效果变差,要不要再继续调整超参数了呢?

如果此时调整了超参数,相当于测试集起到了验证集的作用,那么我们就还需要一个「测试测试集」来测试泛化能力… 因此,建议在使用测试集测试过最终模型后,最好不要再对模型进行进行调整,因为你不知道在实际数据中效果会如何。

在真实项目中,我们一般只会划分出「训练集」和「验证集」。主要原因有两个:

  1. 实际情况下数据集都比较难以获取,有时仅靠人工来制作数据集,因此如果再划分测试集就会导致训练数据不足,可能会使模型欠拟合。
  2. 我们无法保证训练集和真实场景的测试集完全同分布,因此划分一个跟训练集同分布的测试集就没什么作用,它无法验证模型的泛化能力。

最后还有一个注意事项是,当你使用验证集得到合适的超参数后,最终训练的模型应该把这部分验证集也加入训练集中重新训练。

2 评估原则

评估原则很简单,即:

尽可能减少「人为因素」导致的误差。

3 评估方法

3.1 留出法

对于给定数据集 D,划分为两个互斥的集合,训练集 S 和 测试集 T。 通常情况下的划分为:

  • 训练集 70%
  • 测试集 30%

如果顺序划分可能会导致样本的正例和反例不平衡,导致实验结果有误差。所以在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取评估值作为流出法的评估结果。

3.2 交叉验证法

对于给定数据集 D,划分为K个大小相似的互斥子集。每次使用 k-1 个子集的并集用于训练,余下的子集用于测试。这样就可以做 k 次训练和测试。

为了减少因为数据划分不同而引入的差别,通常会重复上述 k 折交叉验证 p 次。最后结果取 p 次 k 折交叉验证的均值。常见的有「10次10折交叉验证」。

3.3 自助法

自助法通常用于数据量较小的情况下,它在给定 m 个样本的数据集 D,采取放回抽样的方式重复 m 次。

假设包含 m 个样本的采样数据集为 E,我们把 E 作为训练集。根据采样概率算得,约有 36.8% 的样本没有出现在 E 中,我们就把可以这部分数据用于测试,这样测试得到结果亦被称为「包外估计」。

⚠️ 上述的划分和评估方法已经很常见,通常不需要你手动去写这部分代码。比如 scikit-learn 就有很多成熟函数供你调用。

4 参考资料