超参数搜索之网格搜索、并行搜索、随机搜索

  多数情况下,超参数的选择是无限的,因此在有限的时间内,除了可以验证人工预设的几种超参数组合外,也可以通过启发式的搜索方法对组合进行调优,这种超参数搜素的方法称为网格搜索

一、网格搜索

  由于超参数的空间是无尽的,因此超参数的组合配置只能是“更优解”,没有最优解。通过依靠网格搜索对多种超参数组合的空间进行暴力搜索,每一套超参数组合被代入到学习函数中作为新的模型,为了比较新模型之间的性能,采用交叉验证的方法在多组相同的训练和验证数据集下进行评估。

#从sklearn.datasets里导入20类新闻文本数据
import numpy as np
from sklearn.datasets import fetch_20newsgroups  #加载数据集
from sklearn.svm import SVC  #支持向量机分类模型
from sklearn.feature_extraction.text import TfidfVectorizer #sklearn.feature_extraction.text导入TfidfVectorizer文本抽取器
from sklearn.pipeline import Pipeline  #导入Pipeline
from sklearn.model_selection import train_test_split #用于分割数据集
from sklearn.model_selection import GridSearchCV #导入网格搜索模块

news=fetch_20newsgroups(subset='all')
x_train,x_test,y_train,y_test = train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
clf =Pipeline([('vect',TfidfVectorizer(analyzer='word',stop_words='english')),('svc',SVC())])
#这里需要试验的2个超参数的个数分别是4,3,SVC_game的参数共有10^-2,10^-1......这样一共有12种的超参数组合,12个不同参数下的模型.
parameters={'svc__gamma':np.logspace(-2,1,4),'svc__C':np.logspace(-2,1,3)}
#将12组参数组合以及初始化的Pipeline 包括3折交叉验证的要求全部告知GridSearchCV
'''注意:refit=True设定表示在交叉验证获取最佳的超参数过程中,程序将会以交叉验证训练集得到的最佳超参数,重新对所有可用的训练集与验证集
进行,作为最终用于性能评估的最佳模型参数'''
gs=GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3) #verbose是否显示处理过程的信息,数值越高,信息越多
time_=gs.fit(x_train,y_train)  #执行单线程网格搜索
gs.best_params_,gs.best_score_
print(gs.score(x_test,y_test))  #输出最佳模型在测试集上的准确性

在这里插入图片描述
  使用单线程的网格搜索技术对朴素贝叶斯模型在文本分类任务中的超参数进行调优,共有12组超参数,运行时间165.40秒,寻找到最佳的超参数组合在测试集上所能达到的最高分类准确性为82.67%

二、并行搜索

  由于各个新模型在执行交叉验证的过程中间是相互独立的,所以可以充分利用多核处理器或分布式的计算资源来并行搜索,这样就能成倍节约运算时间。

#从sklearn.datasets里导入20类新闻文本数据
import numpy as np
from sklearn.datasets import fetch_20newsgroups  #加载数据集
from sklearn.svm import SVC  #支持向量机分类模型
from sklearn.feature_extraction.text import TfidfVectorizer #sklearn.feature_extraction.text导入TfidfVectorizer文本抽取器
from sklearn.pipeline import Pipeline  #导入Pipeline
from sklearn.model_selection import GridSearchCV #导入网格搜索模块
import time
start_time = time.time()
news=fetch_20newsgroups(subset='all')
x_train,x_test,y_train,y_test = train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
clf =Pipeline([('vect',TfidfVectorizer(analyzer='word',stop_words='english')),('svc',SVC())])
#这里需要试验的2个超参数的个数分别是4,3,SVC_game的参数共有10^-2,10^-1......这样一共有12种的超参数组合,12个不同参数下的模型.
parameters={'svc__gamma':np.logspace(-2,1,4),'svc__C':np.logspace(-2,1,3)}
#将12组参数组合以及初始化的Pipeline 包括3折交叉验证的要求全部告知GridSearchCV
'''注意:refit=True设定表示在交叉验证获取最佳的超参数过程中,程序将会以交叉验证训练集得到的最佳超参数,重新对所有可用的训练集与验证集
进行,作为最终用于性能评估的最佳模型参数'''
gs=GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1) #verbose是否显示处理过程的信息,数值越高,信息越多,n_jobs=-1代表使用计算机全部CPU
gs=gs.fit(x_train,y_train)  #执行单线程网格搜索
gs.best_params_,gs.best_score_
print(gs.score(x_test,y_test))  #输出最佳模型在测试集上的准确性
print('net_time',time.time()-start_time)

