12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sckit-learnのPiplineを使って、カスタム前処理をモデルの中に組み込む

Last updated at Posted at 2018-09-13

はじめに

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へのモデル登録ができないことに気付いて、コードを全面的に見直した次第です。

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?