はじめに
Watson Studioの機能を使うと、sckit-learnのモデルを簡単にWebサービスにすることができます。
(参考リンク) Watson Studioでscikit-learn機械学習モデルをWebサービス化する
便利な機能なのですが、この機能を実業務で使うことを想定すると、前処理にあたる部分もモデル処理に含めてしまいたくなります。
sckit-learnのカスタムモデルクラスと、Pipelineを使って、これを実装してみたサンプルコードをメモとして残しておきます。
(2019-01-05 FunctionTransformerを使った方式に全面書き換え)
前提
元データは、Irisデータセットを使います。
このデータセットは、ご存じのとおり、4次元の入力データですが、このうち、1番目と3番目の列は、x に対して np.log(x + 1)に値を変更し、これを後段のモデルの入力とします。
後段のモデルはパラメータすべてデフォルト値のSVMとします。
(業務的には何の意味もないです。単なるサンプルコードと考えて下さい)
動作確認はWatson Studio上のJupyter Notebookで行っています。
データ準備
この部分は特別なことは何もしていないので、解説は省略します。
from sklearn.datasets import load_iris
iris = load_iris()
import pandas as pd
X = iris.data
y = iris.target
フィルター関数の定義
FunctionTransformerの引数として使う、フィルター処理の実装を行う関数です。
import numpy as np
# フィルター関数の実装例
# (1列名と 3列名に np.log1pをかける)
def select_log1p(X):
# 元の変数に副作用を与えないため、コピーを作成
XX = X.copy()
# 1列名と 3列名に np.log1pをかける
XX[:,[0,2]] = np.log1p(XX[:,[0,2]])
# コピーした変数を戻す
return XX
パイプラインの定義
make_pipeline
関数を使ってパイプラインの定義を行います。
今回は、前処理の関数1段だけとなっていますが、フィルター関数は複数段入れることも可能です。
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import FunctionTransformer
from sklearn.svm import SVC
# Pipelineの定義
pipe = make_pipeline(
FunctionTransformer(select_log1p), SVC())
呼出し方法
このようにして定義したオブジェクトpipe
は、通常のモデルのように、fit
,predict
,score
関数が利用可能です。
具体的には、次のようなコードになります。
# 学習実施
pipe.fit(X, y)
# 予測実施
pipe.predict(X)
# 精度評価
pipe.score(X, y)
(おまけ)Webサービス化
Watson Machine Learingを使っている場合、このような方法で作ったPipelineオブジェクトは、Modelとしての保存やWebサービス化が可能です。
具体的な手順についてはWatson Studioでscikit-learn機械学習モデルをWebサービス化するを参照して下さい。
おまけのおまけ
Watson Machine Learningにsckit-learnで作ったモデルを登録する場合、ライブラリのみ使ってモデルを作るのであれば可能なのですが、独自クラスを拡張してモデルを作ることをやってしまうと、登録不可となります。この記事自身も最初は独自クラス実装で書いていたのですが、この理由でWatson Machine Learningへのモデル登録ができないことに気付いて、コードを全面的に見直した次第です。