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

news/2025/2/11 5:03:37/

分类准确度

  • 一、摘要
  • 二、超参数的概念
  • 三、调参的方法
  • 四、实验搜索超参数
  • 五、扩展搜索范围
  • 六、考虑距离权重的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_ 超参数的结果:
    在这里插入图片描述

http://www.ppmy.cn/news/1571067.html

相关文章

Java WORD和PDF互相转换以及数据填充示例

最近碰到一个需求,就是有一些 WORD 或者 PDF 的模板,然后根据用户填入的数据填充进去,还要根据用户选择要 PDF 还是 WORD 下载下来 所以综合下来就是两个功能: 1.WORD 和 PDF 模板填充 2.WORD 和 PDF 互相转换 直接上代码 首先…

采用DDNS-GO与cloudflare实现双域名同时访问NAS

这个标题其实解释的还不够清楚,本人是小白,但是买了群晖的NAS后自己瞎折腾了一下,遇到了如下的问题: 1、家里是移动宽带,没有公网IP,因此Ipv4无法使用,IPV6可以正常使用。 2、办公室场地采用的…

win10向windows server服务器传输文件

win10向windows server服务器传输文件 遇到无法直接拖动文件进行传输时 解决方案: 1.点击显示选项 2.点击本地资源-详细信息 3.在窗口中选择你需要共享的磁盘 4.然后远程连接到Windows server服务器 5.登录Windows server服务器后,在此电脑下就能看…

蓝桥杯准备 【入门3】循环结构

素数小算法&#xff08;埃氏筛&&欧拉筛&#xff09; 以下四段代码都是求20以内的所有素数 1.0版求素数 #include<iostream> using namespace std;int main() {int n 20;for(int i2;i<n;i){int j0;for(j2;j<i;j)//遍历i{if(i%j0){break;}}if(ij){cout&l…

k8s dial tcp 127.0.0.1:6443: connect: connection refused排查流程及解决思路

前言 k8s 集群中&#xff0c;使用 kubelet 报错&#xff0c;如下&#xff1a; The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port? 排查思路 1. 检查环境是否正常 1.1 确认是否在 Master 节点排查 确保当前操作的机器是 Kub…

【从0开始】使用Flax NNX API 构建简单神经网络并训练

与 Linen API 不同&#xff0c;NNX 使用起来对初学者更加简单&#xff0c;跟 PyTorch 的体验更加接近。 任务 使用MLP拟合简单函数&#xff1a; y 2 x 2 1 y2x^21 y2x21 代码 import jax.numpy as jnp import jax.random as jrm import optax as ox from jax import Arra…

Java面试题-计算机网络

文章目录 1.介绍一下TCP/IP五层模型&#xff1f;2.**什么是TCP三次握手、四次挥手&#xff1f;**1.三次握手建立连接2.四次握手断开连接 **3.HTTPS和HTTP的区别是什么&#xff1f;**4.**浏览器输入www.taobao.com回车之后发生了什么**&#xff1f;1.URL解析&#xff0c;对URL进…

Windows系统中常用的命令

随着Windows系统的不断改进&#xff0c;维护系统时有时候会因为新系统的更新而找不到对应的模块或者相关的信息入口&#xff0c;这个时候&#xff0c;记住一些命令就可以起到很好的帮助作用。 比如&#xff0c;windows11中的网络属性的修改&#xff0c;可能习惯了windows10或者…