Scikit-Learn K近邻分类

Scikit-Learn K近邻分类

    • 1、K近邻分类
      • 1.1、K近邻分类及原理
      • 1.2、超参数K
      • 1.3、K近邻分类的优缺点
    • 2、Scikit-Learn K近邻分类
      • 2.1、Scikit-Learn K近邻分类API
      • 2.2、K近邻分类实践(鸢尾花分类)
      • 2.3、交叉验证寻找最佳K
      • 2.4、K近邻分类与Pipeline



1、K近邻分类


K近邻是一种常用的分类算法。K近邻在机器学习知识结构中的位置如下:

在这里插入图片描述

1.1、K近邻分类及原理


K近邻(K-Nearest Neighbors,KNN)又称最近邻,意思是K个最近的邻居,是一种有监督的学习分类器,虽然它可以用于回归问题,但它通常用作分类算法

KNN算法的历史最早可以追溯到1951年,当时Evelyn Fix和Joseph Hodges提出了“最近邻模型”的概念;1957年,Cover和Hart扩展了他们的概念;1992年,Altman发表的一篇名为“K-Nearest Neighbors”的文章,使得该算法真正得到了广泛的认知和应用

然而,随着数据集的增长,KNN变得越来越低效,影响了模型的整体性能。KNN虽然不能像以前那么受欢迎,但由于其简单性和准确性,使得它仍然是数据科学中的首选算法之一。它通常用于简单的推荐系统、金融市场预测、数据预处理(缺失数据估计插补)等

K近邻假设可以在实例彼此附近找到相似点,根据比重分配类别标签,使用在给定数据点周围最多表示的标签。KNN算法的基本原理是:在特征空间中,如果一个样本最接近的K个邻居中大多数属于某一个类别,则该样本也属于这个类别。这在技术上被称为多数表决(Plurality Voting)

在这里插入图片描述

例如,K=3,KNN算法就会找到与预测点距离最近的三个点(如图中圆圈所示),看看哪种类别多一些,就将预测点归为哪类,图示表示预测点将会被归类到Class B

成功的诀窍在于如何确定数据实例之间的相似性,即怎么算是最近?因此,在进行分类之前,必须先定义距离。常见的距离度量有:欧几里得距离(p=2)、曼哈顿距离(p=1)、闵氏距离(详见:传送门)等

值得注意的是,KNN算法也是Lazy Learning模型家族的一部分,这意味着所有计算都发生在进行分类或预测时。由于它严重依赖内存来存储其所有训练数据,因此也称为基于实例或基于内存的学习方法

1.2、超参数K


K-NN算法中的K值定义了将检查多少个邻居以确定查询点的分类。例如,当K=1时,实例将被分配到与其单个最近邻相同的类

K是一种平衡行为,因为不同的值可能会导致过拟合或欠拟合。较小的K值可能具有较高的方差和较低的偏差,较大的K值可能导致较高的偏差和较低的方差

K的选择将很大程度上取决于输入数据,因为有许多异常值或噪声的数据可能会在K值较高时表现更好。总之,建议K值使用奇数以避免分类歧义,交叉验证策略可以帮助我们为数据集选择最佳K值

交叉验证(详见:传送门)会将样本数据按照一定比例拆分成训练数据和验证数据,然后从选取一个较小的K值开始,不断增加K的值,然后计算验证数据的误差,最终找到一个比较合适的K值

一般情况下,K与模型的Validation Error(模型应用于验证数据的错误)的关系如下图所示:

在这里插入图片描述

这个图其实很好理解,当K值增大时,一般错误率会降低,因为周围有更多的样本可以借鉴了;但需要注意的是,和K-Means不同,当K值很大时,错误率会更高,例如我们共有35个样本,当K增大到30时,数据的预测会把更多距离较远的数据也放入比较,最终导致预测偏差较大。相反,K值越小,则模型越过拟合。因此,我们需要针对特定问题选择一个最合适的K值,以保证模型的效果最佳

1.3、K近邻分类的优缺点


