day05——K-近邻算法

news2024/11/25 12:26:10

K-近邻算法

  • 一、定义
  • 二、API
  • 三、实操:预测签到位置
    • 1,数据获取
    • 2,数据基本处理
    • 3,预测算法代码
  • 四、调优
    • 1,什么是交叉验证
    • 2,超参数搜索-网格搜索(Grid Search)
    • 3,调优代码
  • 五、KNN 算法总结

一、定义

如果一个样本在特征空间中的 k 个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

两个样本的距离可以通过如下公式计算,又叫欧式距离
在这里插入图片描述

二、API

# n_neighbors:int,可选(默认= 5),查询默认使用的邻居数
# algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

三、实操:预测签到位置

预测一个人签到的地方。在一个由 10 km x 10km 的正方形区域,对于给定的一组坐标,任务是返回一个最有可能的地方的排名列表。
给出的数据被制造成类似于来自移动设备的位置信号,需要处理不准确和嘈杂的位置数据,同时存在的不一致和错误的位置数据可能会破坏签到。

1,数据获取

数据存放在 train.csv 文件中,有以下特征值
图1
字段说明:

row_id:登记事件的ID
xy:坐标
准确性:定位准确性 
时间:时间戳
place_id:业务的ID,这是您预测的目标

2,数据基本处理

  • 缩小数据集范围,对数据进行逻辑筛选 DataFrame.query()
  • 删除没用的日期数据 DataFrame.drop(可以选择保留)
  • 将签到位置少于n个用户的删除
    place_count = data.groupby('place_id').count()
    tf = place_count[place_count.row_id > 3].reset_index() data = data[data['place_id'].isin(tf.place_id)]
    

3,预测算法代码

from sklearn.preprocessing import StandardScaler
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# 读取数据
data = pd.read_csv("train.csv")

# 数据逻辑筛选操作 df.query()
data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y < 2.75")

# 删除time这一列特征
data = data.drop(['time'], axis=1)

# 删除入住次数少于三次位置
place_count = data.groupby('place_id').count()
tf = place_count[place_count.row_id > 3].reset_index()
data = data[data['place_id'].isin(tf.place_id)]
    
# 取出特征值和目标值
y = data['place_id']
# drop:数据删减,axis为1时表示删除列
x = data.drop(['place_id', 'row_id'], axis=1)

# 数据分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

std = StandardScaler()

# 对训练集进行标准化
x_train = std.fit_transform(x_train)

# 对测试集进行标准化
x_test = std.fit_transform(x_test)

# 算法输入训练预测
# 参数K值:理论上:k = 根号(样本数),可轮流试出最好的参数[1,3,5,10,20,100,200]
knn = KNeighborsClassifier(n_neighbors=20)

# 调用fit()
knn.fit(x_train, y_train)

# 预测测试数据集,得出准确率
y_predict = knn.predict(x_test)

print("预测测试集类别:", y_predict)
print("准确率为:", knn.score(x_test, y_test))

由于数据量不足,运行结果预测值准确率只有百分之几,可以增加数据或者使用参数调优方法来提高准确率

四、调优

1,什么是交叉验证

将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成5份,其中一份作为验证集。然后经过5次(组)的测试,每次都更换不同的验证集。即得到5组模型的结果,取平均值作为最终结果。又称5折交叉验证。
在这里插入图片描述

2,超参数搜索-网格搜索(Grid Search)

通常情况下,很多参数需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)
# estimator:估计器对象
# param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
# cv:指定几折交叉验证

3,调优代码

对上述案例 ”签到位置预测“ K值调优

from sklearn.model_selection import GridSearchCV

# 使用网格搜索和交叉验证找到合适的参数
knn = KNeighborsClassifier()
param = {"n_neighbors": [3, 5, 10]}
gc = GridSearchCV(knn, param_grid=param, cv=2)
gc.fit(x_train, y_train)

