1. 程式人生 > >【Machine Learning】通過網格搜尋進行調參

【Machine Learning】通過網格搜尋進行調參

        在我們日常的進行超引數優化工作時,可以手動去試,也可以使用隨機搜尋、批量隨機搜尋和網格搜尋等方法調到好的引數,關於網格搜尋,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")
通過以上搜索後,程式將會返回給定引數值中結果最好的值!