PyCaretとStreamlitについて
PyCaretはAutoML(自動機械学習)のライブラリです。
Streamlitはデータ分析や可視化に優れたWebフレームワークです。
それぞれとても便利なライブラリですが、PyCaretはIPython Notebookを前提にしているところがあるので、StreamlitでPyCaretを使おうとするとうまくいきません。
が、StreamlitでPyCaret使いたいので、無理やり使ってみます。
インストールする
PyCaretは依存するライブラリが多めです。インストールに詰まったらエラーメッセージを見ながら対処してください。以降はインストールできた前提で進めていきます。
pip install pycaret
pip install streamlit
まずはPyCaretを試してみる
PyCaretを使うとJupyter Notebook等で簡単に機械学習のモデル構築を自動化できます。
試しにサンプルデータを読み込みます。
from pycaret.datasets import get_data
data = get_data('boston')
crim | zn | indus | chas | nox | rm | age | dis | rad | tax | ptratio | black | lstat | medv | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.00632 | 18.0 | 2.31 | 0 | 0.538 | 6.575 | 65.2 | 4.0900 | 1 | 296 | 15.3 | 396.90 | 4.98 | 24.0 |
1 | 0.02731 | 0.0 | 7.07 | 0 | 0.469 | 6.421 | 78.9 | 4.9671 | 2 | 242 | 17.8 | 396.90 | 9.14 | 21.6 |
2 | 0.02729 | 0.0 | 7.07 | 0 | 0.469 | 7.185 | 61.1 | 4.9671 | 2 | 242 | 17.8 | 392.83 | 4.03 | 34.7 |
3 | 0.03237 | 0.0 | 2.18 | 0 | 0.458 | 6.998 | 45.8 | 6.0622 | 3 | 222 | 18.7 | 394.63 | 2.94 | 33.4 |
4 | 0.06905 | 0.0 | 2.18 | 0 | 0.458 | 7.147 | 54.2 | 6.0622 | 3 | 222 | 18.7 | 396.90 | 5.33 | 36.2 |
回帰か分類かでimportするソースが変わります。
from pycaret.regression import * # 回帰の場合
#from pycaret.classification import * # 分類の場合
セットアップ時にデータの型を確認します。
exp = setup(data, target='medv', session_id=1234)
Feature_Type | Data Type | |
---|---|---|
crim | float32 | Numeric |
zn | float32 | Numeric |
indus | float32 | Numeric |
chas | object | Categorical |
nox | float32 | Numeric |
rm | float32 | Numeric |
age | float32 | Numeric |
dis | float32 | Numeric |
rad | object | Categorical |
tax | float32 | Numeric |
ptratio | float32 | Numeric |
black | float32 | Numeric |
lstat | float32 | Numeric |
medv | float32 | Label |
モデル比較はこの1行だけです。
best = compare_models(n_select=6)
best
Model | MAE | MSE | RMSE | R2 | RMSLE | MAPE | TT (Sec) | |
---|---|---|---|---|---|---|---|---|
catboost | CatBoost Regressor | 2.1024 | 9.6111 | 3.0073 | 0.8741 | 0.1366 | 0.1054 | 1.0370 |
et | Extra Trees Regressor | 2.1868 | 10.9424 | .1993 | .8530 | 0.1372 | 0.1078 | 0.0730 |
gbr | Gradient Boosting Regressor | 2.3409 | 11.8092 | 3.2789 | 0.8503 | 0.1510 | 0.1202 | 0.0290 |
rf | Random Forest Regressor | >2.4101 | 12.4452 | 3.3944 | 0.8459 | 0.1499 | 0.1200 | 0.0820 |
xgboost | Extreme Gradient Boosting | 2.4095 | 12.9185 | 3.4328 | 0.8375 | 0.1545 | 0.1224 | 0.3090 |
lightgbm | Light Gradient Boosting Machine | 2.4942 | 13.9406 | 3.5930 | 0.8193 | 0.1553 | 0.1222 | 0.2190 |
モデルをpickle形式で書き出します。
model = create_model('rf')
final = finalize_model(model)
予測も1行でできます。(ここでは学習データで予測しています)
predictions = predict_model(final, data=boston_data.iloc[:, :-1])
PyCaretとJupyterで十分簡単に機械学習のモデル構築ができますが、コードを一切見たくない人(がいれば)のために、Streamlitを使ってGUIツールを作ってみます。
Streamlitでどんな感じのものができるか
コードの中身の前に、どんな感じのツールになるか紹介します。最初はデータアップロードの画面のみが表示されます。
データをアップロードすると、データの確認とターゲットの入力、回帰か分類か選択する画面が表示されます。
ターゲットを入力して、回帰を選ぶとモデル構築が始まります。
実行が終わると最も精度(ここではRMSE)が良かったモデルがpickle形式で出力されます。
推論用には別のコードを用意しています。
推論用のGUIツールでは、はじめにに回帰か分類か選択し、次に推論に使うモデルを選択し、予測したいデータをアップロードすると予測が実行されます。
予測の値は一番右の列に「Label」として表示されます。
Streamlitを使うと簡単にGUIツールが作れます。
ただ、PyCaretはIPython Notebookを前提にしているところがあるので、StreamlitでそのままPyCaretを使おうとするとうまくいきません。
PyCaretをちょっと編集する
手を加えるのは以下のコードです。
- pycaret/internal/tabular.pyのcompare_models関数
まずcompare_models関数のdisplayをすべてコメントアウトします。また戻り値としてreturn master_display_を追加します。これだけです。
AutoMLのGUIツールのコード
import streamlit as st
import pandas as pd
import datetime
st.markdown("# 1. データをアップロードします")
uploaded_file = st.file_uploader("CSVファイルをドラッグ&ドロップ、またはブラウザから選択してください", type='csv', key='train')
if uploaded_file is not None:
df = pd.read_csv(uploaded_file)
st.markdown("# 2. アップロードされたデータを確認します")
st.dataframe(df.head(10))
st.markdown("# 3. ターゲットを入力してください")
target = st.text_input(label='ターゲット名を文字列で正しく入力してください', value=df.columns[-1])
st.markdown("# 4. 回帰の場合はregression、分類の場合はclassificationを選択してください")
ml_usecase = st.selectbox(label='ドロップダウンリストからregressionかclassificationを選択してください',
options=('', 'regression', 'classification'),
key='ml_usecase')
if ml_usecase == 'regression':
from pycaret.regression import *
elif ml_usecase == 'classification':
from pycaret.classification import *
else:
st.text('選択せれていません')
if (ml_usecase == 'regression') | (ml_usecase == 'classification'):
st.markdown("# 5. 実行します")
st.markdown("実行中です…しばらくお待ち下さい…")
ml = setup(data=df,
target=target,
session_id=1234,
silent=True,
)
best = compare_models()
st.dataframe(best)
select_model = best.index[0]
model = create_model(select_model)
final = finalize_model(model)
save_model(final, select_model+'_saved_'+datetime.date.today().strftime('%Y%m%d'))
st.markdown("モデル構築が完了しました")
Streamlitは以下のコマンドで実行します。
streamlit run stautoml.py
推論用のコード
import os
import streamlit as st
import pandas as pd
import datetime
st.markdown("# 1. 回帰の場合はregression、分類の場合はclassificationを選択してください")
ml_usecase = st.selectbox(label='ドロップダウンリストからregressionかclassificationを選択してください',
options=('', 'regression', 'classification'),
key='ml_usecase')
if ml_usecase == 'regression':
from pycaret.regression import *
elif ml_usecase == 'classification':
from pycaret.classification import *
else:
st.text('選択せれていません')
if (ml_usecase == 'regression') | (ml_usecase == 'classification'):
st.markdown("# 2. モデルを読み込みます")
pkl_lt = [''] + [f[:-4] for f in os.listdir(os.getcwd()) if f[-4:]=='.pkl']
model_name = st.selectbox(label='ドロップダウンリストからモデルを選択してください',
options=pkl_lt,
key='model')
if model_name != '':
dt_saved = load_model(model_name)
st.markdown("# 3. 予測したいデータをアップロードします")
uploaded_file = st.file_uploader("CSVファイルをドラッグ&ドロップ、またはブラウザから選択してください", type='csv', key='test')
if uploaded_file is not None:
df_new = pd.read_csv(uploaded_file)
predictions = predict_model(dt_saved, data=df_new)
predictions.to_csv(model_name+'_predict_'+datetime.date.today().strftime('%Y%m%d')+'.csv')
st.dataframe(predictions)
おわり
PyCaretを使うと機械学習が簡単にでき、Streamlitを使うと機械学習ツールを作るのも簡単にできるようになります。
実際にユーザーが使うようなツールを作ろうとすると、エラーに対処したり大変ですが。
参考
- PyCaret
- Streamlit
- 最速でPyCaretを使ってみた→参考にさせていただきました