![]() 介绍在我遇到的所有机器学习算法中,KNN是最容易上手的。尽管它很简单,但事实上它其实在某些任务中非常有效(正如你将在本文中看到的那样)。 甚至它可以做的更好?它可以用于分类和回归问题!然而,它其实更擅长用于分类问题。我很少看到KNN在任何回归任务上实现。我在这里的目的是说明并强调,当目标变量本质上是连续的时,KNN是如何有效的运作的。 ![]() 在本文中,我们将首先了解KNN算法背后的思维,研究计算点与点之间距离的不同方法,然后最终在Big Mart Sales数据集上用Python实现该算法。让我们动起来吧 1.用简单的例子来理解KNN背后的逻辑让我们从一个简单的例子开始。请考虑下表 - 它包含10人的身高,年龄和体重(目标)值。如你所见,缺少ID11的重量值。我们需要根据他们的身高和年龄来预测这个人的体重。 注意:此表中的数据不代表实际值。它仅用作一个例子来解释这个概念。 ![]() 为了更清楚地了解这一点,下面是上表中高度与年龄的关系图: ![]() 在上图中,y轴表示人的身高(以英尺为单位),x轴表示年龄(以年为单位)。这些点是根据ID值进行编号。黄点(ID 11)是我们的测试点。 如果我要求你根据图来确定ID11的重量,你的答案会是什么?你可能会说,因为ID11 更接近第 5点和第1点,所以它必须具有与这些ID类似的重量,可能在72-77千克之间(表中ID1和ID5的权重)。这实际上是有道理的,但你认为算法会如何预测这些值呢?让我们在下边进行试验讨论。 2. KNN算法是怎样工作的如上所述,KNN可用于分类和回归问题。该算法使用“ 特征相似性 ”来预测任何新数据点的值。这意味着新的点将根据其与训练集中的点的接近程度而进行分配。从我们的例子中,我们知道ID11的高度和年龄类似于ID1和ID5,因此重量也大致相同。 如果这是一个分类问题,我们会采用该模式作为最终预测。在这种情况下,我们有两个重量值--72和77.猜猜最终值是如何计算的?是取两个重量的平均值来作为最终的预测值。 以下是该算法的逐步说明:
![]()
![]()
在接下来的几节中,我们将详细讨论这三个步骤中的每一个。 3.点与点之间距离的计算方法所述第一步骤是计算新点和每个训练点之间的距离。计算该距离有多种方法,其中最常见的方法是 - 欧几里德,曼哈顿(用于连续)和汉明距离(用于分类)。
![]()
![]() 一旦一个新的观测值与我们训练集中的点之间的距离被测量出来,下一步就是要选择最近的点。要考虑的点的数量由k的值定义。 4.如何选择k因子第二个步骤是选择k值。这决定了我们在为任何新的观察值赋值时所要考虑到的邻居的数量。 在我们的示例中,k值 = 3,最近的点是ID1,ID5和ID6。 ![]() ![]() ID11的重量预测将是: ID11 =(77 + 72 + 60)/ 3 如果k的值 = 5的话,那么距离最近的点将是ID1,ID4,ID5,ID6,ID10。 ![]() ![]() 那么ID11的预测将是: ID 11 =(77 + 59 + 72 + 60 + 58)/ 5 我们注意到,基于k值,最终结果将趋于变化。那我们怎样才能找出k的最优值呢?让我们根据我们的训练集和验证集的误差计算来决定它(毕竟,最小化误差是我们的最终目标!)。 请看下面的图表,了解不同k值的训练误差和验证误差。 ![]() ![]() 对于非常低的k值(假设k = 1),模型过度拟合训练数据,这导致验证集上的高错误率。另一方面,对于k的高值,该模型在训练集和验证集上都表现不佳。如果仔细观察,验证误差曲线在k = 9的值处达到最小值。那么该k值就是是模型的最佳K值(对于不同的数据集,它将有所不同)。该曲线称为“ 肘形曲线 ”(因为它具有类似肘部的形状),通常用于确定k值。 你还可以使用网格搜索技术来查找最佳k值。我们将在下一节中实现这一点。 5.处理数据集(Python代码)到目前为止,你应该清楚的了解这个算法。我们现在将继续在数据集上实现该算法。我使用Big Mart销售数据集来进行代码实现,你可以从此链接下载它,邀请码为b543。 1.阅读文件 import pandas as pd 2.计算缺失值 df.isnull().sum() 3.处理分类变量并删除id列 df.drop(['Item_Identifier', 'Outlet_Identifier'], axis=1, inplace=True) 4.创建训练集和测试集 from sklearn.model_selection import train_test_split 5.预处理 - 扩展功能 from sklearn.preprocessing import MinMaxScaler 6.查看不同K值的错误率 #导入所需要的包 输出: RMSE value for k = 1 is: 1579.8352322344945 #根据K值绘制RMSE值 ![]() 正如我们所讨论的,当我们取k = 1时,我们得到一个非常高的RMSE值。随着我们增加k值,RMSE值不断减小。在k = 7时,RMSE约为1219.06,并且随着K值在进一步增加,RMSE值会迅速上升。我们可以有把握地说,在这种情况下,k = 7会给我们带来最好的结果。 这些是使用我们的训练数据集进行的预测。现在让我们预测测试数据集的值并进行提交。 7.对测试数据集的预测 #阅读测试和提交文件 在提交此文件后,我得到的RMSE为1279.5159651297。 8.实现GridsearchCV 为了确定k的值,每次绘制肘部曲线是一个繁琐且繁琐的过程。你只需使用gridsearch即可简单的找到最佳值。 from sklearn.model_selection import GridSearchCV 输出: {'n_neighbors': 7} 6.结束语和其他资源在本文中,我们介绍了KNN算法的工作原理及其在Python中的实现。它是最基本但最有效的机器学习技术之一。并且在本文中,我们是直接调用了Sklearn库中的KNN模型,如果你想更仔细的研究一下KNN的话,我建议你可以手敲一下有关KNN的源代码。 本文作者介绍了如何使用KNN算法去进行完成回归任务,大家如果感兴趣的话,可以跟着本文敲一遍代码,进行练习,毕竟看10篇文章也不如去敲一遍代码,毕竟看文章看看也就过去了,如果敲一遍代码的话,就会加深自己的印象,如果想深入的去了解KNN算法的话,可以自己去研究一下KNN的源代码,然后敲一遍,我们后边也会放出有关KNN源代码的文章,当然其他算法的文章我们也会发布,请大家到时候多多捧场。 A Practical Introduction to K-Nearest Neighbors Algorithm for Regression (with Python code) |
|
来自: CDA数据分析师 > 《职场攻略·人能生规划·生活百态》