优点:

  • 超参数少,只需要一个K值和一个距离度量,易于理解和使用,预测效果较好
  • 基于内存,在数据集较小时可以快速地进行训练和预测
  • 对异常值不敏感,根据最邻近实例的类别来进行投票,从而降低了异常值对结果的影响
  • 对数据预处理要求较低,KNN不需要对数据进行复杂的预处理,例如标准化、归一化等

缺点:

  • 在数据集较大时,需要较大的存储空间和较长的计算时间,从时间和金钱的角度来看,这可能是昂贵的
  • 容易出现过拟合,较小的K值可能会过度拟合数据,K值太大,模型可能会欠拟合
  • 对噪声数据敏感,如果数据集中存在噪声数据,KNN算法可能会受到较大影响
  • 对高维数据输入表现不佳,也称峰值现象,在算法达到最佳特征数量后,额外的特征会增加分类错误的数量

2、Scikit-Learn K近邻分类

2.1、Scikit-Learn K近邻分类API


Scikit-Learn实现了两个不同的最近邻分类器:KNeighborsClassifier分类器根据每个查询点的K个最近邻实现学习,其中K是用户指定的整数值。RadiusNeighborsClassifier分类器根据每个训练点的固定半径r内的邻居数实现学习,其中r是用户指定的浮点值

K近邻分类模型sklearn.neighbors.KNeighborsClassifier的API具体如下:

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None)

官方对该API的功能描述如下:

最近邻学习有两种方式:离散标签数据的分类和连续标签数据的回归。最近邻方法背后的原理是找到在距离上离新样本最近的一些样本, 并且从这些样本中预测标签。最近邻的样本数可以是用户定义的常数(K-最近邻),也可以根据不同的点的局部密度(基于半径的近邻学习)确定。一般来说,距离可以用任意来度量:标准的欧氏距离是最常见的选择

API官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html

API中文官方文档:https://scikit-learn.org.cn/view/695.html

RadiusNeighborsClassifier分类器官方文档:https://scikit-learn.org.cn/view/704.html

API参数及说明如下:

参数说明
n_neighborsKNN算法中的K值,选取最近的K个点,默认值为5
weights预测中使用的权重函数,默认为uniform,表示统一权重,每个邻域中的所有点均被加权(权重相等);其他还有distance,表示权重点与其距离的倒数,这种情况下,距离近的点比距离远的点影响大,另外,还支持用户自定义的函数
algorithm用于计算最近邻的算法,默认为autoball_tree将使用BallTree;kd_tree将使用KDTree;brute将使用暴力搜索;
leaf_size用于指定传递给给BallTree或KDTree构建叶子节点时使用的最小样本数,默认为30。这会影响构造和查询的速度,以及存储树所需的内存

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

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

相关文章

【单调栈】力扣84.柱状图中最大的矩形

