在日常模型训练过程中,模型有多种选择,模型的参数同样也有多种选择,如何根据同一批数据选出最适合的模型和参数呢?

一般情况下,模型还比较好选择,是选用机器学习中分类模型例如 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 importload_irisfrom sklearn.svm importSVCfrom sklearn.model_selection importtrain_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 =0for 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:38Best score:0.973684Best 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:38Best score on validation set:0.96Best 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 importcross_val_score

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)

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))

我们在模型训练过程中,没有单独划分出某一部分作为专门的验证集,而是对训练集进行了5折交叉验证,并且取出5个划分好的数据集训练出的结果取平均来尝试得到最优参数组合。(这样更加稳定),结果可见下:

Best score on validation set:0.97Best 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 importGridSearchCV#把要调整的参数以及其候选值 列出来;

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.97Best parameters:{'C': 10, 'gamma': 0.1}

Best score on train set:0.98

Grid Search 调参方法存在的共性弊端就是:耗时;参数越多,候选值越多,耗费时间越长!所以,一般情况下,先定一个大范围,然后再细化。

总结

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

c语言网格搜索算法例题,模型参数选择方法——GridSearch网格搜索相关推荐

  1. python保存模型与参数_基于pytorch的保存和加载模型参数的方法

    当我们花费大量的精力训练完网络,下次预测数据时不想再(有时也不必再)训练一次时,这时候torch.save(),torch.load()就要登场了. 保存和加载模型参数有两种方式: 方式一: torc ...

  2. python实现sklearn的基本操作流程,sklearn预处理方法,sklearn基础算法的使用,以及sklearn模型的选择方法。

    python实现sklearn的基本操作流程,sklearn预处理方法,sklearn基础算法的使用,以及sklearn模型的选择方法. 一.数据的获取与分析 1.读取数据 2.分析数据 二.数据的预 ...

  3. 十、模型自变量选择方法

    在本系列的最后一篇文章中,我们讨论了多元线性回归模型.费尔南多创建了一个模型,根据五个输入参数估算汽车价格. 费尔南多的确获得了一个比较好的模型,然而,费尔南多想要获得最好的输入变量集 本文将详细介绍 ...

  4. amesim子模型_Amesim中液压管路模型的选择方法

    在液压库中并没有 图1 图2 液体在管道种流动时的三种效应,在Amesim管路模型中也有所考虑: 容性 (C): 压力计算 阻性 (R): 沿程压力损失 惯性 (I): 波动效应 管路模型还包括集总参 ...

  5. Pytorch修改模型参数的方法

    https://blog.csdn.net/lppfwl/article/details/120055302

  6. python进行机器学习(四)之模型验证与参数选择

    一.模型验证 进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的泛化能力强,所以就需要模型验证这一过程来体现不同的模型对于未知数据的表现效果. 这里我们将 ...

  7. 【机器学习】算法模型自动超参数优化方法

    什么是超参数? 学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper ...

  8. 全网最全:机器学习算法模型自动超参数优化方法汇总

    什么是超参数? 学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper ...

  9. Python实现直方图梯度提升分类模型(HistGradientBoostingClassifier算法)并基于网格搜索进行优化同时绘制PDP依赖图项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 基于直方图的梯度提升分类树.此估算器对缺失值 (NaN) 具有原 ...

最新文章

  1. 因贡献Linux社区被Linus关注,受公司10万期权奖励!酷派重回大众视野...
  2. [云炬创业学笔记]第一章创业是什么测试8
  3. leetcode842. 将数组拆分成斐波那契序列(回溯)
  4. UI实用素材|电子商务界面模板
  5. Unity打开的文件是杂项文件的处理方法
  6. OpenGL坐标的问题?
  7. UDP协议和socketserver以及文件上传
  8. kass中lisp文件_自动加载文件目录下的lsp、vlx和fas文件
  9. matlab生成流程图,matlab做流程图
  10. 做技术的出路在哪里?---什么叫有前途?钱图钱图,用最省力的方式挣到更多的钱的路径就是前途
  11. 微信支付商户平台app支付开通方法详解
  12. w10系统桌面的计算机找不到,w10桌面我的电脑图标不见了怎么办
  13. Route-Policy
  14. 做PPT只会直接插入图片?这样处理图片,让PPT的颜值瞬间提升几倍
  15. Matlab中pickic_高颜值甜品DIY |春季甜品Picnic野餐系列,一起过个惬意慵懒的午后时光❗️...
  16. 基于bert的platos republic i ii情绪分析和可视化
  17. uniapp开发app真机调试连接电脑服务器请求失败解决方法
  18. Uniapp开发仿哔哩哔哩/短视频系统APP源码
  19. CW32L083系列MCU系统时钟详解
  20. Ubuntu20.04安装QGroundcontrol开发环境

热门文章

  1. 广告点阵屏和熟悉字模软件的使用
  2. 【CCF相关】CCF考试的形式以及难度
  3. 【操作系统】并发与并行
  4. 基于MATLAB的数字图像处理仿真软件
  5. 中国式危机公关9加1策略(第三章 围魏救赵策略)
  6. CSP认证考试笔记-小明种苹果
  7. 详解sklearn中的merics
  8. .fans年末特别企划:《2020年.fans域名注册大回顾》体育篇
  9. scratch猫捉老鼠 少儿编程 电子学会图形化编程scratch编程等级考试二级真题和答案解析2023年3月
  10. trello_从Gmail侧边栏快速添加Trello卡