机器学习-KNN算法(鸢尾花分类实战)

这篇具有很好参考价值的文章主要介绍了机器学习-KNN算法(鸢尾花分类实战)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介


K近邻(K Nearest Neighbors,KNN)算法是最简单的分类算法之一,也就是根据现有训练数据判断输入样本是属于哪一个类别。

“近朱者赤近墨者黑",所谓的K近邻,也就是根据样本相邻最近的K个数据来进行判断,看K个邻居中所属类别最多的是哪一类,则将该样本分为这一类。

算法原理很简单,如下图,K取3时,输入数据为红色点,在它最近的3个邻居点中,有2个黄色1个蓝色,故应把它分类为黄色这一类。

机器学习-KNN算法(鸢尾花分类实战)

可以看出K的取值应为奇数,避免K近邻中有相同个数的类别,同时也不能为类别数的倍数,如3分类中K取3时,出现1:1:1无法分类的情况。注意如果K过小可能造成过拟合。

此外距离的定义公式也有很多,这里不再赘述,根据实际场景进行甄选,一般使用欧式距离更多,即 d i s t ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 dist(x,y)=\sqrt{\sum_{i=1}^n(x_i-y_i)^2} dist(x,y)=i=1n(xiyi)2

代码复现


  1. 数据处理

采用典中典——鸢尾花数据集,Kaggle中有上传鸢尾花数据(下载链接)
鸢尾花数据集包含四个特征,和三种鸢尾花标签类别,共150条数据。
机器学习-KNN算法(鸢尾花分类实战)

采用sepal length和petal width两个特征,你也可以采用其他特征。
使用pandas读取数据,不懂pandas可以参考我这篇:Pandas光速入门-一文掌握数据操作

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

data = pd.read_csv("D:\\Iris_flower_dataset.csv")
x = np.array(data.iloc[:, [1, 4]])
y_tmp = np.array(data["Species"])
y = []
label = ["Iris-setosa", "Iris-virginica", "Iris-versicolor"]
for i in y_tmp:  # 将英文压为整型
    if i == label[0]:
        y.append(0)
    elif i == label[1]:
        y.append(1)
    else:
        y.append(2)
y = np.array(y)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2022)
# 训练集可视化
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train)
plt.xlabel("sepal length[cm]")  # 设置x轴名
plt.ylabel("petal width[cm]")  # 设置y轴名
plt.show()

机器学习-KNN算法(鸢尾花分类实战)
可视化可参考:Matplotlib光速入门-从安装到绘图实战

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

  1. KNN定义

只考虑两个特征,就简单化处理了,即用 ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} (x1x2)2+(y1y2)2

class KNN(object):

    def __init__(self, k):  # 初始化函数
        self.k = k

    def fit(self, x, y):  # 载入训练集
        self.x = x
        self.y = y

    def _distance(self, v1, v2):  # 欧式距离
        return np.sum(np.square(v1 - v2))  # (不开根号节省算力,效果一致

    def predict(self, x):
        y_pre = []
        for i in range(len(x)):  # x是测试集,是一个n维特征数组
            dist_arr = [self._distance(x[i], self.x[j]) for j in range(len(self.x))]  # 计算距离
            sorted_index = np.argsort(dist_arr)  # 排序
            top_k_index = sorted_index[:self.k]  # 得到K近邻
            nearest = self._count(y_top_k=self.y[top_k_index])  # 根据K近邻分类做出预测
            y_pre.append(nearest)  # 加入预测答案
        return np.array(y_pre)

    def _count(self, y_top_k):  # 统计各分类数量
        y_map = {}
        for y in y_top_k:
            if y not in y_map.keys():
                y_map[y] = 1  # 首次不在字典则置1
            else:
                y_map[y] += 1  # 否则value++
        sorted_vote_dict = sorted(y_map.items(), key=operator.itemgetter(1), reverse=True)  # 排序
        return sorted_vote_dict[0][0]  # 返回数量最多的分类
  1. 测试
if __name__ == "__main__":
	# 数据处理
    data = pd.read_csv("D:\\Iris_flower_dataset.csv")
    x = np.array(data.iloc[:, [1, 4]])
    y_tmp = np.array(data["Species"])
    y = []
    label = ["Iris-setosa", "Iris-virginica", "Iris-versicolor"]
    for i in y_tmp:  # 将英文压为整型
        if i == label[0]:
            y.append(0)
        elif i == label[1]:
            y.append(1)
        else:
            y.append(2)
    y = np.array(y)
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=2022)
    # 创建KNN对象
    clf = KNN(5)
    # 训练
    clf.fit(x_train, y_train)
    # 测试
    pre_test = clf.predict(x_test)
    # 计算正确率
    correct = np.count_nonzero((pre_test == y_test) == True)
    print("正确率:%.3f" % (correct / len(pre_test)))

机器学习-KNN算法(鸢尾花分类实战)

  1. 结果可视化
    # 结果可视化
    plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, alpha=0.3)
    for i in range(len(x_test)):
        if pre_test[i] == y_test[i]:  # 正确标绿
            plt.scatter(x_test[i][0], x_test[i][1], color="green")
        else:  # 错误标红
            plt.scatter(x_test[i][0], x_test[i][1], color="red")
    plt.xlabel("sepal length[cm]")  # 设置x轴名
    plt.ylabel("petal width[cm]")  # 设置y轴名
    plt.show()

机器学习-KNN算法(鸢尾花分类实战)
半透明的是训练数据,测试数据中,绿色是分类正确的点,红色是分类错误的点,可以看出上图只错了一个。

sklearn库调用


