盡管采用網(wǎng)格搜索結合交叉驗證的方法,來尋找更好超參數(shù)組合的過程非常耗時;然而,一旦獲取比較好的超參數(shù)組合,則可以保持一段時間使用。因此這是值得推薦并且相對一勞永逸的性能提升方法。更可喜的是,由于各個新模型在執(zhí)行交叉驗證的過程中間是互相獨立的,所以我們可以充分利用多核處理器甚至是分布式的計算資源來從事并行搜索,這樣能夠成倍地節(jié)省運算時間。
使用多線程對文本分類的樸素貝葉斯模型的超參數(shù)組合執(zhí)行并行化的網(wǎng)格搜索
from sklearn.datasets import fetch_20newsgroups
import numpy as np
#使用新聞抓取器從互聯(lián)網(wǎng)上下載所有數(shù)據(jù),并且存儲在變量news中
news=fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
#對前3000條新聞文本進行數(shù)據(jù)分割,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簡化系統(tǒng)搭建流程,將文本抽取與分類器模型串聯(lián)起來
clf=Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())])
# 這里需要試驗的2個超參數(shù)的個數(shù)分別是4、3,svc_gamma的參數(shù)共有10^ - 2,10^ - 1···。這樣我們一共有12種的參數(shù)組合,12個不同參數(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代表使用該計算機全部的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_
#輸出最佳模型在測試集上的準確性
print(X_test,y_test)
wall time:51.8s
t同樣是網(wǎng)格搜索,使用多線程并行搜索技術對樸素貝葉斯模型在文本分類任務中的超參數(shù)組合進行調(diào)優(yōu),執(zhí)行同樣的36項計算任務一共只花費了51.8秒,尋找到的最佳的超參數(shù)組合在測試集上所能達成的最高分類準確性依然為82.27%。我們發(fā)現(xiàn)在沒有影響驗證準確性的前提下,通過并行搜索基礎有效地利用了4核心(CPU)的計算資源,幾乎4倍地提升了運算速度,節(jié)省了最佳超參數(shù)組合的搜索時間。