尽管采用网格搜索结合交叉验证的方法,来寻找更好超参数组合的过程非常耗时;然而,一旦获取比较好的超参数组合,则可以保持一段时间使用。因此这是值得推荐并且相对一劳永逸的性能提升方法。更可喜的是,由于各个新模型在执行交叉验证的过程中间是互相独立的,所以我们可以充分利用多核处理器甚至是分布式的计算资源来从事并行搜索,这样能够成倍地节省运算时间。
使用多线程对文本分类的朴素贝叶斯模型的超参数组合执行并行化的网格搜索
from sklearn.datasets import fetch_20newsgroups
import numpy as np
#使用新闻抓取器从互联网上下载所有数据,并且存储在变量news中
news=fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
#对前3000条新闻文本进行数据分割,25%文本用于未来测试
X_train,X_test,y_train,y_test=train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
from sklearn.svm import SVC
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
#使用Pipeline简化系统搭建流程,将文本抽取与分类器模型串联起来
clf=Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())])
# 这里需要试验的2个超参数的个数分别是4、3,svc_gamma的参数共有10^ - 2,10^ - 1···。这样我们一共有12种的参数组合,12个不同参数下的模型。
parameters={'svc_gamma':np.logspace(-2,1,4),'svc_C':np.logspace(-1,1,3)}
from sklearn.grid_search import GridSearchCV
#初始化配置并行网格搜索,n_jobs=-1代表使用该计算机全部的CPU
gs=GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1)
#执行多线程并行网格搜素
%time_=gs.fit(X_train,y_train)
gs.best_params_,gs.best_score_
#输出最佳模型在测试集上的准确性
print(X_test,y_test)
wall time:51.8s
t同样是网格搜索,使用多线程并行搜索技术对朴素贝叶斯模型在文本分类任务中的超参数组合进行调优,执行同样的36项计算任务一共只花费了51.8秒,寻找到的最佳的超参数组合在测试集上所能达成的最高分类准确性依然为82.27%。我们发现在没有影响验证准确性的前提下,通过并行搜索基础有效地利用了4核心(CPU)的计算资源,几乎4倍地提升了运算速度,节省了最佳超参数组合的搜索时间。
网友评论