Python机器学习

KNN算法(邻近算法)

Python机器学习KNN算法(邻近算法)详细操作教程

简介

K近邻(KNN)算法是一种监督的ML算法,可用于分类以及回归预测问题。但是,它主要用于行业中的分类预测问题。以下两个属性将很好地定义KNN-
惰性学习算法-KNN是一种惰性学习算法,因为它没有专门的训练阶段,并且在分类时将所有数据用于训练。 非参数学习算法-KNN也是一种非参数学习算法,因为它不假定基础数据。

KNN算法的工作

K近邻算法(KNN)使用"特征相似度"来预测新数据点的值,这进一步意味着,将根据新数据点与训练集中各点的匹配程度为该新数据点分配一个值。我们可以通过以下步骤了解它的工作方式-
第1步-要实现任何算法,我们都需要数据集。因此,在KNN的第一步中,我们必须加载训练以及测试数据。
第2步-接下来,我们需要选择K的值,即最近的数据点。 K可以是任何整数。
第3步-对于测试数据中的每个点,请执行以下操作-
3.1-借助以下任意一种方法来计算测试数据与每一行训练数据之间的距离:欧几里得距离,曼哈顿距离或汉明距离。距离计算最常用的方法是欧几里得。 3.2-现在,基于距离值,将它们按升序排序。 3.3-接下来,它将从排序后的数组中选择前K行。 3.4-现在,它将基于这些行中最常见的类别为测试点分配一个类别。
第4步-结束

示例

以下是了解K概念和KNN算法工作原理的示例-
假设我们有一个数据集,可以绘制如下-
 K的概念
现在,我们需要将带有黑点(在点60,60处)的新数据点分类为蓝色或红色类。我们假设K = 3,即它将找到三个最近的数据点。下图显示了它-
 KNN算法
我们可以在上图中看到带有黑点的数据点的三个最近邻居。在这三个中,有两个属于红色等级,因此黑点也将被分配为红色等级。

Python的实现

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

KNN作为分类器

首先,从导入必要的python包开始-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
接下来,按如下方式从其Web链接下载虹膜数据集-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
接下来,我们需要按如下所示为数据集分配列名-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
现在,我们需要按如下方式将数据集读取到pandas数据框-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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
数据预处理将在以下脚本行的帮助下完成。
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values
接下来,我们将数据分为训练和测试拆分。以下代码会将数据集分为60%的训练数据和40%的测试数据-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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)
接下来,将按如下方式进行数据缩放-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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类的帮助下训练模型,如下所示-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 8)
classifier.fit(X_train, y_train)
最后,我们需要进行预测。可以在以下脚本的帮助下完成-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
y_pred = classifier.predict(X_test)
接下来,按如下所示打印结果-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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)

输出

# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
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包开始-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
import numpy as np
import pandas as pd
接下来,按如下方式从其Web链接下载虹膜数据集-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
path = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
接下来,我们需要按如下所示为数据集分配列名-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
headernames = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
现在,我们需要按如下方式将数据集读取到pandas数据框-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
data = pd.read_csv(url, names = headernames)
array = data.values
X = array[:,:2]
Y = array[:,2]
data.shape
output:(150, 5)
接下来,从 sklearn 导入 KNeighborsRegressor 以拟合模型-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors = 10)
knnr.fit(X, y)
最后,我们可以找到如下的MSE-
# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
print ("The MSE is:",format(np.power(y-knnr.predict(X),2).mean()))

输出

# Filename : example.py
# Copyright : 2020 By Lidihuo
# Author by : www.lidihuo.com
# Date : 2020-08-26
The MSE is: 0.12226666666666669

KNN的优缺点

专业人士

这是一种非常简单的算法,可以理解和解释。 这对于非线性数据非常有用,因为该算法中没有关于数据的假设。 这是一种通用算法,我们可以将其用于分类和回归。 它具有相对较高的准确性,但是有比KNN更好的监督学习模型。

缺点

这是一种计算上有点昂贵的算法,因为它存储了所有训练数据。 与其他监督学习算法相比,需要高存储容量。 大N时预测速度很慢。 它对数据规模以及不相关的功能非常敏感。

KNN的应用

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

银行系统

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

计算信用等级

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

投票

借助KNN算法,我们可以将潜在选民分为多个类别,例如"将投票","将不投票",可以使用KNN算法的其他领域是语音识别,手写检测,图像识别和视频识别。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4