使用sklearn封装函数可以非常方便的实现:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 载入数据
iris = datasets.load_iris()  # 已经内置了鸢尾花数据集
x = iris.data  # 输入4个特征
y = iris.target  # 输出类别

# 随机划分数据集,默认25%测试集75%训练集
x_train, x_test, y_train, y_test = train_test_split(x, y)

# 创建一个KNN分类器对象,并设置K=5,
clf = KNeighborsClassifier(n_neighbors=5)  # clf意为Classifier

# 训练
clf.fit(x_train, y_train)  # 用训练数据拟合分类器模型

# 测试
pre_test = clf.predict(x_test)  # 得到测试集的预测结果

# 计算正确率
print('正确率:%.3f' % accuracy_score(y_test, pre_test))
# 由于数据集是随机划分,每次得到正确率自然不同,可以设置random_state让随机一致

机器学习-KNN算法(鸢尾花分类实战)
直接调用库函数简直不要太方便,芜湖起飞(~ ̄▽ ̄)~

原创不易,请勿转载本不富裕的访问量雪上加霜
博主首页:https://wzlodq.blog.csdn.net/
来都来了,不评论两句吗👀
如果文章对你有帮助,记得一键三连❤文章来源地址https://www.toymoban.com/news/detail-403223.html

到了这里,关于机器学习-KNN算法(鸢尾花分类实战)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MapReduce实现KNN算法分类推测鸢尾花种类

    https://gitcode.net/m0_56745306/knn_classifier.git 该部分内容参考自:https://zhuanlan.zhihu.com/p/45453761 KNN(K-Nearest Neighbor) 算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。 KNN算法的思想非常简单:对于任

    2024年02月08日
    浏览(47)
  • 经典案例——利用 KNN算法 对鸢尾花进行分类

    实现流程:         1、获取数据集         2、数据基本处理         3、数据集预处理-数据标准化         4、机器学习(模型训练)         5、模型评估         6、模型预测 具体API: 1、获取数据集  查看各项属性  2、数据基本处理   3、数据集预处理

    2024年02月02日
    浏览(50)
  • 【机器学习算法】KNN鸢尾花种类预测案例和特征预处理。全md文档笔记(已分享,附代码)

    本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用,结合场景解决实际问题。包括K-近邻算法,线性回归,逻

    2024年02月19日
    浏览(47)
  • 【机器学习案例】不同的模型算法对鸢尾花数据集进行分类

    经典机器学习入门项目,使用逻辑回归、线性判别分析、KNN、分类与回归树、朴素贝叶斯、向量机、随机森林、梯度提升决策树对不同占比的训练集进行分类 数据源 :Iris Species | Kaggle 150行,5列,分三种鸢尾花类型,每种类型50个样本,每行数据包含花萼长度、花萼宽度、花

    2024年02月04日
    浏览(33)
  • 【机器学习】鸢尾花分类-逻辑回归示例

    功能: 这段代码演示了如何使用逻辑回归对鸢尾花数据集进行训练,并将训练好的模型保存到文件中。然后,它允许用户输入新的鸢尾花特征数据,使用保存的模型进行预测,并输出预测结果。 步骤概述: 加载数据和预处理: 使用 Scikit-Learn 中的 datasets 模块加载鸢尾花数据

    2024年02月10日
    浏览(42)
  • 机器学习实验3——支持向量机分类鸢尾花

    基于鸢尾花数据集,完成关于支持向量机的分类模型训练、测试与评估。 代码 认识数据 属性:花萼长度,花萼宽度,花瓣长度,花瓣宽度 分类:Setosa,Versicolour,Virginica 相关性分析 如下图,可以直观看到花瓣宽度(Petal Width)和花瓣长度(Petal Length)存在很高的正相关性,

    2024年01月24日
    浏览(38)
  • 【机器学习实例讲解】机器学习-鸢尾花数据集多分类第02课

    问题定义与理解: 明确机器学习任务的目标,是分类、回归、聚类、强化学习还是其他类型的问题。 确定业务背景和需求,了解所处理数据的现实意义。 数据收集: 根据任务目标从各种来源获取原始数据,可以是数据库、文件、传感器、网络日志等。 数据预处理: 数据清

    2024年01月18日
    浏览(36)
  • 初识机器学习——感知机(Perceptron)+ Python代码实现鸢尾花分类

      假设输入空间 χ ⊆ R n chisubseteq R^n χ ⊆ R n ,输出空间为 γ = { + 1 , − 1 } gamma=left { +1,-1right } γ = { + 1 , − 1 } 。其中每一个输入 x ⊆ χ xsubseteq chi x ⊆ χ 表示对应于实例的特征向量,也就是对应于输入空间(特征空间)的一个点, y ⊆ γ ysubseteq gamma y ⊆ γ 输出表

    2023年04月08日
    浏览(50)
  • 【机器学习】决策树案例二:利用决策树进行鸢尾花数据集分类预测

    手动反爬虫,禁止转载: 原博地址 https://blog.csdn.net/lys_828/article/details/122045161(CSDN博主:Be_melting) 在进行逻辑回归分类的过程中已经有使用过iris数据集,这里直接加载数据,并进行字段名称的修改。 输出结果如下。 通过info()方法查看各个字段的基本详情,输出结果如下。

    2024年02月08日
    浏览(46)
  • 机器学习实战-系列教程8:SVM分类实战3非线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读

    本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 使用PolynomialFeatures模块进行预处理,使用这个可以增加数据维度 polynomial_svm_clf.fit(X,y)对当前进行训练传进去X和y数据 SVM分类实战

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包