什么是Grid Search 网格搜索?

Grid Search:一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)

Simple Grid Search:简单的网格搜索

以2个参数的调优过程为例:

from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split iris = load_iris() X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=0) print("Size of training set:{} size of testing set:{}".format(X_train.shape[0],X_test.shape[0])) #### grid search start best_score = 0 for gamma in [0.001,0.01,0.1,1,10,100]: for C in [0.001,0.01,0.1,1,10,100]: svm = SVC(gamma=gamma,C=C)#对于每种参数可能的组合,进行一次训练; svm.fit(X_train,y_train) score = svm.score(X_test,y_test) if score > best_score:#找到表现最好的参数 best_score = score best_parameters = {'gamma':gamma,'C':C} #### grid search end print("Best score:{:.2f}".format(best_score)) print("Best parameters:{}".format(best_parameters))

输出:

Size of training set:112 size of testing set:38 Best score:0.973684 Best parameters:{'gamma': 0.001, 'C': 100}

存在的问题:

原始数据集划分成训练集和测试集以后,其中测试集除了用作调整参数,也用来测量模型的好坏;这样做导致最终的评分结果比实际效果要好。(因为测试集在调参过程中,送到了模型里,而我们的目的是将训练模型应用在unseen data上);

解决方法:

对训练集再进行一次划分,分成训练集和验证集,这样划分的结果就是:原始数据划分为3份,分别为:训练集、验证集和测试集;其中训练集用来模型训练,验证集用来调整参数,而测试集用来衡量模型表现好坏。

X_trainval,X_test,y_trainval,y_test = train_test_split(iris.data,iris.target,random_state=0)
X_train,X_val,y_train,y_val = train_test_split(X_trainval,y_trainval,random_state=1)
print("Size of training set:{} size of validation set:{} size of teseting set:{}".format(X_train.shape[0],X_val.shape[0],X_test.shape[0])) best_score = 0.0 for gamma in [0.001,0.01,0.1,1,10,100]: for C in [0.001,0.01,0.1,1,10,100]: svm = SVC(gamma=gamma,C=C) svm.fit(X_train,y_train) score = svm.score(X_val,y_val) if score > best_score: best_score = score best_parameters = {'gamma':gamma,'C':C} svm = SVC(**best_parameters) #使用最佳参数,构建新的模型 svm.fit(X_trainval,y_trainval) #使用训练集和验证集进行训练,more data always results in good performance. test_score = svm.score(X_test,y_test) # evaluation模型评估 print("Best score on validation set:{:.2f}".format(best_score)) print("Best parameters:{}".format(best_parameters)) print("Best score on test set:{:.2f}".format(test_score))

输出:

Size of training set:84 size of validation set:28 size of teseting set:38 Best score on validation set:0.96 Best parameters:{'gamma': 0.001, 'C': 10} Best score on test set:0.92
然而,这种间的的grid search方法,其最终的表现好坏与初始数据的划分结果有很大的关系,为了处理这种情况,我们采用交叉验证的方式来减少偶然性。

Grid Search with Cross Validation

from sklearn.model_selection import cross_val_scorebest_score = 0.0
for gamma in [0.001,0.01,0.1,1,10,100]: for C in [0.001,0.01,0.1,1,10,100]: svm = SVC(gamma=gamma,C=C) scores = cross_val_score(svm,X_trainval,y_trainval,cv=5) #5折交叉验证 score = scores.mean() #取平均数 if score > best_score: best_score = score best_parameters = {"gamma":gamma,"C":C} svm = SVC(**best_parameters) svm.fit(X_trainval,y_trainval) test_score = svm.score(X_test,y_test) print("Best score on validation set:{:.2f}".format(best_score)) print("Best parameters:{}".format(best_parameters)) print("Score on testing set:{:.2f}".format(test_score))

输出:

Best score on validation set:0.97
Best parameters:{'gamma': 0.01, 'C': 100} Score on testing set:0.97

交叉验证经常与网格搜索进行结合,作为参数评价的一种方法,这种方法叫做grid search with cross validation。sklearn因此设计了一个这样的类GridSearchCV,这个类实现了fit,predict,score等方法,被当做了一个estimator,使用fit方法,该过程中:(1)搜索到最佳参数;(2)实例化了一个最佳参数的estimator;

from sklearn.model_selection import GridSearchCV#把要调整的参数以及其候选值 列出来;
param_grid = {"gamma":[0.001,0.01,0.1,1,10,100], "C":[0.001,0.01,0.1,1,10,100]} print("Parameters:{}".format(param_grid)) grid_search = GridSearchCV(SVC(),param_grid,cv=5) #实例化一个GridSearchCV类 X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=10) grid_search.fit(X_train,y_train) #训练,找到最优的参数,同时使用最优的参数实例化一个新的SVC estimator。 print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test))) print("Best parameters:{}".format(grid_search.best_params_)) print("Best score on train set:{:.2f}".format(grid_search.best_score_))

输出:

Parameters:{'gamma': [0.001, 0.01, 0.1, 1, 10, 100], 'C': [0.001, 0.01, 0.1, 1, 10, 100]} Test set score:0.97 Best parameters:{'C': 10, 'gamma': 0.1} Best score on train set:0.98
Grid Search 调参方法存在的共性弊端就是:耗时;参数越多,候选值越多,耗费时间越长!所以,一般情况下,先定一个大范围,然后再细化。

