【演算法_調參】sklearn_GridSearchCV,CV調節超參使用方法
GridSearchCV 簡介:
GridSearchCV,它存在的意義就是自動調參,只要把引數輸進去,就能給出最優化的結果和引數。但是這個方法適合於小資料集,一旦資料的量級上去了,很難得出結果。這個時候就是需要動腦筋了。資料量比較大的時候可以使用一個快速調優的方法——座標下降。它其實是一種貪心演算法:拿當前對模型影響最大的引數調優,直到最優化;再拿下一個影響最大的引數調優,如此下去,直到所有的引數調整完畢。這個方法的缺點就是可能會調到區域性最優而不是全域性最優,但是省時間省力,巨大的優勢面前,還是試一試吧,後續可以再拿bagging再優化。回到sklearn裡面的GridSearchCV,GridSearchCV用於系統地遍歷多種引數組合,通過交叉驗證確定最佳效果引數。
常用引數解讀:
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的誤差估計函式。scoring引數選擇如下:
cv :交叉驗證引數,預設None,使用三折交叉驗證。指定fold數量,預設為3,也可以是yield訓練/測試資料的生成器。
refit :預設為True,程式將會以交叉驗證訓練集得到的最佳引數,重新對所有可用的訓練集與開發集進行,作為最終用於效能評估的最佳模型引數。即在搜尋引數結束後,用最佳引數結果再次fit一遍全部資料集。
iid
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()