训练集、验证集和测试集 + 训练误差和泛化误差 + 欠拟合和过拟合
训练集、验证集和测试集 + 训练误差和泛化误差 + 欠拟合和过拟合
在机器学习领域,如何有效地训练模型并评估其性能是一个核心问题。本文将详细介绍训练集、验证集和测试集的作用,解释训练误差和泛化误差的区别,并探讨K折交叉验证方法。此外,文章还将深入分析欠拟合和过拟合现象及其产生的原因,帮助读者更好地理解模型训练过程中的关键概念。
什么是训练集、验证集和测试集?
训练集:机器学习模型用于训练和学习的数据集。训练集用于训练模型的参数。模型通过训练集来学习数据的特征,并产生一个模型,以便在之后的预测中使用。
验证集(评估集):用于评估模型性能的数据集,以便选择和调整合适的超参数。验证集的作用是帮助开发人员调整模型,避免模型过拟合或欠拟合。
测试集:用于测试模型最终性能的数据集。测试集的作用是测试模型在未见过的数据上的性能,并判断模型是否足够准确和鲁棒。
一个简单的例子
假设一个大学生正在努力准备期末考试,他手里的复习资料有练习题和往年真题。该大学生通过练习题的训练之后,想检验一下自己的备考效果,于是通过完成往年真题,根据在往年真题中得到的分数情况来调整自己的备考状态,最终在真实的期末考卷上测试自己的水平。
什么是训练误差和泛化误差?
错分率:在给定数据集上,模型预测错误的样本所占的比例。
训练误差:模型在训练数据集上计算得到的误差。即在训练集上训练完毕后在训练集本身上进行预测得到了错分率。
泛化误差:模型应用在同样从原始样本的分布中抽取的无限多数据样本时,模型误差的期望。即模型在新数据集(训练集上没见过的数据)上的错分率。
问题是,我们永远不能准确地计算出泛化误差。这是因为无限多的数据样本是一个虚构的对象。在实际中,我们只能通过将模型应用于一个独立的测试集来估计泛化误差,该测试集由随机选取的、未曾在训练集中出现的数据样本构成。
一个简单的例子
每当期末考试来临时,我都会整理本学期的作业习题和历年考试真题,通过大量的刷题,在短时间内掌握了大量的题目和答案。尽管如此,在考试中,并不能保障每次都很考出好的成绩。因为我只是尝试死记硬背,如果考题正好在我的记忆中,我就会考出好成绩,反之,如果考试中出现了我没有见过的题目,我就无法准确地回答。在这种情况下,即使遇到了记忆中的题目,我仍有可能做错,我所犯的错误可以被称为“训练误差”,因为这些错误反映了我对训练数据的掌握程度。
后来我意识到,仅仅依赖记忆是不够的。我开始尝试通过做题来理清知识点之间的逻辑关系,构建起完整的知识体系。这样,即使在考试中遇到了我之前没有见过的题目,我也能通过已有的知识框架来分析和解决问题。但是,即便如此,我还是有可能犯错,这时候所犯的错误就可以被称为“泛化误差”,因为这些错误反映了我对未知数据的预测能力。
K折交叉验证
当训练数据稀缺时,我们甚至可能无法提供足够的数据来构成一个合适的验证集。这个问题的一个流行的解决方案是采用K折交叉验证。这里,原始训练数据被分成K个不重叠的子集。然后执行K次模型训练和验证,每次在K−1个子集上进行训练,并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。最后,通过对K次实验的结果取平均来估计训练和验证误差。
算法步骤
- 将训练数据分成K块大小相等的子集
- For i = 1, 2, ..., K
- 使用第i块作为验证数据集,其余k-1个子集作为训练数据集
- 执行完上述过程K次,每次将不同的子集作为验证集
- 取K次测试结果的平均值作为最终的性能评估指标
优缺点
优点:
- 保证每个样本都有机会作为验证集的一部分,从而使得模型的评估更为全面和均衡。
- 经过多次划分,大大降低了结果的偶然性,从而提高了模型的准确性。
- 对数据的使用效率更高。
缺点:
- 对数据随机均等划分,不适合包含不同类别的数据集。
- 比如:数据集有5类数据(ABCDE各占20%),抽取出来的刚好也是按照类别划分的5类,第一折全是A,第二折全是B……在这种情况下,模型用BCDE训练的模型去测试A类数据、ACDE的模型测试B类数据,这样会导致准确率很低。
什么是欠拟合和过拟合?
欠拟合(underfitting):欠拟合是指模型在训练集、验证集和测试集上均表现不佳的情况。即模型过于简单(表达能力不足),无法捕捉到数据中的基本模式。
过拟合(overfitting):过拟合是指模型在训练集上表现很好,到了验证和测试阶段就很差,即模型的泛化能力很差。
一个简单的例子
- 图一的模型是一条线型方程。可以看到,所有的红点都不在蓝线上,所以导致了错误率很高,这是典型的不拟合的情况。
- 图二的蓝线则更加贴近实际的红点,虽然没有完全重合,但是可以看出模型表示的关系是正确的,拟合效果较好。
- 所有点都在蓝线上,这时候模型计算出的错误率很低,(甚至将噪音都考虑进去了)。这个模型只在训练集中表现很好,在验证集和测试集中的表现就不行。这是典型的过拟合情况。
过拟合和欠拟合产生的原因
- 模型复杂性
- 可用训练数据集的大小
模型复杂度
当模型的复杂度过高时,模型容易过拟合,即在训练数据上表现良好,但在测试数据上表现较差。因为模型过于复杂,它可以拟合数据集中的任何细节和噪声,从而导致模型对数据集中的噪声产生过度敏感,无法很好地泛化到新数据集上。
当模型的复杂度过低时,模型容易欠拟合,即在训练数据和测试数据上表现都较差。因为模型太简单,无法很好地拟合数据集中的规律和特征,从而导致无法很好地泛化到新数据集上。
数据集的大小
- 训练数据集中的样本越少,我们就越有可能(且更严重地)过拟合。
- 随着训练数据量的增加,泛化误差通常会减小。
- 一般来说,更多的数据不会有什么坏处。给出更多的数据,我们可能会尝试拟合一个更复杂的模型。能够拟合更复杂的模型可能是有益的。如果没有足够的数据,简单的模型可能更有用。