【机器学习】应用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_iris

def 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 os

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler


iris = load_iris()
X = iris.data
y = iris.target

x_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算法是一种简单而有效的算法,在处理小型数据集和简单分类问题时可以发挥很好的作用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 系列:注意 ORDER 和 LIMIT 联合使用的陷阱

文章目录 前言背后的原因ORDER BY 排序列存在相同值时返回顺序是不固定的LIMIT 和 ORDER BY 联合使用时的行为ORDER BY 或 GROUP BY 和 LIMIT 联合使用优化器默认使用有序索引 如何解决其它说明个人简介 前言 不知道大家在在分页查询中有没有遇到过这个问题,分页查…

三、JS逆向

一、JS逆向 解释:在我们爬虫的过程中经常会遇到参数被加密的情况,这样只有先在前端搞清楚加密参数是怎么生成的才能继续我们的爬虫,而且此时我们还需要用python去执行这个加密的过程。本文主要讲怎么在浏览器调试JS,以及Python执…

【数据结构和算法】--队列的特殊结构-循环队列

目录 循环队列的结构循环队列的实现循环队列的创建循环队列为空判断循环队列为满判断入队出队返回循环队列首元素返回循环队列尾元素释放循环队列 循环队列的结构 循环队列是队列的一种特殊结构,它的长度是固定的k,同样是先进先出,理论结构是…

PHP是世界上最好的语言-PolarDN XXF无参数RCE QUERY_STRING 特性

这个靶场我之前看到过打广告&#xff0c;而且感觉比较新 来坐坐 <?php //flag in $flag highlight_file(__FILE__); include("flag.php"); $c$_POST[sys]; $key1 0; $key2 0; if(isset($_GET[flag1]) || isset($_GET[flag2]) || isset($_POST[flag1]) || isset…

作者推荐 |【深入了解系统性能优化】「实战技术专题」全方面带你透彻探索服务优化技术方案(方案分析篇)

全方面带你透彻探索服务优化技术方案 前提背景影响一个系统性能的方方面面代码优化数据库优化网络优化硬件优化 常用的性能评价/测试指标响应时间并发数吞吐量响应时间、并发数和吞吐量之间的关系运作流程关系 性能优化方案的建议避免过早优化进行系统性能测试寻找系统瓶颈&…

Vue2将在2023年12月31日结束支持

文章目录 一、前言二、2023.12.31 会发生什么&#xff1f;三、接下来呢&#xff1f;四、仍然使用 Vue 2&#xff1f;你应该这样做4.1、升级到 Vue 2 的最终版本4.2、购买 Vue 2 的扩展支持4.3、通知用户 Vue 2 EOL 后的计划 五、展望未来六、最后 一、前言 随着 2024 年的临近…

【漏洞复现】捷诚管理信息系统 SQL注入漏洞

漏洞描述 捷诚管理信息系统是一款功能全面,可以支持自营、联营到外柜租赁的管理,其自身带工作流管理工具,能够帮助企业有效的开展内部审批工作。 该系统CWSFinanceCommon.asmx接口存在SQL注入漏洞。未经身份认证的攻击者可以通过该漏洞获取数据库敏感信息,深入利用可获取…

【5G PHY】5G小区类型、小区组和小区节点的概念介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

谷歌浏览器标签页显示内存使用率

Chrome 桌面浏览器的新更新现在可让您查看每个标签页占用了多少内存&#xff0c;这可以帮助您确定哪些标签页占用了多少内存&#xff0c;网站正在减慢您笔记本电脑的速度。 今年早些时候在 Google Chrome 中引入内存节省程序之后&#xff0c;Google 又发布了一项功能&#xff…

【LeetCode刷题-树】--173.二叉搜索树迭代器

173.二叉搜索树迭代器 本题就是实现二叉树的中序遍历&#xff0c;利用数组本身实现迭代器 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.va…

栈和队列的实现(Java篇)

文章目录 一、栈的概念二、栈的实现2.1压栈(push)2.2出栈(pop)2.3获取栈顶元素(peek)2.4判断栈是否为空(isEmpty)栈的实现测试 三、队列的概念四、队列的实现4.1入队(offer)4.2出队(poll)4.3判断队列是否为空4.4获取对头元素队列的实现测试 五、循环队列5.1入队5.2出队5.3获取队…

基于Java SSM框架实现智能停车场系统项目【项目源码+论文说明】

基于java的SSM框架实现智能停车场系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个智能停车场管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述…

TVS管连接方式与电压的选取

TVS管连接方式与电压的选取 电源供电电压为12V时&#xff0c;TVS管可以选用15V&#xff1b;电源供电电压为24V&#xff0c;TVS管可以选用24V。 TVS管的供电接口的连接方式。我们看到有些厂家的步进电机机驱动器或者其他驱动或做有防浪涌电路时&#xff0c;会有一个超级大的直插…

tomcat启动异常:子容器启动失败(a child container failed during start)

最近在使用eclipse启动Tomcat时&#xff0c;发现一个问题&#xff0c;启动以前的项目突然报子容器启动异常。 异常信息如下&#xff1a; 严重: 子容器启动失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件[org.apache.…

DDD挤水分和强行加异性为好友-UMLChina建模知识竞赛第4赛季第25轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者…

LeetCode(68)翻转二叉树【二叉树】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 翻转二叉树 1.题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1…

pytest之allure测试报告03:allure动态自定义报告

1、测试用例模块中引入allure&#xff1a;import allure 2、yaml文件中定义添加title、story的值&#xff1a; 3、测试用例中读取调用。eg:allure.dynamic.title() 4、运行报告查看&#xff1a;成功动态展示yaml文件中配置的story、title

【深度学习】注意力机制(六)

本文介绍一些注意力机制的实现&#xff0c;包括MobileVITv1/MobileVITv2/DAT/CrossFormer/MOA。 【深度学习】注意力机制&#xff08;一&#xff09; 【深度学习】注意力机制&#xff08;二&#xff09; 【深度学习】注意力机制&#xff08;三&#xff09; 【深度学习】注意…

昇腾Profiling性能分析工具使用问题案例

昇腾Profiling性能分析工具用于采集和分析运行在昇腾硬件上的AI任务各个运行阶段的关键性能指标, 用户可根据输出的性能数据&#xff0c;快速定位软、硬件性能瓶颈&#xff0c;提升AI任务性能分析的效率。具体使用方法请参考&#xff1a; 本期分享几个关于Profiling性能分析工具…

知识付费小程序开发:构建个性化学习平台的技术实践

随着在线学习和知识付费的兴起&#xff0c;开发一款知识付费小程序成为了创新的热点之一。本文将通过使用Node.js、Express和MongoDB为例&#xff0c;演示如何构建一个基础的知识付费小程序后端&#xff0c;并实现用户认证和知识内容管理。 1. 初始化项目 首先&#xff0c;确…