【Machine Learning】通過網格搜尋進行調參
阿新 • • 發佈:2019-02-10
在我們日常的進行超引數優化工作時,可以手動去試,也可以使用隨機搜尋、批量隨機搜尋和網格搜尋等方法調到好的引數,關於網格搜尋,sklearn中GridSearchCV用於系統地遍歷多種引數組合,通過交叉驗證確定最佳效果引數。
一、引數簡介
①estimator:所使用的分類器,如estimator=RandomForestClassifier(njobs=-1),n_jobs為並行數,int:個數,-1表示跟CPU核數一致,預設值為1。
②parameters:需要最優化的引數取值,一般為字典或者列表,如parameters={'n_estimators': [25,30,35],'criterion':('gini','entropy')}。
③scoring:評價標準,每一個分類器都需要一個scoring引數,或者score方法,預設None,這時需要使用score函式;或者如scoring='roc_auc',根據所選模型不同,評價準則不同。如果是None,則使用estimator的誤差估計函式。
④cv :交叉驗證引數,預設None,使用三折交叉驗證。
⑤refit :預設為True,程式將會以交叉驗證訓練集得到的最佳引數,重新對所有可用的訓練集與開發集進行,作為最終用於效能評估的最佳模型引數。即在搜尋引數結束後,用最佳引數結果再次fit一遍全部資料集。
⑥verbose:日誌冗長度,int :冗長度,0指不輸出訓練過程,1指偶爾輸出,如果>1是指對每個子模型都輸出。
二、例項程式碼
通過以上搜索後,程式將會返回給定引數值中結果最好的值!# -*- coding: utf-8 -*- from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestClassifier from scoring import cost_based_scoring as cbs #自己編寫的scoring import pickle with open('../data/training_df.pkl', 'rb') as f: #load資料集 df = pickle.load(f) with open(r'../data/selected_feat_names.pkl', 'rb') as f: #特徵和標籤的key selected_feat_names = pickle.load(f) print("data loaded") y = df["attack_type"].values #標籤,y值 X = df[selected_feat_names].values #所有特徵值 rfc = RandomForestClassifier(n_jobs=-1) #隨機森林分類器 parameters = { 'n_estimators': [25, 30, 35], 'criterion': ("gini", "entropy") } scorer = cbs.scorer(show=True) if __name__ == '__main__': gscv = GridSearchCV(rfc, parameters, scoring=scorer, cv=3, verbose=2, refit=False, n_jobs=1, return_train_score=False) gscv.fit(X, y) print(gscv.cv_results_) print(gscv.best_params_, gscv.best_score_) print("grid search finished")