【机器学习】应用KNN实现鸢尾花种类预测

目录

 前言

一、K最近邻(KNN)介绍

二、鸢尾花数据集介绍

三、鸢尾花数据集可视化

四、鸢尾花数据分析

总结


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

💡本文由Filotimo__✍️原创,首发于CSDN📚。

📣如需转载,请事先与我联系以获得授权⚠️。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。

 前言

机器学习是一项快速发展的领域,其中K-最近邻算法(K-Nearest Neighbors,简称KNN)是一个经典且常用的算法,可以用于分类和回归问题。在本文中,我们将介绍如何使用KNN算法来实现鸢尾花种类的预测。


一、K最近邻(KNN)介绍

原理:
KNN算法的核心思想是通过计算样本之间的距离来度量它们的相似性。对于分类任务,当给定一个未知样本时,算法会找到与该样本距离最近的K个已知样本,然后根据这K个已知样本的类别标签来预测未知样本的类别。常见的距离度量方法包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。

使用场景:

KNN算法在许多实际应用中被广泛使用,特别是在以下场景中表现出良好的性能:
1.数据集中类别分布均匀、样本点较为离散的情况下,KNN的效果较好。
2.数据集规模较小的情况下,KNN的计算速度较快。
3.对异常值不敏感,可以处理噪声较多的数据集。

相关术语:

K值:K是KNN算法中的一个超参数,用于指定要考虑的最近邻居的个数。选择合适的K值是KNN算法的重要部分,通常通过交叉验证或网格搜索进行选择。
距离度量:KNN算法使用距离度量来评估样本之间的相似性。常见的距离度量方法有欧氏距离、曼哈顿距离、闵可夫斯基距离等。
预测和决策规则:对于分类任务,KNN算法中常用的决策规则是投票法,即选择K个邻居中出现最频繁的类别作为预测类别。对于回归任务,通常使用K个邻居的平均值来进行预测。
超参数选择:KNN算法中常见的超参数有K值和距离度量方法等。选择合适的超参数对模型的性能和准确度至关重要,常用的方法是通过交叉验证或网格搜索来选择最佳超参数组合。

基本流程:

1.加载数据集,划分为训练集和测试集。
2.根据训练集计算样本之间的距离。
3.选择K值,并找到距离未知样本最近的K个样本。
4.使用投票法或平均值法来预测未知样本的类别或数值。
5.评估模型在测试集上的性能和准确度。
6.根据需要调整超参数K和距离度量方法,并重新训练和评估模型。

优化模型性能:

1.特征选择和特征工程:选择与分类或回归任务相关的有效特征,并对数据进行预处理和归一化处理,以减少特征间的差异性。
2.调整K值:选择合适的K值很重要,若选择较小的K值容易受到噪声干扰,而较大的K值容易忽略局部特征,因此应通过交叉验证等方法选择最佳K值。
3.距离度量方法的选择:根据实际情况选择适当的距离度量方法,如曼哈顿距离适用于处理具有非连续特征的数据,而欧氏距离适用于处理连续特征的数据。
4.数据预处理:对数据进行特征缩放、离群值处理等预处理步骤,以提高模型的鲁棒性和准确性。
5.交叉验证和模型评估:使用交叉验证来评估模型在不同数据集上的泛化能力,以选择最佳的模型。
6.集成学习:考虑使用集成学习方法,如投票集成或基于KNN的Bagging方法来进一步提升KNN算法的性能。

二、鸢尾花数据集介绍

Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。

数据集介绍:

数据集样例:

