超參數搜索之網格搜索與並行搜索

超參數搜索
所謂的模型配置,一般統稱爲模型的超參數(Hyperparameters),比如KNN算法中的K值,SVM中不同的核函數(Kernal)等。多數情況下,超參數等選擇是無限的。在有限的時間內,除了可以驗證人工預設幾種超參數組合以外,也可以通過啓發式的搜索方法對超參數組合進行調優。稱這種啓發式的超參數搜索方法爲網格搜索。
網格搜索
由於超參數的空間是無盡的,因此超參數的組合配置只能是“更優”解,沒有最優解。通常,依靠網格搜索(Grid Search)對各種超參數組合的空間進行暴力搜索。每一套超參數組合被代入到學習函數中作爲新的模型,並且爲了比較新模型之間的性能,每個模型都會採用交叉驗證的方法在多組相同的訓練和開發數據集下進行評估。

Python源碼:

#coding=utf-8
from sklearn.datasets import fetch_20newsgroups
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.svm import SVC
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV

#-------------download data
news=fetch_20newsgroups(subset='all')
#-------------select front 3000 data,split data,25% for test
X_train,X_test,y_train,y_test=train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
#-------------use Pipeline to simplify processing flow,contact wordsVectorizer with classifier model
clf=Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())])
#-------------create geometric progression,total 4*3 =12 parameters combination
parameters={'svc__gamma':np.logspace(-2,1,4),'svc__C':np.logspace(-1,1,3)}

gs=GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3)

time_=gs.fit(X_train,y_train)
gs.best_params_,gs.best_score_

print 'Best accuracy is:',gs.score(X_test,y_test)
Result:


輸出說明:使用單線程的網格搜索技術對Naive Bayes Model在文本分類任務中的超參數組合進行調優,共有12組超參數X3折交叉驗證=36項獨立運行的計算任務。該過程一共進行了3.2min,尋找到的最佳的超參數組合在測試集上所能達成的最高分類準確性爲82.27%
由於超參數的驗證過程之間彼此獨立,因此爲並行計算提供了可能。
下面展示如何在在不損失搜索精度的前提下,充分利用多核處理器成倍節約計算時間。
並行搜索
網格搜索結合交叉驗證的方法,尋找更好的超參數組合的過程非常耗時;然而,一旦獲取比較好的超參數組合,可以保持一段時間的使用。這是值得推薦並且相對一勞永逸的性能提升方法。由於各個新模型在執行交叉驗證的過程中相互獨立,可以充分利用多核處理器甚至是分佈式的資源來從事並行搜索(Parallel Grid Search),可以成倍的節省運算時間。下面是並行搜索的過程:
Python源碼:

#coding=utf-8
from sklearn.datasets import fetch_20newsgroups
import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.svm import SVC
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV

#-------------download data
news=fetch_20newsgroups(subset='all')
#-------------select front 3000 data,split data,25% for test
X_train,X_test,y_train,y_test=train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)
#-------------use Pipeline to simplify processing flow,contact wordsVectorizer with classifier model
clf=Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())])
#-------------create geometric progression (等比數列),total 4*3 =12 parameters combination
parameters={'svc__gamma':np.logspace(-2,1,4),'svc__C':np.logspace(-1,1,3)}
#-------------n_jobs=-1 means use all available 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 'Best accuracy is:',gs.score(X_test,y_test)
Result:



同樣是網格搜索,使用多線程並行搜索技術,執行同樣的36項任務一共只花費了1.2min,尋找到的最佳的超參數組合在測試ji上的最高分類準確性依然爲82.27%。在沒有影響準確性的情況下,幾乎3倍的提升了運算速度!


P.S:關於Pipeline,後面會單獨介紹

可以參考:http://scikit-learn.org/stable/modules/pipeline.html#pipeline-chaining-estimators



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章