上一个部分,讲到最终我们要选择的模型应该是泛化误差最小的。那这部分,我们来进一步学习Min(泛化误差)这件事。
首先,我们来看这样一个思维导图。针对机器学习的数据,我们可以把他们分为三大类:训练集(Training),验证集(Validation),测试集(Testing)。我们之前说过,测试集是用来衡量泛化误差的,所以在这里我们都是围绕着测试集做文章。在这里我们需要知道:用测试集近似衡量泛化误差的假设;如何获得测试集;有哪些可选的评估指标;获得评估指标数据后如何进行比较;拆解泛化误差。
一个暗含的假设:
当我们要通过测试集来评估模型好坏时,其实就已经暗含了一个基本假设:测试样本也是从样本真实分布中独立同分布采样获得的。我们用测试集上的“测试误差”,来对总泛化误差进行近似。
那测试集的数据该如何获得呢?
如何得到测试集:
方法一:留出法(hold0out)
这是个最基本,最直接的方法,直接把已有的数据集合划分为两部分,一个训练用,一个测试用。如果使用这种方法,要尽可能保持数据分布的一致性,比如可以使用分层抽样的方法来抽取数据。这就像切蛋糕一样,如果有两个樱桃,讲究的切法就是一边一个。
方法二:交叉验证法(Cross Validation)
这是一个非常常用的方法。首先把数据分为k份,然后每次用k-1份的数据作为训练数据,剩下的一份数据作为测试数据。最终把平均值作为返回的结果。
方法三:自助法(Bootstrapping)
在所有数据中,每次都是随机抽取一个数据,然后再把它放回到数据集里面继续随机抽,即该数据在下次采样时依然有可能被抽到。当我们重复这个动作一定次数以后,题目就得到了样本数据。
这种方法在数据较少,难以有效划分训练集和测试集时会很有用,而且能从初始数据集中产生很多个训练集,对集成学习方法很好。这种方法的缺点是:产生的数据集改变了原始数据的分布(人为加大了已被抽中数据的出现概率)。所以在数据足够的情况下,用留出法和交叉验证法会更常见,也更好。
关于参数与调参:
机器学习一般有两类参数:一种是算法的参数,叫做超参数;另一种就是模型的参数。
对于原始数据的处理,可以参照以下图片。训练数据用来训练模型,验证数据用来调参和选择模型。最后测试数据负责检验泛化误差。
在此,必须再次强调一下:不要用测试数据去训练,也不要用测试数据去调参!