在这里插入图片描述
  同样是网格搜索,使用多线程并行搜索技术对朴素贝叶斯模型在文本分类任务中的超参数组合进行调优,执行时间39.80秒,提升了4倍的运行速度,模型结果一致.

pd.DataFrame(gs.cv_results_).T  #每次取mean_test_score和对应的params,rank_test_score也可知道结果

在这里插入图片描述

三、随机搜索

  我们使用Scikit-Learn 的RandomizedSearchCV 来寻找最佳的超参数组合,进行模型优化,随机搜索是用交叉验证来评估超参数值的所有组合,当超参数的搜索范围较大时,通常会优先选择使用 RandomizedSearchCV 。它不会尝试所有可能的组合,而是在每次迭代中为每个超参数选择一个随机值,然后对一定数量的随机组合进行评估。这种方法有两个优点,如果运行随机1000个迭代,那么将会探索每个超参数的1000个不同的值,而不是只探索少量的值,并且通过简单地设置迭代次数,可以更好地控制要分配给超参数搜索的计算预算。它相比于网格搜索有着更好的随机性,能够在相同时间内探索更多可能的区域,但也会带来不确定性。

#从sklearn.datasets里导入20类新闻文本数据
import numpy as np
from sklearn.datasets import fetch_20newsgroups  #加载数据集
from sklearn.svm import SVC  #支持向量机分类模型
from sklearn.feature_extraction.text import TfidfVectorizer #sklearn.feature_extraction.text导入TfidfVectorizer文本抽取器
from sklearn.pipeline import Pipeline  #导入Pipeline
from sklearn.model_selection import RandomizedSearchCV #导入随机搜索模块
import time
start_time = time.time()
news=fetch_20newsgroups(subset='all')
x_train,x_test,y_train,y_test = train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
clf =Pipeline([('vect',TfidfVectorizer(analyzer='word',stop_words='english')),('svc',SVC())])
#这里需要试验的2个超参数的个数分别是4,3,SVC_game的参数共有10^-2,10^-1......这样一共有12种的超参数组合,12个不同参数下的模型.
parameters={'svc__gamma':np.logspace(-2,1,4),'svc__C':np.logspace(-2,1,3)}
#将12组参数组合以及初始化的Pipeline 包括3折交叉验证的要求全部告知GridSearchCV
'''注意:refit=True设定表示在交叉验证获取最佳的超参数过程中,程序将会以交叉验证训练集得到的最佳超参数,重新对所有可用的训练集与验证集
进行,作为最终用于性能评估的最佳模型参数'''
gs=RandomizedSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1) #verbose是否显示处理过程的信息,数值越高,信息越多,n_jobs=-1代表使用计算机全部CPU
gs=gs.fit(x_train,y_train)  #执行单线程网格搜索
gs.best_params_,gs.best_score_
print(gs.score(x_test,y_test))  #输出最佳模型在测试集上的准确性
print('net_time',time.time()-start_time)

在这里插入图片描述
  使用随机搜索多线程并行技术对朴素贝叶斯模型在文本分类任务中的超参数组合进行调优,执行时间32.53秒,比网格搜索并行快7秒多.

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python网格搜索是一种用于自动化调整模型超参数的技术。在机器学习中,超参数是用于控制模型行为的参数,例如学习速率、正则化强度等。网格搜索为我们提供了一种系统地尝试不同超参数组合的方法,以找到最优的模型配置。 网格搜索的基本思想是通过指定超参数的待选值,并尝试所有可能的组合来评估模型性能。具体来说,我们首先要确定待选超参数的范围,并将其细分为一个网格结构。然后,使用训练数据来训练和验证每个超参数组合的模型,并根据预定义的性能指标对其进行评估。最后,从所有可能的组合中选择性能最佳的超参数组合作为最终模型的配置。 Python的scikit-learn库提供了GridSearchCV类来实现网格搜索。该类通过接受一个参数网格字典,包含待选超参数名称及其对应的候选值列表。在调用fit()方法时,GridSearchCV会在指定的超参数网格上进行模型训练和验证,并记录每组超参数的性能指标。通过调用best_params_属性,我们可以获取最佳超参数组合,通过调用best_score_属性,我们可以获取最佳性能指标的值。 值得注意的是,在使用网格搜索时,我们需要选择适当的超参数范围和候选值。选择范围过大会导致计算量巨大,而选择范围过小可能会导致找不到最优解。因此,在实际应用中,我们通常需要根据经验和领域知识来确定合适的超参数范围。 总结起来,Python网格搜索是一种用于自动化调整模型超参数的技术。它通过尝试所有可能的超参数组合,帮助我们找到模型的最佳配置。通过使用scikit-learn库的GridSearchCV类,我们可以方便地实现网格搜索,并从中获取最佳超参数组合和性能指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值