1. 首页
  2. 机器学习

用Python开发k最近邻

在本教程中,您将学习k最近邻居算法, 包括它的工作方式以及如何在Python中(没有库)从头开始实现它。

一种简单但功能强大的预测方法是对新数据使用最相似的历史示例。这是k最近邻居算法背后的原理。

完成本教程后,您将知道:

  • 如何逐步编码k最近邻算法。
  • 如何在真实数据集上评估k最近邻。
  • 如何使用k最近邻居对新数据进行预测。
  • 从头开始使用Python开发k最近邻

k最近邻居

k最近邻算法(简称KNN)是一种非常简单的技术。

整个训练数据集将被存储。当需要预测时,然后找到与训练数据集中的新记录最相似的k条记录。从这些邻居中,进行了汇总的预测。

记录之间的相似性可以用许多不同的方法来衡量。可以使用问题或特定于数据的方法。通常,使用表格数据时,一个好的起点是欧几里得距离。

一旦发现邻居,就可以通过返回最常见的结果或取平均值来进行汇总预测。这样,KNN可以用于分类或回归问题。

除了拥有整个训练数据集之外,没有其他可说的模型。因为直到需要预测才进行任何工作,所以KNN通常被称为惰性学习方法。

鸢尾花种类数据集

在本教程中,我们将使用鸢尾花种类数据集。

鸢尾花数据集涉及在给定鸢尾花的测量值的情况下预测花的种类。

这是一个多类分类问题。每个类别的观察次数是平衡的。有150个观测值,其中包含4个输入变量和1个输出变量。变量名称如下:

  • 萼片长度,以厘米为单位。
  • 萼片宽度,以厘米为单位。
  • 花瓣长度,以厘米为单位。
  • 花瓣宽度,以厘米为单位。
  • 班级

下面列出了前5行的示例。

该问题的基准性能约为33%。

下载数据集,并使用文件名“ iris.csv ”将其保存到当前工作目录中。

k最近邻居(只需3个简单步骤)

首先,我们将在本节中开发算法的每一部分,然后在下一节中将所有元素绑定到一个适用于实际数据集的有效实现中。

此k-Nearest Neighbors教程分为3部分:

  • 步骤1:计算欧几里得距离。
  • 步骤2:取得最近的邻居。
  • 步骤3:做出预测。

这些步骤将教您实现k-最近邻居算法并将其应用于分类和回归预测建模问题的基础知识。

注意:本教程假定您正在使用Python3。如果需要安装Python的帮助,请参阅本教程:

  • 如何为机器学习设置Python环境

我相信本教程中的代码也可以与Python 2.7一起使用,而无需进行任何更改。

步骤1:计算欧几里得距离

第一步是计算数据集中两行之间的距离。

数据行主要由数字组成,计算两行或数字向量之间的距离的一种简便方法是绘制一条直线。这在2D或3D中是有意义的,并且可以很好地缩放到更高的尺寸。

我们可以使用欧几里得距离度量来计算两个向量之间的直线距离。它被计算为两个向量之间的平方差之和的平方根。

  • 欧几里德距离= sqrt(总和i至N(x1_i – x2_i)^ 2)

其中x1是数据的第一行,x2是数据的第二行,i是当我们跨所有列求和时对特定列的索引。

对于欧几里得距离,值越小,两条记录将越相似。值为0表示两个记录之间没有差异。

下面是一个名为euclidean_distance()的函数,该函数在Python中实现。

您可以看到该函数假定每行的最后一列是一个输出值,该值将从距离计算中忽略。

我们可以使用一个小的人为分类数据集来测试该距离函数。在构造KNN算法所需的元素时,我们将使用该数据集几次。

以下是使用不同颜色的数据集图,以显示每个点的不同类别。

用于测试KNN算法的小型人为数据集的散点图

用于测试KNN算法的小型人为数据集的散点图

放在一起,我们可以写一个小例子来测试我们的距离函数,方法是打印第一行和所有其他行之间的距离。我们希望第一行与其自身之间的距离为0,这是一件好事。

下面列出了完整的示例。

