机器学习数据集划分及交叉验证的选择

机器学习中数据集划分是很重要的。

样本数(实例数)较大时采取下面的策略:

如果给定的样本充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分为训练集(training set)、验证集(validation set)和测试集(testing set)。训练集用来训练模型,验证集用于模型的选择,而测试集用于最终对学习方法评估。在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型进行选择也是有效的。

Training set与Validation set都是在模型的training过程中使用的:

testing sets只用来测试模型,来看这个模型究竟有多好,就是评价这个模型的泛化能力(generalization)。 这时候,这个model在testing sets上得到的accuracy就是一个很有代表性(representative)的accuracy,以后再在新的数据集上测试时,也跑不离这个精度的范围。

实际使用时,我们通过训练集学习到参数,再计算交叉验证集上的error,再选择一个在验证集上error最小的模型,最后再在测试集上估计模型的泛化误差。

样本数目较少时采用交叉验证(cross-validation)

k-fold cross validation的目的不是为了选择模型,而是先是有了一个模型,对这个模型进行精度评定。

方法:

交叉验证法”(cross validation)先将数据集 DD划分为k个大小相近的互斥子集,即D=D1∪D2∪...∪Dk,Di∩Dj=∅D=D1∪D2∪...∪Dk,Di∩Dj=∅. 每个子集 DiDi都尽可能保持数据分布的一致性,即从DD中通过分层采样得到。然后,每次用k−1k−1个子集的并集作为训练集,余下的那个子集则作为测试集;这样就可以得到kk组训练/测试集,从而可进行kk组训练和测试,最终返回的是这kk个测试结果的均值。显然,交叉验证评估结果的稳定性和保真性在很大程度上取决于kk的取值,为了强调这一点,通常把交叉验证法称为“kk折交叉验证”(k-fold cross validation)。kk最常用的取值是10,此时称为10折交叉验证。
将数据集DD划分为kk个子集存在多种划分方式。为减小因样本划分不同而引入的差别,kk折交叉验证通常要随机使用不同的划分重复pp次,最终的评估结果是这pp次kk折交叉验证结果的均值,例如常见的有“10次10折交叉验证”(10次10折交叉验证,进行了100次训练/测试)。
假定数据集DD中包含mm个样本,若令k=mk=m,则得到了交叉验证法的一个特例:留一法(Leave-One-Out,简称LOO)。显然,留一法不受随机样本划分方式的影响,因为mm个样本只有唯一的方式划分为mm个子集——每个子集包含一个样本;留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用DD训练出的模型很相似。因此,留一法的评估结果往往被认为比较准确。然而,留一法也有其缺陷:在数据集比较大时,训练mm个模型的计算开销可能是非常巨大的(例如数据集包含100万个样本,则需训练100万个模型),而这还是在未考虑算法调参的情况下,另外,留一法的评估结果也未必比其他评估方法准确;“没有免费的午餐”定理对实验评估同样适用。

——周志华《机器学习》

看这下面这个表中的数据集,实例最多只有200,因此采用交叉验证。

作者采用的是基于变体KNN的LOOCV(留一法)交叉验证,可以看到耗时很长。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注