使用OPTUNA對LightBGM自動調試參數,並進行繪圖可視化

 

1.optuna基本使用 

Optuna是一個自動幫助我們調試參數的工具,使用起來十分方便。比sklearn的gridsearchcv好用很多,一是因爲optuna相比於sklearn能夠快速進行調參,二是因爲它可以將調試參數的過程進行可視化。同時可以如果沒訓練完,下次繼續訓練。而optuna內部使用貝葉斯調試參數的機制,可以在最短的時間之內,給我們一個較爲優秀的結果,甚至可能會得到一個最優的結果。我們可以根據貝葉斯調參給我們確定的參數範圍,自行使用gird search再次驗證最佳參數,當然這在大部分情況下沒必要了。

我們首先先在函數裏使用k折交叉驗證,這裏使用5折交叉驗證,對我們的結果進行優化,當然你也可以使用10折交叉驗證。

在函數train_model_category當中,我們一共有三個參數,trail,data,y。trail是optuna自帶的一個傳入參數,我們在調用train_model_category會使用到它。data是我們訓練集的數據,y是訓練集的label。函數return的變量則是當前k折交叉驗證得到的一個auc(accuracy)的值,因此你可以在這裏完全自定義你用來評價的指標,可以是auc,mse,也可以是accuracy均可。optuna完全是一個開放的框架。

在我們的字典 param_grid當中,傳入了lightbgm常用的參數,

其中,例如:

"n_estimators": trial.suggest_int("n_estimators", 5000,10000,step=1000),

這裏使用調試了n_estimator的參數,suggest_int表示我們在後面的參數是int型變量。因爲有些參數可能是小數,也就是浮點型的數據,這個時候我們就需要考慮使用suggest_float 了。step表示,參數可以從5000-10000之間波動,每一次波動的step爲1000.因此我們的n_estimator的參數可能的範圍是(5000,6000,7000,8000,9000,10000).

import optuna
from optuna.integration import LightGBMPruningCallback

from sklearn.model_selection import KFold
 def train_model_category(trial,data_,y_):
#使用sklearn建立fold folds_
= KFold(n_splits=5, shuffle=True, random_state=546789) param_grid = { "n_estimators": trial.suggest_int("n_estimators", 5000,10000,step=1000), "learning_rate": trial.suggest_float("learning_rate", 0.01, 0.3,step=0.05), "num_leaves": trial.suggest_int("num_leaves", 2**2, 2**5, step=4), "max_depth": trial.suggest_int("max_depth", 3, 12,step=2), "min_data_in_leaf": trial.suggest_int("min_data_in_leaf", 200, 10000, step=100), "lambda_l1": trial.suggest_int("lambda_l1", 0, 100, step=5), "lambda_l2": trial.suggest_int("lambda_l2", 0, 100, step=5), "min_gain_to_split": trial.suggest_float("min_gain_to_split", 0, 15), "bagging_fraction": trial.suggest_float("bagging_fraction", 0.2, 0.95, step=0.1), "bagging_freq": trial.suggest_categorical("bagging_freq", [1]), "feature_fraction": trial.suggest_float("feature_fraction", 0.2, 0.95, step=0.1), "colsample_bytree":trial.suggest_float("colsample_bytree", 0.2, 0.9, step=0.1), "subsample":trial.suggest_float("subsample", 0.2, 1, step=0.1), "reg_alpha":trial.suggest_float("reg_alpha", 0.2, 1, step=0.1), "random_state": 2021, } oof_preds = np.zeros(data_.shape[0]) sub_preds = np.zeros(test_.shape[0]) feature_importance_df = pd.DataFrame()
  #這裏去除無關的特徵,load id,user id,is default feats
= [f for f in data_.columns if f not in ['loan_id', 'user_id', 'isDefault'] ] for n_fold, (trn_idx, val_idx) in enumerate(folds_.split(data_)): trn_x, trn_y = data_[feats].iloc[trn_idx], y_.iloc[trn_idx] val_x, val_y = data_[feats].iloc[val_idx], y_.iloc[val_idx] clf = LGBMClassifier(**param_grid) clf.fit(trn_x, trn_y, eval_set= [(trn_x, trn_y), (val_x, val_y)], eval_metric='auc', verbose=100, early_stopping_rounds=40 #30 ) oof_preds[val_idx] = clf.predict_proba(val_x, num_iteration=clf.best_iteration_)[:, 1]

     del clf, trn_x, trn_y, val_x, val_y gc.collect() print('Full AUC score %.6f' % roc_auc_score(y, oof_preds)) return roc_auc_score(y, oof_preds)

然後定義優化函數:

study = optuna.create_study(direction="maximize", study_name="LGBM Classifier")
func = lambda trial: train_model_category(trial,train, y)
study.optimize(func, n_trials=20)

這裏傳入的參數trial,train和y。同時自定義direction=“maximize”,如果是mse,則可以定義爲“minimize”。

現在運行代碼,就可以調試參數啦!

2.optuna超參數空間可視化

首先導入相關的包:

from optuna.visualization import plot_contour
from optuna.visualization import plot_edf
from optuna.visualization import plot_intermediate_values
from optuna.visualization import plot_optimization_history
from optuna.visualization import plot_parallel_coordinate
from optuna.visualization import plot_param_importances
from optuna.visualization import plot_slice

繪製參數優化的歷史圖像:

plot_optimization_history(study)

 

 繪製參數之間高緯度關係:

#繪製高緯關係
plot_parallel_coordinate(study)

 

 繪製經驗分佈函數:

#繪製經驗分佈函數
plot_edf(study)

 

 這就是今天的optuna繪製教程啦!覺得有收穫的別忘記點下方的推薦呀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章