Assisted Modelingで作成されたモデルを使ってPythonツールで推論する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。

以前購入していたThinkpadトラックポイントキーボードIIが先日届きました。 長年、ThinkPad USB トラックポイントキーボードを愛用していましたが、 古いモデルのためドライバが公式ではWindows10に対応していなかったり(インストールすれば動きはする)、自宅で仕事をするようになってかは配線ごちゃごちゃが気になりだしたため、いっそ最新の無線モデルにしてやろうという魂胆です。 そのため、この記事を書くにあたって、キーボードの使い心地のテストという裏目的もありますw

Assisted ModelingとPythonツール

さて、本題に入っていきましょう。 以前ご紹介させていただいた通り、Assisted Modelingでは学習の処理をコードとしてPythonツールにエクスポートする機能を有しています。

エクスポートされたPythonツールの出力と、Assisted ModelingのFitツールの出力は同じ形式の機械学習モデルとなっています。 そのため、生成されたPythoつツールが出力するモデルはAssisted ModelingのPredictツールでそのまま利用可能です。

これらの関係によって、モデル作成と推論の双方でAssisted Modelingを使うかPythonツールを使うかを組み合わせで選ぶことが可能になっていますね。 しかし、Alteryx 2020.2現在、Predictツール相当の機能はエクスポート機能が存在していません。

そのため、実装する方法を紹介してきます。

モデルを使って推論を行う

まずは、エクスポートされたPythonツール内に推論処理を追加してみましょう。

利用するデータはおなじみのirisデータセットです。 事前にデータを分割しておき、学習データは #1 、テストデータは #2 としてPythonツールで受け取っています。

エクスポートされたPythonツール内では、pipeline_entity変数のfit関数で学習処理を行っているので、 そのあとてテストデータの読み込みと推論処理を行っています。

test_data_df = Alteryx.read("#2")
test_data_df.drop(columns=['Species'], inplace=True)

pipeline_entity.predict(test_data_df)

推論を行うにはpipeline_entityのpredict関数を利用します。 predict関数では、データ内に目的変数の列がない状態である必要があるため、事前に削除しています。

結果は以下のように推論した値のみを出力します。

また、分類であればpredict_proba関数を使うことで、各カテゴリの確率値も取得可能です。

この結果をテストデータと結合すれば、Predictツールど同様の結果が得られます。

モデルをPythonツールで読み込んで利用する

Assisted ModelingでエクスポートしたPythonツール内で推論は簡単に実行可能でした。 では、続いてAssisted Modelingが生成したモデルやエクスポートしたPythonツールが出力するモデルを別なPythonツールで読み込んで利用する方法を見ていきましょう。

推論を行う際には、Assisted Modeling内部の各種ライブラリがインストールされた環境が必要です。 Pythonツールをワークフローに配置後、まずはvenv環境の変更を行っておきましょう。

変更を行うにPythonツールのJupyter上部のメニューから Kernel > Change kernel > machinelearningtool_venv を選択します。

モデルはBlob形式で出力されています。 そのため、Pythonツールで読み込むとbytearrayとなっています。

まずはこれを取得してデシリアライズします。

from ayx import Alteryx
from ayx_ml_toolkit.serializers import PipelineSerializer
from ayx_ml_toolkit.utilities.cfml_codecs import DataCodec

pipeline_blob = Alteryx.read("#1").iloc[0, 0]
pipeline_entity = PipelineSerializer.deserialize(DataCodec.decode(pipeline_blob))

pipeline_entityにはシリアリズするタイミングで目的変数に関する情報が含まれていません。 先ほど、同一のPythonツール内で処理を行ったときにはテストデータの目的変数はdropするのみでしたが、 今回はメタデータを取得して目的変数として設定しておきましょう。 処理内容自体は、エクスポートしたもので学習時に行っていたものと同等となっています。

from ayx_ml_toolkit.entities import ColumnMetadataEntity

test_metadata = Alteryx.readMetadata("#2")

target_variable = "Species"
target_metadata = ColumnMetadataEntity(
    col_name=target_variable,
    col_type=test_metadata[target_variable]["type"]
)
pipeline_entity.target = target_metadata

あとは、テスト用データを読み込んで目的変数の列さ削除したのち、推論を行うだけです。

test_df = Alteryx.read("#2")
pipeline_entity.predict(test_df.drop(columns=target_variable))

このコードは、Assisted Modelingによって作成されたモデルであっても、Pythonツールにエクスポートされたものであっても同様に利用可能です。

おわりに

今回は、Assisted Meodeling関連として、作成されたモデルを使ってPythonツールで推論する方法を紹介しました。 Pythonツールへのエクスポート機能を使って処理をカスタマイズしまくりたい人はぜひこちらもご活用ください。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400