sklearn-GridSearchCV,CV調節超參
GridSearchCV 簡介:
GridSearchCV,它存在的意義就是自動調參,只要把引數輸進去,就能給出最優化的結果和引數。
但是這個方法適合於小資料集,一旦資料的量級上去了,很難得出結果。這個時候就是需要動腦筋了。資料量比較大的時候可以使用一個快速調優的方法——座標下降。它其實是一種貪心演算法:拿當前對模型影響最大的引數調優,直到最優化;再拿下一個影響最大的引數調優,如此下去,直到所有的引數調整完畢。這個方法的缺點就是可能會調到區域性最優而不是全域性最優,但是省時間省力,巨大的優勢面前,還是試一試吧,後續可以再拿bagging再優化。回到sklearn裡面的GridSearchCV,GridSearchCV用於系統地遍歷多種引數組合,通過交叉驗證確定最佳效果引數
GridSearchCV官方網址:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
常用引數解讀:
estimator:所使用的分類器,如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10), 並且傳入除需要確定最佳的引數之外的其他引數。每一個分類器都需要一個scoring引數,或者score方法。
param_grid
scoring :準確度評價標準,預設None,這時需要使用score函式;或者如scoring='roc_auc',根據所選模型不同,評價準則不同。字串(函式名),或是可呼叫物件,需要其函式簽名形如:scorer(estimator, X, y);如果是None,則使用estimator的誤差估計函式。scoring引數選擇如下:
參考地址:http://scikit-learn.org/stable/modules/model_evaluation.html
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次
常用方法:
grid.fit():執行網格搜尋
grid_scores_:給出不同引數情況下的評價結果
best_params_:描述了已取得最佳結果的引數的組合
best_score_:成員提供優化過程期間觀察到的最好的評分
使用gbm的不通用例子:
#-*- coding:utf-8 -*- import numpy as np import pandas as pd import scipy as sp import copy,os,sys,psutil import lightgbm as lgb from lightgbm.sklearn import LGBMRegressor from sklearn.model_selection import GridSearchCV from sklearn.datasets import dump_svmlight_file from svmutil import svm_read_problem from sklearn import metrics #Additional scklearn functions from sklearn.grid_search import GridSearchCV #Perforing grid search from featureProject.ly_features import make_train_set from featureProject.my_import import split_data # from featureProject.features import TencentReport from featureProject.my_import import feature_importance2file def print_best_score(gsearch,param_test): # 輸出best score print("Best score: %0.3f" % gsearch.best_score_) print("Best parameters set:") # 輸出最佳的分類器到底使用了怎樣的引數 best_parameters = gsearch.best_estimator_.get_params() for param_name in sorted(param_test.keys()): print("\t%s: %r" % (param_name, best_parameters[param_name])) def lightGBM_CV(): print ('獲取記憶體佔用率: '+(str)(psutil.virtual_memory().percent)+'%') data, labels = make_train_set(24000000,25000000) values = data.values; param_test = { 'max_depth': range(5,15,2), 'num_leaves': range(10,40,5), } estimator = LGBMRegressor( num_leaves = 50, # cv調節50是最優值 max_depth = 13, learning_rate =0.1, n_estimators = 1000, objective = 'regression', min_child_weight = 1, subsample = 0.8, colsample_bytree=0.8, nthread = 7, ) gsearch = GridSearchCV( estimator , param_grid = param_test, scoring='roc_auc', cv=5 ) gsearch.fit( values, labels ) gsearch.grid_scores_, gsearch.best_params_, gsearch.best_score_ print_best_score(gsearch,param_test) if __name__ == '__main__': lightGBM_CV()