K-近邻算法的 sklearn 实现实验

本文最后更新于 2026年5月6日 下午

AI文章摘要
本文通过Python实现K近邻算法,对二手房数据分类预测。经模型训练与验证,确定最优k值,准确率达100%,并绘制分类边界图,直观展示分类效果。

实验目的与要求

  1. 掌握基于 K-近邻分类算法的编程方法
  2. 通过编程理解 K-近邻分类算法和该算法的基本步骤

实验器材

  1. 硬件:PC 机
  2. 软件环境:Python3.7 + Pycharm

实验内容

使用 sklearn 库中的 neighbors 模块实现 K-近邻算法,并对二手房样本所属类别进行预测,程序流程为:

  1. 导入 sklearn 库中的 K-近邻算法模块(KNeighborsClassifier),数据集分割模块(train_test_split)以及机器学习准确率评估模块(metrics)
  2. 读取数据,并分割成特征属性集和类别集
  3. 将数据集分割成训练集和测试集
  4. 构建模型
  5. 利用循环语句,k 值取 1-8 分别训练模型以确定最优 k 值
  6. 使用最优 k 值训练模型并对新样本[7,27]和[2,4]的类别进行预测
  7. 使用测试集对模型进行测试
  8. 预测新样本类别
  9. 绘制分类边界图

数据集下载

本实验的数据集可以点击此处去下载

代码实现

1
2
3
4
5
6
7
8
# coding = utf-8
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics #引入机器学习的准确率评估模
from sklearn.model_selection import train_test_split #数据分割模块
from sklearn.model_selection import cross_val_score #交叉验证模块
1
2
3
4
5
6
7
8
9
10
# 导入数据
X1,y1=[],[]
fr = open('./knn.txt')
for line in fr.readlines():
lineArr = line.strip().split()
X1.append([int(lineArr[0]),int(lineArr[1])])
y1.append(int(lineArr[2]))
X=np.array(X1) #转换成 NumPy 数组,X 是特征属性集
y=np.array(y1) #y 是类别标签集
X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.16)
1
2
3
4
5
6
7
8
# 测试准确率
k_range = range(1, 9)
k_error = [] #保存预测错误率
for k in k_range: #循环,k 取值为 1~8,查看 KNN 分类的预测准确率
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X, y, cv=3, scoring='accuracy')
#cv 参数决定数据集划分比例,这里是按照 5:1 划分训练集和测试集
k_error.append(1 - scores.mean()) #把每次的错误率添加到数组中
1
2
3
4
5
6
k_error.pop(0)
k_min = min(k_error)
k = k_error.index(k_min)
# 定义模型并训练
knn=KNeighborsClassifier(k + 2)
knn.fit(X,y)
1
KNeighborsClassifier(n_neighbors=3)
1
2
3
4
5
6
7
8
9
10
11
# 使用测试集对分类模型进行测试
y_pred=knn.predict(X_test)
print(knn.score(X_test,Y_test)) #输出整体预测结果的准确率
#输出准确率的方法 2
print(metrics.accuracy_score(y_true=Y_test,y_pred=y_pred))
#输出混淆矩阵,如果为对角矩阵,则表示预测结果是正确的,准确度越大
print(metrics.confusion_matrix(y_true=Y_test,y_pred=y_pred))
#输出更详细的分类测试报告
from sklearn.metrics import classification_report
target_names = ['labels_1','labels_2','labels_3']
print(classification_report(Y_test,y_pred))
1
2
3
4
5
6
7
8
9
10
1.0
1.0
[[2]]
precision recall f1-score support

2 1.00 1.00 1.00 2

accuracy 1.00 2
macro avg 1.00 1.00 1.00 2
weighted avg 1.00 1.00 1.00 2
1
2
3
# 预测新样本的类别
label=knn.predict([[7,27],[2,4]])
print(label) #输出[2 1],表示新样本分别属于 2 和 1 类
1
[2 1]
1
2
3
4
5
6
7
8
9
10
11
# 绘制分类程序的界面图
import matplotlib as mpl
N, M = 90, 90 #网格采样点的个数,采样点越多,分类界面图越精细
t1 = np.linspace(0, 25, N) #生成采样点的横坐标值
t2 = np.linspace(0,12, M) #生成采样点的纵坐标值
x1, x2 = np.meshgrid(t1, t2) #生成网格采样点
x_show = np.stack((x1.flat, x2.flat), axis=1) #将采样点作为测试点
y_show_hat = knn.predict(x_show) #预测采样点的值
y_show_hat = y_show_hat.reshape(x1.shape) #使之与输入的形状相同
cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
plt.pcolormesh(x1, x2, y_show_hat, cmap=cm_light,alpha=0.3) #预测值的显示

结果图


K-近邻算法的 sklearn 实现实验
https://www.andyjin.website/2024/04/23/20240423001/
作者
Andy Jin
发布于
2024年4月23日
更新于
2026年5月6日
许可协议