zoukankan      html  css  js  c++  java
  • 【笔记】KNN之超参数

    超参数

    超参数

    很多时候,对于算法来说,关于这个传入的参数,传什么样的值是最好的?
    这就涉及到了机器学习领域的超参数
    超参数简单来说就是在我们运行机器学习之前用来指定的那个参数,就是在算法运行前需要决定的参数
    像是knn算法中的k就是典型的超参数

    同时,还有一种是模型参数,即在算法过程中学习的参数,不过由于KNN算法没有模型参数,这里就不再赘述

    那么怎么才能寻找到好的参数?
    大致分为三点:
    领域知识
    经验数值
    实验搜索
    前两种是需要专业环境来养成,关于最后一种实验搜索就可以实践体现出来

    实践部分(实验搜索)

    为保证可复现,种子为666,数据集为sklearn的手写数字数据集

    如果我们想要寻找一个好的k,可以使用一个循环,在初始的时候设置成最好的值为0,将for范围为从第二个参数开始的是个参数,那么我们在循环的过程中,每一次我们都创建一个knn_clf,进行fit操作,这样我们就可以得到当前k的分类准确度是多少
    然后我们就可以开始比较,如果当前的score比历史上的score都好,那么就将现在的变成best_score,k同理,最后输出最好的k和其对应的预测准确率

      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)
          if score > best_score:
              best_k = k
              best_score = score
    
      print("best_k =", best_k)
      print("best_score =",best_score)
    

    然而k近邻算法中是不止一个K这样的超参数
    还存在一个超参数,距离的权重(可使用倒数比较)

    本来如果按照原有的knn算法,当出现三个不一样种类的情况的时候,我们只能随机出来得到一个样本,但是使用距离权重以后,可以有效地解决这种平票的问题

    这样,我们引入距离这个想法以后,算法就变成了需不需要考虑距离这个要素的情况

      best_method = ""
      best_score = 0.0
      best_k = -1
      for method in ["uniform","distance"]:
          for k in range(1,11):
              knn_clf = KNeighborsClassifier(n_neighbors=k,weights = method)
              knn_clf.fit(X_train ,y_train)
              score = knn_clf.score(X_test,y_test)
              if score > best_score:
                  best_k = k
                  best_score = score
                  best_method = method
    
      print("best_method =",best_method)  
      print("best_k =", best_k)
      print("best_score =",best_score)
    

    输出结果

    那么距离的定义到底是什么
    我们到底需要使用哪种距离

    通过对曼哈顿距离和欧拉距离的变形推广,我们可以得到明科夫斯基距离

    这样我们就获得了一个新的超参数 p
    在sklearn中,p的默认为2,相当于取得是欧拉距离
    那么继续修改算法为

      %%time
      best_p = -1
      best_score = 0.0
      best_k = -1
    
      for k in range(1,11):
          for p in range(1,6):
              knn_clf = KNeighborsClassifier(n_neighbors=k,weights ="distance",p=p)
              knn_clf.fit(X_train ,y_train)
              score = knn_clf.score(X_test,y_test)
              if score > best_score:
                  best_k = k
                  best_score = score
                  best_p = p
    
      print("best_p =",best_p)  
      print("best_k =", best_k)
      print("best_score =",best_score)
    

    一般这种叫做网格搜索策略

    您能读到这儿,我呢是发自真心的感谢您,若要转载,还望请您带上链接
  • 相关阅读:
    DP——背包问题(三)
    堆——练习题
    DP——背包问题(二)
    二叉树的后序遍历(暴力版) 小白菜oj 1034
    树状数组2模板 Luogu 3368
    树状数组1模板 Luogu 3374
    DP——最长上升子序列(n^2与n log n)
    线段树(区间修改)模板题 Luogu 2357 守墓人
    c语言学习摘录
    python 学习摘录
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14276582.html
Copyright © 2011-2022 走看看