要了解一个模型对新样例的归纳效果,唯一的方法是在新样例下实际测试。一种方法是将您的模型放在生产中,并监控它的执行情况。这很好,但是如果你的模型糟糕透顶,你的用户就会抱怨——这不是最好的主意。

一个更好的选择是把你的数据分为两组:训练集和测试集,这些名字暗示,你使用训练集训练你的模型,你使用测试集对其进行测试。对新样本的错误率称为泛化误差[generalization error](或样本外误差[out-of-sample error]),通过在测试集上对模型进行评估,你得到一个估计的误差。这个值告诉您,您的模型在以前从未见过的实例上执行的怎么样。

如果训练错误率低(即你的模型在训练集中很少出错),但是泛化误差很高,这意味着你的模型对训练数据过拟合。

一般使用80%的数据进行训练,保留20%用于测试。

因此,评估一个模型非常简单:只需使用一个测试集。现在假设你在两个模型之间犹豫不决(比如一个线性模型和一个多项式模型):你如何决定?一种选择是对两者进行训练,并比较它们对于测试集的泛化程度。

现在假设线性模型泛化得更好,但是你想应用一些正则化来避免过度拟合。问题是:如何选择正规化超参数的值?一种选择是用100个不同的超参数值来训练100个不同的模型。假设您找到了最佳的超参数值,该值生成一个具有最低泛化误差的模型,它仅有5%的错率。

因此,您将该模型启动到生产中,但不幸的是,它没有达到预期的效果,并且产生了15%的错误。发生了什么?

问题是您在测试集上多次测量泛化错误率,并且您调整了模型和超参数,以生成该集合的最佳模型,这意味着模型不太可能在新样本数据上执行。

这个问题通常的解决方案是:再保留一个集合,称作验证集合[validation set]。用测试集和多个超参数训练多个模型,选择在验证集上有最佳性能的模型和超参数。当你对模型满意时,用测试集再做最后一次测试,以得到泛化误差率的预估。

为了避免在验证集[validation set]中“浪费”太多的训练数据,一种常见的技术是使用交叉验证[ cross-validation]:训练集被分割成互补的子集,并且每个模型用不同的子集训练,并用其余的部分进行验证。一旦选择了模型类型和超参数,最终的模型就会在完整训练集上使用这些超参数进行训练,并在测试集上测量泛化误差。

无免费午餐定理
模型是观察的简化版本。简化的目的是丢弃那些不太可能泛化到新实例的多余细节。但是,要决定要丢弃哪些数据以及要保留哪些数据,必须做出假设。例如,线性模型假设数据是基本线性的,并且实例与直线之间的距离只是噪声,可以安全地忽略。

在一篇1996年的著名论文(goo.gl/3zaHIZ)中,David Wolpert证明,如果完全不对数据做假设,就没有理由选择一个模型而不选另一个。这称作没有免费午餐(NFL)公理。对于一些数据集,最佳模型是线性模型,而对其它数据集是神经网络。没有一个模型可以保证效果更好(如这个公理的名字所示)。确信的唯一方法就是测试所有的模型。因为这是不可能的,实际中就必须要做一些对数据合理的假设,只评估几个合理的模型。例如,对于简单任务,你可能是用不同程度的正规化评估线性模型,对于复杂问题,你可能要评估几个神经网络模型。

results matching ""

    No results matching ""