IBM Cloud Pak for Data as a ServiceのNotebookで機械学習パイプラインを自動化する

# はじめに
IBM Cloud Pak for Data as a Service（以下CP4DaaS）のNotebookで機械学習のパイプラインを実装する際のファイル入出力について、以下の記事でとりあげました。
[IBM Cloud Pak for Data as a ServiceのNotebookで機械学習のパイプラインを実装する際のデータ入出力を整理](https://qiita.com/nobs616/items/c44de2332495dc625a7a)

上記記事の手順では、デプロイメントスペースの資産IDをAPIで手動取得しつつ進める前提となっています。つまり、データ資産を再作成することでIDが変更されてしまった場合には手動でIDを再取得する必要があります。実際の運用を想定すると、例えばデータ資産の登録や再作成が繰り返し発生するようなケースではその度に手動操作が入り、作業負荷増大や潜在的な作業ミスのリスクがあります。別の視点では、デプロイメントスペースに同じ名前のデータ資産を追加する場合、パイプライン実行毎に同じ名前のデータ資産が重複して作成されてしまう問題もあります。

本記事では、パイプラインを自動化するために、これら２つの問題に対処する方法を記載します。

*****

# 対処のポイント
以下2点が上記問題への対処のポイントです。なお、2.で削除するデータ資産はデプロイメントスペースでは削除されますが、IBM CloudObjectSorage(以下COS)には残っており、バージョン管理されます（COSのバケットでバージョン管理が有効化されていることが前提です）。

① デプロイメントスペース上のデータ資産の名前から最新の資産IDを自動取得する
② デプロイメントスペースへのデータ資産の登録前に同じ名前のデータ資産を自動削除する

![記事2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2139220/6ac47b3d-b777-149b-ac5e-7049c57a9e9f.png)


*****

#Notebook上の修正内容
## 1. デプロイメントスペース上のデータ資産の名前から最新の資産IDを自動取得する

### 1-1. 関数の用意
同じ名前のデータ資産から最新のデータ資産IDを取得する関数"get_latest_asset_id"を用意。

```py
# asset id取得関数
def get_latest_asset_id(wml_client, data_asset_name):

    # Data Assetのリストを取得
    all_data_assets = wml_client.data_assets.get_details()

    # Data Asset名でフィルター
    filtered_data_assets = list(filter(lambda e: e['metadata']['name'] == data_asset_name, all_data_assets['resources']))

    # 見つからなかったらエラーにする
    assert  len(filtered_data_assets) > 0, 'asset({}) is not found '.format(data_asset_name)

    # 最終更新日の最も新しいData Asset IDを取得
    asset_id = wml_client.data_assets.get_uid(sorted(filtered_data_assets, key=lambda e: e['metadata']['last_updated_at'], reverse=True)[0])
    print('asset id: {}'.format(asset_id))
    return asset_id
```

*****


### 1-2. 分析対象データの取得

学習データとテストデータのデータ資産の名前を登録

```py
# 加工後のトレーニングデータとテストデータの登録名とファイル名
TRAIN_DATA_ASSET_NAME = 'Telco_Customer_Churn_Processed_Training'
TEST_DATA_ASSET_NAME = 'Telco_Customer_Churn_Processed_Test'
PROCESSED_TRAINING_DATA_FILE_NAME = '{}.csv'.format(TRAIN_DATA_ASSET_NAME)
PROCESSED_TEST_DATA_FILE_NAME = '{}.csv'.format(TEST_DATA_ASSET_NAME)
```

上記関数を使ってデータ資産の名前からデータ資産IDを取得し、変数として設定。

```py
#学習データの資産IDを取得
training_asset_id = get_latest_asset_id(wml_client, TRAIN_DATA_ASSET_NAME)
#テストデータの資産IDを取得
test_asset_id = get_latest_asset_id(wml_client, TEST_DATA_ASSET_NAME)
```

データ資産をダウンロード。

```py
# デプロイメントスペースから学習データをダウンロード
wml_client.data_assets.download(asset_uid=asset_id, filename=PROCESSED_TRAINING_DATA_FILE_NAME)
# デプロイメントスペースからテストデータをダウンロード
wml_client.data_assets.download(asset_uid=asset_id, filename=PROCESSED_TEST_DATA_FILE_NAME)
```

## 2.デプロイメントスペースへのデータ資産の登録前に同じ名前のデータ資産を自動削除
アセット登録前のアセットを削除して、パイプライン実行毎に同じ名前のデータ資産が作成されないようにします。

学習データ・テストデータのデータ資産名からアセットIDを取得（上記関数を使って最新を取得）

```py
# 既に同じ名前のデータ資産があったら削除
latest_train_data_asset_id = get_latest_asset_id(wml_client, TRAIN_DATA_ASSET_NAME)
latest_test_data_asset_id = get_latest_asset_id(wml_client, TEST_DATA_ASSET_NAME)

if latest_train_data_asset_id is not None: wml_client.data_assets.delete(latest_train_data_asset_id)
if latest_test_data_asset_id is not None: wml_client.data_assets.delete(latest_test_data_asset_id)
```

*****

# おわりに
CP4DaaSのNotebookでパイプラインを自動化するポイントについて記載しました。CP4DaaSには、現時点でβ版ですが（2021年11月12日現在）、Notebookを使ってパイプラインを実装するWatson Studio Pipelineがあります。このサービスを使って本記事で記載した内容をパイプライン化する手順については、記事を改めて記載します。


# 参考
[Watson Machine Learning APIs](https://www.ibm.com/support/producthub/icpdata/apis/watson_machine_learning)