首先明白一个事实,那就是如果我们在某个训练集上训练拟合得到一个模型,那么显然,这个模型在这个训练集上的训练错误很有可能会比实际上的泛化错误(generalization error)会低(模型overfitting)。
问题来了:
假如我们把数据集分成 训练集 和 测试集。然后,在训练集上训练得到几个模型,我们想从中选择一个我们认为最好的模型。我们该如何做选择呢?
一种方法是,直接从中选择 训练错误最小的那个模型。
但是,我们知道,训练错误最小,很可能是这个模型过度拟合;因此,这个模型的 实际 泛化错误(generalization error)很大。换句话说,如果把这些模型放在测试集上进行测试,训练错误最小的那个模型很可能测试错误很大。所以,这种方法不可行。
另一种方法是,把 这些模型 放在测试集上进行测试,然后选择 测试错误最小的那个。
嗯,是不错,但是如果我们想知道这个模型的 泛化错误(generalization error)是多少该怎么办? 直接使用测试错误吗?显然这样做不好,前面提到,这个错误值往往 很可能 比实际的泛化错误 小。
那该 怎么办 呢?
具体做法是:
首先,把数据集分成三部分:训练集、验证集(交叉验证集 cross validation set)、测试集;
其次,在训练集上训练得到 几个模型;
接着,把这些模型放在验证集上 进行验证,选择验证错误最小的那个模型;
最后,把这个模型放在测试集上 进行测试,计算得到它的测试错误,这个测试错误 就可以当成它的 泛化错误(generalization error)。