【机器学习】超参数的选择,以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值的得分或表现

      python 复制代码
      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的超参数值

      python 复制代码
      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算法调用得到最佳超参数

      python 复制代码
      # 当单纯使用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最佳超参数

      python 复制代码
      %%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. 代码实现:

    python 复制代码
    # 准备测试数据集
    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_ 超参数的结果:

相关推荐
补三补四1 小时前
支持向量机(一)
算法·机器学习·支持向量机
Zz_waiting.3 小时前
java数据结构_二叉树_5.4
数据结构·算法
B站计算机毕业设计超人3 小时前
计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习
大数据·hadoop·深度学习·机器学习·spark·知识图谱·课程设计
道一云黑板报3 小时前
AGI的基石:什么是机器学习
人工智能·rnn·机器学习·cnn·transformer·agi·深度神经网络
小赖同学啊3 小时前
机器学习-使用大规模的平行语料
人工智能·机器学习
vⅤ_Leon3 小时前
Machine Learning:Introduction
人工智能·机器学习
天亮有惊喜3 小时前
基于改进型灰狼优化算法(GWO)的无人机路径规划
算法·matlab·路径规划·灰狼优化算法·gwo
九亿AI算法优化工作室&3 小时前
KOA优化最近邻分类预测matlab
人工智能·python·机器学习·matlab·分类·数据挖掘·回归
程序员东min3 小时前
Python:凯撒密码
python·算法
Luo_LA4 小时前
【LeetCode Hot100 多维动态规划】最小路径和、最长回文子串、最长公共子序列、编辑距离
算法·leetcode·动态规划