AutoAIで作成したモデルは、通常はWatson Machine Learningで実行します。
しかしながら、不良の予測などの場合、ネットワークにつながらないエッジのローカルのパソコンなどで実行したい場合があります。
ここではAutoAIで作成したモデルをローカルPCにダウンロードして、予測を行ってみたいと思います。
具体的にはAutoAIで作成したエクスペリメントを操作するNotebookをダウンロードし、Watson StudioからモデルをローカルPCに取得してpickleファイルにして、別のPythonコードから読み込んで予測します。
- テスト環境
- 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 さんの記事を参照して作った「営業成約予測」のモデルを使います。以下の手順を参考にモデルを作ってください。
2. エクスペリメントのNotebookの保存
今回は「パイプライン2」が最優秀なモデルとして選ばれています(ランダム要素もあるので結果は変わる可能性があります)。
ここで「コードの保存」をクリックして、Notebookとして保存します。
プロジェクト内に「営業成約予測」のNotebookができましたので開き、ダウンロードボタンでローカルのPCにダウンロードします。
3. APIキーの作成
コピーやダウンロードをして保存しておきます。(このAPIキーがあるとユーザーの操作がなんでもできてしまうようになるので、管理には気を付けてください)
4. Notebookでモデルを抽出する
ここではWindows上のVisual Studio Codeで実行していきます。
パッケージ導入
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キーを以下に設定します。
api_key = 'PUT_YOUR_APIKEY_HERE'
最高ランクのパイプラインをpickle化する
pipのセル以外を「Get pipeline as a scikit-learn pipeline model」の前まで実行していきます。
まず、ポイントになるのは「Get fitted AutoAI optimizer」です。ここで先ほどAutoAIで実行したエクスペリメントを呼び出しています。
そして、「Get pipeline as a scikit-learn pipeline model」のコードを以下に変更して実行します。get_pipeline(pipeline_name='Pipeline_2')で最高ランクだったパイプライン2を取得して、pickle.dumpでpipeline_model.pickleというファイルに書き出しています。
#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というファイルができます。
必要パッケージimport文の生成
次に「Preview pipeline model as a Python code」のセルを実行します。
このコードの中からimport文の部分を抜き出しておきます。この内容はパイプラインによって変化します。このモデルではxgboostを使っていますが、モデルによってはrandomforestを使っていたり、pcaを使っていたりします。
Notebookはまだ続きますが、この後はWatson Machine Learningにモデルをアップしていくコードになりますので、今回はローカルで実行したいので実行しません。
5. 予測用Notebook
いまダウンロードしたpipeline_model.pickleをつかって予測をしていきます。
新しいnotebook、ここではpredict.ipynbを作成し、先ほどのimport文を貼り付けます。
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を読み込みます。
#モデルの読み込み
import pickle
with open('pipeline_model.pickle', 'rb') as p:
pipeline = pickle.load(p)
次にデータを読み込みます。
#データの読み込み
import pandas as pd
df=pd.read_csv('bank-train-jp-autoai.csv')
df_x= df.drop(['今回販促結果'],axis=1)
先頭10行を予測してみます。ネットワークのつながっていない。ローカルPC上でも実行ができました。
#予測
pipeline.predict(df_x.values[:10])
サンプル
エクスペリメントNotebook
予測Notebook
requirements.txt
piclkeファイル