当前位置: 首页 > news >正文

【机器学习】超参数的选择,以kNN算法为例

分类准确度

  • 一、摘要
  • 二、超参数的概念
  • 三、调参的方法
  • 四、实验搜索超参数
  • 五、扩展搜索范围
  • 六、考虑距离权重的kNN算法
  • 七、距离的计算方法及代码实现
  • 八、明可夫斯基距离的应用
  • 九、网格搜索超参数

一、摘要

本博文讲解了机器学习中的超参数问题,以K近邻算法为例,介绍了超参数的概念及其重要性。讲解了如何通过实验搜索确定最佳超参数值,如k值的选择,并介绍了距离权重的考虑和明可夫斯基距离的计算方法。同时,探讨了如何通过网格搜索策略来寻找最优的超参数组合。最后,强调了机器学习工程师在进行调参时需要考虑领域知识经验数值的重要性。

二、超参数的概念

  1. 超参数是在运行机器学习算法之前需要指定的参数
  2. kNN算法中的k是一个典型的超参数
  3. 超参数模型参数区别在于,超参数在算法运行前决定,而模型参数算法过程中学习。

三、调参的方法

  1. 调参的目标是找到最好的超参数。
  2. 领域知识和经验数值是寻找超参数的重要途径。
  3. 对于具体问题,最好的超参数可能不同于经验数值,需要通过实验搜索确定。

四、实验搜索超参数

  1. 通过循环测试不同k值,找到最佳的k值。
  2. 初始化最佳准确率和最佳k值,循环遍历k的取值范围。
  3. 对每个k值,创建kNN分类器并计算准确率,更新最佳准确率和最佳k值。

五、扩展搜索范围

  1. 如果找到的最佳k值在搜索范围的边界上,建议扩展搜索范围以寻找更好的值。

六、考虑距离权重的kNN算法

  1. kNN算法可以考虑距离的权重,通常使用距离的倒数作为权重。
  2. 距离越近,权重越大。
  3. 考虑距离权重可以更好地解决平票问题
  4. 权重weight的选择:
    • kNN分类器中有一个weight参数,默认值为uniform,表示不考虑距离权重
    • 将位次参数设置为distance时,会考虑距离权重,可使用明可夫斯基距离。
    • 通过实验搜索找到最佳的weight参数。

七、距离的计算方法及代码实现

  1. 距离的计算方法包括欧拉距离曼哈顿距离
  2. 欧拉距离是每个维度上差值的平方和的平方根。
    在这里插入图片描述
  3. 曼哈顿距离是每个维度上差值的绝对值的和。
    在这里插入图片描述
  4. 明可夫斯基距离是每个维度上差值的绝对值的p次方和的p次方根。
    在这里插入图片描述
  5. 三者的关系
    p=1时,明可夫斯基距离为曼哈顿距离;p=2时,为欧拉距离。
    在这里插入图片描述
  6. 通过寻找kNN超参数,利用手写数字数据集作为训练集和测试集
    1. 准备手写数字数据集,并调用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中执行过程及结果如下:
      在这里插入图片描述

    2. 寻找最佳的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中执行过程及结果如下:
      在这里插入图片描述

    3. 考虑距离权重的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中执行过程及结果如下:
      在这里插入图片描述

    4. 考虑使用明可夫斯基距离来搜索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中执行的过程和结果如下所示:
      在这里插入图片描述

八、明可夫斯基距离的应用

  1. 明可夫斯基距离可以表示多种距离计算方法。
  2. 通过搜索不同的p值,找到最适合当前问题的距离计算方法。

九、网格搜索超参数

  1. 网格搜索是一种系统搜索超参数的方法。
  2. 通过遍历所有可能的超参数组合,找到最佳组合。
  3. 代码实现:
    # 准备测试数据集
    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&#xf…...

如何将网站提交百度收录完整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里的模型&#xff0c;主要是由以下原因导致&#xff1a; Ollama 服务未正确暴露给 Docker 容器或客户端模型未正确下载或名称不匹配网络配置或权限问题 排查以上问题的思路首先排查ollama服务是否启动&#xff0c;然后再看端口号 使…...

速度超越DeepSeek!Le Chat 1100tok/s闪电回答,ChatGPT 4o和DeepSeek R1被秒杀?

2023年&#xff0c;当全球科技界还在ChatGPT引发的AI狂潮中沉浮时&#xff0c;一场来自欧洲的"静默革命"正悄然改变游戏规则。法国人工智能公司Mistral AI推出的聊天机器人Le Chat以"比ChatGPT快10倍"的惊人宣言震动业界&#xff0c;其背后承载的不仅是技术…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...