ノーコードで行うOptunaを使ったハイパーパラメータの最適化と実験管理 

# 概要
機械学習モデルを作成するときに欠かせないの手順の一つがハイパーパラメータの最適化です。
ハイパーパラメータの最適化は、モデル作成時に設定したパラメータやその時のスコア、データセットは何を使ったのか、などの実験を管理するコストが発生します。
Excelなどで管理する場合もありますが、Hydra, MLFlow, Optuna, Gitなどを組み合わせて行うケースが多いと思います。
しかし、それぞれのツールのセットアップやバージョン管理、コードのメンテナンスが発生して、本来の目的の課題を解決するためのモデルを開発することではなく、管理に工数を取られてしまうと時間が無駄になってしまいます。

そこで、VARISTAを使ったハイパーパラメータのチューニング方法と、機械学習モデル作成の実験管理をご紹介します。
VARISTAはSaaS型のノーコード機械学習プラットフォームです。VARISTAは[こちら](https://www.varista.ai/)
無料でも多くの機能を使うことができます。

# 本記事の流れ
1. データの用意
1. モデル作成（固定値のハイパーパラメータで学習）
1. モデル作成（OptunaでHyperParameterを探索してモデル作成）
1. モデル作成（OptunaでHyperParameterの探索範囲を広めてモデル作成）
1. 作成したモデル比較

# データの用意
今回使うデータセットはKaggleにて公開されている「IBM HR Analytics Employee Attrition & Performance」で、社員の離職につながる要因を探ることを目的に作られたデータです。
（IBMのデータサイエンティストが作成した架空のデータセットです。）
[IBM HR Analytics Employee Attrition & Performance](https://www.kaggle.com/pavansubhasht/ibm-hr-analytics-attrition-dataset "IBM HR Analytics Employee Attrition & Performance")

なお、本記事はパラメータチューニングの手順紹介にフォーカスするため、特徴量エンジニアリングなどは行わずオリジナルのデータセットでモデルを作成します。

初めてVARISTAを使う方は、以下を参考にプロジェクトを作成後、データアップロードまで終えてください。
ドキュメント › [プロジェクトの作成](https://www.varista.ai/docs/create-new-project/ "プロジェクトの作成")

データセットは、1470インスタンス、34の説明変数で構成されています。
目的変数は __Attrition__ (退職)です。
![VARISTA Blog HyperParameterTuning 000](//images.ctfassets.net/8qlu80sl3ynp/4oG5BW58J3EAjWxu1XwUT9/468e62168ddfccb04e2e43af72dc4c45/VARISTA_Blog_HyperParameterTuning_000.png)

# モデルの作成
まずは、パラメータチューニングをしないでLightGBMを使いモデルを作成してみましょう。
VARISTAではモデルを作成するときにテンプレートを使用しますので、以下の手順で学習テンプレートを作成して編集します。

## 学習テンプレートの複製と編集
今回は、LightGBMを使いパラメータチューニングを行いますので、LightGBMを使用するテンプレートを作成します。

モデリング › テンプレート(タブ）へと移動し、XGBoost Classifierを __複製__ します。
![VARISTA Blog HyperParameterTuning 001](//images.ctfassets.net/8qlu80sl3ynp/2UNWY4rm1O1oCwVt5Z3cIH/bca2be8c476fd10f3a39ed0621168643/VARISTA_Blog_HyperParameterTuning_001.png)

複製されたテンプレートは、カスタムテンプレートセクションにありますので、選択して詳細を確認します。
![VARISTA Blog HyperParameterTuning 002](//images.ctfassets.net/8qlu80sl3ynp/1Sd9nRXHV8KCjvlPqmZuCf/8cf43eb2358a75fd17e989648e963f6c/VARISTA_Blog_HyperParameterTuning_002.png)

続いて、設定を以下の通りに変更します。
- 基本設定 › 検証データの分割設定 › 分割サイズ : 0.2
- モデル設定 › 交差検証設定 › n_splits : 5
- アルゴリズム: LightGBM Classifier

![VARISTA Blog HyperParameterTuning 003](//images.ctfassets.net/8qlu80sl3ynp/559xf2l8OlfiUX9y6hn3vA/eac03acdb2a34f289d307c47688729e2/VARISTA_Blog_HyperParameterTuning_003.png)

最後にテンプレートを保存します。名前は__LightGBM Classifier__にします。
![VARISTA Blog HyperParameterTuning 004](//images.ctfassets.net/8qlu80sl3ynp/5HlwLTSWgrWXI2Mo0FauEd/09d0ac7fef40c153a767d8b6b2e0a950/VARISTA_Blog_HyperParameterTuning_004.png)

# モデルの作成
先ほど作成したLightGBM Classifierを使いモデルを作成してみましょう。

モデリング › モデル(タブ）へと移動し、新規モデルを選択します。
![VARISTA Blog HyperParameterTuning 005](//images.ctfassets.net/8qlu80sl3ynp/6WtddVEPJiXNsAAFgbzeFd/6714453907f8c2d0f6c215ee5d307dfa/VARISTA_Blog_HyperParameterTuning_005.png)

続いて、アップロードしたデータを選択し、ターゲットがAttritionに、テンプレートにLightGBM Classifierを選択して、作成を選択します。
![VARISTA Blog HyperParameterTuning 006](//images.ctfassets.net/8qlu80sl3ynp/5UbOicwe9ymjPeWJtrTQZq/64bd243ee1b0874f2719ec6cf5c0c3e5/VARISTA_Blog_HyperParameterTuning_006.png)

学習は10秒程度で完了し、モデルリストに作成されたモデルが表示されています。
![VARISTA Blog HyperParameterTuning 007](//images.ctfassets.net/8qlu80sl3ynp/2tu6kWr6VmAMPxciflgm3O/68b5786a3007f91c7e3d91989c5e9471/VARISTA_Blog_HyperParameterTuning_007.png)

モデルをクリックしてメトリクスを確認します。
![VARISTA Blog HyperParameterTuning 008](//images.ctfassets.net/8qlu80sl3ynp/7DsVVCtAnx1bhkVuGdGDzO/26a381840d32177c2275f01b0688ebcd/VARISTA_Blog_HyperParameterTuning_008.png)
今回は、F1スコアを基準にしてパラメータチューニングを行ってみます。

# Optunaを使用したハイパーパラメータの最適化
では、ここからOptunaを使いハイパーパラメータの最適化を行ってみます。
以下の手順で、Optuna用の学習テンプレートを作成します。

## Optuna用に学習テンプレートの複製と編集
先ほどと同様の操作で、LightGBM Classifierのテンプレートを複製します。
複製されたテンプレートを選択して編集します。
![VARISTA Blog HyperParameterTuning 009](//images.ctfassets.net/8qlu80sl3ynp/10Tc1ck6Q5I99DNig37fnY/cbe9f8383998fd37e180b22dfe8d7d78/VARISTA_Blog_HyperParameterTuning_009.png)

変更するテンプレートの値は以下の通りとし、その他の設定はデフォルトのまま行います。
- パラメータ › AutoTune: TPE Optimization with Optuna
パラメータチューニングにOptunaを使用します。
- パラメータ › AutoTune Round: 10
パラメータチューニングの試行回数を10回に設定します。
- パラメータ › AutoTune Scoring: f1
各試行において、クロスバリデーションを行う際のメトリクスを指定します。
- パラメータ › AutoTune CV Settings n_splits: 5
各試行において、クロスバリデーションを行う際の分割数を指定します
- パラメータ › num_leaves: 256, 512
LightGBMのLeavesの探索範囲を設定します。

![VARISTA Blog HyperParameterTuning 010](//images.ctfassets.net/8qlu80sl3ynp/2YgiTrBx09DTDnEL0Ve1V/bdaaa96b22cfcf9e4936c3f6f21dc337/VARISTA_Blog_HyperParameterTuning_010.png)

テンプレート名はLightGBM Optuna Classifierとします。
![VARISTA Blog HyperParameterTuning 011](//images.ctfassets.net/8qlu80sl3ynp/2vpzn28RI25PeSDTZ414EM/b3ab0a0a14a8c3eb216f51373c014a02/VARISTA_Blog_HyperParameterTuning_011.png)


## Optunaを使ったモデルの作成
先ほどのモデル作成の手順と同様に、モデルタブから新規モデルを選択します。
今度はテンプレートをLightGBM Optuna Classifierに設定して学習を開始します。

## モデルの確認
パラメータ探索の試行回数を少なく設定したので、十数秒で学習が完了してモデルが生成されます。
F1スコアを確認するとスコアが改善されていることがみて取れます。
![VARISTA Blog HyperParameterTuning 012](//images.ctfassets.net/8qlu80sl3ynp/4aWtNkjNadYTTu8XI9a5UU/2a832669d69b198b96df4ab9753992b1/VARISTA_Blog_HyperParameterTuning_012.png)


## パラメータチューニング履歴の確認
実際に、試行したハイパーパラメータを確認してみたいと思います。
モデルをクリックして、アルゴリズムタブを選択します。
![VARISTA Blog HyperParameterTuning 013](//images.ctfassets.net/8qlu80sl3ynp/5lbIa7BGFnCjE9FjhgFK2/001e7b3367def438fb0e7a1209116a0c/VARISTA_Blog_HyperParameterTuning_013.png)
Selected Estimatorセクションにある、lightgbm_classifierを選択すると、学習の履歴を確認することができますので、さらにAutoTuneタブを選択します。

この情報から、10回試行をし7回目でf1スコアが最も高くなるようなハイパーパラメータを見つけることができたことがわかります。

また、それぞれのハイパーパラメータを探索した範囲ごとのスコアも __パラメータ情報__ から確認することができます。
![VARISTA Blog HyperParameterTuning 014](//images.ctfassets.net/8qlu80sl3ynp/2U9BUopi5U9j9ipminPsyX/9e2e297ba9cc2e3a95141cc14b49fa05/VARISTA_Blog_HyperParameterTuning_014.png)


## 試行回数と探索範囲を変更
次に、テンプレートの値を変更して再度モデルを作成してみましょう。
今回もテンプレートを複製してから変更します。

以下のように、試行回数と探索範囲を変更してみます。
- AutoTune rounds: 700
- num_leaves: 32, 1024
- n_estimators: 256

![VARISTA Blog HyperParameterTuning 015](//images.ctfassets.net/8qlu80sl3ynp/2S8namvsKohhiy8ir6FMWU/110493dce53d33f3fa275a8145a95f39/VARISTA_Blog_HyperParameterTuning_015.png)


テンプレート名は、LightGBM Optuna Classifier Rev2などと名前をつけて保存し、このテンプレートを使い、モデルを作成します。

## モデルの確認
出来上がったモデルを確認すると、F1スコアが改善されていることが確認できます。
これは、先程の探索範囲では見つけることができなかったより良いパラメータを見つることができたためです。
![VARISTA Blog HyperParameterTuning 016](//images.ctfassets.net/8qlu80sl3ynp/58gkn8DLlFC2AGZBjxwOgY/3a6ac76ebfb8c1f259b38cceb0380313/VARISTA_Blog_HyperParameterTuning_016.png)

また、最適化の履歴を参照すると、510回目の試行でスコアが高くなるハイパーパラメータの組み合わせを発見したことを確認することができます。
![VARISTA Blog HyperParameterTuning 022](//images.ctfassets.net/8qlu80sl3ynp/5FHskEOKBRS8cwO9p04wYW/82005c356d0a78ba9bf16ef18f365919/VARISTA_Blog_HyperParameterTuning_022.png)

## モデル比較
ここまで作成した複数モデルを比較してみたいと思います。

作成したモデルを選択し、__モデル比較__ をクリックします。
![VARISTA Blog HyperParameterTuning 017](//images.ctfassets.net/8qlu80sl3ynp/2UqDrdNHNL33lNjfZHnTc9/5153a1108bf3e90cb1b9660a30c9b8b3/VARISTA_Blog_HyperParameterTuning_017.png)


続いて、「グリッド」を選択します。
この表示では、比較対象のモデルの各指標を俯瞰して確認することができます。
F1, Balanced Accuracy, ROC-AUC, Accuracyなどを確認してみると、Rev2モデルは他のモデルよりもスコアがいいようです。
![VARISTA Blog HyperParameterTuning 018](//images.ctfassets.net/8qlu80sl3ynp/1gyMHIhud7HOH74WL1Uw5i/7a8e58d57575101462356d1358958911/VARISTA_Blog_HyperParameterTuning_018.png)

次に、混同行列を確認するために、Confusion Matrixを選択します。
クロスバリデーションの結果をモデルごとに比較することができます。
![VARISTA Blog HyperParameterTuning 019](//images.ctfassets.net/8qlu80sl3ynp/6oKQPboiHPEPqDUYZ4fuTV/0f9cf88c8221adfaeea309c0e3429610/VARISTA_Blog_HyperParameterTuning_019.png)

プロットタブを選択すると、それぞれのモデルのPR曲線や、ROC曲線を確認することができます。
![VARISTA Blog HyperParameterTuning 020](//images.ctfassets.net/8qlu80sl3ynp/3b5G4goaWZZu4Z9JCCrL6e/821bc88dfa896a98f79f6b1c01a248c7/VARISTA_Blog_HyperParameterTuning_020.png)

Speed VS Accuracyタブは、推論速度と精度を比較することができますので、性能よりも速度を優先したい場合、またはその逆を優先したい場合など、ビジネス要件に応じてモデルを選択したい場合に役立ちます。
![VARISTA Blog HyperParameterTuning 021](//images.ctfassets.net/8qlu80sl3ynp/2QpVHO2t6KfKhieKVtsbp0/5ea54b3afbb4599873df709dfaa72b09/VARISTA_Blog_HyperParameterTuning_021.png)

# まとめ
VARISTAでOptunaとLightGBMを組み合わせてハイパーパラメータの最適化を行い、モデルを比較する流れをご紹介しました。
通常であれば複数のツールのセットアップや環境のメンテナンスが必要ですが、VARISTAを使うことでこれらの工数を削減することができます。

VARISTAは[こちら](https://www.varista.ai/)から試せます。