• K-近邻算法的 sklearn 实现


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

    2. 实验器材
      1. 硬件:PC 机(参与实验的学生每人一台)
      2. 软件环境:Python3.7 + Pycharm

    3. 实验内容
      1. 使用 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) 绘制分类边界图

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

    5. 代码实现
    # 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
    # 导入数据
    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
    • 9
    • 10
    # 测试准确率
    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
    • 7
    • 8
    k_error.pop(0)
    k_min = min(k_error)
    k = k_error.index(k_min)
    # 定义模型并训练
    knn=KNeighborsClassifier(k + 2)
    knn.fit(X,y)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    KNeighborsClassifier(n_neighbors=3)
    
    • 1
    # 使用测试集对分类模型进行测试
    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
    • 11
    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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    # 预测新样本的类别
    label=knn.predict([[7,27],[2,4]])
    print(label)  #输出[2 1],表示新样本分别属于 2 和 1 类
    
    • 1
    • 2
    • 3
    [2 1]
    
    • 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)  #预测值的显示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    【Linux】环境变量
    php连接mssql数据库的几种方式
    JAVA基础
    LeetCode952三部曲之二:小幅度优化(137ms -> 122ms,超39% -> 超51%)
    react native环境搭建
    SOFAJRaft 日志复制共识算法
    2023中国传媒产业发展报告
    vue视频播放功能
    matplotlib笔记之折线图
    山东大学人工智能导论实验四 利用神经网络分类红色和蓝色的花
  • 原文地址:https://blog.csdn.net/csdnjxx/article/details/138118382