• 机器学习——KNN算法


    0、前言:

    • 机器学习算法和深度学习算法不同,深度学习模型有时候直接输入pandas中的DataFrame数据是可以识别并且运行的,但是机器学习一定是要转化为numpy数据类型,也就是DataFrame或者Series数据类型中的values属性将其转为numpy数据类型。一般机器学习输入数据要二维numpy,输出要一维numpy。这个问题就会导致你在用机器学习算法训练pandas数据时报错!

    1、:前提知识

    • KNN算法是机器学习算法中用于分类或者回归的算法,KNN全称为K nearest neighbour(又称为K-近邻算法)

    • 原理:K-近邻算法采用测量不同特征值之间的距离的方法进行分类。

    • 优点:精度高

    • 缺点:时间和空间复杂度高

    • K近邻算法思想:有N个样本分布在m个类别中,要判定第x个样本为什么类别,就要求出x到N个样本每个样本的距离集合,从中找出K个最近的样本,然后通过k个样本的比例判断x所属类别,例如在k个样本中第一类占比较多,就判定x是第一类数据。注意:计算x到N个样本之间的距离方法有两种,第一种是曼哈顿距离,第二种是欧式距离,他们的计算如下:
      在这里插入图片描述
      可以看出,曼哈顿距离计算复杂度较低,计算速度快。

    • 实现方法:基于谷歌公司开发的第三方python库sklearn

    • 实现步骤:

      • 1、导入numpy、pandas、matplotlib、from sklearn.neighbors import KNeighborsClassifier第三方库
      • 2、导入原始数据(导入数据后可以通过散点图进行数据可视化简单了解下数据)
      • 3、将数据划分为训练数据(x_train、y_train)和测试数据(x_test、y_test),注意:在KNN中输入数据x为二维数据,输出数据y为一维数据。(注意:二维数据代表数据只能有行和列两个维度,但x可以有多个,x也叫做特征,输入数据必须是数值型数据,如果不是就需要转换为数值型数据。输出数据也就是目标数据可以是数值和字符串)
      • 4、设定KNN算法参数,引入KNN模型
      • 5、通过fit函数输入训练数据,训练KNN模型
      • 6、通过测试数据测试KNN模型
      • 7、计算模型准确率

    2、案例:

    • 我有一份原始数据,数据中有两个变量,分别为“武打镜头”和“接吻镜头”,通过这两个变量可以判断这部影片为动作片还是爱情片,规则就是:武打镜头大于接吻镜头为动作片,武打镜头小于接吻镜头为爱情片,原始数据如下:
      在这里插入图片描述
    • 代码
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    # 导入KNN分类库
    from sklearn.neighbors import KNeighborsClassifier
    
    # 1、导入数据
    movie = pd.read_excel('./tests.xlsx',sheet_name="Sheet2")
    # 2、数据可视化
    plt.scatter(movie.loc[:,'武打镜头'],movie.loc[:,'接吻镜头'])
    plt.show
    # 3、训练数据赋值,x(二维)、y(一维)
    x_train = movie.loc[:,['武打镜头','接吻镜头']]
    y_train = movie.loc[:,'分类情况']
    print(type(x_train),type(y_train))
    # 4、设置KNN参数(近邻数量为5,距离计算方法为曼哈顿),引入KNN模型
    KNN = KNeighborsClassifier(n_neighbors=5,p=1)
    # 5、训练模型
    KNN.fit(x_train,y_train)
    # 6、设置测试数据测试训练完的KNN模型
    x_test = np.array([[30,2],[3,36],[2,15],[30,2]])
    y_test = np.array(['动作片','爱情片','爱情片','动作片'])
    y_pred = KNN.predict(x_test)
    print(y_pred)
    # 7、计算测试集准确率(accuracy)
    KNN.score(x_test,y_test)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3、鸢尾花分类任务实战:

    • 1、学习sklearn中自带的数据集调用方法
      • 导入鸢尾花数据集:from sklearn.datasets import load_iris(同过tab键代码补齐的方法就能靠大概记忆输入此行代码)
      • 使用数据集:load_iris(),如下所示为调用结果,结果为字典形式,其中data为数据键,对应的值为array二维数组(150行*4列),其中第一列特征为花萼的长度(sepal length (cm)),第二列特征为花萼的宽度’sepal width (cm)‘,第三列特征为花瓣的长度’petal length (cm)’,第四列特征为花瓣的宽度 ‘petal width (cm)’。target键对应的为150组数据对应的分类标签,其中0代表’setosa’鸢尾花,1 代表’versicolor’鸢尾花, 2代表’virginica’鸢尾花。其他键表示的就是一些数据集的相关信息。
    • 2、通过字典调用方式获取数据集中的相关数据,再根据pandas或者numpy处理数据。
    # 获取输入数据
    data = s_data['data']
    pd.DataFrame(data)
    # 获取输出数据
    target = s_data['target']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 3、将数据集划分为训练数据和测试数据(使用sklearn库中model_selection模块中的train_test_split函数)
    # 导入sklearn自带的切分训练数据和测试数据的包
    from sklearn.model_selection import train_test_split
    
    # 将数据切分为训练集输入、训练集输出、测试集输入、测试集输出
    # test_size的参数如果是整数就会从所有数据中取多少条作为测试数据
    # test_size的参数如果是0~1的小数就会从所有数据中按比例取多少条作为测试数据
    # random_state参数可以让每次数据切分都一样
    x_train, x_test, y_train, y_test = train_test_split(data,target,test_size=10)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 4、导入KNN模型,训练数据,并测试分类效果
    # 获取KNN算法
    KNN = KNeighborsClassifier()
    # 训练KNN算法
    model = KNN.fit(x_train,y_train)
    # 测试模型分类效果
    model.predict(x_test)
    print(y_test)
    # 计算分类准确度
    model.score(x_test,y_test)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4、补充(这部分内容不一定会用到,但用到可以查)

    • 1、DataFrame数据可以直接用matplotlib中的plot画出数据的折线图,下面的例子是画出鸢尾花数据集的特征数据折线图
    s_data = load_iris()
    # 获取输入数据
    data = s_data['data']
    data = pd.DataFrame(data,columns=s_data['feature_names'])
    # 用DataFrame直接画图查看数据集
    data.plot()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    • 2、绘制分类分界图:目的是将一个数据集中的数据放在一个坐标系中,然后让除了数据以外坐标系中其他区域也显示分类情况
    # 1、先划分坐标系
    x = np.linspace(data2.iloc[:, 0].min(), data2.iloc[:, 0].max(), 1000)   # 把x等分成1000份
    y = np.linspace(data2.iloc[:, 1].min(), data2.iloc[:, 1].max(), 1000)   # 把y等分成1000份
    
    X, Y = np.meshgrid(x, y) # 按行复制y个x,按列复制x个y
    XY = np.c_[X.ravel(), Y.ravel()] # 将x扁平化,将y扁平化,再一对一组合,最终XY形状为(1000000, 2)
    # 用KNN模型预测
    knn = KNeighborsClassifier()
    knn.fit(data2, target)
    y_pred = knn.predict(XY)
    y_pred
    # 分界图
    plt.scatter(XY[:, 0], XY[:, 1], c=y_pred)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述
    注意:上面绘图需要等待,可以使用matplotlib自带的绘图函数,绘图就不用等待了。
    pcolormesh(): 画分界图,边界图
    plt.pcolormesh(X, Y, y_pred.reshape(1000, 1000))

    • 3、保存模型和加载模型
    # 保存模型
    import joblib
    joblib.dump(模型名称,"模型存储路径.plk")
    
    • 1
    • 2
    • 3
    # 加载模型
    import joblib
    joblib.load("模型存储路径.plk")
    
    • 1
    • 2
    • 3
  • 相关阅读:
    Linux系统自有服务
    洛谷P4185 离线+并查集
    冲压模具在线检测技术,解决过哪些问题?
    【Git】fork 出的仓库拉取源仓库
    游戏开发中的设计模式
    Leetcode刷题详解——在排序数组中查找元素的第一个和最后一个位置
    谷粒商城实战笔记-34-前端基础-ES6-promise异步编排
    vue2配置环境变量并且nginx运行成功
    URL地址解析至页面展示全过程(面试详细解答)
    【Leetcode刷题】搜索插入位置
  • 原文地址:https://blog.csdn.net/sz1125218970/article/details/132520443