KNN算法及基于该算法的回归和分类实践

说明

    前两天无意间翻到一篇文章:[1]Machine Learning: 十大机器学习算法 - 知乎,里面讲到了十种最基本的机器学习算法,粗略看了一遍,和我最近学习以及实践的内容很契合,文中所罗列的十种机器学习算法中,我目前已经完成了:线性回归[2]、支持向量机[3]、逻辑回归[4]、K-Means[5]四种,后续如果时间和精力允许的话,我打算把剩下的几种算法都尝试一遍。   乍一看,剩下的六个算法中,似乎KNN算法是最简单的,本文探讨和实践K最近邻(K-Nearest Neighbors, KNN)算法。

Blog

2024.10.30  博文第一次写作

目录

说明

目录

一、KNN算法概述

二、基于KNN算法的回归实践

2.1  数据集介绍

扫描二维码关注公众号,回复: 17479718 查看本文章

2.2  回归实践结果

2.3  本章小结

三、基于KNN算法的分类实践

3.1  数据集介绍

3.2  分类实践结果

3.3  本章小结

四、总结

五、参考资料

六、数据和代码


一、KNN算法概述

    KNN算法的概念并不抽象,原理也简单,仅凭文字描述我们其实就能理解这个算法是做什么的,以及如何实现。

    KNN算法既可以用来做回归,也可以用来做分类,其核心思想是

    对于回归:我们可以用与某个样本在特征空间中最相邻的K个样本的样本值均值(或加权均值)来预测该样本的样本值。

    对于分类:在特征空间中,如果某个样本的K个最相邻的样本中的大多数属于某个类别,那么我们认为该样本也属于这个类别。

   

    对这两段话做拆解(理解)

    拆解1,关于最相邻: 上面两段描述中,都涉及到最相邻这个词,这就要求我们计算待回归(或分类)样本与其它样本之间的距离。关于距离的计算,我们常用的有:欧式距离和曼哈顿距离。 举个例子,假设样本1的特征为:

                                                         (1-1)

    式中,n为样本特征数。同时,假设样本2的特征为:

                                                        (1-2)

    那么欧式距离和曼哈顿距离的分别为:

     (欧式距离)                           (1-3) 

      (曼哈顿距离)                                       (1-4)

    在后文的实践中,我将使用欧式距离来计算距离

    需要注意的是:为确保所有特征在计算距离时有相等的权重,我们一般要对样本特征进行预处理:归一化或者标准化。(在后文的实践中,我将直接通过除以各特征最大值的方法来实现归一化,读者也可以做其它的尝试,一般针对不同特性的特征,应该选取适当的归一化方法。)

    此外还需要注意的是:为了求得K个最相邻的样本,这要求我们计算待回归(或分类)样本与训练集中所有样本之间的距离,然后再排序,并进而得到K个最相近距离对应的样本。这也体现了KNN算法的缺点:计算复杂度高、空间复杂度高。

    拆解2,关于K的值。不难理解的是,和我们熟知的梯度下降法中的学习率一样,K值就是KNN算法里的超参数了,K值的选取会直接影响到回归或分类的效果。  一般来说,K值较小时,模型对训练数据的拟合程度较高,但可能容易受到噪声的影响,导致过拟合;K值较大时,模型对训练数据的拟合程度降低,但可能增加模型的泛化能力,减少过拟合的风险。 我看一些文章里说,该值一般不建议超过20,且应该随着训练集样本数量的增加而适当增大(不能超过训练集的样本数量)。

    关于K值的选择,除了比较直球地多次尝试然后选择一个比较合适的值外。一个推荐的方法是:交叉验证法。   所谓交叉验证法,就是把我们的数据集多次划分(为训练集和测试集),然后重复训练和测试,直到得到一个在多种划分下效果都比较好的K值。 【不过本文的实践中,我不会尝试该方法,我直接给出一个尝试过几次后还算比较合适的K值。读者可以基于所提供的代码,只需改变训练集和测试集的划分,即可自行实践交叉验证法】

    拆解3,关于KNN算法中的训练集和测试集。上面的拆解中聊到了KNN算法下的训练集和测试集。 其实从前面对KNN算法核心思想的介绍来看,KNN下并没有所谓的模型、也没有所谓的训练过程! KNN算法的实现过程就是,从测试集中拿出样本,然后与训练集的所有样本进行比较,随后进行回归或分类的预测处理。

   总结:基于KNN算法进行回归和分类的处理流程。

