風待ち

プログラミングの勉強や日々の出来事のログなど

scikit-learnのテキトーに作ったモデルを読み込んで、Flaskを使ってWebでもアクセスできるようにしてみる。

前に作ったモデルを読み込んで使う。

バッチ処理だけではなんなので、Webアプリに組み込んでみた。

import json

from flask import Flask
from flask import request
from flask import abort

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.externals import joblib

scaler = joblib.load("foo.scaler")
model = joblib.load("foo.learn")

app = Flask(__name__)


@app.route('/foo', methods=['POST'])
def foo():
    if not request.json:
        abort(400)

    data = pd.DataFrame(request.json)
    for col in data.loc[:, data.dtypes == 'int64']:
        data[col] = data[col].astype(float)

    X = data.loc[:, data.columns].as_matrix()
    X = scaler.transform(X)

    y_predict = model.predict(X)
    return json.dumps(str(y_predict[0]))


if __name__ == "__main__":
    app.run(debug=True, port=5000)

こんなテキトーなものでも動いてるな。

$ curl http://localhost:5000/foo -s -X POST -H "Content-Type: application/json" -d '{"YYYY": ["2018"], "MM": ["08"], "DD": ["05"], "DY": ["0"]}'

試してないけど、jQueryだとこんな感じかな。

$('#btn').click(function() {
  var d = {"YYYY": ["2018"], "MM": ["08"], "DD": ["05"], "DY": ["0"]};
  $.ajax({
    url: 'http://localhost:5000/foo',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify(d),
  }).done(function (data) {
    console.log(JSON.parse(data));
  });
});

バッチ処理だけでは利用用途が限られるのと、未来の予測に必要なデータを作り込むのが大変だけど、こうやってWebで使えるようになると、入力に反応してリアルタイムに使う道が増えるから一気に活用の場所が広がるな。

あと、初めてFlaskを使ったけど、小さいものを作る分にはものすごく楽。