AutoAIで作成したModelをローカルPythonで実行する

AutoAIで作成したモデルは、通常はWatson Machine Learningで実行します。
しかしながら、不良の予測などの場合、ネットワークにつながらないエッジのローカルのパソコンなどで実行したい場合があります。

ここではAutoAIで作成したモデルをローカルPCにダウンロードして、予測を行ってみたいと思います。

具体的にはAutoAIで作成したエクスペリメントを操作するNotebookをダウンロードし、Watson StudioからモデルをローカルPCに取得してpickleファイルにして、別のPythonコードから読み込んで予測します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7cf70112-fe59-476f-8d91-43cffe112de2.png)

* テスト環境
    * CP4DaaS (2024-03-05)
    * Python 3.10.9
    * ibm-watson-machine-learning-1.0.349
    * ibm-watsonx-ai-0.2.0 
    * autoai-libs-1.16.2
    * lale-0.7.11
    * scikit-learn-1.1.1
    * xgboost-1.6.2
    * snapml-1.13.2

# 1. モデルの作成
モデルは以下の@makaishi2 さんの記事を参照して作った「営業成約予測」のモデルを使います。以下の手順を参考にモデルを作ってください。

https://qiita.com/makaishi2/items/d6cd449f7a9f7186a833

# 2. エクスペリメントのNotebookの保存
今回は「パイプライン２」が最優秀なモデルとして選ばれています（ランダム要素もあるので結果は変わる可能性があります）。
ここで「コードの保存」をクリックして、Notebookとして保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2659c66c-3a74-a0f9-c294-433332a6b53f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/fe894ed0-5d47-78f9-d51d-fc5c9857d446.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bfde5405-2d78-5c5c-9ad8-9ed1c971fb40.png)
プロジェクト内に「営業成約予測」のNotebookができましたので開き、ダウンロードボタンでローカルのPCにダウンロードします。


# 3. APIキーの作成
ハンバーガーメニューから「IAM」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ea250206-8027-3540-60bc-b4a0bdf1362e.png)

「APIキー」を選び、「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/265f51b3-1aa9-243f-0fb5-cc604363d5a0.png)

適当な名前を指定して「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/74c645ab-1bab-d516-9533-69e996f302b4.png)

コピーやダウンロードをして保存しておきます。（このAPIキーがあるとユーザーの操作がなんでもできてしまうようになるので、管理には気を付けてください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a510dac4-8000-cfbb-e0de-50df7516a9f0.png)

# 4. Notebookでモデルを抽出する
ここではWindows上のVisual Studio Codeで実行していきます。

## パッケージ導入 
最初のセルのpackageを導入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/604b0273-727e-a58c-56ed-80e45d948e51.png)

Windowsだとこのままでは動かないのでコンソールなどで以下のコマンドで導入します。バージョンにシビアなのでこのセルの通りの順序で導入してください。


```
pip install ibm-watsonx-ai
pip install autoai-libs==1.16.2
pip install -U "lale>=0.7,<0.8"
pip install scikit-learn==1.1.1
pip install xgboost==1.6.2
pip install lightgbm==3.3.2
pip install snapml==1.13.2
```

## APIキーの設定
先ほど#3で取得したAPIキーを以下に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/1cd7d481-ee18-0380-b0d3-1aeba94411b7.png)
```python
api_key = 'PUT_YOUR_APIKEY_HERE'
```

## 最高ランクのパイプラインをpickle化する
pipのセル以外を「Get pipeline as a scikit-learn pipeline model」の前まで実行していきます。

まず、ポイントになるのは「Get fitted AutoAI optimizer」です。ここで先ほどAutoAIで実行したエクスペリメントを呼び出しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/30f419db-246e-ab0b-f057-a0b995c9a6b2.png)

そして、「Get pipeline as a scikit-learn pipeline model」のコードを以下に変更して実行します。get_pipeline(pipeline_name='Pipeline_2')で最高ランクだったパイプライン２を取得して、pickle.dumpでpipeline_model.pickleというファイルに書き出しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/96eae507-2167-4657-a748-85e72e948723.png)

```python
#pipeline_model = pipeline_optimizer.get_pipeline()
pipeline_model = pipeline_optimizer.get_pipeline(pipeline_name='Pipeline_2')
import pickle

with open('pipeline_model.pickle', mode='wb') as fo:
  pickle.dump(pipeline_model, fo)
```

以下のようにpipeline_model.pickleというファイルができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/af8694a6-c5a1-0d09-8c89-94b622a78b53.png)


## 必要パッケージimport文の生成

次に「Preview pipeline model as a Python code」のセルを実行します。

以下のようにパイプラインのPythonコードを出力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ae8f98a2-eb0e-cda4-8b37-574cf1d244f9.png)

このコードの中からimport文の部分を抜き出しておきます。この内容はパイプラインによって変化します。このモデルではxgboostを使っていますが、モデルによってはrandomforestを使っていたり、pcaを使っていたりします。

Notebookはまだ続きますが、この後はWatson Machine Learningにモデルをアップしていくコードになりますので、今回はローカルで実行したいので実行しません。

# 5. 予測用Notebook
いまダウンロードしたpipeline_model.pickleをつかって予測をしていきます。

新しいnotebook、ここではpredict.ipynbを作成し、先ほどのimport文を貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/58419691-82a0-f113-8429-407c42897b2a.png)

```python
from autoai_libs.transformers.exportable import NumpyColumnSelector
from autoai_libs.transformers.exportable import CompressStrings
from autoai_libs.transformers.exportable import NumpyReplaceMissingValues
from autoai_libs.transformers.exportable import NumpyReplaceUnknownValues
from autoai_libs.transformers.exportable import boolean2float
from autoai_libs.transformers.exportable import CatImputer
from autoai_libs.transformers.exportable import CatEncoder
import numpy as np
from autoai_libs.transformers.exportable import float32_transform
from sklearn.pipeline import make_pipeline
from autoai_libs.transformers.exportable import FloatStr2Float
from autoai_libs.transformers.exportable import NumImputer
from autoai_libs.transformers.exportable import OptStandardScaler
from sklearn.pipeline import make_union
from autoai_libs.transformers.exportable import NumpyPermuteArray
from xgboost import XGBClassifier
```
次にpickle.loadでpipeline_model.pickleを読み込みます。
```python
#モデルの読み込み
import pickle
with open('pipeline_model.pickle', 'rb') as p:
    pipeline = pickle.load(p)
```
次にデータを読み込みます。
```python
#データの読み込み
import pandas as pd
df=pd.read_csv('bank-train-jp-autoai.csv')
df_x= df.drop(['今回販促結果'],axis=1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5ec5d1de-7d0c-5401-9ac1-1d979a95eb10.png)

先頭10行を予測してみます。ネットワークのつながっていない。ローカルPC上でも実行ができました。

```python
#予測
pipeline.predict(df_x.values[:10])
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/196925de-56c5-cd54-c13a-1e9c08bde40b.png)

# サンプル

エクスペリメントNotebook

https://github.com/hkwd/200701WML/blob/master/240305AutoAILocalExecute/%E5%96%B6%E6%A5%AD%E6%88%90%E7%B4%84%E4%BA%88%E6%B8%ACpub.ipynb

予測Notebook

https://github.com/hkwd/200701WML/blob/master/240305AutoAILocalExecute/predict.ipynb

requirements.txt

https://github.com/hkwd/200701WML/blob/master/240305AutoAILocalExecute/requirements.txt

piclkeファイル

https://github.com/hkwd/200701WML/raw/master/240305AutoAILocalExecute/pipeline_model.pickle