【机器学习】超参数的选择,以kNN算法为例
分类准确度
- 一、摘要
- 二、超参数的概念
- 三、调参的方法
- 四、实验搜索超参数
- 五、扩展搜索范围
- 六、考虑距离权重的kNN算法
- 七、距离的计算方法及代码实现
- 八、明可夫斯基距离的应用
- 九、网格搜索超参数
一、摘要
本博文讲解了机器学习中的超参数
问题,以K近邻算法为例
,介绍了超参数的概念及其重要性。讲解了如何通过实验搜索
确定最佳
的超参数值
,如k值的选择
,并介绍了距离权重
的考虑和明可夫斯基距离
的计算方法。同时,探讨了如何通过网格搜索策略来寻找最优的超参数组合。最后,强调了机器学习工程师在进行调参
时需要考虑领域知识
和经验数值
的重要性。
二、超参数的概念
- 超参数是在
运行机器学习算法之前
需要指定的参数
。 - kNN算法中的
k是一个典型的超参数
。 - 超参数与模型参数的
区别
在于,超参数在算法运行前决定,而模型参数在算法过程中学习。
三、调参的方法
- 调参的目标是找到最好的超参数。
- 领域知识和经验数值是寻找超参数的重要途径。
- 对于具体问题,最好的超参数可能不同于经验数值,需要通过实验搜索确定。
四、实验搜索超参数
- 通过循环测试不同k值,找到最佳的k值。
- 初始化最佳准确率和最佳k值,循环遍历k的取值范围。
- 对每个k值,创建kNN分类器并计算准确率,更新最佳准确率和最佳k值。
五、扩展搜索范围
- 如果找到的最佳k值在搜索范围的边界上,建议扩展搜索范围以寻找更好的值。
六、考虑距离权重的kNN算法
- kNN算法可以考虑距离的权重,通常使用距离的倒数作为权重。
- 距离越近,权重越大。
- 考虑距离权重可以更好地解决
平票问题
。 - 权重weight的选择:
- kNN分类器中有一个
weight
参数,默认值为uniform
,表示不考虑距离权重
。 - 将位次参数设置为
distance
时,会考虑距离权重
,可使用明可夫斯基距离。 - 通过实验搜索找到最佳的weight参数。
- kNN分类器中有一个
七、距离的计算方法及代码实现
- 距离的计算方法包括
欧拉距离
和曼哈顿距离
。 欧拉距离
是每个维度上差值的平方和的平方根。
曼哈顿距离
是每个维度上差值的绝对值的和。
明可夫斯基距离
是每个维度上差值的绝对值的p次方和的p次方根。
- 三者的关系
p=1时,明可夫斯基距离为曼哈顿距离;p=2时,为欧拉距离。
- 通过寻找kNN超参数,利用手写数字数据集作为训练集和测试集
-
准备手写数字数据集,并调用scikit-learn中的kNN算法在指定k值的得分或表现
import numpy as np from sklearn import datasets# 准备数据集 digits = datasets.load_digits() X = digits.data y = digits.target# 将数据集拆分为训练集和测试集 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=666)# 指定sklearn中kNN中的k值为3 from sklearn.neighbors import KNeighborsClassifier knn_clf = KNeighborsClassifier(n_neighbors=3) knn_clf.fit(X_train,y_train) knn_clf.score(X_test,y_test)
在Jupyter中执行过程及结果如下:
-
寻找最佳的k的超参数值
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=666)best_score = 0.0 # 设置默认准确度 best_k = -1 # 设置默认值 for k in range(1,11):knn_clf = KNeighborsClassifier(n_neighbors = k)knn_clf.fit(X_train,y_train)score= knn_clf.score(X_test,y_test) # 调用score函数得出knn算法准确度# 判断当前的score是否大于当前的best_score,如果是,则重新赋值if score > best_score:best_k = kbest_score = score print("best_k = ",best_k) print("best_score = ",best_score)
在Jupyter中执行过程及结果如下:
-
考虑距离权重的kNN算法调用得到最佳超参数
# 当单纯使用KNN距离远近来作为分类的依据时,会存在离得近的点总数少于离得稍微远的点的总数,到时分类错误。可使用权重参数,通过选择一个合理的method方法来解决。 # 当投票时出现平票时,需要考虑使用距离的权重来解决; 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=666)best_method = None # kNN的一个超参数 best_score = 0.0 # 设置默认准确度 best_k = -1 # 设置默认值,为kNN默认的超参数 for method in ["uniform","distance"]:for k in range(1,11):knn_clf = KNeighborsClassifier(n_neighbors = k,weights=method) # weights 就是权重knn_clf.fit(X_train,y_train)score= knn_clf.score(X_test,y_test) # 调用score函数得出knn算法准确度# 判断当前的score是否大于当前的best_score,如果是,则重新赋值if score > best_score:best_k = kbest_score = scorebest_method = methodprint("best_k = ",best_k) print("best_score = ",best_score) print("best_method = ",best_method)
在jupyter中执行过程及结果如下:
-
考虑使用明可夫斯基距离来搜索kNN最佳超参数
%%timefrom 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=666)best_p = -1 # kNN的一个超参数 best_score = 0.0 # 设置默认准确度 best_k = -1 # 设置默认值,为kNN默认的超参数 for k in range(1,11):for p in range(1,6):knn_clf = KNeighborsClassifier(n_neighbors = k,weights="distance",p=p) # 使用明可夫斯基距离时,weights必须是distanceknn_clf.fit(X_train,y_train)score= knn_clf.score(X_test,y_test) # 调用score函数得出knn算法准确度# 判断当前的score是否大于当前的best_score,如果是,则重新赋值if score > best_score:best_k = kbest_score = scorebest_p = pprint("best_k = ",best_k) print("best_score = ",best_score) print("best_p = ",best_p)
在jupyter中执行的过程和结果如下所示:
-
八、明可夫斯基距离的应用
- 明可夫斯基距离可以表示多种距离计算方法。
- 通过搜索不同的p值,找到最适合当前问题的距离计算方法。
九、网格搜索超参数
- 网格搜索是一种系统搜索超参数的方法。
- 通过遍历所有可能的超参数组合,找到最佳组合。
- 代码实现:
执行结果如下:# 准备测试数据集 import numpy as np from sklearn import datasets digits = datasets.load_digits() X = digits.data y = digits.target 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=666)from sklearn.neighbors import KNeighborsClassifierknn_clf = KNeighborsClassifier(n_neighbors=3)# 定义网格参数 param_grid = [{'weights': ['uniform'],'n_neighbors': [ i for i in range(1,11)]},{'weights': ['distance'],'n_neighbors': [i for i in range(1,11)],'p' : [i for i in range(1,6)]} ] # 引入GridSearchCV 网格搜索 from sklearn.model_selection import GridSearchCV grid_search = GridSearchCV(knn_clf,param_grid) grid_search = GridSearchCV(knn_clf,param_grid,n_jobs=-1,verbose=2) grid_search.fit(X_train,y_train) # 查看相关参数 grid_search.best_estimator_ grid_search.best_score_ grid_search.best_params_
fit函数执行效果:
best_estimator_结果:
best_score_ 结果:
best_params_ 超参数的结果:
相关文章:

【机器学习】超参数的选择,以kNN算法为例
分类准确度 一、摘要二、超参数的概念三、调参的方法四、实验搜索超参数五、扩展搜索范围六、考虑距离权重的kNN算法七、距离的计算方法及代码实现八、明可夫斯基距离的应用九、网格搜索超参数 一、摘要 本博文讲解了机器学习中的超参数问题,以K近邻算法为例&#…...

【RabbitMQ的监听器容器Simple和Direct】 实现和场景区别
在Spring Boot中,RabbitMQ的两种监听器容器(SimpleMessageListenerContainer和DirectMessageListenerContainer)在实现机制和使用场景上有显著差异。以下是它们的核心区别、配置方式及最佳实践: Simple类型 Direct类型 一、核心…...
NO.13十六届蓝桥杯备战|条件操作符|三目操作符|逻辑操作符|!||||(C++)
条件操作符 条件操作符介绍 条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下: exp1 ? exp2 : exp3条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算, exp2 计算的结果是整个表达式的结果&am…...

2025.1.8(qt图形化界面之消息框)
笔记(后期复习补充) 作业 1> 手动将登录项目实现,不要使用拖拽编程 并且,当点击登录按钮时,后台会判断账号和密码是否相等,如果相等给出登录成功的提示,并且关闭当前界面,发射一…...

旅游行业内容管理系统CMS提升网站建设效率与体验
内容概要 在如今快速发展的互联网时代,旅游行业对网站的要求越来越高,内容管理系统(CMS)的应用不可或缺。以 Baklib 为代表的先进CMS可显著提高旅游网站的建设效率与用户体验。为了满足不断变化的市场需求,这些系统通…...
使用 Scrapy 抓取网页数据
1. Scrapy 简介 Scrapy 是一个流行的 Python 爬虫框架,提供了强大的工具和灵活的扩展机制,用于高效抓取和处理网页数据。它支持异步 I/O,速度快且资源消耗低,非常适合大规模爬取任务。 2. 安装 Scrapy 确保你的 Python 环境版本…...

