Comet.mlからデータをいちいちダウンロードするのは面倒だからPython APIを使う



## Comet.mlとは？

Comet.mlは機械学習の実験支援ツールの一つです．
詳しい内容については公式ドキュメントで説明されています．

Comet.ml

https://www.comet.ml

また，今回はComet.mlのPython APIの使い方をまとめています．
Comet.mlでパラメータやメトリックのログをとりたい場合は以下の記事を参照してください．

https://qiita.com/29Takuya/items/00c1f4fef5983cdf1c54

## なぜPython APIを使うのか

Cometでデータをダウンロードする際，experimentのパネルからデータをexportします．

![スクリーンショット 2021-11-04 13.40.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2241869/e5f95d24-2d0c-b19d-5d41-0f313469ced0.png)



しかし，ダウンロードしたいデータが何個もある場合，毎回ファイル名を変えてダウンロードするのは手間になります．
そこで，簡単にデータを持ってくることが可能なPython APIを使ってデータを取得しグラフを作成します．

Comet.mlのPython APIの公式ドキュメント

https://www.comet.ml/docs/python-sdk/API/

## 流れ

- 自身のAPIキーで個人用ワークスペースを取得
- ワークスペースから条件を選んでexperimentを取得
- boxplotの作成



## 自身のAPIキーで個人用ワークスペースを取得
追加で必要なライブラリをインポートします．

```py
from comet_ml import API
```

そしてAPIキーで個人用ワークスペースを取得します

```py
api = API(api_key="API_KEY")
```
API_KEYの部分は自身のマイページから確認し，そのキーを代入してください．

## ワークスペース内から条件を選んでexperimentを取得

まず初めに，シンプルなexperimentの取得方法を示します．

```py
experiment = api.get_experiment("WORKSPACE", "PROJECT_NAME", "EXPERIMENT_KEY")
```

これでは毎回，取得したいexperimentの`EXPERIMENT_KEY`を入力しなければならく面倒である．

そこで，タグやパラメータを指定してexperimentを取得する方法を示します．
まず，タグとパラメータで条件を指定するので必要なライブラリをインポートします．

```py
from comet_ml.query import Tag
from comet_ml.query import Parameter 
```

MetricやMetadataなどもありますが，今回は使わないので，インポートしていません．
必要に応じて同様にインポートしてください．

ここで，`score`というタグと`compression_rate`というパラメータを持ち，`compression_rate`が100である時をqueryに定義します．
定義したqueryを条件に`experiments`を取得します．
出力結果より，得られた`experiments`はリストの形をしていることが分かります．

```py
tagged = Tag("score")
compression_rate_params = Parameter('compression_rate')
query = ((compression_rate_params == 100) & tagged)
experiments = api.query("WORKSPACE", "PROJECT_NAME", query)
print(experiments)

# 出力
[<APIExperiment 'WORKSPACE/PROJECT_NAME/EXPERIMENT_KEY（例：3fb027ebdcc....)'>]
```

ここで，`score`というタグと`compression_rate`というパラメータを持ち，その値が100である時をqueryに定義する．
定義したqueryを条件に`experiments`を取得する．
出力結果より，得られた`experiments`はリストの形をしています．

## boxplotの作成
今回は，metricとしてログを残したssimのboxplotを作成したいと思います．
`experiments`内の`ssim`を取得します．

```py
ssim_list = experiments[0].get_metrics("ssim")
print(ssim_list)

# 出力
[{'epoch': None,
  'metricName': 'ssim',
  'metricValue': '0.9977576459186188',
  'offset': 92,
  'runContext': None,
  'step': 0,
  'timestamp': 1635487567854},
 {'epoch': None,
  'metricName': 'ssim',
  'metricValue': '0.9976428612529257',
  'offset': 107,
  'runContext': None,
  'step': 3,
  'timestamp': 1635487568711},
 {'epoch': None,
   .
   .
   .
```

このように`ssim`で指定すると，ssim値やstep値がdict形式のリストで返されるので，1個ずつ値を取得していきます．

```py
ssim_score = ssim_list[0].get("metricValue")
print(ssim_score)
type(ssim_score)

# 出力
0.9977576459186188
str
```


このようにして得られた値を1つずつリストに追加していき，boxplotを作成します．
その前にここで得られる値は文字列となっているので，今回はfloatに変換し，boxplotを作成します．
実行するコード (notebookの場合)を以下に示します．

```py
import comet_ml
import matplotlib.pyplot as plt
from comet_ml.query import Tag
from comet_ml.query import Parameter 
from comet_ml import API
%matplotlib inline


api = API(api_key="API_KEY")
ssim_0_100_list = []
for i in range(11):
    compression_rate = i * 10
    print(compression_rate)
    tagged = Tag("score")
    compression_rate_params = Parameter('compression_rate')
    query = ((compression_rate_params == compression_rate) & tagged)
    experiments = api.query("WORKSPACE", "PROJECT_NAME", query)
    ssim_list = experiments[0].get_metrics("ssim")
    exec_command_ssim_list = 'ssim_' + str(compression_rate) + '= []' 
    exec(exec_command_ssim_list)
    for j in range(len(ssim_list)):
        ssim_score = ssim_list[j].get("metricValue")
        exec_command_ssim_append = 'ssim_' + str(compression_rate) + '.append(ssim_score)'
        exec(exec_command_ssim_append)
    exec_command_ssim = 'ssim_0_100_list.append(ssim_' + str(compression_rate) + ')'
    exec(exec_command_ssim)

# boxplot作成

labels = list(range(0, 110, 10))
colors = ["red", "green", "blue", "black" , "yellow" , "violet", "cyan", "gray", "coral", "indianred", "lime", "magenta"]
boxplt = plt.boxplot(ssim_0_100_list, labels=labels, showfliers=False, patch_artist=True)
plt.xlabel('compression_rate')
plt.ylabel('ssim')
plt.title('ssim')
for b, c in zip(boxplt['boxes'], colors):
    b.set(color=c, linewidth=1)  # boxの外枠の色
    b.set_facecolor(c) 
plt.show()
```

出力は以下の図のようになります．
![スクリーンショット 2021-11-03 23.22.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2241869/45a6deba-1955-5538-7662-8ea53084a1c9.png)

これで必要なデータをダウンロードすることなく，コードを実行することでboxplotが作成できました．