python机器学习库sklearn——参数优化(网格搜索GridSearchCV、随机搜索RandomizedSearchCV、hyperopt)

python机器学习库sklearn——参数优化(网格搜索GridSearchCV、随机搜索RandomizedSearchCV、hyperopt)全栈工程师开发手册 作者 栾鹏 python 数据挖掘系列教程优化的相关的知识内容可以参考 https blog csdn net luanpeng article details 网格搜索 GridSearchCV 用于系统地遍历多种参数组合 通过交叉验证确定最佳效果参数 classskle

分享一个朋友的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开


python机器学习库sklearn——参数优化(网格搜索GridSearchCV、随机搜索RandomizedSearchCV、hyperopt)




全栈工程师开发手册 (作者:栾鹏)
python数据挖掘系列教程

网格搜索GridSearchCV

GridSearchCV用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。

classsklearn.model_selection.GridSearchCV(estimator,param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True,cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score='raise',return_train_score=True) 

常用参数解读

estimator:所使用的分类器,如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10), 并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法。

param_grid:值为字典或者列表,即需要最优化的参数的取值,param_grid =param_test1,param_test1 = {'n_estimators':range(10,71,10)}。

scoring :准确度评价标准,默认None,这时需要使用score函数;或者如scoring=‘roc_auc’,根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使用estimator的误差估计函数。

cv :交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。

refit :默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。

iid:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。

verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。

n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值。

pre_dispatch:指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次

随机参数优化RandomizedSearchCV

尽管使用参数设置的网格法是目前最广泛使用的参数优化方法, 其他搜索方法也具有更有利的性能。 RandomizedSearchCV 实现了对参数的随机搜索, 其中每个设置都是从可能的参数值的分布中进行取样。 这对于穷举搜索有两个主要优势:

  • 可以选择独立于参数个数和可能值的预算
  • 添加不影响性能的参数不会降低效率

指定如何取样的参数是使用字典完成的, 非常类似于为 GridSearchCV 指定参数。 此外, 通过 n_iter 参数指定计算预算, 即取样候选项数或取样迭代次数。 对于每个参数, 可以指定在可能值上的分布或离散选择的列表 (均匀取样):

{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1), 'kernel': ['rbf'], 'class_weight':['balanced', None]} 

搜索的输出值

cv_results_:给出不同参数情况下的评价结果的记录

best_params_:描述了已取得最佳结果的参数的组合

best_score_:成员提供优化过程期间观察到的最好的评分

from sklearn.datasets import load_iris # 自带的样本数据集 from sklearn.neighbors import KNeighborsClassifier # 要估计的是knn里面的参数,包括k的取值和样本权重分布方式 import matplotlib.pyplot as plt # 可视化绘图 from sklearn.model_selection import GridSearchCV,RandomizedSearchCV # 网格搜索和随机搜索 iris = load_iris() X = iris.data # 150个样本,4个属性 y = iris.target # 150个类标号 k_range = range(1, 31) # 优化参数k的取值范围 weight_options = ['uniform', 'distance'] # 代估参数权重的取值范围。uniform为统一取权值,distance表示距离倒数取权值 # 下面是构建parameter grid,其结构是key为参数名称,value是待搜索的数值列表的一个字典结构 param_grid = {'n_neighbors':k_range,'weights':weight_options} # 定义优化参数字典,字典中的key值必须是分类算法的函数的参数名 print(param_grid) knn = KNeighborsClassifier(n_neighbors=5) # 定义分类算法。n_neighbors和weights的参数名称和param_grid字典中的key名对应 # ================================网格搜索======================================= # 这里GridSearchCV的参数形式和cross_val_score的形式差不多,其中param_grid是parameter grid所对应的参数 # GridSearchCV中的n_jobs设置为-1时,可以实现并行计算(如果你的电脑支持的情况下) grid = GridSearchCV(estimator = knn, param_grid = param_grid, cv=10, scoring='accuracy') #针对每个参数对进行了10次交叉验证。scoring='accuracy'使用准确率为结果的度量指标。可以添加多个度量指标 grid.fit(X, y) print('网格搜索-度量记录:',grid.cv_results_) # 包含每次训练的相关信息 print('网格搜索-最佳度量值:',grid.best_score_) # 获取最佳度量值 print('网格搜索-最佳参数:',grid.best_params_) # 获取最佳度量值时的代定参数的值。是一个字典 print('网格搜索-最佳模型:',grid.best_estimator_) # 获取最佳度量时的分类器模型 # 使用获取的最佳参数生成模型,预测数据 knn = KNeighborsClassifier(n_neighbors=grid.best_params_['n_neighbors'], weights=grid.best_params_['weights']) # 取出最佳参数进行建模 knn.fit(X, y) # 训练模型 print(knn.predict([[3, 5, 4, 2]])) # 预测新对象 # =====================================随机搜索=========================================== rand = RandomizedSearchCV(knn, param_grid, cv=10, scoring='accuracy', n_iter=10, random_state=5) # rand.fit(X, y) print('随机搜索-度量记录:',grid.cv_results_) # 包含每次训练的相关信息 print('随机搜索-最佳度量值:',grid.best_score_) # 获取最佳度量值 print('随机搜索-最佳参数:',grid.best_params_) # 获取最佳度量值时的代定参数的值。是一个字典 print('随机搜索-最佳模型:',grid.best_estimator_) # 获取最佳度量时的分类器模型 # 使用获取的最佳参数生成模型,预测数据 knn = KNeighborsClassifier(n_neighbors=grid.best_params_['n_neighbors'], weights=grid.best_params_['weights']) # 取出最佳参数进行建模 knn.fit(X, y) # 训练模型 print(knn.predict([[3, 5, 4, 2]])) # 预测新对象 # =====================================自定义度量=========================================== from sklearn import metrics # 自定义度量函数 def scorerfun(estimator, X, y): y_pred = estimator.predict(X) return metrics.accuracy_score(y, y_pred) rand = RandomizedSearchCV(knn, param_grid, cv=10, scoring='accuracy', n_iter=10, random_state=5) # rand.fit(X, y) print('随机搜索-最佳度量值:',grid.best_score_) # 获取最佳度量值 

