使用二手房数据集训练 K-近邻分类模型,并对新的二手房样本[7,27] 和[2,4]的所属类别进行预测

本文讲解了sklearn中KNeighborsClassifier的使用,涉及参数设置、模型训练、预测评估和可视化,适合初学者理解KNN在实际项目中的应用。
摘要由CSDN通过智能技术生成

在 sklearn 的 neighbors 模块中,KneighborsClassifier 类可以用来实现 K-近邻算法,该类的构造函数语法格式如下:
KNeighborsClassifier(n_neighbors = 5, weights=‘uniform’, algorithm =‘’, leaf_size= ‘30’, p = 2, metric = ‘minkowski’, metric_params = None, n_jobs = None )
参数含义如下:
➢ n_neighbors:K-近邻算法中的 k 值,该参数必须指定。
➢ weights:权重值,取值有:‘uniform’,表示不管近邻点远近,权重值都一样,这就是最普通的 KNN 算法;‘distance’,权重和距离成反比,距离预测目标越近则具有越高的权重;自定义函数,自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。
➢ algorithm:构建 KNN 模型使用的算法,取值包括:brute 表示蛮力实现,就是直接计算所有距离再排序;'kd_tree’表示使用 k-d 树实现 KNN 算法;'ball_tree’表示使用球树实现 KNN 算法;'auto’是默认参数,表示自动选择合适的方法构建模型。

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics  #引入机器学习的准确率评估模块
# 导入数据
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)
# 定义模型并训练
knn=KNeighborsClassifier(3)
knn.fit(X,y)
KNeighborsClassifier(n_neighbors=3)
# 结果可视化
plt.scatter(X_train[Y_train==1,0],X_train[Y_train==1,1],color='red',marker='o')
plt.scatter(X_train[Y_train==2,0],X_train[Y_train==2,1],color='green',marker='x')
plt.scatter(X_train[Y_train==3,0],X_train[Y_train==3,1],color='blue',marker='d')
plt.show()

在这里插入图片描述

# 使用测试集对分类模型进行测试
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))
output
1.0
1.0
[[1 0]
 [0 1]]
              precision    recall  f1-score   support

           1       1.00      1.00      1.00         1
           3       1.00      1.00      1.00         1

    accuracy                           1.00         2
   macro avg       1.00      1.00      1.00         2
weighted avg       1.00      1.00      1.00         2
# 预测新样本的类别
label=knn.predict([[7,27],[2,4]])
print(label)  #输出[2 1],表示新样本分别属于 2 和 1 类

[2 1]

# 绘制分类程序的界面图
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)  #预测值的显示

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值