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

news2025/2/11 11:15:53

分类准确度

  • 一、摘要
  • 二、超参数的概念
  • 三、调参的方法
  • 四、实验搜索超参数
  • 五、扩展搜索范围
  • 六、考虑距离权重的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 = k
              best_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 = k
                  best_score = score
                  best_method = method
      
      
      print("best_k = ",best_k)
      print("best_score = ",best_score)
      print("best_method = ",best_method)
      

      在jupyter中执行过程及结果如下:
      在这里插入图片描述

    4. 考虑使用明可夫斯基距离来搜索kNN最佳超参数

      %%time
      
      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_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必须是distance
              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 = k
                  best_score = score
                  best_p = p
      
      
      print("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 KNeighborsClassifier
    
    knn_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_ 超参数的结果:
    在这里插入图片描述

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

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

相关文章

哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测

哪吒闹海!SCI算法分解组合四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测 目录 哪吒闹海!SCI算法分解组合四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测效果一览基本介绍程序设计参考资料 效果一览…

Django开发入门 – 3.用Django创建一个Web项目

Django开发入门 – 3.用Django创建一个Web项目 Build A Web Based Project With Django By JacksonML 本文简要介绍如何利用最新版Python 3.13.2来搭建Django环境,以及创建第一个Django Web应用项目,并能够运行Django Web服务器。 创建该Django项目需…

2025.2.8——二、Confusion1 SSTI模板注入|Jinja2模板

题目来源:攻防世界 Confusion1 目录 一、打开靶机,整理信息 二、解题思路 step 1:查看网页源码信息 step 2:模板注入 step 3:构造payload,验证漏洞 step 4:已确认为SSTI漏洞中的Jinjia2…

【C语言标准库函数】标准输入输出函数详解[5]:格式化文件输入输出

目录 一、fprintf() 函数 1.1. 函数简介 1.2. fprintf使用场景 1.3. 注意事项 1.4. 示例 二、fscanf() 函数 2.1. 函数简介 2.2. fscanf使用场景 2.3. 注意事项 2.3. 示例 三、总结 在 C 语言中,格式化文件输入输出函数能够让我们以特定的格式对文件进行…

【详细版】DETR系列之Deformable DETR(2021 ICLR)

论文标题Deformable DETR: Deformable Transformers for End-to-End Object Detection论文作者Xizhou Zhu, Weijie Su, Lewei Lu, Bin Li, Xiaogang Wang, Jifeng Dai发表日期2021年03月01日GB引用> Xizhou Zhu, Weijie Su, Lewei Lu, et al. Deformable DETR: Deformable T…

c++----函数重载

目录标题 为什么会有函数重载函数重载的概念函数重载的例子第一个:参数的类型不同第二个:参数的个数不同第三种:类型的顺序不同函数重载的奇异性重载函数的底层原理有关函数重载的一个问题 为什么会有函数重载 大家在学c语言的时候有没有发现…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者:谢吉宝(唐三) 编者按: 云原生 API 网关系列教程即将推出,欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三) 在云栖大会的精…

多头自注意力中的多头作用及相关思考

文章目录 1. num_heads2. pytorch源码演算 1. num_heads 将矩阵的最后一维度进行按照num_heads的方式进行切割矩阵,具体表示如下: 2. pytorch源码演算 pytorch 代码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

对接DeepSeek

其实,整个对接过程很简单,就四步,获取key,找到接口文档,接口测试,代码对接。 获取 KEY https://platform.deepseek.com/transactions 直接付款就是了(现在官网暂停充值2025年2月7日&#xff0…

ChatGPT提问技巧:行业热门应用提示词案例-文案写作

ChatGPT 作为强大的 AI 语言模型,已经成为文案写作的得力助手。但要让它写出真正符合你需求的文案,关键在于如何与它“沟通”,也就是如何设计提示词(Prompt)。以下是一些实用的提示词案例,帮助你解锁 ChatG…

分享如何通过Mq、Redis、XxlJob实现算法任务的异步解耦调度

一、背景 1.1 产品简介 基于大模型塔斯,整合传统的多项能力(NLP、OCR、CV等),构建以场景为中心的新型智能文档平台。通过文档审阅,实现结构化、半结构化和非结构化文档的信息获取、处理及审核,同时基于大…

8.flask+websocket

http是短连接,无状态的。 websocket是长连接,有状态的。 flask中使用websocket from flask import Flask, request import asyncio import json import time import websockets from threading import Thread from urllib.parse import urlparse, pars…

【大模型实战】使用Ollama+Chatbox实现本地Deepseek R1模型搭建

下载安装Ollama Ollama官方链接:https://ollama.com/,打开链接后就可以看到大大的下载按钮,如下图: 我选择用Win的安装。将Ollama的安装包下载到本地,如果下载慢可以复制链接到迅雷里面,提高下载速度,如下图: 双击之后,就可以开始安装了,如下图: 默认安装到C盘,…

VMware 虚拟机 ubuntu 20.04 扩容工作硬盘

一、关闭虚拟机 关闭虚拟机参考下图,在vmware 调整磁盘容量 二、借助工具fdisk testubuntu ~ $ df -h Filesystem Size Used Avail Use% Mounted on udev 1.9G 0 1.9G 0% /dev tmpfs 388M 3.1M 385M 1% /run /dev/sda5 …

【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)

岭回归(Ridge Regression)中的 α 值 岭回归(Ridge Regression)是一种 带有 L2​ 正则化 的线性回归方法,用于处理多重共线性(Multicollinearity)问题,提高模型的泛化能力。其中&am…

9 Pydantic复杂数据结构的处理

在构建现代 Web 应用时,我们往往需要处理复杂的输入和输出数据结构。例如,响应数据可能包含嵌套字典、列表、元组,甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库,可以帮助我们轻松地处理这些复杂的数据结构&#…

Day62_补20250210_图论part6_108冗余连接|109.冗余连接II

Day62_20250210_图论part6_108冗余连接|109.冗余连接II 108冗余连接 【把题意转化为并查集问题】 题目 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图&am…

kafka消费端之消费者协调器和组协调器

文章目录 概述回顾历史老版本获取消费者变更老版本存在的问题 消费者协调器和组协调器新版如何解决老版本问题再均衡过程**第一阶段CFIND COORDINATOR****第二阶段(JOINGROUP)**选举消费组的lcader选举分区分配策略 第三阶段(SYNC GROUP&…

IDEA升级出现问题Failed to prepare an update Temp directory inside installation

IDEA升级出现问题"Failed to prepare an update Temp directory inside installation…" 问题来源: 之前修改了IDEA的默认配置文件路径,然后升级新版本时就无法升级,提示"Failed to prepare an update Temp directory insid…