总而言之,言而总之

  • Grid Search:一种调优方法,在参数列表中进行穷举搜索,对每种情况进行训练,找到最优的参数;由此可知,这种方法的主要缺点是 比较耗时!

https://www.cnblogs.com/ysugyl/p/8711205.html

转载于:https://www.cnblogs.com/Rvin/p/11058216.html

调参必备---GridSearch网格搜索相关推荐

  1. Lesson 6.5Lesson 6.6.1Lesson 6.6.2 机器学习调参基础理论与网格搜索多分类评估指标的macro与weighted过程GridSearchCV的进阶使用方法

    Lesson 6.5 机器学习调参基础理论与网格搜索 在上一小节执行完手动调参之后,接下来我们重点讨论关于机器学习调参的理论基础,并且介绍sklearn中调参的核心工具--GridSearchCV. ...

  2. 几种机器学习常用调参方式对比(网格搜索,随机搜索,贝叶斯优化)

    网格搜索(GridSearchCV): grid search就是穷举,穷举所有得超参组合 Ex:当对决策树调参,若只对一个超参优化,如树的最大深度,尝试[3,5,7],则可表示为 若还想对分裂标准进 ...

  3. Python的数据分析中超参数调优方法:网格搜索

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python的数据分析中 超参数调优方法:网格搜索 ● 选择题 以下说 ...

  4. 参数调优:K折交叉验证与GridSearch网格搜索

    本文代码及数据集来自<Python大数据分析与机器学习商业案例实战> 一.K折交叉验证 在机器学习中,因为训练集和测试集的数据划分是随机的,所以有时会重复地使用数据,以便更好地评估模型的有 ...

  5. 调参必备--Grid Search网格搜索

    什么是Grid Search 网格搜索? Grid Search:一种调参手段:穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果.其原理就像是在数组里找最 ...

  6. LightGBM 重要参数、方法、函数理解及调参思路、网格搜索(附例子)

    文章目录 一.LightGBM 原生接口 重要参数 训练参数 预测方法 绘制特征重要性 分类例子 回归例子 二.LightGBM 的 sklearn 风格接口 LGBMClassifier 基本使用 ...

  7. c语言网格搜索算法例题,模型参数选择方法——GridSearch网格搜索

    在日常模型训练过程中,模型有多种选择,模型的参数同样也有多种选择,如何根据同一批数据选出最适合的模型和参数呢? 一般情况下,模型还比较好选择,是选用机器学习中分类模型例如 LR.SVM或XGBoost ...

  8. 贝叶斯分析助你成为优秀的调参侠:自动化搜索物理模型的参数空间

    ©PaperWeekly 原创 · 作者|庞龙刚 学校|华中师范大学 研究方向|能核物理.人工智能 做研究的时候经常莫名其妙的发现自己成了调参侠,为了使用物理模型拟合某组实验数据,不断在模型参数空间人 ...

  9. python网格搜索核函数_机器学习笔记——模型调参利器 GridSearchCV(网格搜索)参数的说明...

    算法 数据结构 机器学习笔记--模型调参利器 GridSearchCV(网格搜索)参数的说明 GridSearchCV,它存在的意义就是自动调参,只要把参数输进去,就能给出最优化的结果和参数.但是这个 ...

最新文章

  1. php mysql zend linux_在Linux系统中安装Apache+MySQL+php+phpMyAdmin+Zend
  2. 一起做激光SLAM:ICP匹配用于闭环检测
  3. poj-1159 Palindrome **
  4. 有关java的读书软件吗_我手机没JAVA,能用什么读书软件、
  5. plsql command window 执行批量脚本
  6. C++ opengl GL_QUAD_STRIP的绘制
  7. Go语言学习之GOPATH
  8. mysql调用短信接口_短信平台接口调用方法参考
  9. 转:mysql show processlist命令 详解
  10. python list的+=操作
  11. oracle delete误删除表数据进行恢复
  12. 极域电子教室师生端连接不上怎么解决
  13. 读研究生的目的之我见
  14. HDFS源码解析---Balancer
  15. 对Windows和类Unix争论的观点] 谁是谁的躯壳,谁又是谁的灵魂
  16. scratch鲜为人知的技巧-初级篇
  17. ECCV2020Workshop-PAN-270k参数量SISR网络 | Efficient Image Super-Resolution Using Pixel Attention
  18. webAP练习五 --- 电子表 短信验证码 定时跳转
  19. 从屡次一面被刷到腾讯实习生HR面(一个菜鸟的辛酸史)
  20. STM32单片机与Openmv的串口通信

热门文章

  1. vue element form ref 重置表单
  2. Spring mvc @ModelAttribute
  3. C语言 gcc 动态库
  4. java maven
  5. 二分分类2.1 二分分类
  6. Oracle的order by关键字
  7. html按照字数分页,纯javascript实现分页(两种方法)
  8. java aes 模式_Java实现多种加密模式的AES算法-总有一种你用的着!
  9. c++ eos智能合约开发_hyperledger fabric 开发第一个智能合约
  10. server2012 AD域 radius 802.1x认证