1. 程式人生 > >【演算法_調參】sklearn_GridSearchCV,CV調節超參使用方法

【演算法_調參】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

:預設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的不通用例子:

  1. #-*- coding:utf-8 -*-
  2. import numpy as np  
  3. import pandas as pd  
  4. import scipy as sp  
  5. import copy,os,sys,psutil  
  6. import lightgbm as lgb  
  7. from lightgbm.sklearn import LGBMRegressor  
  8. from sklearn.model_selection import GridSearchCV  
  9. from sklearn.datasets import dump_svmlight_file  
  10. from svmutil import svm_read_problem  
  11. from sklearn import  metrics   #Additional scklearn functions
  12. from sklearn.grid_search import GridSearchCV   #Perforing grid search
  13. from featureProject.ly_features import make_train_set  
  14. from featureProject.my_import import split_data  
  15. # from featureProject.features import TencentReport
  16. from featureProject.my_import import feature_importance2file  
  17. def print_best_score(gsearch,param_test):  
  18.      # 輸出best score
  19.     print("Best score: %0.3f" % gsearch.best_score_)  
  20.     print("Best parameters set:")  
  21.     # 輸出最佳的分類器到底使用了怎樣的引數
  22.     best_parameters = gsearch.best_estimator_.get_params()  
  23.     for param_name in sorted(param_test.keys()):  
  24.         print("\t%s: %r" % (param_name, best_parameters[param_name]))  
  25. def lightGBM_CV():  
  26.     print ('獲取記憶體佔用率: '+(str)(psutil.virtual_memory().percent)+'%')  
  27.     data, labels = make_train_set(24000000,25000000)  
  28.     values = data.values;  
  29.     param_test = {  
  30.         'max_depth': range(5,15,2),  
  31.         'num_leaves': range(10,40,5),  
  32.     }  
  33.     estimator = LGBMRegressor(  
  34.         num_leaves = 50# cv調節50是最優值
  35.         max_depth = 13,  
  36.         learning_rate =0.1,   
  37.         n_estimators = 1000,   
  38.         objective = 'regression',   
  39.         min_child_weight = 1,   
  40.         subsample = 0.8,  
  41.         colsample_bytree=0.8,  
  42.         nthread = 7,  
  43.     )  
  44.     gsearch = GridSearchCV( estimator , param_grid = param_test, scoring='roc_auc', cv=5 )  
  45.     gsearch.fit( values, labels )  
  46.     gsearch.grid_scores_, gsearch.best_params_, gsearch.best_score_  
  47.     print_best_score(gsearch,param_test)  
  48. if __name__ == '__main__':  
  49.     lightGBM_CV()