当你的调节参数是连续的,比如回归问题的正则化参数,有必要指定一个连续分布而不是可能值的列表,这样RandomizeSearchCV就可以执行更好的grid search。

Scoring Function Comment
Classification
‘accuracy’ metrics.accuracy_score
‘average_precision’ metrics.average_precision_score
‘f1’ metrics.f1_score for binary targets
‘f1_micro’ metrics.f1_score micro-averaged
‘f1_macro’ metrics.f1_score macro-averaged
‘f1_weighted’ metrics.f1_score weighted average
‘f1_samples’ metrics.f1_score by multilabel sample
‘neg_log_loss’ metrics.log_loss requires predict_proba support
‘precision’ etc. metrics.precision_score suffixes apply as with ‘f1’
‘recall’ etc. metrics.recall_score suffixes apply as with ‘f1’
‘roc_auc’ metrics.roc_auc_score
Clustering
‘adjusted_rand_score’ metrics.adjusted_rand_score
‘adjusted_mutual_info_score’ metrics.adjusted_mutual_info_score
‘completeness_score’ metrics.completeness_score
‘fowlkes_mallows_score’ metrics.fowlkes_mallows_score
‘homogeneity_score’ metrics.homogeneity_score
‘mutual_info_score’ metrics.mutual_info_score
‘normalized_mutual_info_score’ metrics.normalized_mutual_info_score
‘v_measure_score’ metrics.v_measure_score
Regression
‘explained_variance’ metrics.explained_variance_score
‘neg_mean_absolute_error’ metrics.mean_absolute_error
‘neg_mean_squared_error’ metrics.mean_squared_error
‘neg_mean_squared_log_error’ metrics.mean_squared_log_error
‘neg_median_absolute_error’ metrics.median_absolute_error
‘r2’ metrics.r2_score

如果没有我们想要的度量字符串表达,我们可以自定义度量函数,将函数名设置为scoring参数的值。函数名必须为

# 自定义度量函数 def scorerfun(estimator, X, y): 。。。 return 。。 

python调参神器hyperopt

Hyperopt库为python中的模型选择和参数优化提供了算法和并行方案。

给一段代码,一看就明白

