三、KNN 的交叉验证

由于 KNN 算法本身具有动态调整的特点,需要不断调整测试集和训练集的比例才有较为良好的模型表现,所以交叉验证在 KNN 算法的应用过程中显得尤为重要。一般来讲,按比例的数据采样或多折交叉验证需要多次应用,相互印证。 在机器学习里,通常不能将全部数据用于训练模型,否则将没有数据集对该模型进行验证,从而难以评估模型的预测效果。为了解决这一问题,通常将数据集进行不同方法的分割,人为将整个数据集分为训练集(training set)和测试集(test set)两部分。我们将这种数据集分割组合进行算法模型评估的方法叫作交叉验证。示意图如下:



在实际应用中,有如下几种常用方法:
(一)The Validation Set Approach(验证集方法) 该方法是把整个数据集分成两部分,一部分用于训练,另一部分用于验证,分割时以比例进行调节。 同样以汽车分类为例,以不同的比例分割数据集,其错误率是不同的,如图 2-4-4 所示。



图 2-4-4 汽车分类案例不同比例分割的错误率

可以看到,在不同的划分方法下,错误率的变动是很大的。所以如果训练集和测试集的划分方法不够好,很有可能无法选择到最好的模型与参数。
(二)Cross-Validation(交叉验证法) 1. LOOCV LOOCV 方法即 leave-one-out cross-validation,或称为留一法。像 test set approach 一样,LOOCV 方法也包含将数据集分为训练集和测试集这一步骤。但是不同的是,现在只用一个数据作为测试集,其他数据都作为训练集,并将此步骤重复 n 次(n 为数据集的数据数量)。留一法的示意图如下所示:



假设现在有 n 个数据组成的数据集,那么 LOOCV 方法就是每次取出一个数据作为测试集的唯一元素,而其他 n -1个数据都作为训练集用于训练模型和调参。结果就是最终训练了 n 个模型,每次都能得到一个 MSE(均方误差)。而计算最终 test MSE 则就是将这 n 个 MSE取平均。 (适用于回归问题) (适用于分类问题, Err 是指分类错误的数量) 2. K-fold Cross Validation(K 折交叉验证) K折交叉验证的示意图如下所示:



K 折交叉验证与 LOOCV 的不同之处在于,每次测试集将不再只包含一个数据,而是多个,具体数目将根据 K 的选取决定。比如,如果 K=5,那么利用五折交叉验证的步骤就是: (1)将所有数据集分成 5 份。 (2)不重复地每次取其中一份做测试集,用其他 4 份做训练集训练模型,之后计算该模型在测试集上的 MSEi 。 (3)将 5 次的 MSEi 取平均得到最后的 MSEi 。 以 Orange 平台为例,有两个模块是被经常用于交叉验证的,说明如下: 1)数据采样器模块 数据采样器模块的名称为 Data Sampler,图标形式是 ,在这个模块中,采样类型被分为 4 种,其窗口如图 2-4-5 所示。 图 2-4-5 数据采样器模块窗口 ▶Fixed proportion of data:这是一种按固定比例将数据进行分割的方法,其数量可以按照比例条进行调节,一般按 6∶4 或 7∶3 的比例进行分割。 ▶ Fixed sample size:这是按照固定数量将数据集进行分割的方法,勾选 Sample with replacement 表示有放回的采样方式。 ▶ Cross validation:交叉验证,是常用的一种采样方式,是将数据集平均分为几折,然后取其中的一折作为测试集的验证方法。调节参数 Number of folds 表示分为几折,即几份;Selected fold 表示取那一份为测试集。 ▶ Bootstrap:是通过样本来估计总体的采样方法。 可选项 Replicable(deterministic)sampling 是可复制(确定性)采样,Stratify sample 是根据数据属性不同而采取的分层采样。 2)测试模块测试模块的名称是 Test and Score,其模块图形是 。在这一模块中,也有采用的参数调节选项,如图 2-4-6 所示。 ▶ Cross validation:交叉验证。 ▶ Random sampling:随机采样。其中,Repeat train/test 表示重复训练及测试的次数,Training set size 表示随机抽取的训练测试集的比例。



图 2-4-6 测试模块窗口

▶ Leave one out:表示留一法。 ▶ Test on train data:用训练数据测试。 ▶Test on test data:用测试数据测试,如数据已经被采样。