一.KNN算法概述
KNN可以说是最简单的分类算法之一,同时,它也是最常用的分类算法之一,注意KNN算法是有监督学习中的分类算法,它看起来和另一个机器学习算法Kmeans有点像(Kmeans是无监督学习算法),但却是有本质区别的。
二.KNN算法介绍
KNN的全称是K Nearest Neighbors,意思是K个最近的邻居。K个最近邻居,其中K的取值是至关重要的。KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。
1.距离计算
要度量空间中点距离的话,有好几种度量方式,比如常见的曼哈顿距离计算,欧式距离计算等等。不过通常KNN算法中使用的是欧式距离,这里只是简单说一下,拿二维平面为例,,二维空间两个点的欧式距离计算公式如下:
其实就是计算(x1,y1)和(x2,y2)的距离,拓展到多维空间,则公式变成这样:
d(x,y)=
2. K值选择
通过交叉验证(将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如6:4拆分出部分训练数据和验证数据),从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。
通过交叉验证计算方差后你大致会得到下面这样的图:
三.KNN特点
KNN是一种非参的,惰性的算法模型。什么是非参,什么是惰性呢?
非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归(我们总会假设线性回归是一条直线)。也就是说KNN建立的模型结构是根据数据来决定的,这也比较符合现实的情况,毕竟在现实中的情况往往与理论上的假设是不相符的。
惰性又是什么意思呢?想想看,同样是分类算法,逻辑回归需要先对数据进行大量训练(tranning),最后才会得到一个算法模型。而KNN算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。
KNN算法的优势和劣势
KNN算法优点
1、简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
2、模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
3、预测效果好。
4、对异常值不敏感
KNN算法缺点
1、对内存要求较高,因为该算法存储了所有训练数据
2、预测阶段可能很慢
3、对不相关的功能和数据规模敏感
三、KNN算法实现鸢尾花的分类
1.加载、查看鸢尾花数据集
首先,你需要导入所需的库,如numpy、pandas和sklearn。然后,使用sklearn库中的load_iris函数加载鸢尾花数据集,并使用pandas库将其转换为DataFrame格式。最后,使用head()函数查看数据集的前几行。
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
# 加载、查看鸢尾花数据集
iris = load_iris()
df = pd.DataFrame(data= np.c_[iris['data'], iris['target']], columns= iris['feature_names'] + ['target'])
print(df.head())
输出结果:
2.使用matplotlib对鸢尾花数据集进行可视化
导入matplotlib库,并使用scatter函数绘制散点图来可视化鸢尾花数据集。你可以根据不同的特征来绘制不同的图形,比如以花瓣长度和宽度为坐标轴。
# 使用matplotlib对鸢尾花数据集进行可视化
plt.scatter(df['sepal length (cm)'], df['sepal width (cm)'], c=df['target'])
plt.xlabel('sepal length (cm)')
plt.ylabel('sepal width (cm)')
plt.show()
输出结果:
3.将数据集拆分为训练集和测试集
使用sklearn库中的train_test_split函数将数据集拆分为训练集和测试集。你可以指定拆分比例,比如80%的数据用于训练,20%的数据用于测试
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris['data'], iris['target'], test_size=0.2, random_state=42)
print(X_train.shape, X_test.shape)
输出结果:
4.构建K-NN模型,评估并预测
导入sklearn库中的KNeighborsClassifier类,并创建一个K-NN模型对象。使用fit函数将训练集数据和对应的标签传入模型进行训练。然后,使用predict函数对测试集进行预测,并使用sklearn库中的accuracy_score函数计算预测准确率。
# 构建K-NN模型,评估并预测
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("预测准确率:", accuracy)
输出结果: