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