盡管采用網(wǎng)格搜索結(jié)合交叉驗(yàn)證的方法,來(lái)尋找更好超參數(shù)組合的過(guò)程非常耗時(shí)贯涎;然而芹敌,一旦獲取比較好的超參數(shù)組合,則可以保持一段時(shí)間使用肩榕。因此這是值得推薦并且相對(duì)一勞永逸的性能提升方法刚陡。更可喜的是,由于各個(gè)新模型在執(zhí)行交叉驗(yàn)證的過(guò)程中間是互相獨(dú)立的株汉,所以我們可以充分利用多核處理器甚至是分布式的計(jì)算資源來(lái)從事并行搜索筐乳,這樣能夠成倍地節(jié)省運(yùn)算時(shí)間。
使用多線程對(duì)文本分類的樸素貝葉斯模型的超參數(shù)組合執(zhí)行并行化的網(wǎng)格搜索
from sklearn.datasets import fetch_20newsgroups
import numpy as np
#使用新聞抓取器從互聯(lián)網(wǎng)上下載所有數(shù)據(jù)乔妈,并且存儲(chǔ)在變量news中
news=fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
#對(duì)前3000條新聞文本進(jìn)行數(shù)據(jù)分割蝙云,25%文本用于未來(lái)測(cè)試
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簡(jiǎn)化系統(tǒng)搭建流程,將文本抽取與分類器模型串聯(lián)起來(lái)
clf=Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())])
# 這里需要試驗(yàn)的2個(gè)超參數(shù)的個(gè)數(shù)分別是4褒翰、3贮懈,svc_gamma的參數(shù)共有10^ - 2,10^ - 1···优训。這樣我們一共有12種的參數(shù)組合朵你,12個(gè)不同參數(shù)下的模型。
parameters={'svc_gamma':np.logspace(-2,1,4),'svc_C':np.logspace(-1,1,3)}
from sklearn.grid_search import GridSearchCV
#初始化配置并行網(wǎng)格搜索揣非,n_jobs=-1代表使用該計(jì)算機(jī)全部的CPU
gs=GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1)
#執(zhí)行多線程并行網(wǎng)格搜素
%time_=gs.fit(X_train,y_train)
gs.best_params_,gs.best_score_
#輸出最佳模型在測(cè)試集上的準(zhǔn)確性
print(X_test,y_test)
wall time:51.8s
t同樣是網(wǎng)格搜索抡医,使用多線程并行搜索技術(shù)對(duì)樸素貝葉斯模型在文本分類任務(wù)中的超參數(shù)組合進(jìn)行調(diào)優(yōu),執(zhí)行同樣的36項(xiàng)計(jì)算任務(wù)一共只花費(fèi)了51.8秒早敬,尋找到的最佳的超參數(shù)組合在測(cè)試集上所能達(dá)成的最高分類準(zhǔn)確性依然為82.27%忌傻。我們發(fā)現(xiàn)在沒(méi)有影響驗(yàn)證準(zhǔn)確性的前提下,通過(guò)并行搜索基礎(chǔ)有效地利用了4核心(CPU)的計(jì)算資源搞监,幾乎4倍地提升了運(yùn)算速度水孩,節(jié)省了最佳超參數(shù)組合的搜索時(shí)間。