一、 概述
本报告在单一数据集上测试了 KNN 的 k 值,欧拉距离的使用与否,归一化数据与否对 KNN 算法结果的影响,测试数据来源于 UCI 机器学习数据集的 iris 数据集,由于数据量较少,采用交叉验证的方式(10-fold-cross validation),实验结果表明,在本数据集上使用欧拉距离,不进行特征归一化,在 k = sqrt(m)(m 为数据测试量)能取得最小的错误率,并对不同变量影响下的结果进行了分析。
二、 数据集分析
iris 数据集的中文名是安德森鸢尾花卉数据集,英文全称是 Anderson’s Iris dataset。iris 包含 150 个样本,对应数据集的每行数据。每行数据包含每个样本的四个特征和样本的类别信息,一共分为三类:
虽然是四维数据,但其属性主要分为两类:sepal 的长宽, petal 的长宽,首先分别根据其绘制散点图进行分析:
图中可以看出红色点代表的 Setosa 类与其他两类区分交大,而蓝绿点在 sepal属性上有所混叠,可以尝试使用 KNN 算法。
三、 测试准备
由于数据量较小采用 10-fold-crossvalidation 的方法进行测试分析,误差测度采用分类错误率。
机器学习实战的代码中并没有用欧拉距离赋权,对其 classify0 代码稍作修改,
添加 ifuseED 0-1 变量控制赋权与否。
改变部分如下:
封装了 cross_validation 函数用于测试改变 k, fold 值(k-fold-cross validation),ifuseED,返回交叉验证的平均错误率,函数原型如下:
另外,设计的交叉验证算法每次根据顺序采样数据与测试集,为了增加实验结果的普遍性,每次单一测试前对数据集顺序进行打乱:
四、 实验结果与分析
首先,测试采用欧拉矩阵赋权与否根据 k 值对结果的影响,绘制结果图如下:
测试前查阅相关文献发现,一般 K 值的选取根据经验主义(empirically)可以选用数据量的开方,本数据采用 10-fold crossvalidation,总数据量 150,所以训练数据是 135,sqrt(135)=11.62,可以看出与实验结果较为符合,并且在本数据集上,不使用欧拉距离赋权在 26 之前错误率甚至优于使用欧拉赋权但随 k 值增大,错误率波动增大,而使用欧拉距离赋权的错误率随 k 增长趋于稳定。
同时测试了在本数据集上实现归一化数据与否对精确度的影响,两组测试都使用欧拉距离赋权:
在本数据集上,不归一化特征的错误率明显优于归一化后的,可能原因是几组数据处于一个量级,不会产生由于数据量级导致的偏差,并且归一化后影响了本身不同数据的权重。
五、 其他组测试图展示
为了保证实验结果的普遍性,每组测试对测试数据打乱再交叉验证,其他组的测试结果如下:
其结果与之前的实验分析较为一致