模型参数分为训练参数和超参数,其中前者是在训练集上训练得到的,而后者是在训练之前由用户指定的,比如学习率、迭代次数等。
机器学习中,样本集通常会被划分为训练集、验证集和测试集,其中训练集和测试集一般是必须有的,验证集在很多情况下可以没有。
★训练集:用于训练模型的训练参数。
★测试集:用于检验已经训练好的最终模型的泛化性能(特别注意:经过测试集后,模型参数就不能再动了)。
对于一个训练好的模型,需要了解它的泛化性能,理想的的泛化性能评估应该在除原样本集之外的所有潜在样本上进行计算,但实际中没法得到这些潜在样本,于是退而求其次,在原样本集上划分出一个测试集作为替代,并将在该测试集上的泛化性能近似作为在所有潜在样本上的泛化性能。
注意:
(1)测试集中的样本与训练集、验证集不能有任何交集;
(2)测试集只能用于检验最终模型的泛化性能,不能用于更新模型参数。如果利用在测试集上得到的误差进一步训练模型,本质上是将测试集也作为训练集对待了,也就没有了测试集。
(3)理论上,如果最终模型在测试集上的表现非常差,则应该从样本数据量、样本分布、训练集和测试集划分情况、模型选择等一系列因素入手查找原因,而不是回去继续调整模型参数(虽然也有可能就是模型参数还不不够好)。
【值得注意的是,模型在测试集上的准确率不一定越高越好。如果样本集本身的分布存在局限性(无法有效表征所有潜在样本的基本特征),那么测试集的分布就更有局限性,此时测试集上的高准确率就意味着严重的过拟合,模型投入实际应用后准确率一定差。因此对于不太理想的样本集而言,测试集上的准确率相对低一些,模型的真正泛化性能反而更好。如果样本集的分布足够好,能足够表征所有潜在样本的特征,那么模型在测试集上的准确率越高越好。】
★验证集:用于检验模型的性能(这点和测试集相同),但可以根据检验结果反过来调整模型参数,主要是超参数(这点和测试集不同)。
验证集是训练集和测试集之间的一个中间件。根据前面的定义,我们发现了一个问题,如果只有训练集和测试集,是无法在测试集之前对模型进行评价的。实际上我们更希望在最终模型确定之前,可以先对模型进行一定的评价,然后根据评价结果调整模型参数(特别是超参数)后重新训练,直到我们认为模型已经不错了,最后再用测试集进行测试,测试就只为了查看模型的近似泛化性能,不再继续更新模型参数。正是为了这个目的,才划分出了一个验证集。可见,验证集一定程度上还是训练集,因为会根据验证集的结果调整模型参数。
有了验证集,整个过程就变成了下面这样:
(1)先确定一组超参数C0,然后在训练集上训练得到参数W0,再用验证集进行检验;
(2)如果效果不好,则继续调整超参数C1,重新在训练集上训练得到参数W1;
……
(3)如此循环n次,最终得到了一系列超参数和训练参数【(C0,W0),(C1,W01,……,(Cn,Wn)】;
(4)最后从中找出在验证集上表现最好的参数对(Cb,Wb),到这一步,我们已经基本找到了相对最优的超参数Cb;
(5)接下去可以直接将(Cb,Wb)作为最终模型参数;也可以利用超参数Cb在“训练集+验证集”上重新训练一遍,得到一个新的训练参数Wbb,此时(Cb,Wbb)就是最终模型参数;
(6)最后用测试集检验最终模型(Cb,Wb)或(Cb,Wbb)的泛化效果,好与不好都不再调整模型参数了。