运行此示例将打印数据集中第一行与每一行之间的距离,包括其自身。

现在是时候使用距离计算来定位数据集中的邻居了。

步骤2:取得最近的邻居

数据集中新数据的邻居是k个最接近的实例,这由我们的距离度量定义。

为了在数据集中找到新数据的邻居,我们必须首先计算数据集中每个记录到新数据之间的距离。我们可以使用上面准备的距离函数来做到这一点。

一旦计算出距离,我们就必须根据它们与新数据的距离对训练数据集中的所有记录进行排序。然后,我们可以选择顶部k作为最相似的邻居返回。

我们可以通过以元组的形式跟踪数据集中每个记录的距离,通过距离(按降序)对元组列表进行排序,然后检索邻居来做到这一点。

下面是一个名为get_neighbors()的函数,用于实现此功能。

您可以看到,在上一步中开发的euclidean_distance()函数用于计算每个train_row与新的test_row之间的距离。

在使用自定义键的情况下,对train_row和distance元组的列表进行排序,以确保在排序操作中使用了元组中的第二项(tup [1])。

最后,列表num_neighbors最相似的邻居test_row返回。

我们可以使用上一节中准备的小型人为数据集来测试此功能。

下面列出了完整的示例。

运行此示例将按相似性顺序将数据集中的3个最相似的记录打印到第一个记录。

不出所料,第一条记录与其本身最相似,并且位于列表的顶部。

现在我们知道了如何从数据集中获取邻居,我们可以使用它们进行预测。

步骤3:做出预测

从训练数据集中收集的最相似的邻居可以用来进行预测。

在分类的情况下,我们可以返回邻居中代表最多的类。

我们可以通过对来自邻居的输出值列表执行max()函数来实现此目的。给定在邻居中观察到的类值列表,max()函数采用一组唯一的类值,并为该集中的每个类值调用类值列表上的计数。

下面是实现此功能的名为predict_classification()的函数。

我们可以在上述人为设计的数据集上测试此功能。

以下是一个完整的示例。

运行此示例将打印预期的分类0和从数据集中3个最相似的邻居预测的实际分类。

我们可以想象到如何可以更改Forecast_classification()函数以计算结果值的平均值。

现在,我们拥有使用KNN进行预测的所有方法。让我们将其应用于真实数据集。

鸢尾花种类案例研究

本部分将KNN算法应用于鸢尾花数据集。

第一步是加载数据集,并将加载的数据转换为可用于平均值和标准偏差计算的数字。为此,我们将使用辅助函数load_csv()加载文件,使用str_column_to_float()将字符串数字转换为浮点数,并使用str_column_to_int()将类列转换为整数值。

我们将使用5倍的k倍交叉验证对算法进行评估。这意味着每个折叠中将有150/5 = 30个记录。我们将使用辅助函数validate_algorithm()来评估具有交叉验证的算法,并使用precision_metric()来计算预测的准确性。

开发了一个名为k_nearest_neighbors()的新函数来管理KNN算法的应用,首先从训练数据集中学习统计信息,然后使用它们为测试数据集做出预测。

下面列出了完整的示例。

运行示例将在每个交叉验证折叠上打印平均分类准确性得分以及平均准确性得分。

我们可以看到,平均准确度约为96.6%,远远高于基线准确度33%。

我们可以使用训练数据集为新的观测值(数据行)做出预测。

这涉及到调用predict_classification()函数,其中一行代表了我们用来预测类标签的新观察结果。

我们也可能想知道用于预测的类标签(字符串)。

我们可以更新str_column_to_int()函数以打印字符串类名称到整数的映射,以便我们可以解释模型所做的预测。

结合在一起,下面列出了将KNN与整个数据集结合使用并对新观测值进行单个预测的完整示例。

运行数据首先总结了类标签到整数的映射,然后将模型拟合到整个数据集。

然后定义一个新的观察值(在这种情况下,我从数据集中取了一行),并计算了一个预测标签。

在这种情况下,我们的观察预计属于第一类,我们知道这是“鸢尾花”。

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code