三、鸢尾花数据集可视化

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_irisdef iris_plot(data, x_col, y_col):sns.lmplot(x=x_col, y=y_col, data=data, hue="target", fit_reg=False)plt.title("鸢尾花数据显示")plt.show()# 设置字体为中文黑体
plt.rcParams['font.sans-serif'] = ['SimHei']# 加载数据集
iris = load_iris()# 创建数据框
iris_df = pd.DataFrame(data=iris.data, columns=['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_df["target"] = iris.target# 绘制图表
iris_plot(iris_df, 'Sepal_Width', 'Petal_Length')

我们使用了 seaborn 库和 matplotlib 库进行绘制。在绘制之前,先加载了鸢尾花数据集,并将其转换为数据框格式。然后定义了一个 iris_plot 函数,用于绘制散点图。最后调用该函数,以花萼宽度和花瓣长度作为 x 轴和 y 轴绘制。也就是将数据集中的样本点按照花瓣长度和花萼宽度两个指标在二维坐标系上进行了展示,并且以不同颜色对应不同类型的鸢尾花。

四、鸢尾花数据分析

import pandas as pd
import joblib
import osfrom sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaleriris = load_iris()
X = iris.data
y = iris.targetx_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)param_grid = {"n_neighbors": [1, 3, 5, 7]}
estimator = KNeighborsClassifier()
grid_search = GridSearchCV(estimator, param_grid=param_grid, cv=5)
grid_search.fit(x_train, y_train)estimator = grid_search.best_estimator_if not os.path.exists("./model"):os.makedirs("./model")joblib.dump(estimator, "./model/model.pkl")
estimator = joblib.load("./model/model.pkl")y_pred = estimator.predict(x_test)
print("预测值是:\n", y_pred)
print("预测值和真实值的对比是:\n", y_pred == y_test)score = estimator.score(x_test, y_test)
print("准确率为: \n", score)print("在交叉验证中验证的最好结果:\n", grid_search.best_score_)
print("最好的参数配置:\n", grid_search.best_params_)
cv_results = pd.DataFrame(grid_search.cv_results_)
print("交叉验证后的准确率结果:\n", cv_results)

使用 K 最近邻算法对鸢尾花数据集进行分类。

我们主要使用了 pandas、joblib、os、sklearn 中的一些模块和函数。

我们首先加载鸢尾花数据集,然后将数据集分为训练集和测试集。接下来对训练集和测试集进行了特征标准化处理,使用了 StandardScaler 类对数据进行标准化。

然后定义一个参数网格 param_grid,用于指定超参数 n_neighbors 的取值。创建一个 KNeighborsClassifier 估计器,用于训练和预测。通过 GridSearchCV 类对模型进行了交叉验证和参数调优,并选出了最佳的模型估计器。

通过 joblib 模块将最佳的模型保存到./model/model.pkl文件中,并再次加载该模型。

利用这个模型对测试集进行预测,并计算准确率。同时打印了预测值、预测值和真实值的对比结果,交叉验证后的最佳得分和最佳参数配置。

使用 pd.DataFrame 将交叉验证的结果转换为数据框格式,并打印交叉验证后的准确率结果。

我们可以通过这段代码可以了解到如何使用 K 最近邻算法对数据集进行分类,并使用网格搜索和交叉验证对模型进行参数调优。


总结

在本文中,我们学习了如何使用KNN算法来预测鸢尾花的种类。我们首先进行了数据准备和预处理,然后实现了KNN算法,并通过评估指标对模型进行了评估。KNN算法是一种简单而有效的算法,在处理小型数据集和简单分类问题时可以发挥很好的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/218999.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js基础入门

先来一点js基础&#xff0c;其实js大部分的时候都在处理对象或者数组。 对象四个基本操作&#xff1a;增删改查 掌握元素的增删改查&#xff0c;了解如何拷贝&#xff0c;深拷贝和浅拷贝的区别。详情见代码 <script>//创建对象一共有三种赋值声明的语法let obj{} //赋值…

大数据存储技术(3)—— HBase分布式数据库

目录 一、HBase简介 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;特点 &#xff08;三&#xff09;HBase架构 二、HBase原理 &#xff08;一&#xff09;读流程 &#xff08;二&#xff09;写流程 &#xff08;三&#xff09;数据 flush 过程 &#xf…

Java stream 进阶版

1、Stream 概述 Java 8 引入了 Stream API,它是一种用于简化集合和数组操作的强大工具。Stream API 允许我们将集合或数组视为流,并在流上进行各种操作,如筛选、排序、聚合等。 Stream API 的核心概念是 Stream 流,它代表了一个数据流,其中包含了一系列的元素。这些元素…

【LeetCode刷题-排序】--179.最大数

179.最大数 思路&#xff1a; 方法&#xff1a;自定义排序 class Solution {public String largestNumber(int[] nums) {if(nums null || nums.length 0){return "";}//将每个数字转换成字符串String[] strs new String[nums.length];for(int i 0;i < nums.l…

怎样长时间保持SSH会话连接不断开?

操作场景 使用SSH方式登录CentOS Stream操作系统的云服务器时&#xff0c;过一段时间就会自动断开连接。 该文档适用于CentOS/EulerOS系统。 操作方法 编辑/etc/ssh/sshd_config文件设置心跳&#xff0c;保持连接。 编辑/etc/ssh/sshd_config&#xff0c;添加配置项&#x…

【C语言】——认识指针变量和地址,以及指针变量类型的意义

&#x1f3a5; 岁月失语唯石能言的个人主页 &#x1f525;个人栏专&#xff1a;秒懂C语言 ⭐若在许我少年时&#xff0c;一两黄金一两风 目录 前言 一、指针变量和地址 1.1 取地址操作符&#xff08;&&#xff09; 1.2 指针变量和解引用操作符&#xff…

scrapy post请求——百度翻译(十四)

scrapy处理 post 请求 爬取百度翻译界面 目录 1.创建项目及爬虫文件 2.发送post请求 1.创建项目及爬虫文件 scrapy startproject scrapy_104 scrapy genspider translate fanyi.baidu.com 2.发送请求 post请求需要传递参数&#xff0c;所以就不能用start_urls和parse函数了&…

飞天使-docker知识点6-容器dockerfile各项名词解释

文章目录 docker的小技巧dockerfile容器为什么会出现启动了不暂停查看docker 网桥相关信息 docker 数据卷 docker的小技巧 [rootlight-test playbook-vars[]# docker inspect -f "{{.NetworkSettings.IPAddress}}" d3a9ae03ae5f 172.17.0.4docker d3a9ae03ae5f:/etc…

QT----第三天,Visio stdio自定义封装控件,鼠标事件,定时器,事件分发器过滤器,绘图事件

目录 第三天1 自定义控件封装2 QT鼠标事件3 定时器4 event事件分发器5 事件过滤器6 绘图事件Qpainter 源码&#xff1a;CPP学习代码 第三天 1 自定义控件封装 新建一个QT widgetclass&#xff0c;同时生成ui,h,cpp文件 在smallWidget.ui里添加上你想要的控件并调试大小 回到…

《Linux C编程实战》笔记:一些系统调用

目录 dup和dup2函数 fcntl函数 示例程序1 示例程序2 ioctl函数 dup和dup2函数 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd): dup 函数复制 oldfd 参数所指向的文件描述符。 参数&#xff1a; oldfd&#xff1a;要复制的文件描述符的…

zookeeper4==zookeeper源码阅读,FOLLOWER收到了需要LEADER执行的命令后各节点会执行什么

上面已经阅读并观察了节点确定自己的身份后会做些什么&#xff0c;大致就是比对双方信息然后完成同步。 本篇阅读&#xff0c; FOLLOWER收到了需要LEADER执行的命令后&#xff0c;怎么同步给LEADER的&#xff0c;并且LEADER会执行什么操作。 源码启动zkCli用于测试 将原本的代…

技术阅读周刊第十期

技术阅读周刊&#xff0c;每周更新。 周四加了个班&#xff0c;周五没缓过来&#xff0c;就推迟到今天更新了 历史更新 20231117&#xff1a;第六期20231124&#xff1a;第七期20231201&#xff1a;第八期20231215&#xff1a;第九期 Golang: 14 Shorthand Tricks You Might No…

LLM中的Prompt提示

简介 在LLM中&#xff0c;prompt&#xff08;提示&#xff09;是一个预先设定的条件&#xff0c;它可以限制模型自由发散&#xff0c;而是围绕提示内容进行展开。输入中添加prompt&#xff0c;可以强制模型关注特定的信息&#xff0c;从而提高模型在特定任务上的表现。 结构 …

hive数据仓库工具

1、hive是一套操作数据仓库的应用工具&#xff0c;通过这个工具可实现mapreduce的功能 2、hive的语言是hql[hive query language] 3、官网hive.apache.org 下载hive软件包地址 Welcome! - The Apache Software Foundationhttps://archive.apache.org/ 4、hive在管理数据时分为元…

『踩坑记录』IDEA Spring initialzr新建Spring项目不能选择jdk8的解决方法

问题描述 Spring initializr新建Spring项目不能选低版本java 解决方法 默认官方start.spring.io已不支持自动生成低版本jkd的Spring项目&#xff0c;自定义用阿里云的starter即可 用阿里云的就能支持低版本jdk了 完 欢迎关注我的CSDN博客 &#xff1a;Ho1aAs 版权属于&a…

【C++】 C++11 新特性探索:decltype 和 auto

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ decltype推导变量类型推导函数返回类型 2️⃣ auto自动推导变量类型迭代器和范围循环 3️⃣ decltype 和 auto 同时使用&#x1f6ec; 结论&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 C11 引入了一些强大的新特性&#xff…

LVS负载均衡群集,熟悉LVS的工作模式,了解LVS的调度策略以及ipvsadm工具的命令格式

目录 一、什么是群集 群集的作用&#xff1a; 群集的目的是什么 根据群集所针对的目标差异&#xff0c;可分为三种类型 负载均衡群集&#xff08;LBC&#xff09;load balance cluster 高可用群集&#xff08;HAC&#xff09;high availability cluster 高性能运算群集&a…

MAMOS蓝图: 打造自己的质量工程

针对团队中存在的问题&#xff0c;构造MAMOS蓝图&#xff0c;从而以系统化的方式识别并解决问题。本文将针对减少等待时间这一问题举例说明MAMOS蓝图的组成和使用方式。原文: MAMOS Blueprint: Build your own for Quality at Speed 很难完全摆脱等待时间。 我认为没有必要争论…

在线二进制原码,补码,反码计算器

具体请前往&#xff1a;在线原码/反码/补码计算器