print("选择了某个模型测试集当中预测的准确率为:", gc.score(x_test, y_test))
# 训练验证集的结果
print("在交叉验证当中验证的最好结果:", gc.best_score_)
print("gc选择了的模型K值是:", gc.best_estimator_)
print("每次交叉验证的结果为:", gc.cv_results_)

五、KNN 算法总结

优点:
简单,易于理解,易于实现,无需训练

缺点:
懒惰算法,对测试样本分类时的计算量大,内存开销大
必须指定K值,K值选择不当则分类精度不能保证

使用场景:小数据场景,几千~几万样本

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网工内推 | 应届生网工专场,最高15薪,有NP以上证书优先

01 智己汽车 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;职责描述&#xff1a; 1.管理和运维支持网络基础设备&#xff08;防火墙&#xff0c;交换机&#xff0c;路由器&#xff0c;负载均衡、无线、准入等&#xff09;&#xff1b; 2.负责公司OA网络及公有云…

类和对象以及数组工具类的常用方法

文章目录 一、类和对象二、数组工具类的常用方法 一、类和对象 1、对象没人引用时&#xff0c;会被自动回收 2、对象一定在堆上&#xff0c;引用变量不一定在栈上 3、this表示当前对象的引用&#xff0c;谁调用eat方法(eat方法里有this)&#xff0c;谁就是this。this.data访问…

C++11 使用using定义别名(替代typedef)::作用域运算符

typedef 一切合法的变量的定义可以转换为类型 typedef unsigned int uint_t;示例如下&#xff1a; 使用 typedef 重定义类型是很方便的&#xff0c;但它也有一些限制&#xff0c;比如&#xff0c;无法重定义一个模板。 现在&#xff0c;在 C11 中终于出现了可以重定义一个模…

Kerberos从入门到精通以及案例实操系列(一)

1、Kerberos部署 1.1、Kerberos概述 1.1.1、什么是Kerberos Kerberos是一种计算机网络认证协议&#xff0c;用来在非安全网络中&#xff0c;对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构&a…

STC89C52+DS18B20实现环境温度检测(数码管显示温度)

一、项目介绍 温度检测是工业自动化、生产线等众多领域中常见的应用场景之一,能及时准确地监测温度对于保障生产安全和提高生产效率有着非常重要的作用。而在现代的电子制造行业中,使用单片机和传感器等电子元器件进行温度检测已经成为了一个比较成熟的技术方案。 本项目选…

Qcom_hexagon编译自动获取目录和特定文件的方法

一&#xff0c;简介 本文主要介绍&#xff0c;如何在高通hexagon ide中的hexagon.min中添加获取目录和.c文件的方法&#xff0c;供参考。 二&#xff0c;具体命令 OBJ_PATH : ./awinic_sp_module/algo_libINCLUDE_PATH : $(shell find $(OBJ_PATH ) -type d) SRC_C_FILE : …

synchronized 的底层原理

tip: 作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 文章目录 一、synchronized 的底层原理二、synchronized 的锁升级原理1、偏向锁2、轻量级锁3、重量级锁 一…

大幅提升iOS编译速度的cocoapods二进制化插件介绍

1. 背景 驾校一点通iOS项目是采用是cocoapods来管理组件的&#xff0c;又经过多年的组件化发展&#xff0c;目前组件已经达到了120的数量。在这种组件规模下&#xff0c;主工程的打包时间也从最开始的几分钟增加到十几分钟&#xff08;M1&#xff09;、二十几分钟&#xff08;…

restTemplate转发Https请求

代码架构 package com.http.controller;import com.http.RestTemplateConfig; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework…

Vercel部署个人博客

vercel 部署静态资源网站极其方便简单&#xff0c;并且有可观的访问速度&#xff0c;最主要的是免费部署。 如果你还没有尝试的话&#xff0c;强烈建议去使用一下。 演示博客演示http://202271.xyz/?vercel vercel 介绍 注册账号 进入Vercel官网https://vercel.com&#x…