上篇文章我们介绍了使用 无重复值 单调栈代码解决 含有重复值 的问题,在文章的最后,留下了一道考察相同思想的题目,今天我们来看看如何套路解决该题。 (还没看过前几篇介绍的小伙伴赶快关注,在 「单调栈」 集合里查看…

用DataGrip连接hive时报错:User: root is not allowed to impersonate plck5,解决方法

你可以尝试关闭主机校验 修改hive安装目录下conf/hive-site.xml,将hive.server2.enable.doAs设置成false <property><name>hive.server2.enable.doAs</name><value>false</value><description>Setting this property to true will have H…

element-ui autocomplete 组件源码分享

紧接着 input 组件的源码&#xff0c;分享带输入建议的 autocomplete 组件&#xff0c;在 element-ui 官方文档上&#xff0c;没有这个组件的 api 目录&#xff0c;它的 api 是和 input 组件的 api 在一起的&#xff0c;看完源码之后发现&#xff0c;源码当中 autocomplete 组件…

java 抠取红色印章(透明背景)

一个亲戚让我帮他把照片里的红色印章抠出来&#xff0c;&#xff0c;&#xff0c;记录下处理过程&#xff0c;代码如下&#xff0c;可直接用&#xff1a; public static void signatureProcess(String sourceImagePath, String targetImagePath) {Graphics2D graphics2D null…

网络七层模型之传输层:理解网络通信的架构(四)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

算法---动态规划练习-7(按摩师)【类似打家劫舍】

按摩师 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;给定一个整数数组 nums&#xff0c;其中 nums[i] 表示第 i 天的预约时间长度。 定义两个辅助数组 f 和 g&#xff0c;长度都为 n&#xff08;n 是数组…

Android14之深入理解sp模板类(二百零二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

linux安装Zookeeper的详细步骤

1.Java环境确认 确保已经安装了Java环境&#xff0c;没有的自行安装 2.官网下载包 Apache ZooKeeper 3.安装 3.1上传到linux&#xff0c;解压 我的目录为/root/apache-zookeeper-3.8.4-bin 进入到/root/apache-zookeeper-3.8.4-bin/conf目录下&#xff0c;执行命令复制zoo…

没学数模电可以玩单片机吗?

我们首先来看一下数电模电在单片机中的应用。数电知识在单片机中主要解决各种数字信号的处理、运算&#xff0c;如数制转换、数据运算等。模电知识在单片机中主要解决各种模拟信号的处理问题&#xff0c;如采集光照强度、声音的分贝、温度等模拟信号。而数电、模电的相互转换就…

这次轮到小米,遥遥领先!

年轻人的第一辆保时米 3 月28日晚小米首款汽车小米汽车 SU7 正式发布并上市&#xff0c;新车定位于“C 级高性能生态科技轿车”&#xff0c;提供双电机版本和单电机版本车型选择&#xff0c;并提供容量为 73.6 千瓦时以及 101 千瓦时电池可选&#xff0c;售价 21.59 万元-29.99…

容器镜像加速指南:探索 Kubernetes 缓存最佳实践

介绍 将容器化应用程序部署到 Kubernetes 集群时&#xff0c;由于从 registry 中提取必要的容器镜像需要时间&#xff0c;因此可能会出现延迟。在应用程序需要横向扩展或处理高速实时数据的情况下&#xff0c;这种延迟尤其容易造成问题。幸运的是&#xff0c;有几种工具和策略…

CSGO赛事管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文&#xff08;设计&#xff09;学生选题参考合集推荐收藏&#xff08;包含Springboot、jsp、ssmvue等技术项目合集&#xff09; 目录 1. 系…

【能省则省】搭建网站仅50/年 云服务器选择建议 程序员职场刚需云产品 附最新价格对比表

《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】云服务器1分钟教会你如何选择教程 2024-开年采购活动 云服务器专区 京东云 阿里云 腾讯云 配置最新价格表 与 官方活动地址 ​ 当前活动…

【蓝桥杯省赛真题36】python最佳排列方式 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python最佳排列方式 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python最佳排列方式 第十三届蓝桥杯青少年组python比赛省赛真题 一、…

实验报告-02

实验室开放项目实验报告 实验名称&#xff1a;实验二 简单数据处理问题&#xff08;一&#xff09; 实验目的&#xff1a;熟练掌握一些简单数据处理的方法 实验内容&#xff1a; 在本地电脑中新建一个文件夹&#xff0c;用于存放C源程序&#xff0c;文件夹的名字要求是“学…

学会Sass的高级用法,减少样式冗余

在当今的前端开发领域&#xff0c;样式表语言的进步已经显著提升了代码组织性和可维护性。Sass&#xff08;Syntactically Awesome Style Sheets&#xff09;作为CSS预处理器的翘楚&#xff0c;以其强大的变量、嵌套规则、混合宏&#xff08;mixin&#xff09;、循环和函数等高…

【JavaEE初阶系列】——带你了解volatile关键字以及wait()和notify()两方法背后的原理

目录 &#x1f6a9;volatile关键字 &#x1f388;volatile 不保证原子性 &#x1f388;synchronized 也能保证内存可见性 &#x1f388;Volatile与Synchronized比较 &#x1f6a9;wait和notify &#x1f388;wait()方法 &#x1f4bb;wait(参数)方法 &#x1f388;noti…

Redis中的客户端(三)

客户端 身份验证 客户端状态的authenticated属性用于记录客户端是否通过了身份验证: typedef struct redisClient {// ...int authenticated;// ... } redisClient;如果authnticated的值为0&#xff0c;那么表示客户端未通过身份验证&#xff1b;如果authenticated的值为1&a…

【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

javaWeb项目-火车票订票信息系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Spring Boot框架 …