购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6 交叉验证

为了评估机器学习算法的真实效果,避免出现“打哪指哪”,机器学习领域通常使用交叉验证(cross-validation)。即将数据集分成训练集和测试集,机器学习算法仅利用训练集中的数据进行训练,利用测试集评估算法的效果,不能把所有数据都用于训练。这种划分,一方面可以避免过拟合,另一方面能够真正判断出模型是不是建得好。例如,如果一位老师把考试题和作业题都给学生讲过,期末考试是不能考出学生的真实水平的。应该是老师只给学生讲作业题,期末考试用的题目和平时的作业题不一样,这样考试才能考出学生的水平。所以训练集对应的是平时的作业题,会提供正确答案,而测试集对应的是期末用来判定学生水平的考试题。

而在神经网络的设计过程中,除了需要用训练集通过训练确定神经网络的权重和偏置等参数,还需要确定一些与神经网络结构和训练相关的超参数(hyperparameter),例如神经网络的隐层层数、每个隐层的神经元个数、学习率的大小、神经网络训练的迭代次数等。如果使用测试集确定超参数是不合理的,可能会有过拟合测试数据的风险。因此常见的方法是将数据集划分为三个部分:训练集、验证集和测试集。利用训练集训练神经网络后,在验证集上评估网络的准确率,并用验证集选择合适的神经网络超参数。当数据集规模较大、数据划分后三部分的数据分布较为接近时,同一个神经网络在验证集和测试集上的评估结果较为相近,使用验证集可以在选择合适的神经网络超参数的同时避免在测试集上出现过拟合的问题。

做交叉验证时,划分训练集和测试集的最简单方法是随机分。如图2.24所示,浅色的是训练集,深色的是测试集。该方法的缺点是最终模型和参数很大程度上依赖于训练集和测试集的具体划分方式。如果数据集的规模较大,训练集和测试集基本可以满足样本间独立同分布,划分方式不会对神经网络的准确率造成较大的影响。但是当数据集规模较小时,划分方式不同可能会导致测出来的神经网络模型准确率波动很大。

图2.24 最简单的验证方式

为了减少准确率的波动,研究者提出了留一法(leave-one-out)交叉验证。如图2.25所示,对于一个包含 n 个数据的数据集 S ,每次取出一个数据作为测试集的唯一元素,剩下的 n -1个数据全部用于训练模型和调参。最后训练出 n 个模型,每个模型得到一个均方误差MSE i ,然后将这 n 个MSE i 取平均得到最终的测试结果。该方法的缺点是计算量过大,耗费时间长。

现在实际中常用的方法是 k -折( k -fold)交叉验证。例如,可以将整个数据集分成 k =10份,如图2.26所示,取第1份数据做测试集,取剩下的9份数据做训练集训练模型,之后计算该模型在测试集上的均方误差MSE 1 。接下来,取第2份数据做测试集,取剩下的9份数据做训练集训练模型,之后计算该模型在测试集上的均方误差MSE 2 。重复上述过程,可以测出10个均方误差,将10个均方误差取平均值得到最后的均方误差。 k -折交叉验证方法可以评估神经网络算法或者模型的泛化能力,看其是否在各种不同的应用上、各种不同的数据上都有比较稳定且可靠的效果。由于 k -折交叉验证方法只需要训练 k 个模型,相比留一法交叉验证,其计算量小,耗费时间短。

图2.25 留一法交叉验证

图2.26 k -折交叉验证

在目前的神经网络应用中,在图像分类、目标检测、机器翻译等大部分应用领域通常可以收集到较大规模的数据集,因此无须使用 k -折交叉验证。但在某些领域,如医学图像处理、遥感图像处理等,数据收集较为困难,依然需要使用 k -折交叉验证来评估模型的泛化能力,避免神经网络过拟合。 +qk1xeSoGhSsp5nyFRIYvWCJShaFPwNWNQNlD5Rhq/e2KHjL5cclNsNf4rX+LoPX

点击中间区域
呼出菜单
上一章
目录
下一章
×