背景
実験管理をマニュアルで行ってきましたが、効率化欲が高まったためWandbの利用を試みることにしました
概要
今回はKaggle notebookからの利用を試します
利用ケースは”GBDTのハイパラとCV記録を行いたい”とします。
具体的にはCatboostのハイパラとCV記録を取っていきます。
(LightGBMはwandb_callbackが準備されていることが分かりいろいろ出来そうなのでやるとしたら次回)
前提
- Kaggleへの登録/Kaggle notebookが利用できる
- wandBへの登録/APIキーの取得
作業
wandBのインスタンス化/ハイパラ記録
import wandb
params = {
'loss_function': 'RMSE',
'eval_metric': 'RMSE',
'iterations': 1,
'learning_rate': 0.1,
'random_seed': 0,
"early_stopping_rounds": 200,
"max_depth": 10,
"subsample": 0.9,
}
#wandb初期化
run = wandb.init(config = params, project="wandb_test", name="wandb_test_run")
configにparamsを辞書型で入れることでハイパラの記録が可能
projectは管理する箱の名前
nameはprojectの中で管理する実験名 こちらは実験するたびに名称変更することになる部分
実行するとAPIキーを求められるため、あらかじめ取得したAPIキーを入力する
cvごとの結果を記録するテーブル作成
cv_table = wandb.Table(columns=['Fold_%d'%d for d in range(5)])
cvごとの結果を記録するためのテーブルを作成
columnsにはテーブルの列をリスト型で定義 今回はn_splits=5を想定
実験結果を記録
# scoresはcvごとの結果が入っているリスト型
# 例: [0.7, 0.2, 0.3, 0.4, 0.5]
cv_table.add_data(*scores)
run.log(
{
"cv_table": cv_table
}
)
run.log({f"oof_score_mean: ": np.mean(scores)})
run.log({f"oof_score_std: ": np.std(scores)})
学習後に取得されたscoresをあらかじめ作成したcv_tableにadd_dataメソッドを使って記録
add_dataのにはcv_tableで作成した列の数だけ引数を与える必要があるため、*scoresとしてリストを分解して与えている
記録の終了
run.finish()
finishメソッドで実験記録の終了
記録の結果
WandBサイトにアクセスしてログインしてみると、定義したprojectが作成されていて、Runsにnameで指定した実験名で記録がされました
マニュアルで実験管理を行なってた際は面倒でCV毎の記録は取ってなかったですが、これであれば簡単に記録ができて全CVで改善がされているかの確認もできることになるので嬉しい
まとめ
実験管理を効率化するためにWandB入門をしました。
ディープ系についてよく使われているのは見ていたのですがGBDT系でも使えることがわかり有益でした。
まだまだスイープやアーティファクトなどまだまだ機能が盛り沢山そうなので色々試してみようと思います。
参考文献
5行でカッコいい可視化を「WandB」入門 - Qiita
Quickstart | Weights & Biases Documentation
Starter_Notebook with WandB