KNN 算法 - 寻找最近邻居


介绍

K 最近邻 (KNN) 算法是一种监督机器学习算法,可用于分类和回归预测问题。然而,它主要用于工业中的分类预测问题。以下两个属性可以很好地定义 KNN -

  • 惰性学习算法- KNN 是一种惰性学习算法,因为它没有专门的训练阶段,并且在分类时使用所有数据进行训练。

  • 非参数学习算法- KNN 也是一种非参数学习算法,因为它不假设任何有关基础数据的信息。

KNN 算法的工作原理

K 最近邻 (KNN) 算法使用“特征相似性”来预测新数据点的值,这进一步意味着新数据点将根据其与训练集中的点的匹配程度来分配一个值。我们可以通过以下步骤来了解它的工作原理 -

  • 步骤 1 - 为了实现任何算法,我们需要数据集。因此,在 KNN 的第一步中,我们必须加载训练数据和测试数据。

  • 步骤 2 - 接下来,我们需要选择 K 的值,即最近的数据点。K可以是任意整数。

  • 步骤 3 - 对于测试数据中的每个点,执行以下操作 -

    3.1 - 借助以下任一方法计算测试数据与每行训练数据之间的距离:欧几里德距离、曼哈顿距离或汉明距离。最常用的计算距离的方法是欧几里得距离。

    3.2 - 现在,根据距离值,按升序对它们进行排序。

    3.3 - 接下来,它将从排序数组中选择前 K 行。

    3.4 - 现在,它将根据这些行中最常见的类别为测试点分配一个类别。

  • 步骤 4 - 结束

例子

以下是理解 K 概念和 KNN 算法工作原理的示例 -

假设我们有一个数据集,可以绘制如下 -

违反

现在,我们需要将带有黑点(点 60,60)的新数据点分类为蓝色或红色类。我们假设 K = 3,即它将找到三个最近的数据点。如下图所示 -

圆圈

我们可以在上图中看到数据点的三个最近邻居带有黑点。在这三个中,其中两个属于红色类别,因此黑点也将被分配为红色类别。

Python 中的实现

众所周知,K 最近邻(KNN)算法可用于分类和回归。以下是 Python 中使用 KNN 作为分类器和回归器的方法 -

KNN 作为分类器

首先,从导入必要的 python 包开始 -

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

接下来,从其网页链接下载 iris 数据集,如下所示 -

path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

接下来,我们需要为数据集指定列名称,如下所示 -

headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

现在,我们需要将数据集读取到 pandas 数据框,如下所示 -

dataset = pd.read_csv(path, names=headernames)
dataset.head()
slno。 萼片长度 萼片宽度 花瓣长度 花瓣宽度 班级
0 5.1 3.5 1.4 0.2 鸢尾
1 4.9 3.0 1.4 0.2 鸢尾
2 4.7 3.2 1.3 0.2 鸢尾
3 4.6 3.1 1.5 0.2 鸢尾
4 5.0 3.6 1.4 0.2 鸢尾

数据预处理将在以下脚本行的帮助下完成 -

X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values

接下来,我们将数据分为训练集和测试集。以下代码将数据集分为 60% 的训练数据和 40% 的测试数据 -

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40)

接下来,数据缩放将按如下方式完成 -

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

接下来,在 sklearn 的 KNeighborsClassifier 类的帮助下训练模型,如下所示 -

from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=8)
classifier.fit(X_train, y_train)

最后我们需要做出预测。可以借助以下脚本来完成 -

y_pred = classifier.predict(X_test)

接下来,打印结果如下 -

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

输出

Confusion Matrix:
[[21 0 0]
[ 0 16 0]
[ 0 7 16]]
Classification Report:
            precision      recall       f1-score       support
Iris-setosa       1.00        1.00         1.00          21
Iris-versicolor   0.70        1.00         0.82          16
Iris-virginica    1.00        0.70         0.82          23
micro avg         0.88        0.88         0.88          60
macro avg         0.90        0.90         0.88          60
weighted avg      0.92        0.88         0.88          60


Accuracy: 0.8833333333333333

KNN 作为回归器

首先,从导入必要的 Python 包开始 -

import numpy as np
import pandas as pd

接下来,从其网页链接下载 iris 数据集,如下所示 -

path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

接下来,我们需要为数据集指定列名称,如下所示 -

headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']

现在,我们需要将数据集读取到 pandas 数据框,如下所示 -

data = pd.read_csv(url, names=headernames)
array = data.values
X = array[:,:2]
Y = array[:,2]
data.shape

output:(150, 5)

接下来,从 sklearn 导入 KNeighborsRegressor 以拟合模型 -

from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors=10)
knnr.fit(X, y)

最后,我们可以找到 MSE 如下:

print ("The MSE is:",format(np.power(y-knnr.predict(X),2).mean()))

输出

The MSE is: 0.12226666666666669

KNN 的优点和缺点

优点

  • 这是一个非常容易理解和解释的算法。

  • 它对于非线性数据非常有用,因为该算法中没有关于数据的假设。

  • 它是一种通用算法,我们可以将其用于分类和回归。

  • 它具有相对较高的准确率,但有比 KNN 更好的监督学习模型。

缺点

  • 它在计算上是有点昂贵的算法,因为它存储了所有训练数据。

  • 与其他监督学习算法相比,需要高内存存储。

  • 当 N 很大时,预测会很慢。

  • 它对数据规模以及不相关的特征非常敏感。

KNN的应用

以下是 KNN 可以成功应用的一些领域 -

银行系统

KNN 可以在银行系统中使用来预测个人是否适合贷款审批?该人是否具有与违约者相似的特征?

计算信用评级

KNN 算法可用于通过与具有相似特征的人进行比较来查找个人的信用评级。

政治

借助 KNN 算法,我们可以将潜在选民分为不同类别,例如“将投票”、“不会投票”、“将投票给‘国会’政党、“将投票给‘印度人民党’政党。

KNN 算法可用于的其他领域包括语音识别、手写检测、图像识别和视频识别。