在Python中构建和改进K近邻算法!

K近邻算法,简称K-NN,是一种经典的机器学习工作算法,在进行深度学习的时候经常被忽略。在本教程中,我们将在Scikit-Learn中构建一个K-NN算法,并在MNIST数据集上运行它。在此基础上,我们将建立自己的K-NN算法,希望能够开发出比Scikit-Learn K-NN更好的分类精度和分类速度。

现在让我们一起开始这项旅程!

K-近邻分类模型

在Python中构建和改进K近邻算法!

K-最近邻算法是一种有监督的机器学习算法,其易于实现,并且具有进行可靠分类的能力。 K-NN最大的优点之一就是它是一种惰性学习方法。这意味着该模型不需要训练,并且可以对数据进行分类,而不像其他机器学习的兄弟姐妹,如SVM、回归和多层感知。

K-NN如何工作

为了对某个给定的数据点p进行分类,一个K-NN模型将首先使用一些距离度量将p与其数据库中可用的每个其他点进行比较。距离度量是诸如欧几里得距离之类的东西,一个简单的函数,它取两点,并返回这两点之间的距离。因此,可以假设它们之间距离较小的两个点,它们之间的距离就越接近于两个点。这是K-NN背后的核心思想。

这个过程将返回一个无序数组,其中数组中的每个条目都保持在模型数据库中,p和n个数据点之间的距离。所以返回的数组的大小为n。这就是K近邻进来的一部分:K是选择的一些任意值(通常3-11之间),它告诉模型在分类p时应该考虑多少最相似的点。然后模型将采用k个最相似的值,并使用投票技术来决定如何对p进行分类,如下图所示。

在Python中构建和改进K近邻算法!

图像中的K-NN模型的k值为3,而箭头指向中心的点为p,这是需要分类的点。正如你所看到的,圆圈中的三个点是最接近的3个点,或者是与p最接近的点。因此,使用简单的投票技术,p将被归类为“白色”,因为白色会构成k个最相似值中的大多数。

令人惊讶的是,这个简单的算法可以在某些情况下实现超人的结果,并且可以应用于各种各样的问题,我们将在接下来的讨论中看到。

在Scikit-Learn中实现K-NN算法以分类,并对MNIST图像进行分类

数据:

对于这个例子,我们将使用无处不在的MNIST数据集。 MNIST数据集是机器学习中最常用的数据集之一,因为它很容易实现,而且可以作为验证模型的可靠方法之一。

在Python中构建和改进K近邻算法!

MNIST是一组70,000个手写数字编号为0-9的数据集。没有两个手写数字是完全相同的,有些可能很难正确分类。 MNIST分类的人类基准准确率约为97.5%,因此我们的目标是打败它!

算法:

我们将使用Scikit-Learn Python库中的KNeighborsClassifier()来启动。这个函数需要很多参数,但在这个例子中我们只需要担心几个参数。具体来说,我们只会传递n_neighbors参数的值(这是k值)。权重参数给出了模型使用的投票系统的类型,其中默认值是一致的,这意味着在对p进行分类时k个点中的每一个都被相等地加权。算法参数也将保留为默认值,因为我们希望Scikit-Learn找到用于对MNIST数据本身进行分类的最佳算法。

下面,我嵌入了一个用Scikit-Learn构建K-NN分类器的Jupyter Notebook。

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

我们使用Scikit-Learn构建了一个非常简单的K近邻模型,该模型在MNIST数据集上表现不错。

那么分类这些点需要很长时间(两个数据集分别为8分钟和4分钟),具有讽刺意味的是,K-NN仍然是最快的分类方法之一。

建立更快的模型

大多数K-NN模型使用欧几里德距离或曼哈顿距离作为前往距离度量。这些指标非常简单,适用于各种各样的情况。

很少使用的一个距离度量是余弦相似度。余弦相似度通常不是最优的距离度量,因为它违反了三角不等式,并且不适用于负数据。但是,余弦相似性对于MNIST是完美的。它快速、简单,并且比MNIST上的其他距离度量准确度稍高。但要真正实现最佳性能,我们必须编写我们自己的K-NN模型。在我们自己制作K-NN模型之后,我们应该比Scikit-Learn模型获得更好的性能,并且可能是更好的准确性。让我们看看下面我们建立的自己的K-NN模型的笔记本。

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

在Python中构建和改进K近邻算法!

正如笔记本所示,我们自己制作的K-NN模型在分类速度(相当大的保证金)和准确性(一个数据集提高1%)方面都优于Scikit-Learn K-NN!现在,我们可以在实践中继续实施这个模型,因为现在已经开发了一个真正快速的算法。

结论

在以上繁琐的步骤中,我们学到了一些宝贵的经验教训。首先,我们了解了K-NN如何工作,以及如何轻松实施。但最重要的是,我们了解到始终要考虑你尝试解决的问题以及解决该问题的工具非常重要。有时候,最好花一些时间来试验。当然,在解决问题时,一定要建立你自己的模型。正如在笔记本中所证明的那样,它可以支付巨大的红利:我们的第二个专有模型使用了1.5-2倍的加速,节省了使用该模型的实体的很多时间。