机器学习系列(五)——训练集、测试集、验证集与模型选择

在机器学习过程中,为了找到泛化性能最好的那个函数,我们需要确定两方面的参数:1、假设函数参数,也就是我们通常所说的 w w b b ,这类参数可以通过各种最优化算法自动求得。2、模型参数,比如多项式回归中的多项式次数,规则化参数 λ λ 等,这些参数被称为超参数,一般在模型训练之前通过手工指定(当然也可以采用网格法等算法进行寻优)。确定模型超参数的过程称为模型选择。

模型选择

借用吴恩达机器学习课程中的一页PPT,如下图:

机器学习系列(五)——训练集、测试集、验证集与模型选择_第1张图片

现在我们要确定多项式回归的次数 d d ,我们手工指定 d d 取值1到10,然后在训练集上训练模型,分别找出了最优参数 θ(1),θ(2),,θ(10) θ ( 1 ) , θ ( 2 ) , ⋯ , θ ( 10 ) ,接着在测试集上对模型性能进行评估,得到测试误差 Jtest(θ(1)),Jtest(θ(2)),,Jtest(θ(10)) J t e s t ( θ ( 1 ) ) , J t e s t ( θ ( 2 ) ) , ⋯ , J t e s t ( θ ( 10 ) ) ,选择测试误差最小的那个作为最优模型,假设我们选择了 d=5 d = 5 的那个模型 θ0+θ1x++θ5x5 θ 0 + θ 1 x + ⋯ + θ 5 x 5 。现在问题来了,我们要怎么去评价这个模型的泛化性能呢?仍然采用测试误差吗?如果我们采用测试误差作为度量,那我们是不是可以继续调整 d d 的取值呢,直至测试误差降到最低,但是此时的模型我们能相信吗?显然是不能相信的,因为我们已经提前窥见到了测试数据,我们的超参数都是围绕更好的拟合测试数据而设定的, Jtest(θ) J t e s t ( θ ) 因此很有可能是泛化误差的一个最优估计。问题就出在我们将测试数据多次使用,违背了测试数据仅仅只是用来评估最优函数的泛化性能的原则。
为了解决这个问题,我们在训练集中单独划分出一块,作为模型选择的依据,我们把这部分数据称为验证集,现在我们的数据集由之前的训练集和测试集两部分组成变成了训练集,验证集和测试集三部分组成。

机器学习系列(五)——训练集、测试集、验证集与模型选择_第2张图片

  • 训练集:用于训练模型,找出最佳的 w w b b
  • 验证集:用以确定模型超参数,选出最优模型。
  • 测试集:仅用于对训练好的最优函数进行性能评估。

训练集、验证集和测试集分工明确,各施其职,切不可互相取而代之。特别是不能混淆验证集和测试集,下面用一个表整理下两者的区别:

区别 验证集 测试集
作用 确定模型超参数 仅用于对训练好的最优函数进行性能评估
是否用于训练 否(在选出最优模型后,需要将验证集也放入训练集一起训练最优函数)
使用次数 多次使用,每次更新超参数后都要用验证集对模型性能进行验证 仅在最后使用一次

再强调一下:对最终学习得到的函数进行性能评估的数据叫作测试集,必须保证测试集完全独立,直到模型调整和参数训练全部完成前应该将测试集进行封存,以任何形式使用测试集中的信息都是一种窥探。
所以,此时机器学习的全过程如下:

  1. 确定模型的一组超参数
  2. 用训练集训练该模型,找到使损失函数最小的最优函数。
  3. 在验证集上对最优函数的性能进行度量。
  4. 重复1、2、3步,直到搜索完指定的超参数组合。
  5. 选择在验证集上误差最小的模型,并合并训练集和验证集作为整体训练模型,找到最优函数。
  6. 在测试集上对最优函数的泛化性能进行度量。

最后,我们都知道同一模型在不同训练集上学得的函数往往不同,那我们怎样保证选出的模型和函数就是最好的呢?而不是刚好符合当前数据划分的一个特例呢?可以采用交叉验证(Cross Validation)法,其基本思路如下:将训练集划分为K份,每次采用其中K-1份作为训练集,另外一份作为验证集,验证集上K次误差的平均作为该模型的误差。

机器学习系列(五)——训练集、测试集、验证集与模型选择_第3张图片

你可能感兴趣的:(机器学习)