日々の学びと煩悩

Dashで機械学習ができるWebアプリを作る [ラスト]

Dashを使って、機械学習をさせるWebアプリケーション作ろうStep5!ラスト!

いやー長かったですね。

ようやく完成です!

またまたおさらいします。一応ね。

Step1: タイトルとデータアップロードの枠だけ作り、cssでいい感じに表示させる

wimper-1996.hatenablog.com

Step2: 単純な線形モデルを作り、グラフとスコアを表示させる

wimper-1996.hatenablog.com

Step3: モデルを選択するドロップダウンを作って、選択したモデルに応じて出力結果が変わるような動的なページを作る

wimper-1996.hatenablog.com

Step4: ファイルをアップロードし、データフレームとして表示させる

wimper-1996.hatenablog.com

ラストはここ!!↓

Step5: アップロードしたデータを読み込んで学習させるようにする


今回のステップを経ると、無事、完成品ができます!

最初、何もグラフとして表示されていたなかった淡白なページに、

データがアップロードされ…

自動的にデータの中身を読み込んで学習されるようなアプリになりました。

f:id:wimper_1996:20191105133239g:plain

今回は、前回、callbackのOutputとしてdash_table.Datatableの中身を返しましたが、

今回はそれをInputとして、モデルの学習に使います。 かっこよく言ってchain callbackってやつ。

コールバックの全体像はこんな感じ

f:id:wimper_1996:20191105133415p:plain

スタートはデータのアップロードから。

それとは別にモデルの種類を選択するドロップダウンも作って、

その両方の情報を機械学習に使う。

そろそろ、callbackの雰囲気も掴めてきたのではないでしょうか?

Step3では、ドロップダウンで選択したモデルを値としてInputして、学習させていました。

この時データは、一番最初にdf = pd.read_csvで読み込んでいました。

が、今回は、手動でアップロードし、data_tableに送られたデータの情報がInputとして追加で必要になります。

@app.callback([Output('rmse-sentence', 'children'),
               Output('r2-sentence', 'children'),
               Output('residual-plot', 'figure')
               ],
              [Input('model-dropdown', 'value'),
               Input('output-data-upload', 'data')]
              )
def update_result(model_name, dict_data):
    # コールバックが起こるがまだデータはアップロードされていないので、例外処理を行う
    if dict_data is None:
        raise dash.exceptions.PreventUpdate

    # アップロードしたデータテーブルの中身を読み込む
    df = pd.DataFrame(data=dict_data)

data_tableに格納されているデータの型はdict型で、pd.DataFrame(data=)でデータフレームに変換することができます。

あとのモデルを学習させる続きは、Step3と一緒です(雑)

終わりに

これでようやく完成しました〜〜

ここまで見てくれてありがとうございました!

へ〜こんな簡単にアプリ作れるんだ!と実感してくれたら嬉しいです。

今回、モデルは2つしか使っていませんが、

ドロップダウンを増やしたり、

パラメータを変化させたり、、、

簡単な前処理も施せるかも。

ここから、色々機能を追加できると思います!

ぜひ色々試してみてください。

私はちなみに、学習モデルとして勾配ブースティングと決定木のアンサンブルモデルであるXGboostも付け足してみて、

loading機能も加えてちょっとお洒落にしてみました。

f:id:wimper_1996:20191106020039g:plain

やっぱり、スコアは3つのモデルの中でxgboostが一番よかった。

若干自己満な感じあるけど、楽しかったからよし。笑

ここまで読んでくれてありがとうございました〜〜!!!