sklearn参数优化方法
学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数
比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的alpha等,在学习其模型的设计中,我们要搜索超参数空间为学习器模型找到最合理的超参数,可以通过以下方法获得学习器模型的参数列表和当前取值:estimator.get_params()
sklearn 提供了两种通用的参数优化方法:网络搜索和随机采样,
- 网格搜索交叉验证(GridSearchCV):以穷举的方式遍历所有可能的参数组合
- 随机采样交叉验证(RandomizedSearchCV):依据某种分布对参数空间采样,随机的得到一些候选参数组合方案
sklearn.model_selection:GridSearchCV,RandomizedSearchCV,ParameterGrid,ParameterSampler,fit_grid_point
①GridSearchCV:
该方法提供了在参数网格上穷举候选参数组合的方法。参数网格由参数param_grid来指定,比如,下面展示了设置网格参数param_grid的一个例子:
param_grid=[
{'C':[1,10,100,1000],'kernel':['linear']},
{'C':[1,10,100,1000],'gamma':[0.001,0.0001],'kernel':['rbf']}
]
上面的参数指定了要搜索的两个网格(每个网格就是一个字典):第一个里面有4个参数组合节点,第二个里面有4*2=8个参数组合节点
GridSearchCV的实例实现了通用的estimator API:当在数据集上训练的时候,所有可能的参数组合将会被评估,训练完成后选组最优的参数组合对应的estimator。
from sklearn import svm,datasets from sklearn.model_selection import GridSearchCViris=datasets.load_iris() parameters={'kernel':('rbf','linear'),'C':[1,5,10]} svr=svm.SVC() clf=GridSearchCV(svr,parameters) clf.fit(iris.data,iris.target) print(clf.best_estimator_)
最终结果:
SVC(C=1, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape=None, degree=3, gamma='auto', kernel='linear',max_iter=-1, probability=False, random_state=None, shrinking=True,tol=0.001, verbose=False)
②RandomizedSearchCV
RandomizedSearchCV类实现了在参数空间上进行随机搜索的机制,其中参数的取值是从某种概率分布中抽取的,这个概率分布描述了对应的参数的所有取值情况的可能性,这种随机采样机制与网格穷举搜索相比,有两大优点:
- 相比于整体参数空间,可以选择相对较少的参数组合数量
- 添加参数节点不影响性能,不会降低效率
指定参数的采样范围和分布可以用一个字典开完成,跟网格搜索很像,另外,计算预算(总共要采样多少参数组合或者迭代做多少次)可以用参数n_iter来指定,针对每一个参数,既可以使用可能取值范围内的概率分布,也可以指定一个离散的取值列表(离散的列表将被均匀采样)
{'C':scpiy.stats.expon(scale=100),'gamma':scipy.stats.expon(scale=.1),'kernel':['rbf'],'class_weight':['balanced':None]}
上边的例子中:C服从指数分布,gamma服从指数分布,这个例子使用了scipy.stats模块,其中包含了很多有用的分布用来产生参数采样点,像expon,gamma,uniform or randint,原则上,任何函数都可以传递进去,只要他提供一个rvs(random variate sample)方法来返回采样值,rvs函数的连续调用应该能够保证产生独立同分布的样本值。
import numpy as np from time import time from scipy.stats import randint as sp_randint from sklearn.model_selection import RandomizedSearchCV from sklearn.datasets import load_digits from sklearn.ensemble import RandomForestClassifierdef report(results,n_top=3):for i in range(1,n_top+1):candidates=np.flatnonzero(results['rank_test_score']==i)for candidate in candidates:print("Model with rank:{0}".format(i))print("Mean validation score:{0:.3f}(std:{1:.3f})".format(results['mean_test_score'][candidate],results['std_test_score'][candidate]))print("Parameters:{0}".format(results['params'][candidate]))print("")digis=load_digits() X,y=digis.data,digis.targetclf=RandomForestClassifier(n_estimators=20) #设置想要优化的超参数以及他们的取值分布 param_dist={"max_depth":[3,None],"max_features":sp_randint(1,11),"min_samples_split":sp_randint(2,11),"min_samples_leaf":sp_randint(1,11),"bootstrap":[True,False],"criterion":['gini','entropy']} #开启超参数空间的随机搜索 n_iter_search=20 random_search=RandomizedSearchCV(clf,param_distributions=param_dist,n_iter=n_iter_search) start=time() random_search.fit(X,y) print("RandomizedSearchCV took %.3f seconds for %d candidates""parameter settings."%((time()-start),n_iter_search)) report(random_search.cv_results_)
最终结果:
RandomizedSearchCV took 3.652 seconds for 20 candidatesparameter settings. Model with rank:1 Mean validation score:0.930(std:0.019) Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 8, 'bootstrap': False, 'min_samples_split': 10}Model with rank:2 Mean validation score:0.928(std:0.009) Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'gini', 'max_features': 4, 'bootstrap': False, 'min_samples_split': 10}Model with rank:3 Mean validation score:0.924(std:0.009) Parameters:{'max_depth': None, 'min_samples_leaf': 1, 'criterion': 'gini', 'max_features': 9, 'bootstrap': True, 'min_samples_split': 5}
③超参数优化中的随机搜索和网格搜索对比试验以随机森林分类器为优化对象。所有影响分类器学习的参数都被搜索了,除了树的数量之外,随机搜索和网格优化都在同一个超参数空间上对随机森林分类器进行优化,虽然得到的超参数设置组合比较相似,但是随机搜索的运行时间却比网络搜索显著的少,随机搜索得到的超参数组合的性能稍微差一点,但这很大程度上由噪声引起的,在实践中,我们只能挑几个比较重要的参数组合来进行优化。
import numpy as np from time import time from scipy.stats import randint as sp_randint from sklearn.model_selection import RandomizedSearchCV from sklearn.model_selection import GridSearchCV from sklearn.datasets import load_digits from sklearn.ensemble import RandomForestClassifierdef report(results,n_top=3):for i in range(1,n_top+1):candidates=np.flatnonzero(results['rank_test_score']==i)for candidate in candidates:print("Model with rank:{0}".format(i))print("Mean validation score:{0:.3f}(std:{1:.3f})".format(results['mean_test_score'][candidate],results['std_test_score'][candidate]))print("Parameters:{0}".format(results['params'][candidate]))print("")digis=load_digits() X,y=digis.data,digis.targetclf=RandomForestClassifier(n_estimators=20)print("==========下面是RandomizedSearchCV的测试结果===============") #设置想要优化的超参数以及他们的取值分布 param_dist={"max_depth":[3,None],"max_features":sp_randint(1,11),"min_samples_split":sp_randint(2,11),"min_samples_leaf":sp_randint(1,11),"bootstrap":[True,False],"criterion":['gini','entropy']} #开启超参数空间的随机搜索 n_iter_search=20 random_search=RandomizedSearchCV(clf,param_distributions=param_dist,n_iter=n_iter_search) start=time() random_search.fit(X,y) print("RandomizedSearchCV took %.3f seconds for %d candidates""parameter settings."%((time()-start),n_iter_search)) report(random_search.cv_results_)print("==========下面是GridSearchCV的测试结果===============") #在所有参数上搜索,找遍所有网络节点 param_grid={"max_depth":[3,None],"max_features":[1,3,10],"min_samples_split":[2,3,10],"min_samples_leaf":[1,3,10],"bootstrap":[True,False],"criterion":['gini','entropy']} #开启超参数空间的网格搜索 grid_search=GridSearchCV(clf,param_grid=param_grid) start=time() grid_search.fit(X,y) print("GridSearchCV took %.2f seconds for %d candidates parameter settings."%(time()-start,len(grid_search.cv_results_['params']))) report(random_search.cv_results_)
最终结果:
==========下面是RandomizedSearchCV的测试结果=============== RandomizedSearchCV took 3.874 seconds for 20 candidatesparameter settings. Model with rank:1 Mean validation score:0.928(std:0.010) Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 10, 'bootstrap': False, 'min_samples_split': 2}Model with rank:2 Mean validation score:0.920(std:0.007) Parameters:{'max_depth': None, 'min_samples_leaf': 4, 'criterion': 'gini', 'max_features': 6, 'bootstrap': False, 'min_samples_split': 2}Model with rank:2 Mean validation score:0.920(std:0.009) Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 7, 'bootstrap': True, 'min_samples_split': 10}==========下面是GridSearchCV的测试结果=============== GridSearchCV took 37.64 seconds for 216 candidates parameter settings. Model with rank:1 Mean validation score:0.928(std:0.010) Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 10, 'bootstrap': False, 'min_samples_split': 2}Model with rank:2 Mean validation score:0.920(std:0.007) Parameters:{'max_depth': None, 'min_samples_leaf': 4, 'criterion': 'gini', 'max_features': 6, 'bootstrap': False, 'min_samples_split': 2}Model with rank:2 Mean validation score:0.920(std:0.009) Parameters:{'max_depth': None, 'min_samples_leaf': 2, 'criterion': 'entropy', 'max_features': 7, 'bootstrap': True, 'min_samples_split': 10}
超参数空间的搜索技巧
- 技巧一,指定一个合适的目标测度对模型进行估计
默认情况下,参数搜索使用estimator的score函数来评估模型在某种参数配置下的性能:
分类器对应于 sklearn.metrics.accuracy_score
回归器对应于sklearn.metrics.r2_score
但是在某些应用中,其他的评分函数获取更加的合适。(比如在非平衡的分类问题中,准确率sccuracy_score通常不管用。这时,可以通过参数scoring来指定GridSearchCV类或者RandomizedSearchCV类内 部用我们自定义的评分函数)
- 技巧二、使用SKlearn的PipeLine将estimators和他们的参数空间组合起来
- 技巧三、合理划分数据集:开发集(用于GridSearchCV)+测试集(Test)使用model_selection.train_test_split()函数来搞定!
- 技巧四、并行化:(GridSearchCV)和(RandomizedSearchCV)在参数节点的计算上可以做到并行计算,这个通过参数”n_jobs“来指定。
- 技巧五、提高在某些参数节点上发生错误时的鲁棒性:在出错节点上只是提示警告。可以通过设置参数error_score=0(or=np.NaN)来搞定!
sklearn参数优化方法相关推荐
- 【机器学习】算法模型自动超参数优化方法
什么是超参数? 学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper ...
- python机器学习库sklearn——参数优化(网格搜索GridSearchCV、随机搜索RandomizedSearchCV、hyperopt)
分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 优化的相关的知识内容可以参 ...
- 模型效果差?我建议你掌握这些机器学习模型的超参数优化方法
模型优化是机器学习算法实现中最困难的挑战之一.机器学习和深度学习理论的所有分支都致力于模型的优化. 机器学习中的超参数优化旨在寻找使得机器学习算法在验证数据集上表现性能最佳的超参数.超参数与一般模型参 ...
- 参数调优为什么要采样_sklearn参数优化方法
学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的 ...
- 全网最全:机器学习算法模型自动超参数优化方法汇总
什么是超参数? 学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper ...
- 积神经网络的参数优化方法——调整网络结构是关键!!!你只需不停增加层,直到测试误差不再减少....
积神经网络(CNN)的参数优化方法 from:http://blog.csdn.net/u010900574/article/details/51992156 著名: 本文是从 Michael Nie ...
- mlp 参数调优_积神经网络(CNN)的参数优化方法
积神经网络(CNN)的参数优化方法 from:http://blog.csdn.net/u010900574/article/details/51992156 著名: 本文是从 Michael Nie ...
- 基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作
详情链接 :基于R语言.MaxEnt模型融合技术的物种分布模拟.参数优化方法.结果分析制图与论文写作 内容介绍: 第一章 .理论篇 以问题导入的方式,深入掌握原理基础 : 什么是MaxEnt模型? ...
- R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作
基于R语言.MaxEnt模型融合技术的物种分布模拟.参数优化方法.结果分析制图与论文写作技术应用 第一章.理论篇以问题导入的方式,深入掌握原理基础 什么是MaxEnt模型? MaxEnt模型的原理是什 ...
最新文章
- Android性能优化典范第五季
- python方法和函数的格式是完全一样的_Python成为专业人士笔记-返回变量形式函数- str() 和 repr()...
- linux 终端 tty 简介
- [Android 插件化(一)] DynamicLoadApk的用法
- java实现串口ymodem 传输文件_活久见!Jmeter也能实现文件传输和发送邮件啦
- 文章目录 | .NET Core on K8s学习之旅 (更新至20200618)
- 让钱生钱!商人赚钱的6条方法
- python中设置时间格式--模块datetime中日期和时间格式的参数
- 小程序Android端movable-view拖拽卡顿掉帧的优化
- java nio 关闭channel_JAVA NIO(二)Channel通道
- Android Studio如何去除界面默认标题栏
- BUPT复试专题—密码(2009)
- xp共享文件夹服务器,xp共享文件夹服务器
- 台湾自由行可行性研究报告
- IC卡读写模块(MFRC522) 简介调试QT实现
- 红帽子linux系统下载服务器OS:Windows、Linux与Unix三分天下
- Python基础知识从hello world 开始(第四天完结)
- 【重识云原生】第六章容器基础6.4.10.3节——StatefulSet实操案例-部署WordPress 和 MySQL
- pacemaker corosync 概念
- HttpClient如何访问需要提交客户端证书的SSL服务
热门文章
- workbeach约束简称_实际工程中,经常遇到两个构件通过光滑圆柱销钉的连接,这种约束称为...
- Java 工作时长计算(除去午休时长,周六周日)
- RBA验厂辅导,RBA主要是电子行业的社会责任审核标准
- Fully-Convolutional Siamese Networks for Object Tracking(SiamFC 算法学习)
- 【自动驾驶轨迹预测】一文熟悉自动驾驶轨迹预测发展现状!
- JS-offsetParent作用
- 全球及中国建筑节能行业十四五发展态势及产值规模预测报告2021-2027年
- 一些微信第三方登录需要注意的地方
- 传统商业的O2O正成为商业主流 线上线下融合大势所趋
- 洛谷P3950 部落冲突