Python

PythonとPlotly/Dashで機械学習WEBアプリを作ってみよう

以前のブログ記事でStreamlitを使って簡単な機械学習WEBアプリを作るというのをやりましたが、今回はその兄弟企画でPlotly社が提供しているDashというライブラリを使って機械学習WEBアプリを作ってみたいと思います。

Plotly社はPlotlyやPlotly Expressというとても便利な可視化ライブラリを提供しているのですが、そのうちの一つとして簡単にアプリを開発できるDashを提供しています。

https://dash.plotly.com

DashはPythonベースで開発することができ、同じPythonでアプリ開発するときによく使われるDjangoやFlaskよりもずっと簡単にアプリが作れるので、Pythonで何かデモアプリを作りたいようなときに重宝されます。

そしてStreamlitよりは拡張性が高いので、もう少し凝ったものが作りたい時に向いているのではないかと思います。

というわけで、今回はDashを使った機械学習WEBアプリを作ってみます(デプロイはしません・・)。

 

Dashで機械学習WEBアプリを作ってみる

今回はSeabornに入っている"tip"チップ額のデータを使って、どのチップ額を予測するWEBアプリを作ってみたいと思います。

 

データのダウンロード

まずはデータをダウンロードしましょう。

seabornをimportして、load_datasetの中から"tips"を指定してダウンロードします。

 

 

線形重回帰によるモデリング

データがダウンロードできたので、そのデータを使ってチップ額を予測するモデルを作ります。

今回は簡単のため、説明変数を"size", "time", "total_bill"とし、目的変数を"tip"とします。

ちなみに"size"は食事をした人数、"time"はランチかディナーか、"total_bill"は食事の合計額で、"tip"がチップ額になります。

モデリングは簡単のため標準化とかも全くせず、とりあえず線形重回帰でモデリングをするだけにします。

 

 

もちろん、このモデリング自体はこのコード内になく、別のところで作ったモデルを読み込むようにすればよいのですが、一つのファイルにまとまっていた方がわかりやすいかと思い、今回はこのようにしています。

 

Plotlyによるグラフ作成(箱ひげ図・散布図)

せっかくWEBアプリを作るので、ただ数値を入れて予測するだけでは味気ないですから、アプリで図表も見れるようにしておきたいと思います。

今回は説明変数として3つの変数を使うので、それらの分布をアプリで確認できるようにします。

なので、それ用のグラフをPlotlyで作ります。

make_subplotsで1行3列の箱を用意し、その中にadd_traceして3つのグラフを入れていきます。

入れるのは、「ランチorディナー」と「チップ額」の箱ひげ図、「合計額」と「チップ額」の散布図、そして「人数」と「チップ額」の散布図です。

 

まだこの段階ではアプリはできていないので、上記で作ったのはあとでアプリに入れるためのグラフということになります。

 

アプリの作成(app.layout)

では本命のアプリ部分を作っていきます。

まずはアプリの静的な部分(レイアウト)を作っていき、そのあとにアクションを加えていくというふうに進めていきます。

アプリのレイアウトは、app.layoutという中にHTMLのような形で書いていき、ボタンや数値の入力枠などはdash_core_components (dcc)を使って付け加えていきます。

今回は、数値である「合計額("total bill")」と「人数("size")」を入力し、2値である「ランチorディナー("time")」をラジオボタンを入力するようにします。

そして、そのインプットを読み込んで先ほど作ったモデルで予測を行い、一番最後にチップの予測額を出力します。

 

これでアプリのレイアウトができたので、次に動きを付け加えていきます。

 

アプリの動き(callback)

さて、アプリの動きはcallbackというものを使って実装します。

今はまだ数値を入れる枠やボタンしかないので、これでアプリにしても何も起こりません。

なので必要なことはインプットの値を読み込んだら予測を行い、それを画面に出力するということです。

そちらを@app.callbackという中で指定します。

アクションはInputの"submit-button"が押されたら始まり、それによって次の関数predictionが動作し、そのreturn結果がOutputから返されるという流れになっています。

 

そして、最後にapp.run_server()をすれば、アプリが動くということになります。

このコードができたら、ターミナルで以下を実行すればOKです(コードをapp.pyとした場合)。

 

 command
python app.py

 

するとターミナルにこのようなメッセージが出るので、出てきたURLをブラウザにコピーするとWEBアプリが表示されます。

 

 

全体はこのように上部にグラフが、そして下部にインプットとその結果が表示されています。

最初はなにも値が入っていませんので予測額もなく「ちゃんとデータを入力してね」になっています。

 

 

次に値を入れてみます。

 

 

値を入れましたが、まだSubmitボタンを押していないので、予測額の表示は変わっていないと思います。

そしてSubmitボタンを押すと、callbackが動いてチップの予測額が表示されました!

 

 

HTMLとかcallbackとかを頑張って書いていけばけっこう凝ったアプリができますので、ぜひやってみてください!

おすすめ記事

1

こんにちわ、サトシです。33歳です。 今回は、データサイエンティストの3年間に3社で働いた僕が、データサイエンティストとしての転職活動についてまとめて書きたいと思います。 これまでSE→博士研究員→ポ ...

2

お疲れさまです! 久しぶりの更新になってしまいましたが、僕が未経験からデータサイエンティストになるまでの転職活動の全記録を書き残しておきたいと思います。 僕は博士号を取得後に研究員として仕事をしていま ...

3

こんにちわ、サトシです。 今回は、企業でデータサイエンティストとして働いていた僕が、フリーランスとしてどのような手順で独立していったかについて書いていきたいと思います。 僕はSIer SE→博士過程→ ...

-Python

Copyright© さとぶろぐ , 2024 All Rights Reserved Powered by AFFINGER5.