GridSearchCV
GridSearchCV的名字其實可以拆分為兩部分,GridSearch和CV,即網格搜索和交叉驗證。
這兩個概念都比較好理解,網格搜索,搜索的是參數,即在指定的參數范圍內,按步長依次調整參數,利用調整的參數訓練學習器,從所有的參數中找到在驗證集上精度最高的參數,這其實是一個循環和比較的過程。
GridSearchCV可以保證在指定的參數范圍內找到精度最高的參數,但是這也是網格搜索的缺陷所在,它要求遍歷所有可能參數的組合,在面對大數據集和多參數的情況下,非常耗時。這也是我通常不會使用GridSearchCV的原因,一般會采用后一種RandomizedSearchCV隨機參數搜索的方法。
交叉驗證的概念也很簡單
· 將訓練數據集划分為K份,K一般為10
· 依次取其中一份為驗證集,其余為訓練集訓練分類器,測試分類器在驗證集上的精度
· 取K次實驗的平均精度為該分類器的平均精度
網格搜索就是利用交叉驗證的形式比較每一個參數下訓練器的精度的,但是交叉驗證也要求大量的計算資源,加重了網格搜索的搜索時間
接下來以阿里IJCAI廣告推薦數據集與XGBoostClassifier分類器為例,用代碼的形式說明sklearn中GridSearchCV的使用方法
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.grid_search import GridSearchCV
#導入訓練數據
traindata = pd.read_csv("/traindata_4_3.txt",sep = ',')
traindata = traindata.set_index('instance_id')
trainlabel = traindata['is_trade']
del traindata['is_trade']
print(traindata.shape,trainlabel.shape)
#分類器使用 xgboost
clf1 = xgb.XGBClassifier()
#設定網格搜索的xgboost參數搜索范圍,值搜索XGBoost的主要6個參數
param_dist = {
'n_estimators':range(80,200,4),
'max_depth':range(2,15,1),
'learning_rate':np.linspace(0.01,2,20),
'subsample':np.linspace(0.7,0.9,20),
'colsample_bytree':np.linspace(0.5,0.98,10),
'min_child_weight':range(1,9,1)
}
#GridSearchCV參數說明,clf1設置訓練的學習器
#param_dist字典類型,放入參數搜索范圍
#scoring = 'neg_log_loss',精度評價方式設定為“neg_log_loss“
#n_iter=300,訓練300次,數值越大,獲得的參數精度越大,但是搜索時間越長
#n_jobs = -1,使用所有的CPU進行訓練,默認為1,使用1個CPU
grid = GridSearchCV(clf1,param_dist,cv = 3,scoring = 'neg_log_loss',n_iter=300,n_jobs = -1)
#在訓練集上訓練
grid.fit(traindata.values,np.ravel(trainlabel.values))
#返回最優的訓練器
best_estimator = grid.best_estimator_
print(best_estimator)
#輸出最優訓練器的精度
print(grid.best_score_)
這里關於網格搜索的幾個參數再說明一下,評分參數“scoring“,需要根據實際的評價標准設定,阿里的IJCAI的標准是’neg_log_loss’,所以這里設定的是’neg_log_loss’,sklearn中備選的評價標准有一下:
在一些情況下,sklearn中沒有現成的評價函數,sklearn是允許我們自己的定義的,但需要注意格式,接下來給個例子
import numpy as np
from sklearn.metrics import make_scorer
def logloss(act, pred):
epsilon = 1e-15
pred = sp.maximum(epsilon, pred)
pred = sp.minimum(1-epsilon, pred)
ll = sum(act*sp.log(pred) + sp.subtract(1, act)*sp.log(sp.subtract(1, pred)))
ll = ll * -1.0/len(act)
return ll
#這里的greater_is_better參數決定了自定義的評價指標是越大越好還是越小越好
loss = make_scorer(logloss, greater_is_better=False)
score = make_scorer(logloss, greater_is_better=True)
定義好以后,再將其代入GridSearchCV函數就好
這里再貼一下常用的集成學習算法比較重要的需要調參的參數,供大家參考
RandomizedSearchCV
RandomizedSearchCV的使用方法其實是和GridSearchCV一致的,但它以隨機在參數空間中采樣的方式代替了GridSearchCV對於參數的網格搜索,在對於有連續變量的參數時,RandomizedSearchCV會將其當作一個分布進行采樣這是網格搜索做不到的,它的搜索能力取決於設定的n_iter參數,同樣的給出代碼
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.grid_search import RandomizedSearchCV
#導入訓練數據
traindata = pd.read_csv("/traindata.txt",sep = ',')
traindata = traindata.set_index('instance_id')
trainlabel = traindata['is_trade']
del traindata['is_trade']
print(traindata.shape,trainlabel.shape)
#分類器使用 xgboost
clf1 = xgb.XGBClassifier()
#設定搜索的xgboost參數搜索范圍,值搜索XGBoost的主要6個參數
param_dist = {
'n_estimators':range(80,200,4),
'max_depth':range(2,15,1),
'learning_rate':np.linspace(0.01,2,20),
'subsample':np.linspace(0.7,0.9,20),
'colsample_bytree':np.linspace(0.5,0.98,10),
'min_child_weight':range(1,9,1)
}
#RandomizedSearchCV參數說明,clf1設置訓練的學習器
#param_dist字典類型,放入參數搜索范圍
#scoring = 'neg_log_loss',精度評價方式設定為“neg_log_loss“
#n_iter=300,訓練300次,數值越大,獲得的參數精度越大,但是搜索時間越長
#n_jobs = -1,使用所有的CPU進行訓練,默認為1,使用1個CPU
grid = RandomizedSearchCV(clf1,param_dist,cv = 3,scoring = 'neg_log_loss',n_iter=300,n_jobs = -1)
#在訓練集上訓練
grid.fit(traindata.values,np.ravel(trainlabel.values))
#返回最優的訓練器
best_estimator = grid.best_estimator_
print(best_estimator)
#輸出最優訓練器的精度
print(grid.best_score_)
不過建議還是使用隨機的搜索。
---------------------
作者:juezhanangle
來源:CSDN
原文:https://blog.csdn.net/juezhanangle/article/details/80051256
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!