【応用編】WandBの応用 〜複雑なプロット描写〜

※ この記事は、読者がWandBの基本的な使い方を知っている前提で書かれています。WandBの基本についてはこちらで紹介しているのでご参照ください：

https://qiita.com/Hiromasa_H/private/a74eda17a17091088ba4

## WandBを使った複雑なプロット描写
Weights and Biases (WandB)ではデフォルトの折線グラフに加え、混合行列やパラレル・コーディネイト図など、より複雑な図表を図示することも可能です。本記事で以下の図について、描写方法や使い方を紹介します。

- [混合行列](#混合行列)
- [複数の線がある折線グラフ](#複数の線がある折線グラフ)
- [パラレル・コーディネイト](#パラレル・コーディネイト)
- 散布図(追加予定)
- 特徴量の重要度(追加予定)
- ヒストグラム（追加予定）

:::note warn
複雑なプロットはレンダリングに時間がかかることがあります。また、使い過ぎるとブラウザが重くなるので注意してください。

:::

## 混合行列
分類問題において、混合行列を可視化する際に役立ちます。WebUI上では、以下(左)のように棒グラフとして表示されます。また、複数のrunを比較(右)することもできるので、複数モデルの比較や、train・testの比較などが容易にできます。

<img width="50%" style="display:inline;" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/1f811991-8a19-806e-497a-95ccf1ab859a.png"><img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/94631664-f099-3114-d397-29826cde5590.png">

描写コードは以下の通りです。
```python
labels = [1,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1,0]
preds  = [1,0,0,1,1,0,1,1,0,0,1,0,1,1,0,0,1,1,1,0]

wandb.log({"conf_mat" : wandb.plot.confusion_matrix(probs=None,
                y_true=labels, preds=preds,
                class_names=["cat","dog"],)})
```
- `y_true`：*list型* 正解ラベルのリスト
- `preds`：*list型* 予測ラベルのリスト
- `class_names`：*list型* クラス名のリスト（要素のindexがラベルの値と紐づく。上の例で言うと、0番目の'cat'がラベル0と紐づいている。）

参考文献：


https://wandb.ai/wandb/plots/reports/Confusion-Matrix-Usage-and-Examples--VmlldzozMDg1NTM


## 複数の線がある折線グラフ
複数の学習曲線を描写したい場合などに役立ちます。WebUI上では、以下(左)のように表示され、各線の識別は線の色ではなく点線の形で行います。複数のrunを比較(右)する場合は、色でrunを識別することになります。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/dbce8379-ca71-9ecc-c591-c0350f533268.png"><img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/c4a084c2-3928-5698-b739-1ab6ee4692bd.png">

描写コードは以下の通りです。
```python
x_list = list(range(10))
list_of_y_list = [ [x**2 for x in x_list], [x**3 for x in x_list], [x**4 for x in x_list] ]
key_list = ["x^2", "x^3", "x^4"]

wandb.log({"my_multiplot" : wandb.plot.line_series(
                    xs=list(range(10)), 
                    ys=list_of_y_list,
                    keys=key_list,
                    title="x to the power of N",
                    xname="x")})

wandb.finish()
```
- `xs`：*list型* x値のリスト
- `ys`：*list型* 各線のy値のリストが含まれたリスト
- `keys`：*list型* 各線のラベルのリスト（要素のindexがラベルの値と紐づく）

参考文献：

https://wandb.ai/wandb/plots/reports/Custom-Multi-Line-Plots--VmlldzozOTMwMjU


## パラレル・コーディネイト
ハイパラの最適化などをする際に役立ちます。例えば以下の例では、学習時のバッチサイズ、チャンネル数、学習率が最終的な精度に与える影響を可視化しています。混合行列やmulti-line plotと違い、複数runの情報をまとめて表示するため、手元に複数のrunがあることが前提となります。

![Screen Shot 2023-05-17 at 17.01.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/8c99c892-74ae-d777-3e67-e9535c7165ae.png)

描写時に使いたい情報を`wandb.config`に登録するか、`wandb.log()`で記録をします。
```python

config = {'batch_size': 128, 'channels_one': 30, 'learning_rate':0.025}
wandb.init(config = config)

accuracy = get_accuracy(model,testloader)
wandb.log({'accuracy':accuracy})
```
描写はWebUI経由から行います。（複数runの情報をまとめて表示するので、1つのrunのコードで描写をすること自体ができません。）

1. まず、任意の「section」で、「Add Panel」ボタンをクリックし、表示されたオプションの中から「Parallel Coordinates」を選択します。

<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/44e3283b-18a1-fa25-8cd9-fc6dc37b1341.png"><img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/6fe564ad-0c4f-92b6-ea5e-7a0b88a8d4db.png">
2. 「Add a column」ボタンから、追加したいカラム名を選択します。ここで、`wandb.config`で追加し情報には歯車マークが、`wandb.log()`で追加した情報にはグラフマークがついているはずです。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/0a5c227c-972d-42d0-89a1-570ec3d49092.png"><img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1146760/9c5ff2fd-6213-4021-416b-96cbada16022.png">
3. 複数のカラムを選択し終えたら、それで終わりです。「Axes」タブで一番下にあるカラムが、プロット上では一番右側に来る仕様です。


参考文献：

https://docs.wandb.ai/guides/app/features/panels/parallel-coordinates