C# OpenCV机器视觉:SoftNMS非极大值抑制
嘿,你知道吗?阿强最近可忙啦!他正在处理一个超级棘手的问题呢,就好像在一个混乱的战场里,到处都是乱糟糟的候选框,这些候选框就像一群调皮的小精灵,有的重叠在一起,让阿强头疼不已。…...
kamailio关于via那点事
如果kamailio作为代理服务器,在转到目的路由时 不删除原始的via信息 会造成信息泄露 如果 Kamailio 作为代理服务器(SIP Proxy)在转发 SIP 请求时不删除原始的 Via 信息,这确实可能会造成信息泄露。 📌 为什么不删除 …...

[MFC] 使用控件
介绍如何使用控件,以及如何获取控件中的数值 check Box 添加点击事件,即选中和取消选中触发的事件 第一种方式是按照如下方式第二种方式是直接双击点击进去 void CMFCApplication1Dlg::OnBnClickedCheckSun() {// TODO: 在此添加控件通知处理程序代…...

【探索未来科技】2025年国际学术会议前瞻
【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…...

使用wpa_supplicant和wpa_cli 扫描wifi热点及配网
一:简要说明 交叉编译wpa_supplicant工具后会有wpa_supplicant和wpa_cli两个程序生产,如果知道需要连接的wifi热点及密码的话不需要遍历及查询所有wifi热点的名字及信号强度等信息的话,使用wpa_supplicant即可,否则还需要使用wpa_…...

Sealos的k8s高可用集群搭建
Sealos 介绍](https://sealos.io/zh-Hans/docs/Intro) Sealos 是一个 Go 语言开发的简单干净且轻量的 Kubernetes 集群部署工具,能很好的支持在生产环境中部署高可用的 Kubernetes 集群。 Sealos 特性与优势 支持离线安装,工具与部署资源包分离&#…...
Android和DLT日志系统
1 Linux Android日志系统 1.1 内核logger机制 drivers/staging/android/logger.c static size_t logger_offset( struct logger_log *log, size_t n) { return n & (log->size - 1); } 写的off存在logger_log中(即内核内存buffer)&am…...

【openresty服务器】:源码编译openresty支持ssl,增加service系统服务,开机启动,自己本地签名证书,配置https访问
1,openresty 源码安装,带ssl模块 https://openresty.org/cn/download.html (1)PCRE库 PCRE库支持正则表达式。如果我们在配置文件nginx.conf中使用了正则表达式,那么在编译Nginx时就必须把PCRE库编译进Nginx…...

如何将网站提交百度收录完整SEO教程
百度收录是中文网站获取流量的重要渠道。本文以我的网站,www.mnxz.fun(当然现在没啥流量) 为例,详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…...

【STM32】ADC|多通道ADC采集
本次实现的是ADC实现数字信号与模拟信号的转化,数字信号时不连续的,模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法,使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时,0~ 3.3v(模拟信…...
蓝桥杯算法日记|贪心、双指针
3412 545 2928 2128 贪心学习总结: 1、一般经常用到sort(a,an);【a[n]】排序,可以给整数排,也可以给字符串按照字典序排序 2、每次选最优 双指针 有序数组、字符串、二分查找、数字之和、反转字…...
ArcGIS Pro SDK (二十七)自定义许可
ArcGIS Pro SDK (二十七)自定义许可 环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 文章目录 ArcGIS Pro SDK (二十七)自定义许可1 在Config.xaml中添加扩展配置2 在Module1.cs中实现接口IExtensionConfig1 在Config.xaml中添加扩展配置 <modules><inse…...

通过客户端Chatbox或OpenwebUI访问识别不到本地ollama中的模型等问题的解决
Chatbox和Open WebUI 等无法获取到 Ollama里的模型,主要是由以下原因导致: Ollama 服务未正确暴露给 Docker 容器或客户端模型未正确下载或名称不匹配网络配置或权限问题 排查以上问题的思路首先排查ollama服务是否启动,然后再看端口号 使…...
速度超越DeepSeek!Le Chat 1100tok/s闪电回答,ChatGPT 4o和DeepSeek R1被秒杀?
2023年,当全球科技界还在ChatGPT引发的AI狂潮中沉浮时,一场来自欧洲的"静默革命"正悄然改变游戏规则。法国人工智能公司Mistral AI推出的聊天机器人Le Chat以"比ChatGPT快10倍"的惊人宣言震动业界,其背后承载的不仅是技术…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...