图1.1 基于KNN算法进行回归的处理流程

图1.2 基于KNN算法进行分类的处理流程

    在前文的基础上,我们可以实践KNN算法了。 为方便与之前的回归/分类文章([2]~[6])的对比。后文的实践中,采用的数据集分别是:UCI的Real Estate数据集[7](用于回归实践)和Iris数据集[8](用于分类实践)。读者可以从参考资料给链接中去网站里下载这两份数据集,同时我也将这两份数据集一并打包在了后文的代码链接中。

二、基于KNN算法的回归实践

2.1  数据集介绍

    该Real Estate数据集[7],一共有414个样本,每个样本有6个特征:交易日期、房屋年龄、离最近交通枢纽的距离、周边商场的数量、房屋的地理维度、地理经度,其样本值为房屋价格。 有关该数据集更细节的说明读者可以移步我之前的博文[2] 4.1节查看。

    本章的实践中,随机选择其中2/3的数据作为训练集,剩余1/3的数据作为测试集,来实践KNN算法的回归效果。

2.2  回归实践结果

    预设K值为10。得到的结果如下:

图2.1  测试样本真实值和预测值

图2.2  测试样本预测误差值&误差直方图

图2.3  测试样本集的均方误差值(多除以了2)

    上面所展示的结果其实和我在博文[2]中使用线性模型&梯度下降法求得的结果很接近。  结果符合预期。

2.3  本章小结

    本章基于KNN算法实践了对数据集[7]的回归,达到了预期的效果,验证了前述理论和所编代码的准确性。 读者可以基于本文提供的代码做更深的探讨(比如可以获取不同K值下的均方误差值曲线,从而挑选更合适的K值)。

三、基于KNN算法的分类实践

3.1  数据集介绍

    Iris数据集[8],一共有150个样本,分为三类,每类有50个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)。 有关该数据集更细节的说明读者可以移步我之前的博文[9] 2.1节查看。

    本章的实践中,随机选择其中2/3的数据作为训练集,剩余1/3的数据作为测试集,来实践KNN算法的分类效果。

3.2  分类实践结果

预设K值为5,得到的分类结果如下:

图3.1  测试集分类结果以及与样本真实类别的对比

图3.2  测试集分类准确率

    准确率还蛮高的,虽然略低于我在博文[4]、[6]中使用逻辑回归和Softmax回归的分类准确率(不过都没有用蒙特卡洛方法进行多次试验)。但KNN算法胜在原理简单、计算简单、编程也简单。

3.3  本章小结

    本章基于KNN算法实践了对数据集[8]的分类,达到了预期的效果,验证了前述理论和所编代码的准确性。 读者可以基于本文提供的代码做更深的探讨(比如可以获取不同K值下的分类准确率曲线,从而挑选更合适的K值)。

四、总结

    本文围绕KNN算法展开,首先对其实现原理和一些实现细节做了论述,随后基于该算法分别进行了回归和分类实践,实践结果都符合预期。KNN算法的优势是:原理简单,实现起来很容易,对特殊值不敏感,可以很方便处理复杂的非线性关系(因为其只关注特征空间内的欧式距离);不过其缺点也很显著:计算复杂度高、空间复杂度高(特别是训练集的样本数量大、特征数多时),此外需要选择合适的K值。

    本文的工作进一步丰富了专栏机器学习_墨@#≯的博客-CSDN博客的工具箱!为后续更复杂的深度学习等内容的理解和实践打下了基础。

五、参考资料

[1] Machine Learning: 十大机器学习算法 - 知乎

[2] 回归问题探讨与实践-CSDN博客

[3] SVM及其实践1 --- 概念、理论以及二分类实践-CSDN博客

[4] Logistic回归(分类)问题探讨与实践-CSDN博客

[5] (毫米波雷达数据处理中的)聚类算法(3)–K-means算法及其实践-CSDN博客

[6] Softmax回归 探讨与实践-CSDN博客

[7] Real Estate Valuation - UCI Machine Learning Repository

[8] Iris - UCI Machine Learning Repository

[9] (毫米波雷达数据处理中的)聚类算法(2) – DBSCAN算法及其实践-CSDN博客

六、数据和代码

KNN算法及基于该算法的回归和分类实践博文对应的数据和代码资源-CSDN文库

猜你喜欢

转载自blog.csdn.net/xhblair/article/details/143366571