天天看點

Sklearn-GridSearchCV網格搜尋

GridSearchCV,它存在的意義就是自動調參,隻要把參數輸進去,就能給出最優化的結果和參數。但是這個方法适合于小資料集,一旦資料的量級上去了,很難得出結果。這個時候就是需要動腦筋了。資料量比較大的時候可以使用一個快速調優的方法——坐标下降。它其實是一種貪心算法:拿目前對模型影響最大的參數調優,直到最優化;再拿下一個影響最大的參數調優,如此下去,直到所有的參數調整完畢。這個方法的缺點就是可能會調到局部最優而不是全局最優,但是省時間省力,巨大的優勢面前,還是試一試吧,後續可以再拿bagging再優化。

回到sklearn裡面的GridSearchCV,GridSearchCV用于系統地周遊多種參數組合,通過交叉驗證确定最佳效果參數。

GridSearchCV的sklearn官方網址:

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

classsklearn.model_selection.GridSearchCV(estimator,param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True,cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score='raise',return_train_score=True)

1.常用參數解讀

estimator:所使用的分類器,如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10), 并且傳入除需要确定最佳的參數之外的其他參數。每一個分類器都需要一個scoring參數,或者score方法。

param_grid:值為字典或者清單,即需要最優化的參數的取值,param_grid =param_test1,param_test1 = {'n_estimators':range(10,71,10)}。

scoring :準确度評價标準,預設None,這時需要使用score函數;或者如scoring='roc_auc',根據所選模型不同,評價準則不同。字元串(函數名),或是可調用對象,需要其函數簽名形如:scorer(estimator, X, y);如果是None,則使用estimator的誤差估計函數。

cv :交叉驗證參數,預設None,使用三折交叉驗證。指定fold數量,預設為3,也可以是yield訓練/測試資料的生成器。

refit :預設為True,程式将會以交叉驗證訓練集得到的最佳參數,重新對所有可用的訓練集與開發集進行,作為最終用于性能評估的最佳模型參數。即在搜尋參數結束後,用最佳參數結果再次fit一遍全部資料集。

iid:預設True,為True時,預設為各個樣本fold機率分布一緻,誤差估計為所有樣本之和,而非各個fold的平均。

verbose:日志冗長度,int:冗長度,0:不輸出訓練過程,1:偶爾輸出,>1:對每個子模型都輸出。

n_jobs: 并行數,int:個數,-1:跟CPU核數一緻, 1:預設值。

pre_dispatch:指定總共分發的并行任務數。當n_jobs大于1時,資料将在每個運作點進行複制,這可能導緻OOM,而設定pre_dispatch參數,則可以預先劃分總共的job數量,使資料最多被複制pre_dispatch次

2.進行預測的常用方法和屬性

grid.fit():運作網格搜尋

grid_scores_:給出不同參數情況下的評價結果

best_params_:描述了已取得最佳結果的參數的組合

best_score_:成員提供優化過程期間觀察到的最好的評分

3.網格搜尋執行個體

param_test1 ={'n_estimators':range(10,71,10)}  
gsearch1= GridSearchCV(estimator =RandomForestClassifier(min_samples_split=100,  
                                 min_samples_leaf=20,max_depth=       8,max_features='sqrt',random_state=10),   
                       param_grid =param_test1,scoring='roc_auc',cv=5)  
gsearch1.fit(X,y)  
gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_
           

輸出結果如下:

([mean: 0.80681, std:0.02236, params: {'n_estimators': 10},
  mean: 0.81600, std: 0.03275, params:{'n_estimators': 20},
  mean: 0.81818, std: 0.03136, params:{'n_estimators': 30},
  mean: 0.81838, std: 0.03118, params:{'n_estimators': 40},
  mean: 0.82034, std: 0.03001, params:{'n_estimators': 50},
  mean: 0.82113, std: 0.02966, params:{'n_estimators': 60},
  mean: 0.81992, std: 0.02836, params:{'n_estimators': 70}],
{'n_estimators': 60},
0.8211334476626017)
           

如果有transform,使用Pipeline簡化系統搭建流程,将transform與分類器串聯起來(Pipelineof transforms with a final estimator)

pipeline= Pipeline([("features", combined_features), ("svm", svm)])  
param_grid= dict(features__pca__n_components=[1, 2, 3],  
                  features__univ_select__k=[1,2],  
                  svm__C=[0.1, 1, 10])  
   
grid_search= GridSearchCV(pipeline, param_grid=param_grid, verbose=10)  
grid_search.fit(X,y)  
print(grid_search.best_estimator_)
           

繼續閱讀