通俗易懂的机器学习——sklearn鸢尾花分类(KNN)
前言
KNN算法是机器学习中较为简单的入门算法,其主要思想是选取k个与待预测点相近的数据,观察他们的类别,本着离谁近就更像谁的思路对于待预测点进行预测,本文将针对使用sklearn进行KNN算法的使用进行详解
数据预处理
在正式开始之前,我们先要进行数据预处理
数据预处理有两种常见的方式,MinMaxScaler和StandardScaler
MinMaxScaler: 𝑋=𝑋−𝑚𝑎𝑥(𝑋)𝑚𝑎𝑥(𝑋)−𝑚𝑖𝑛(𝑋)𝑋=\frac{𝑋−𝑚𝑎𝑥(𝑋)}{𝑚𝑎𝑥(𝑋)−𝑚𝑖𝑛(𝑋)}X=max(X)−min(X)X−max(X)
StandardScaler: 𝑋=𝑋−𝑚𝑒𝑎𝑛(𝑋)𝑠𝑡𝑑(𝑋)𝑋=\frac{𝑋−𝑚𝑒𝑎𝑛(𝑋)}{𝑠𝑡𝑑(𝑋)}X=std(X)X−mean(X)
from sklearn.preprocessing import MinMaxScaler, StandardScalerminmaxscaler = MinMaxScaler()
standardscaler = StandardScaler()
鸢尾花数据集
从sklearn.datasets中我们可以加载一些数据集,其中包含鸢尾花数据集
from sklearn import datasets
# 加载数据集
iris = datasets.load_iris()
X = iris.data[:,2:] # 这里为了画图方便,只取最后两个维度的信息
y = iris.target # 数据标签
X.shape, y.shape
((150, 2), (150,))
模型训练
从sklearn.neighbors我们引出KNeighborsClassifier分类器,直接调用KNN算法进行训练,我们在数据加载时选用sklearn.model_selection中提供的train_test_split来直接划分数据集
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 以20%作为测试数据,随机数为42进行随机选取数据
X_train_std = standardscaler.fit_transform(X_train) # 数据预处理
X_test_std = standardscaler.fit_transform(X_test) # 数据预处理
# 实例化k值为3的knn模型,即n_neighbors=3,即选取最近的三个临近的点
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train_std, y_train)
knn_clf.score(X_test_std, y_test)
1.0
超参数选择
k值
对于KNN任务来讲,k值越小越容易过拟合,k值越大越容易欠拟合,所以对于k值的选用要特别注意
绘制子图
我们在这里编写了一个函数来绘制我们用于测试k值时需要画的图
def plot_decision_boundary(model,k, sub, X, y):# 用于画图的函数x0_min, x0_max = X[:,0].min()-1, X[:,0].max()+1 # 获取x0最小值和最大值x1_min, x1_max = X[:,1].min()-1, X[:,0].max()+1 # 获取x1最小值和最大值x0, x1 = np.meshgrid(np.linspace(x0_min, x0_max, 100), np.linspace(x1_min, x1_max, 100)) # 以x0和x1的最小值和最大值生成100个二维网格数据Z = model.predict(np.c_[x0.ravel(), x1.ravel()]) # 对生成的数据进行预测Z = Z.reshape(x0.shape)# plt.contourf是用来绘制等高线的函数,给定二维坐标和高度值可以画出等高线,x0, x1为二维坐标,Z为高度plt.subplot(sub[0], sub[1], sub[2]) # 绘制子图plt.contourf(x0, x1, Z, cmap=plt.cm.Spectral) # 预测数据的等高线plt.ylabel("x1")plt.xlabel("x0")plt.xticks([])plt.yticks([])plt.title('k={:d}'.format(k))plt.scatter(X[:,0], X[:,1],c=np.squeeze(y)) # 原数据
选择不同的k值并画图
for k in range(1, 90, 10):knn_clf = KNeighborsClassifier(n_neighbors=k) # 选择不同的k值knn_clf.fit(X_train_std, y_train)plot_decision_boundary(knn_clf, k, (3, 3, k // 10+1), X_train_std, y_train)
plt.show()

