xgboost hyperopt 調參套路

2021-10-03 19:18:30 字數 3031 閱讀 6242

有時候為了節省時間快速驗證不用工具進行調參,手動設定超引數,此時一般設定成70%的train, 10%的validation, 20%的test。

由於fit的過程是不斷增加tree,所以在train上fit的時候,設定validation set,當在validation上loss不再下降的時候,就停止fit,這樣可以避免在train上過擬合。

相比gridsearch,hyperopt調參可以設定調參次數max_evals_num,控制調參時間。不至於調起來沒完沒了讓人等得心焦。

乙個基本的套路總結如下:

1. 拆分訓練集和測試集,例如80%的訓練,20%的測試集。

2. 利用hyperopt + 80%的訓練集,針對決策樹的相關超引數進行調參。

調參時要提供乙個評價函式:hyperopt_eval_func()。

例如用train做五折交叉驗證:cross_val_score()代表目前這批超引數的效果,避免調參時在tarin上過擬合。

所以這種情況下其實沒必要再設定外部的validation集了。

利用hyperopt調參的**如下:

def hyperopt_eval_func(params, x, y):

'''利用params裡定義的模型和超引數,對x進行fit,並返回cv socre。

args:

@params: 模型和超引數

@x:輸入引數

@y:真值

return:

@score: 交叉驗證的損失值

'''

int_feat = ['n_estimators', 'max_depth', 'min_child_weight']

for p in int_feat:

params[p] = int(params[p])

clf = xgbclassifier(**params)

#用cv結果來作為評價函式

from sklearn.model_selection import kfold

shuffle = kfold(n_splits=5, shuffle=true)

score = -1 * cross_val_score(clf, x, y, scoring='f1', cv=shuffle).mean()

return score

def hyperopt_binary_model(params):

'''hyperopt評價函式,在hyperopt_eval_func外面包圍了一層,增加一些資訊輸出

args:

@params:用hyperopt調參優化得到的超引數

return:

@loss_status: loss and status

'''

global best_loss, count, binary_x, binary_y

count += 1

clf_type = params['type']

del params['type']

loss = hyperopt_eval_func(params, binary_x, binary_y)

print(count, loss)

if loss < best_loss:

ss = 'count:%d new best loss: %4.3f , using %s'%(count, loss, clf_type)

print(ss)

best_loss = loss

loss_status =

return loss_status

def get_best_model(best):

'''根據hyperopt搜尋的引數,返回對應最優score的模型

args:

@best:最優超引數

return:

@clf: xgb model

'''

int_feat = ['n_estimators', 'max_depth', 'min_child_weight']

for p in int_feat:

best[p] = int(best[p])

#fix the random state

best['seed'] = 2018

clf = xgbclassifier(**best)

return clf

def get_best_model(x_train, y_train, predictors, max_evals_num=10):

'''利用hyperopt得到最優的xgb model

args:

@x_train: 訓練樣本x 資料

@y_train: 訓練樣本y target

@predictors: 用於**的特徵

@max_evals_num: hyperopt調參時的次數,次數越多,模型越優,但是也越耗費時間

return:

@clf: 最優model

'''space =

#hyperopt train

global count, best_loss, binary_x, binary_y

count = 0

best_loss = 1000000

binary_x = x_train

binary_y = y_train

trials = trials()

best = fmin(hyperopt_binary_model, space, algo=tpe.suggest, max_evals=max_evals_num, trials=trials)

print( 'best param:{}'.format(best))

print('best trans cv mse on train:{}'.format(best_loss))

clf = get_best_model(best)

return clf

python 隨機森林調參 隨機森林調參

前兩天寫了個scikit learn初步學習,今天沒事又照著寫了個rf模型的,剛開始還不懂這個python列表推導式,想了想還是挺好用的。然後用了gridsearchcv這個引數優化類,遍歷多種引數組合 也就是暴搜最優引數組合 通過交叉驗證確定最佳效果引數。所以優化完可能對訓練資料擬合更差,泛化能力...

RNN 調參經驗

調了快1年的rnn,深刻的感受到,深度學習是一門實驗科學,下面是一些煉丹心得.後面會不斷補充.有問題的地方,也請大家指正.引數初始化,下面幾種方式,隨便選乙個,結果基本都差不多.uniform w np.random.uniform low scale,high scale,size shape g...

機器學習 調參

在實際調整引數之前,我們先要搞清楚兩個事情 1.調參的目的是什麼?2.調參調的東西具體是什麼?第乙個問題 調參的目的是什麼?調參的最終目的是要使訓練之後的模型檢測物體更精確,向程式的方向更靠近一步的話,就是使得損失函式 例如ssd中的loss 盡量小 因為利用訓練集訓練出來的模型質量在訓練過程中只能...