1. 程式人生 > 實用技巧 >sklearn-GridSearchCV,CV調節超參

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

:值為字典或者列表,即需要最優化的引數的取值,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引數選擇如下:

參考地址: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()