1. 程式人生 > >19.【進階】超引數搜尋--網格搜尋&並行搜尋

19.【進階】超引數搜尋--網格搜尋&並行搜尋

超引數搜尋

  • 前面所提到的模型配置,我們一般統稱為模型的超引數,如K近鄰演算法中的k值、支援向量機中不同的核函式等,多數情況下,超引數等選擇是無限的,除了人工預設幾種超引數的組合以外,還可以通過啟發式的搜尋演算法對超引數組合進行調優。
  • 這種啟發式的搜尋演算法對超引數搜尋演算法,被稱之為網格搜尋。(如果人工處理所有可能的超引數組合,通常的辦法是,根據超引數的維度,列成相應的表格,比如說k的取值有[2,3,4,5,6,7,8],另一個係數比如λ取值有[0.01,0.03,0.1,0.3]等,這樣就可以列出一個二維表格,組合出7*4種可能性的超引數組合,再對每一個格子中具體的超引數組合,通過交叉驗證的方式進行模型效能的評估,然後通過驗證效能的比較,最終篩選出最佳的超引數資料組合)
  • 網格搜尋採用交叉驗證的方法,來尋找更好的超引數組合的過程非常耗時,由於各個新模型在執行交叉驗證的過程中是相互獨立的,那麼我們可以充分利用多核處理器甚至是分散式的計算資源來從事並行搜尋,從而成倍的節省運算時間。
#-*- coding:utf-8 -*-

#1.使用單執行緒對文字分類的樸素貝葉斯模型的超引數組合執行網格搜尋

from sklearn.datasets import fetch_20newsgroups
import numpy as np 
news = fetch_20newsgroups(subset='all')
from sklearn.cross_validation import train_test_split
#取前3000條新聞文字進行資料分割
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 #*************匯入pipeline************* from sklearn.pipeline import Pipeline #使用Pipeline簡化系統搭建流程,sklean提供的pipeline來將多個學習器組成流水線,通常流水線的形式為:
#將資料標準化的學習器---特徵提取的學習器---執行預測的學習器 #將文字特徵與分類器模型串聯起來,[(),()]裡有兩個引數 #引數1:執行 vect = TfidfVectorizer(stop_words='english',analyzer='word')操作 #引數2:執行 svc = SVC()操作 clf = Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())]) #這裡需要試驗的2個超引數svc_gamma和svc_C的元素個數分別為4、3,這樣我們一共有12種超引數對集合 #numpy.linspace用於建立等差數列,numpy.logspace用於建立等比數列 #logspace中,開始點和結束點是10的冪 #例如logspace(-2,1,4)表示起始數字為10^-2,結尾數字為10^1即10,元素個數為4的等比數列 #parameters變數裡面的key都有一個字首,這個字首其實就是在Pipeline中定義的操作名。二者相結合,使我們的程式碼變得十分簡潔。 #還有注意的是,這裡對引數名是<兩條>下劃線 __ parameters = {'svc__gamma':np.logspace(-2,1,4),'svc__C':np.logspace(-1,1,3)} #從sklearn.grid_search中匯入網格搜尋模組GridSearchCV from sklearn.grid_search import GridSearchCV #GridSearchCV引數解釋: #1.estimator : estimator(評估) object. #2.param_grid : dict or list of dictionaries #3.verbose:Controls the verbosity(冗餘度): the higher, the more messages. #4.refit:default=True, Refit(再次擬合)the best estimator with the entire dataset #5.cv : int, cross-validation generator 此處表示3折交叉驗證 gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3) #執行單執行緒網格搜尋 gs.fit(X_train,y_train) print gs.best_params_,gs.best_score_ #最後輸出最佳模型在測試集上的準確性 print 'the accuracy of best model in test set is',gs.score(X_test,y_test) #小結: #1.由輸出結果可知,使用單執行緒的網格搜尋技術 對樸素貝葉斯模型在文字分類任務中的超引數組合進行調優, # 共有12組超引數組合*3折交叉驗證 =36項獨立執行的計算任務 #2.在本機上,該過程一共運行了2.9min,尋找到最佳的超引數組合在測試集上達到的分類準確性為82.27%

附上程式的輸出結果:
這裡寫圖片描述
這裡寫圖片描述

#2.使用多執行緒對文字分類的樸素貝葉斯模型的超引數組合執行網格搜尋

#n_jobs=-1,表示使用該計算機的全部cpu
gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1)
gs.fit(X_train,y_train)
print gs.best_params_,gs.best_score_
#輸出最佳模型在測試集上的準確性
print 'the accuracy of best model in test set is',gs.score(X_test,y_test) 

#小結:
#總任務相同的情況下,使用並行搜尋技術進行計算的話,執行時間只花費了1.1min;
#而且最終所得的的best_params_和score沒有發生變化,說明並行搜尋可以在不影響準確性的前提下,
#有效的利用計算機的CPU資源,大大節省了最佳超引數的搜尋時間。

附上程式的輸出結果:
這裡寫圖片描述這裡寫圖片描述