from sklearn.model_selection import cross_val_score import pickle from hyperopt import fmin, tpe, hp,space_eval,rand,Trials,partial,STATUS_OK from xgboost.sklearn import XGBClassifier import xgboost as xgb # 定义一个目标函数,接受一个变量,计算后返回一个函数的损失值, def GBM(argsDict): max_depth = argsDict["max_depth"] + 5 n_estimators = argsDict['n_estimators'] * 5 + 50 learning_rate = argsDict["learning_rate"] * 0.02 + 0.05 subsample = argsDict["subsample"] * 0.1 + 0.7 min_child_weight = argsDict["min_child_weight"]+1 global attr_train,label_train gbm = xgb.XGBClassifier(nthread=4, #进程数 max_depth=max_depth, #最大深度 n_estimators=n_estimators, #树的数量 learning_rate=learning_rate, #学习率 subsample=subsample, #采样数 min_child_weight=min_child_weight, #孩子数 max_delta_step = 10, #10步不降则停止 objective="binary:logistic") metric = cross_val_score(gbm,attr_train,label_train,cv=5,scoring="roc_auc").mean() print(metric) return -metric # 定义参数的搜索空间 space = {"max_depth":hp.randint("max_depth",15), "n_estimators":hp.randint("n_estimators",10), #[0,1,2,3,4,5] -> [50,] "learning_rate":hp.randint("learning_rate",6), #[0,1,2,3,4,5] -> 0.05,0.06 "subsample":hp.randint("subsample",4),#[0,1,2,3] -> [0.7,0.8,0.9,1.0] "min_child_weight":hp.randint("min_child_weight",5), # } algo = partial(tpe.suggest,n_startup_jobs=1) # 定义随机搜索算法。搜索算法本身也有内置的参数决定如何去优化目标函数 best = fmin(GBM,space,algo=algo,max_evals=4) # 对定义的参数范围,调用搜索算法,对模型进行搜索 print(best) print(GBM(best)) 
  • hp.choice返回一个选项,选项可以是list或者tuple.options可以是嵌套的表达式,用于组成条件参数。
  • hp.pchoice(label,p_options)以一定的概率返回一个p_options的一个选项。这个选项使得函数在搜索过程中对每个选项的可能性不均匀。
  • hp.uniform(label,low,high)参数在low和high之间均匀分布。
  • hp.quniform(label,low,high,q),参数的取值是round(uniform(low,high)/q)*q,适用于那些离散的取值。
  • hp.loguniform(label,low,high)绘制exp(uniform(low,high)),变量的取值范围是[exp(low),exp(high)]
  • hp.randint(label,upper) 返回一个在[0,upper)前闭后开的区间内的随机整数。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176850.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午8:53
下一篇 2026年3月26日 下午8:54


相关推荐

  • SIP协议详解(一)

    SIP协议详解(一)1 SIP 协议介绍 Internet 的许多应用都需要建立和管理一个会话 会话在这里的含义是在参与者之间的数据的交换 由于考虑到参与者的实际情况 这些应用的实现往往是很复杂的 参与者可能是在代理间移动 他们可能可以有多个名字 他们中间的通讯可能是基于不同的媒介 比如文本 多媒体 视频 音频等 有时候是多种媒介一起交互 人们创造了无数种通讯协议应用于实时的多媒体会话数据比如声音 影像 或者

    2026年3月19日
    2
  • linux yum安装python3_Linux安装python3

    linux yum安装python3_Linux安装python3安装环境 CentOS7yum 安装 python3 4 一般情况下在 linux 中使用 python 是很轻松的 因为本身 linux 自带 python 环境 CentOS7 目前自带 python2 7 但是据说 python2 7 只支持到 2020 年 从学习上来讲还是应该先习惯下 python3 版本以上的使用方法 学习之前先要配置环境所以先要安装 python3 的环境 最简单的安装方法是直接通过 yum 安装 yum

    2026年3月17日
    2
  • navicate 15 激活码【2021.8最新】[通俗易懂]

    (navicate 15 激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsa…

    2022年3月26日
    244
  • h5页面 请在微信客户端打开链接_模拟微信接口时,提示“请在微信客户端打开链接”(转)…[通俗易懂]

    h5页面 请在微信客户端打开链接_模拟微信接口时,提示“请在微信客户端打开链接”(转)…[通俗易懂]背景描述相信有模拟微信页面请求的测试都有看到过这个页面,简单点说就是爬虫爬微信页面,进行回放的时候会出现这个页面。大概在1年前,专门安排了一个人去解决这个技术问题,遗憾的是当时没有找到解决方案,接下来所有微信端的接口测试和性能测试都无法进行,今天和大家分享下我们的解决方案,希望大家可以绕过微信的坑。业务场景我这里以JMeter来举例,我们可以通过在JMeter上开启代理,手机上设置代理来录制微信端…

    2022年6月7日
    33
  • 使用OmniDiskSweeper清理MAC

    使用OmniDiskSweeper清理MACMac 经常提示我磁盘空间已满 管理磁盘空间 然后我就管理了一下 发现系统竟占 90 个 G 有点懵逼 然后网上查了资料使用了一个名叫 OmniDiskSwee 的超级强大的工具 而且还是免费的 它能扫描出你的硬盘中所有目录 文件所占用的空间 于是自己网上下载了一个 扫描了一遍 最后清出了 60 多个 G 但是要注意不要随便清理系统的文件 Users 目录下的文件倒是可以放心清理 打开是这样的

    2026年3月17日
    2
  • Quartus II 13.0安装和激活成功教程教程

    Quartus II 13.0安装和激活成功教程教程QuartusII软件是学习FPGA非常重要的软件,下面来介绍一下13.0版本的安装及激活成功教程教程:1、安装包介绍大家下载的完整版的QuartusII13.0软件应包含以下三个部分:请大家选择第三个“Quartus-13.0.0.156-windows.tar”压缩文件,即为我们的QuartusII13.0的主安装包,这是一个压缩文件,安装前需要解压。该包包含了开发FP…

    2022年10月16日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号