模型参数选择方法——GridSearch网格搜索
在日常模型训练过程中,模型有多种选择,模型的参数同样也有多种选择,如何根据同一批数据选出最适合的模型和参数呢?
一般情况下,模型还比较好选择,是选用机器学习中分类模型例如 LR、SVM或XGBoost等,还是使用深度学习模型CNN、LSTM等。但是参数的选择就让人很头疼,每个模型都有一堆参数,参数值又有许多,如何不费人力而费机器的选择模型参数呢,我今天看到了一种方法叫做:GridSearch,叫做网格搜索,准备记录一下。
什么是Grid Search 网格搜索?
Grid Search:一种调参手段,看起来很高大上,其实原理并不是很高大上(汗)。
穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,参数a有3种可能,参数b有4种可能,把所有可能性列出来,可以表示成一个3*4的表格,其中每个cell就是一个网格,循环过程就像是在每个网格里遍历、搜索,所以叫grid search)
例如支持向量机中的SVC模型,一般调参的参数有 C 和 gamma。
其中 C是惩罚系数,即对误差的宽容度。c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差
gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
而网格搜索就像是在下面这个由多个参数构成的网格里搜索一样:
Simple Grid Search 简单的网格搜索
其实在了解了网格搜索的原理后,我们实现网格搜索可以通过两层for循环,遍历每一个参数组合并返回模型在测试集上的分数,选择最高分数训练出来的模型参数即可。例如我们仅将SVC模型中的C和gamma作为待调参数:
from sklearn.datasets import load_iris from sklearn.svm import SVC from sklearn.model_selection import train_test_splitiris = 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 = scorebest_parameters = {'gamma':gamma,'C':C} #### grid search endprint("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 = scorebest_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
可见,在验证集上进行了参数选择后,模型选择的最优参数发生了改变,但最起码能(大概)知道这个参数组合的泛化效果如何,因为也受数据分布影响,因为这只是一个划分结果,这个score of test set,还是有一定的偶然性,所以需要使用交叉验证来减少偶然性。
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 = scorebest_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))
我们在模型训练过程中,没有单独划分出某一部分作为专门的验证集,而是对训练集进行了5折交叉验证,并且取出5个划分好的数据集训练出的结果取平均来尝试得到最优参数组合。(这样更加稳定),结果可见下:
Best score on validation set:0.97 Best parameters:{'gamma': 0.01, 'C': 100} Score on testing set:0.97
可以看到参数又改变了。
在使用交叉验证+网格搜索操作中,我们使用cross_val_score,方法来判断每一次交叉验证的结果,再使用均值来判断这组参数的效果,同样在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自动进行训练集和验证集划分并取出最优参数组合,返回的grid_search就是一个带该参数组合的模型 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/Vancuicide/p/10530583.html
模型参数选择方法——GridSearch网格搜索相关推荐
- c语言网格搜索算法例题,模型参数选择方法——GridSearch网格搜索
在日常模型训练过程中,模型有多种选择,模型的参数同样也有多种选择,如何根据同一批数据选出最适合的模型和参数呢? 一般情况下,模型还比较好选择,是选用机器学习中分类模型例如 LR.SVM或XGBoost ...
- 参数调优:K折交叉验证与GridSearch网格搜索
本文代码及数据集来自<Python大数据分析与机器学习商业案例实战> 一.K折交叉验证 在机器学习中,因为训练集和测试集的数据划分是随机的,所以有时会重复地使用数据,以便更好地评估模型的有 ...
- Python的数据分析中超参数调优方法:网格搜索
[小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python的数据分析中 超参数调优方法:网格搜索 ● 选择题 以下说 ...
- [实例] 特征选择方法、网格搜索调参、不平衡处理、pu-learning
注: 很多内容是网上学习而得,感谢大佬们的分享~ 本文所有代码,包括一些参数搜索过程等详见:代码 一.特征选择 特征选择的代码请详见:特征选择基本方法 当特征非常多的时候,会导致算法性能的降低,所以我 ...
- ML之SVM:利用SVM算法(超参数组合进行多线程网格搜索+3fCrVa)对20类新闻文本数据集进行分类预测、评估
ML之SVM:利用SVM算法(超参数组合进行多线程网格搜索+3fCrVa)对20类新闻文本数据集进行分类预测.评估 目录 输出结果 设计思路 核心代码 输出结果 Fitting 3 folds for ...
- ML之SVM:利用SVM算法(超参数组合进行单线程网格搜索+3fCrVa)对20类新闻文本数据集进行分类预测、评估
ML之SVM:利用SVM算法(超参数组合进行单线程网格搜索+3fCrVa)对20类新闻文本数据集进行分类预测.评估 目录 输出结果 设计思路 核心代码 输出结果 Fitting 3 folds for ...
- python保存模型与参数_基于pytorch的保存和加载模型参数的方法
当我们花费大量的精力训练完网络,下次预测数据时不想再(有时也不必再)训练一次时,这时候torch.save(),torch.load()就要登场了. 保存和加载模型参数有两种方式: 方式一: torc ...
- python实现sklearn的基本操作流程,sklearn预处理方法,sklearn基础算法的使用,以及sklearn模型的选择方法。
python实现sklearn的基本操作流程,sklearn预处理方法,sklearn基础算法的使用,以及sklearn模型的选择方法. 一.数据的获取与分析 1.读取数据 2.分析数据 二.数据的预 ...
- Python集成机器学习:用AdaBoost、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
最近我们被客户要求撰写关于集成机器的研究报告,包括一些图形和统计输出. Boosting 是一类集成机器学习算法,涉及结合许多弱学习器的预测. 视频:从决策树到随机森林:R语言信用卡违约分析信贷数据实 ...
- 调参必备---GridSearch网格搜索
什么是Grid Search 网格搜索? Grid Search:一种调参手段:穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果.其原理就像是在数组里找最 ...
最新文章
- Linux shell 学习笔记(12)— linux 信号、后台运行脚本、作业控制、定时运行任务
- 设置VSCode运行任务命令快捷键Alt+R,通常用于npm start(对频繁使用该命令可节省50%的输入命令行打字时间)
- 幽门螺杆菌感染会增加代谢综合征和糖尿病风险,竟然“男女有别”?
- glide源码中包含了那种设计模式_推荐一个好用的拍照选图库,致敬Glide
- AngularJS 的自定义指令
- python自动化控制设备有限公司_华为 Python网络自动化
- 2021年上半年内容型社交电商行业分析报告
- JavaScript单线程运行机制与并发模型
- 微信开发——带参数二维码的使用
- flask连接mysql数据库_Flask与Mysql数据库建立连接
- G2 可视化引擎-统计图表
- ubuntu 打开ssh登陆_Ubuntu开启SSH远程登录
- 解释下列术语堆栈型计算机,第二章 计算机指令集结构
- Kafka 面试题(2022)
- IP地址作用与分类(A类 B类 C类 D类 E类)
- Graph Stacked Hourglass Networks for 3D Human Pose Estimation
- Ninja ripper 工具使用教程
- Python + Selenium实现163邮箱的自动登录和发送邮件
- LaTeX 多层列举 条目 编号
- Mencoder转换视频
热门文章
- 求助:为什么我用360浏览器和UC浏览器打不开JAVA中的index.html文件? 一打开就显示浏览器首界页...
- zpf框架的business使用方法
- 本地虚拟机中匿名ftp上传文件失败的问题
- 在ASP.NET 2.0中操作数据:使用FormView 的模板
- 软件度量都该度个啥?
- ARP欺骗原理 [转]
- pandas—pandas.DataFrame.iterrows的使用
- 深度学习TF—4.随机梯度下降
- 深度学习10-tf.data-数据输入管道简介
- 机器学习算法基础7-计算范围内素数的五种算法