39
39

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 3 years have passed since last update.

PyCaretとStreamlitでAutoMLのGUIツールをさくっと作ってみる

Posted at

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でどんな感じのものができるか

コードの中身の前に、どんな感じのツールになるか紹介します。最初はデータアップロードの画面のみが表示されます。

stアップロード画面.png

データをアップロードすると、データの確認とターゲットの入力、回帰か分類か選択する画面が表示されます。

st入力画面.png

ターゲットを入力して、回帰を選ぶとモデル構築が始まります。

実行後画面.png

実行が終わると最も精度(ここではRMSE)が良かったモデルがpickle形式で出力されます。

推論用には別のコードを用意しています。
推論用のGUIツールでは、はじめにに回帰か分類か選択し、次に推論に使うモデルを選択し、予測したいデータをアップロードすると予測が実行されます。

推論画面.png

予測の値は一番右の列に「Label」として表示されます。

推論結果.png

Streamlitを使うと簡単にGUIツールが作れます。
ただ、PyCaretはIPython Notebookを前提にしているところがあるので、StreamlitでそのままPyCaretを使おうとするとうまくいきません。

PyCaretをちょっと編集する

手を加えるのは以下のコードです。

  • pycaret/internal/tabular.pyのcompare_models関数

まずcompare_models関数のdisplayをすべてコメントアウトします。また戻り値としてreturn master_display_を追加します。これだけです。

AutoMLのGUIツールのコード

stautoml.py
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

推論用のコード

stpred.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を使うと機械学習ツールを作るのも簡単にできるようになります。
実際にユーザーが使うようなツールを作ろうとすると、エラーに対処したり大変ですが。

参考

39
39
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
39
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?