Machine Learning With Python 简明教程

KNN Algorithm - Finding Nearest Neighbors

Introduction

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

  1. Lazy learning algorithm - KNN 是一种延迟学习算法,因为它没有专门的训练阶段,并且在分类时使用所有数据进行训练。

  2. Non-parametric learning algorithm - KNN 也是一种非参数学习算法,因为它不会对基础数据做任何假设。

Working of KNN Algorithm

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

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

  2. Step 2 - 接下来,我们需要选择 K 的值,即最近的数据点。K可以是任何整数。

  3. Step 3 - 对于测试数据中的每个点,执行以下操作 - 3.1 - 利用以下方法之一:欧氏距离、曼哈顿距离或汉明距离计算测试数据与训练数据中的每一行之间的距离。计算距离的最常用方法是欧氏距离。 3.2 - 现在,根据距离值,按升序对其进行排序。 3.3 - 接下来,它将从已排序数组中选择前 K 行。 3.4 - 现在,它将根据这些行的最频繁类别为测试点分配一个类别。

  4. Step 4 − End

Example

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

假设我们有一个可以按如下方式绘制的数据集 −

violate

现在,我们需要将带黑点的新的数据点(在点 60,60)分类为蓝色或红色类别。我们假定 K = 3,即它会找到三个最邻近的数据点。它在下一张图中显示 −

circle

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

Implementation in Python

众所周知,K 近邻 (KNN) 算法既可以用于分类,也可以用于回归。以下是使用 Python 将 KNN 同时用作分类器和回归器的程序 −

KNN as Classifier

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

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

接下来,从其 Web 链接下载 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.

sepal-length

sepal-width

petal-length

petal-width

Class

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)

Output

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 as Regressor

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

import numpy as np
import pandas as pd

接下来,从其 Web 链接下载 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()))

Output

The MSE is: 0.12226666666666669

Pros and Cons of KNN

Pros

  1. 这是一个理解和解释非常简单的算法。

  2. 它对非线性数据非常有用,因为该算法中没有对数据进行假设。

  3. 它是一种多功能算法,因为我们可以将它用于分类和回归。

  4. 它具有相对较高的准确度,但与 KNN 相比,还有更好的监督学习模型。

Cons

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

  2. 与其他监督学习算法相比,需要较高的内存存储。

  3. 当 N 较大时,预测会很慢。

  4. 它对数据的规模和无关特征非常敏感。

Applications of KNN

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

Banking System

KNN 可用于银行系统预测某个人是否适合贷款审批?此人是否具有与违约者相似的特征?

Calculating Credit Ratings

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

Politics

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

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