Pythonで作成したモデルをPMMLに出力してYellowfinで利用する

以前に[Rで作成したモデルをPMMLに出力してYellowfinで利用するざっくりした手順](https://qiita.com/hadatuna/items/d532b281439446fcad78)という記事を書きました。
今回はRではなくPythonを使って同じようなことをやってみます。

# 今回の動作環境

* macOS 10.13
* Anaconda 5.0.0
* Python 3.6.2
* Jupyter Notebook 4.3.0
* sklearn2pmml 0.39.0
* Yellowfin 8.0.0
* Yellowfin PMMLプラグイン-20171204

# Anacondaのインストール

AnacondaはPython本体と、機械学習やデータサイエンスでよく使われるライブラリがまとめられたディストリビューションです。Jupyter Notebookも含まれています。
具体的なインストール方法については検索すれば情報がたくさん出てきますので、ここでは割愛します。

# sklearn2pmmlのインストール

scikit-learnは定番のPython機械学習ライブラリです。今回もこのライブラリを使ってモデルを作成します。
そして、作成したモデルをPMML出力するために**sklearn2pmml**というライブラリを使用します。

[sklearn2pmml](https://github.com/jpmml/sklearn2pmml)

インストールするにはターミナルで以下を実行します。

```
$ pip install --user --upgrade git+https://github.com/jpmml/sklearn2pmml.git
```

# Yellowfinとプラグインのインストール

これもここでは割愛します。なお、日本国内でPMMLプラグインを入手するにはYellowfin Japan社のサポートへ連絡する必要があります。（2019年1月現在）

# Jupyter NotebookでモデルとPMMLファイル作成

[sklearn2pmmlのUsage](https://github.com/jpmml/sklearn2pmml#usage)に記載されている例に従って、今回はかの有名なIrisデータセットを使用した学習モデルを作成します。

[iris_train.csv](https://raw.githubusercontent.com/hadatuna/python-pmml-yf/master/iris_train.csv)

まずは以下を叩いてJupyter Notebookを起動。

```
$ jupyter notebook
```

するとブラウザが立ち上がってJupyter Notebookが表示されますので、新規にnotebookを作成します。
![py-pmml-yf1.png](https://qiita-image-store.s3.amazonaws.com/0/116818/509919cb-1933-c1be-8b43-c89b03c2458e.png)

そして、おもむろに以下のコードをコピペして、**ファイルパスをご自身の環境に合わせて編集**した後に実行ボタンをクリックします。

```sklearn2pmml.py
import pandas
iris_df = pandas.read_csv("/Users/xxxxxx/temp/iris_train.csv")
from sklearn.tree import DecisionTreeClassifier
from sklearn2pmml.pipeline import PMMLPipeline
pipeline = PMMLPipeline([
    ("classifier", DecisionTreeClassifier())
])
pipeline.fit(iris_df[iris_df.columns.difference(["Species"])], iris_df["Species"])
from sklearn2pmml import sklearn2pmml
sklearn2pmml(pipeline, "/Users/xxxxxx/temp/DecisionTreeIris.xml", with_repr = True)
```

![py-pmml-yf2.png](https://qiita-image-store.s3.amazonaws.com/0/116818/1f899a39-d082-23d4-56c3-d87cb9280d37.png)

実行したら指定した場所にファイルが作成されているはずです。

[DecisionTreeIris.xml](https://raw.githubusercontent.com/hadatuna/python-pmml-yf/master/DecisionTreeIris.xml)

# Yellowfinのトランスフォーメーションフローでの利用

最近のBIツールには事前にデータを準備する機能を備えているものがあります。
Yellowfin Suiteにも**Yellowfinデータ準備（Yellowfin Data Prep）**というカテゴリーが存在します。
![py-pmml-yf6.png](https://qiita-image-store.s3.amazonaws.com/0/116818/ea579cfb-c856-00c1-343e-ca5d790b60ac.png)

Yellowfin上の機能名では**トランスフォーメーションフロー**と呼ばれています。この機能はYellowfin 7.4以降のユーザーであればすぐに利用することができます。別途インストールする必要もありませんし、オプション料金がかかることもありません。

以前の記事では高度な関数でPMMLモデルを使用しましたが、今回はこのトランスフォーメーションフローを例に取ってみます。

まず、以下のテスト用CSVファイルをインプットステップで読み込みます。

[iris_test.csv](https://raw.githubusercontent.com/hadatuna/python-pmml-yf/master/iris_test.csv)

![py-pmml-yf3.png](https://qiita-image-store.s3.amazonaws.com/0/116818/57db5ed7-f375-7411-0b8a-d794e8029664.png)

次にトランスフォーメーションステップの**PMMLモデル予測**をドラッグ＆ドロップし、インプットステップと接続します。
そして、DecisionTreeIris.xmlを読み込み、以下の画面の通り設定します。
![py-pmml-yf4.png](https://qiita-image-store.s3.amazonaws.com/0/116818/e6b5d15e-a452-e65b-1d6f-bf191d77708e.png)

**保存**をクリックすると以下のように予測値の列が追加されます。
![py-pmml-yf5.png](https://qiita-image-store.s3.amazonaws.com/0/116818/3b732f2f-707a-9e60-035f-a996face81a9.png)

あとはアウトプットステップを設定して任意のデータベースへ書き込めば、Pythonで作成した学習モデルを使って予測された値を活用することができます。

# まとめ

Rと同様に、Pythonで作成したモデルもYellowfinで利用することができました。
中間にPMMLを経由することによって、学習モデルの開発環境に左右されない可搬性の高い業務運用を実現することができます。