KNN算法是一种常用的分类算法,它的主要思想是根据样本间的距离来进行分类。本次使用KNN算法对鸢尾花数据集进行分类。
鸢尾花数据集是机器学习领域中广泛使用的一个数据集,它包含三个品种的鸢尾花,分别是Setosa(山鸢尾)、Versicolor(杂色鸢尾)和Virginica(维吉尼亚鸢尾)。每个样本包含四个特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。在本文中,只使用前两个特征进行分类。
首先,加载鸢尾花数据集,并选取前两个特征作为输入数据:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# 加载数据集
iris = datasets.load_iris()
X = iris.data[:, :2] # 只选取前两个特征
y = iris.target
接下来,将数据集划分为训练集和测试集。使用sklearn库中的train_test_split
函数来实现自动划分训练集和测试集:
from sklearn.model_selection import train_test_split
# 自动划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
其中,test_size
表示测试集占总数据集的比例,random_state
为随机数种子,设置相同的随机数种子可以保证多次运行结果相同。
KNN算法的原理很简单,就是根据样本间的距离来进行分类。使用sklearn库中的KNeighborsClassifier
类来训练KNN模型:
from sklearn.neighbors import KNeighborsClassifier
# 训练KNN模型
k = 3
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
其中,k
表示KNN算法中的K值,n_neighbors
表示KNN算法中最近邻居的个数。
KNN模型训练完成后,使用该模型对训练集和测试集进行预测:
# 预测训练集和测试集
y_train_pred = knn.predict(X_train)
y_test_pred = knn.predict(X_test)
完成预测后,需要计算训练集和测试集的准确率:
from sklearn.metrics import accuracy_score
# 计算训练集和测试集准确率
train_acc = accuracy_score(y_train, y_train_pred)
test_acc = accuracy_score(y_test, y_test_pred)
print('训练集准确率: %.2f%%' %(train_acc*100))
print('测试集准确率: %.2f%%' %(test_acc*100))
其中,accuracy_score
函数用于计算准确率,y_train
和y_test
为真实标签,y_train_pred
和y_test_pred
为预测标签。
最后,使用matplotlib库绘制散点图来可视化分类结果:
# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('KNN classification (k=%i)' % k)
plt.show()
其中,X[:, 0]
和X[:, 1]
表示选取的两个特征,c=y
表示按照真实标签进行颜色分类,cmap=plt.cm.Paired
表示使用Paired颜色映射。
本次使用KNN算法对鸢尾花数据集进行了分类,实现了自动划分训练集和测试集、训练KNN模型、预测和计算准确率、可视化结果。KNN算法简单易懂,容易实现,但是当数据集较大时,计算距离的时间复杂度较高,需要选择合适的K值和距离计算方法来提高分类效果。