Android studio安装教程(图文详解,简单搞定)

一 下载 根据自己计算机选择对应版本点击下载 https://developer.android.google.cn/studio 二 安装Android Studio Android Studio 是Google提供的一个Android开发环境&#xff0c;基于IntelliJ IDEA类似 Eclipse ADT&#xff0c;他集成了Android 所需的开发工具。需要注意…

RocketMq的集群的搭建(2主2从异步复制集群模式)

一 RocketMq集群搭建 1.1 说明 本案例采用2m-2s-async的方式搭建集群。 实际项目中&#xff0c;为了达到高可用&#xff0c;一般会使用dleger。 https://blog.csdn.net/wssc63262/article/details/126003507 1.2 集群规划说明 集群规划说明&#xff1a; nameserver是一个…

机器学习——集成学习(装袋法Bagging、提升法Boosting、梯度提升决策树GBDT、随机森林RF)

集成学习 集成学习通过构建并结合多个学习器来完成学习任务 集成方法是用多种学习方法的组合来获取比原方法更优的结果 使用于组合的算法是弱学习算法 即分类正确率仅比随机猜测略高的学习算法 但是组合之后的效果仍可能高于强学习算法 即集成之后的算法准确率和效率都很高…

# 车载软件架构 —— 闲聊几句AUTOSAR OS(三)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标准。到最…

程序员从0到收获心仪offer,我靠训练营实现了180度逆袭!

我相信&#xff0c;在未来的职场中&#xff0c;我也能通过这段时间养成的学习习惯和生活习惯让自己一步步成为更好的自己&#xff0c;以自己为荣 我在大学里主修计算机科学与技术&#xff0c;一个普通的院校&#xff0c;一个算是常见的专业&#xff0c;我知道我的学历和一些其他…

Tomcat的部署(贼详细)

目录 一、Tomcat服务器简介 1、Tomcat服务器 2、Tomcat三大核心组件 3、 Java Servlet 4、JSP全称Java Server Pages 5、 Tomcat 功能组件结构 6、 Container 结构分析 7、Tomcat 请求过程 二&#xff1a;Tomcat部署与安装 1.关闭防火墙&#xff0c;上传所需软件包 2.安…

前端、后端工程师学习路线

学习的平台推荐 视频平台&#xff1a; 慕课&#xff1a;http://www.imooc.com/ 腾讯课堂&#xff1a;https://ke.qq.com/ 教程平台 菜鸟&#xff1a;https://www.runoob.com/ W3&#xff1a;https://www.w3school.com.cn/ yibai&#xff1a;https://www.yiibai.com/ 前端学习路…

c++—STL(六大组件)

一、STL概述 1. STL概述 &#xff08;1&#xff09;STL定义&#xff1a;STL&#xff08;standard template library&#xff09;&#xff0c;标准模板库&#xff0c;是一个高效的c程序库&#xff0c;重在提高了代码的复用性&#xff1b;主要包含了常用的数据结构和基本算法&am…

一分钟学一个 Linux 命令 - mkdir 和 touch

前言 大家好&#xff0c;我是god23bin。欢迎来到《一分钟学一个 Linux 命令》系列&#xff0c;今天需要你花两分钟时间来学习下&#xff0c;因为今天要讲的是两个命令&#xff0c;mkdir 和 touch 命令。前一个命令是操作目录的&#xff0c;后一个命令是操作文件的。 建议学完手…

蓝桥杯STC15F2K60S2单片机 CCP/PCA/PWM模块的学习与使用

有道是“一花独放不是春&#xff0c;万紫千红春满园” 我们不能只满足于 眼前所谓的 “够用、能用” 的少量知识&#xff0c;而不去深入学习探究&#xff0c;进而不慎封锁了自己的见识 和 更多 创新开发上的可能性。 曾经仅满足于学习了蓝桥杯单片机的三个外部晶振 定时器&am…