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算法的工作原理:

假设我们有一个可以绘制如下所示的数据集:

Violate

现在,我们需要将新的数据点(黑色点,位于点60,60)分类为蓝色或红色类别。我们假设K=3,即它将找到三个最近的数据点。这在下图中显示:

Circle

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

Python实现

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

KNN作为分类器

首先,导入必要的Python包:

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

接下来,从其网络链接下载鸢尾花数据集,如下所示:

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()
序号 萼片长度 萼片宽度 花瓣长度 花瓣宽度 类别
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa

数据预处理将使用以下脚本行完成:

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

接下来,从其网络链接下载鸢尾花数据集,如下所示:

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算法还可以用于语音识别、手写识别、图像识别和视频识别等其他领域。

广告