其他参数
我们可以通过help来获取knn分类器的其他参数
help(knn_clf) # 查看KNN分类器的参数
可以看到Parameters下全是参数以及可选范围的介绍,我们随便选用几个进行尝试

网格搜索
由于每个参数及其组合我们一个个的去试效率太低,所以我们使用网格搜索来进行,我们在前面使用help已经知道了分类器的参数以及可选的值了,这里我们只需要先设置一个由字典组成的列表并将他和模型一起传到GridSearchCV的实例化中再次进行GridSearchCV的训练就可以得到最佳参数了,在由字典组成的列表中,每一个字典是选用不同的参数组合,字典的key是参数名,字典的value是要进行网格搜索的值,这里的值一定要满足help中规定的值
from sklearn.model_selection import GridSearchCV
# 使用网格搜索寻找最佳参数
param_grid=[{'weights':['uniform'],'n_neighbors':list(range(1, 11))},{'weights':['distance'],'n_neighbors':list(range(1, 11)),'p':list(range(1, 6))}
]
knn_clf = KNeighborsClassifier()
grid_search = GridSearchCV(knn_clf, param_grid)
grid_search.fit(X_train, y_train)
GridSearchCV

最佳准确率
grid_search.best_score_ # 最好的准确率是0.9583333333333334
0.9583333333333334
最佳参数
grid_search.best_params_ # 最好准确率对应的参数是{'n_neighbors': 1, 'weights': 'uniform'}
{‘n_neighbors’: 1, ‘weights’: ‘uniform’}
相关文章:
通俗易懂的机器学习——sklearn鸢尾花分类(KNN)
前言 KNN算法是机器学习中较为简单的入门算法,其主要思想是选取k个与待预测点相近的数据,观察他们的类别,本着离谁近就更像谁的思路对于待预测点进行预测,本文将针对使用sklearn进行KNN算法的使用进行详解 数据预处理 在正式开…...
操作系统引论
操作系统是管理硬件和软件的一种应用程序。操作系统是运行在计算机上最重要的一种软件,它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层,使应用软件和硬件进行分离,让我们无需关注硬件的实现࿰…...
优质 CS 读博 (PhD) 经验贴汇总
前言 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 Advice for early-stage Ph.D. students 读博的核心是在研究上取得进展,只有在研究上取得一些进展ÿ…...
SpringCloud学习笔记 - @SentinelResource的fallbackblockHandler配置详解 - sentinel
1. sentinel服务负载均衡测试 sentinel默认开启了负载均衡的轮询模式,为了测试sentinel服务负载均衡的效果,需要先创建两个服务提供者和一个服务消费者。 1.1. 分别创建两个服务提供者-支付服务9003、9004 1. 添加pom依赖: 提供者只需要将…...
华为OD机试题 - 静态扫描最优成本(JavaScript)
最近更新的博客 2023新华为OD机试题 - 斗地主(JavaScript)2023新华为OD机试题 - 箱子之形摆放(JavaScript)2023新华为OD机试题 - 考古学家(JavaScript)2023新华为OD机试题 - 相同数字的积木游戏 1(JavaScript)2023新华为OD机试题 - 最多等和不相交连续子序列(JavaScri…...
mysql大数据量批量提交
DROP PROCEDURE IF EXISTS test.insert_bacth_commit_test1;CREATE PROCEDURE test.insert_bacth_commit_test1()begindeclare start_num int default 0; -- 初始设置起始行数declare end_num int default 5;-- 初始设施结束行数declare cnt_srouce int default 0; -- 定义源表…...
IP SAN组网配置
目录一、确认网络连接畅通二、服务器端ISCSI启动器配置1.以root身份登录2.验证是否已安装iSCSI启动器3.安装iSCSI启动器4.启动iSCSI服务5.给iSCSI启动器命名6.扫描目标器7.登录目标器8.将登录目标器行为设置为自启动三、主机多路径配置四、存储配置五、主机挂载背景:…...
面试7分看能力,3分靠嘴皮,剩下90分就靠这份Java面试八股文
有句话说的好,面试中7分靠能力,3分靠嘴皮刚开始面试的时候,介绍项目一般都是凸显我们技能的重中之重,它对一次面试的成败可以说具有决定性作用,这就涉及到我们的表达能力了,有人说我其实水平都在线…...
api接口如何对接?
对于很多产品小白或求职者而言,API接口是一个产品和研发领域的专业术语,大家可能在文章或者PRD中都已经有接触过API接口的概念。 实际上,接口的应用已经非常广泛和成熟,这个概念主要活跃在公司内部的各系统之间的衔接和对接以及公…...
毕业2年不到选择跳槽,居然拿到25K的薪资,简直了···
本人本科就读于某普通院校,毕业后通过同学的原因加入软件测试这个行业,角色也从测试小白到了目前的资深工程师,从功能测试转变为测试开发,并顺利拿下了某二线城市互联网企业的Offer,年薪 30W 。 选择和努力哪个重要&am…...
Java反序列化漏洞——CommonsCollections3链分析
一、原理CC1链中我们是通过调用Runtime.getRuntime.exec()来执行系统命令,而另一个方向我们可以通过TemplatesImpl加载字节码的类,通过调⽤其newTransformer() 方法,即可执⾏这段字节码的类构造器,我们在类构造器中加入恶意代码&a…...
英文论文(sci)解读复现【NO.5】让RepVGG再次变得更强大:一种量化感知方法
此前出了目标检测算法改进专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读发表高水平学术期刊中的SCI论文&am…...
hive学习(仅供参考)
hive搭建Hive什么是hiveHive的优势和特点hive搭建解压、改名修改环境变量添加hive-site.xml将maven架包拷贝到hive替换一下gua包使环境变量生效初始化安装成功Hive 什么是hive 将结构化的数据文件映射为数据库表 提供类sql的查询语言HQL(Hive Query Language) Hive让更多的人…...
新生儿住月子中心20天患败血症 什么是败血症?有哪些危害
12月7日,四川眉山市民唐先生说,他刚出生的儿子在妇产医院分娩中心住了20天后感染了败血症。据唐先生介绍,哈子出院时各项指标正常。他在分娩中心住了半个月左右,孩子喝牛奶异常易怒,第二天开始发烧。当天,在…...
2023年美赛赛题A题赛题公布
问题A:遭受旱灾的植物群落背景不同种类的植物对压力的反应方式不同。例如,草原是相当的对干旱敏感。干旱发生的频率和严重程度各不相同。大量的观察表明,不同物种的数量在一个物种如何生长的过程中起着重要作用植物群落在连续几代的干旱周期中适应。在一…...
交互式前端开发最好用的WebGL框架
JavaScript是创建Web最有用的编程语言之一,尤其是在WebGL库的支持下。有了WebGL,可以很方便地使用 HTML5 Canvas 元素动态生成图形。因此,设计师和开发人员很容易创建流畅的2D和3D效果。WebGL是JavaScript API或基于OpenGL的库,它…...
【Java 面试合集】包装类的缓存问题
包装类的缓存问题1. 概述 嗨,大家好,【Java 面试合集】每日一题又来了。今天我们分享的内容是:包装类的缓存问题。 我们下面的案例以Integer 为例 2. 表现 public class TestCache {public static void main(String[] args) {Integer i 127…...
JAVA PYTHONGOLANG在STR LIST MAP 等数据结构的一些底层设计
一、列表和扩容机制 JAVA的列表主要分为list和vector,list是线程不安全的。list又主要分为ArrayList和LinkedList,ArrayList底层通过object数组实现,可以实现快速查找,LinkedList底层通过双向列表实现。java常用的列表实现类为ArrayList,ArrayList的主要源码如下: publi…...
SpringMVC处理ajax请求
RequestBodyRequestBody:将请求体中的内容和控制器方法的形参进行绑定。使用RequestBody注解将json格式请求参数转换为java对象。条件:1. 导入jackson依赖 (默认调用jackson功能实现的)2. 在springmvc的配置文件中设置开启<mvc:annotation-driven/>3. 在处理请…...
Spire.Office 8.2.2 for NET 开年之喜
Spire.Office for .NET对文档的操作包括打开,创建,修改,转换,打印,浏览 Word、Excel、PowerPoint 和 PDF 文档,以及将数据从数据源导出为常用的文档格式,如:Word,Excel&a…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
