K近邻(KNN)是一种最经典和简单的有监督学习方法,主要用于解决分类和回归问题,当对数据的分布只有很少或者没有任何先验的知识时,K近邻算法是一个不错的选择。
![211ef044ff7e385efb7ebfd57a225fb8.png](https://i-blog.csdnimg.cn/blog_migrate/95779d5b5aaef75b2c3dc870eff944d6.jpeg)
我首先通过上图来直观理解K近邻的原理,假设我们的数据样本分为A类和B类,现在给定一个要预测的样本五角星属于A类还是B类。
如果k=3时,我们先寻找距离五角星最近的3个样本,发现其中有1个属于A类,2个属于B类,B类多于A类,因此K近邻算法认为五角星属于B类。
如果k=6时,我们先寻找距离五角星最近的6个样本,发现其中有4个属于A类,2个属于B类,A类多于B类,因此K近邻算法认为五角星属于A类。
从上面我们可以看出,k值的选择不同,样本被预测的结果有可能会不同。到这里有一个问题要提出,如何计算点与点之间的距离?
![535989222afacfe02b1d971f9f20d122.png](https://i-blog.csdnimg.cn/blog_migrate/f416da7d8324edbb77edfdaf7f8d6feb.jpeg)
常用的距离计算方法还有:
- Hamming Distance 汉明距离
- Manhattan Distance 曼哈顿距离
- Minkowski Distance 闵氏距离
接下来我们再看一个例子:假设您想将灰点分类为一个类。在这里,有三种可能的颜色——石灰绿、绿色和橙色。
![5a681f8a0a52102eb4965a1f0344f144.png](https://i-blog.csdnimg.cn/blog_migrate/abc25864aaffb81502150780e234bb62.jpeg)
首先计算灰点和所有其他点之间的距离。
![4f5b497a89ec272eac9a339f7850e482.png](https://i-blog.csdnimg.cn/blog_migrate/b12319e7f9c599a095c3c59589225ef3.jpeg)
接下来,通过增加距离来排序点来找到最近的邻居。灰点的近邻(NNs)是数据空间中最接近的。
![33607cd7d4139bd2cb0e82268addd0e6.png](https://i-blog.csdnimg.cn/blog_migrate/ca23417294775a17719b8d2adacebbf4.jpeg)
根据k个最邻近的类对预测的类标签进行投票。在这里,标签是根据k=4最近邻预测的。因为橙色的票数最多,所以灰色被预测划分为橙色这一类。
![ff66c6285a079e3584051ad0c956b00e.png](https://i-blog.csdnimg.cn/blog_migrate/a6dc039dbc819fad6a617ab3a1fcff3a.jpeg)
到这里,我们可以来一个总结K近邻算法的详细流程:
- 确定k的大小和距离计算的方法。
- 从训练样本中得到k个与测试样本最相近的样本。
- 根据k个最相似训练样本的类别,通过投票的方式来确定测试样本的类别。
讲了那么多,是时候动手撸代码了,接下来是用sklearn实现K近邻的过程:
案例:一家汽车公司刚刚推出了他们新型的豪华SUV,我们尝试预测哪些用户会购买这种全新SUV。数据集是从某社交网络中收集的用户信息。这些信息涉及用户ID、性别、年龄以及预估薪资,最后一列用来表示用户是否购买。我们将建立一种模型来预测用户是否购买这种SUV,该模型基于两个变量,分别是年龄和预计薪资。我们尝试寻找用户年龄与预估薪资之间的某种相关性,以及他们是否有购买SUV的决定。
1、导入常用相关库。
![0f37831e26f60a50a086e5179d609755.png](https://i-blog.csdnimg.cn/blog_migrate/b6a0b509a49ae7f59196a218bffba2d0.jpeg)
2、导入数据集。
![96afb8cad4434fdadef891d90da54d25.png](https://i-blog.csdnimg.cn/blog_migrate/4b7c47b1f2f01d4606d095e5001d98c5.jpeg)
3、将数据集划分成为训练集和测试集。
![77475c5802877e9ff69062a6b1e22192.png](https://i-blog.csdnimg.cn/blog_migrate/d106908e6a8173624362c75539e0ddb3.jpeg)
4、数据标准化。
![4383cc7d0ff82d09d1f21288b6a68fd3.png](https://i-blog.csdnimg.cn/blog_migrate/33abafa6103cd63dacab4b4b650b5b8c.jpeg)
补充说明,上面的fit_transform、transform处理结果都一样,只是第一个用于训练集,第二个用于测试集,具体的区别可以去这看 看https://www.cnblogs.com/keye/p/8875128.html。
5、使用K-NN对训练集数据进行训练。
![6a60dee368e6796693a64c00ef8263ec.png](https://i-blog.csdnimg.cn/blog_migrate/af30ec501eb58e55633922a2ce630a43.jpeg)
补充说明,上面的参数metric就是用来进行距离度量的,其中传递的是默认参数minkowski(闵可夫斯基距离),闵可夫斯基距离可以根据一些参数变化从而变成其他距离度量算法, 例如p=1为曼哈顿距离, p=2为欧式距离。更为具体的介绍可以去这里看看https://www.cnblogs.com/pinard/p/6065607.html。
6、对测试集进行预测。
![55b021382146a7152b202c027d6e8e45.png](https://i-blog.csdnimg.cn/blog_migrate/9184098874c6b24e3ad440fc1aa21372.jpeg)
7、生成混淆矩阵。
在评估预测阶段,监督学习可用混淆矩阵(confusion matrix)作为精度评价与可视化工具,而非监督学习则用匹配矩阵(matching matrix)。因为我们这的数据有标签0或1,所以是监督学习,所以用混淆矩阵。
![1188106c30f06eb319ff67789642a3f3.png](https://i-blog.csdnimg.cn/blog_migrate/315ddea989babee11c828defdbdb2f20.jpeg)
8、分析混淆矩阵结果。
![fdad4b0683d91e862ddb45f0026fe905.png](https://i-blog.csdnimg.cn/blog_migrate/08ce3ea627760662d50b95f9857ecc1b.jpeg)
从图中我们可以看出:
- 标签 0 的总数为:64 + 4 = 68 个,其中有 64 个被正确预测,有 4 个被错误的预测成 1 标签。
- 标签 1 的总数为:3 + 29 = 32 个,其中有 29 个被正确预测,有 3 个被错误的预测成 0 标签。
到这里就结束了。