【第3回/全3回】Stremlitを用いた簡易AutoMLツール開発 〜LightGBMによるモデル構築と評価〜

AI・機械学習

第1回でStreamlitの基本を、第2回でデータ分析ツール作成を学びました。いよいよ最終回です。今回は、これまでの知識を統合し、機械学習モデルを組み込んだ「簡易AutoMLツール」を開発します。

順番に読みたい方はこちらからご覧ください。

【第1回/全3回】Streamlit超入門 〜概要と基本的なコンポーネントの使用法 (Google Colab編)〜
PythonだけでWebアプリが作れるStreamlitの基本操作をGoogle Colabで紹介。テキストやグラフの表示から分析ツール作成まで、コード付きで分かりやすく解説する入門ガイド。
【第2回/全3回】Streamlitで簡易データ分析ツールを作ろう 〜CSV読み込みからグラフ作成まで〜
Streamlit実践編として、簡易データ分析ツールを作成。CSVのアップロード、データ概要表示、利用者が列を選んでヒストグラム等のグラフを動的に作る方法をコードを交えて解説します。

メジャーな勾配ブースティングライブラリであるLightGBMを使用します。

ユーザーがデータをアップロードし、予測したい項目を選ぶだけで、自動でモデルが学習し、性能を評価するアプリを目指します。

今回作成するアプリの機能

完成するアプリは、以下の機能を持ちます。

  1. データと目的の選択: ユーザーがCSVファイルをアップロードし、予測の「目的変数」と、予測に使う「説明変数」を選択
  2. モデル学習: ボタンをクリックすると、選択されたデータでLightGBMの分類モデルを学習
  3. 結果の評価: 学習済みモデルの精度(正解率)を表示
  4. 結果の可視化: 予測結果を混同行列で可視化し、モデルの性能を視覚的に確認

ステップ1:ライブラリの準備とUIの設計

まず、機械学習に必要なライブラリscikit-learnlightgbmをインストールします。次に、ユーザーが変数を選択するためのUIを作成します。

ライブラリのインストール

Google Colabのセルで、以下のコマンドを実行してください。

Python
!pip install streamlit pyngrok pandas scikit-learn lightgbm

UI作成のコード

ファイルアップロード機能に加え、目的変数と説明変数を選択するためのst.selectbost.multiselectを配置します。

Python
%%writefile app.py
import streamlit as st
import pandas as pd

st.title('簡易AutoMLツール(分類)')

# ファイルアップロード
uploaded_file = st.file_uploader("CSVファイルをアップロードしてください", type='csv')

if uploaded_file is not None:
    df = pd.read_csv(uploaded_file)
    st.success('ファイルのアップロードが完了しました。')
    st.header('データフレーム')
    st.dataframe(df)

    # UIの設計
    st.header('モデルの学習設定')
    # カラム名をリストとして取得
    options = df.columns.tolist()

    # 目的変数の選択
    target_variable = st.selectbox('目的変数(予測したい項目)を選択', options)

    # 説明変数の選択
    feature_variables = st.multiselect('説明変数(予測に使う項目)を選択', options, default=options[:-1])

実行結果

CSVファイルをアップロードすると、データフレームの下に「モデルの学習設定」セクションが表示されます。

「目的変数」を選ぶドロップダウンメニューと、「説明変数」を複数選べる選択ボックスを配置します。

ステップ2:LightGBMによるモデル学習機能

次に、アプリの核となるモデル学習機能を実装します。ユーザーがボタンを押すと、選択された変数を使って学習が実行されるようにします。

サンプルコード

app.pyに、LightGBMによるモデル学習と評価のロジックを追記します。

Python
# (前半のコードはステップ1と同じ)
# ...

# 必要なライブラリのインポート
from sklearn.model_selection import train_test_split
import lightgbm as lgb
from sklearn.metrics import accuracy_score, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

if uploaded_file is not None:
    df = pd.read_csv(uploaded_file)
    # (UI設計のコードはステップ1と同じ)
    # ...
    target_variable = st.selectbox('目的変数(予測したい項目)を選択', df.columns.tolist())
    feature_variables = st.multiselect('説明変数(予測に使う項目)を選択', df.columns.tolist(), default=[col for col in df.columns if col != target_variable])

    # 学習開始ボタン
    if st.button('モデルの学習を開始'):
        # 1. データの準備
        X = df[feature_variables]
        y = df[target_variable]

        # 2. 訓練データとテストデータに分割
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

        # 3. モデルの学習 (LightGBM)
        model = lgb.LGBMClassifier(random_state=42)
        model.fit(X_train, y_train)

        # 4. 予測と評価
        y_pred = model.predict(X_test)
        acc = accuracy_score(y_test, y_pred)

        st.header('モデルの評価結果')
        st.write(f'**正解率:** {acc:.2f}')

        # 5. 混同行列の可視化
        st.subheader('混同行列')
        cm = confusion_matrix(y_test, y_pred)
        fig, ax = plt.subplots()
        sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=ax)
        ax.set_xlabel('予測ラベル')
        ax.set_ylabel('正解ラベル')
        st.pyplot(fig)

実行結果

「モデルの学習を開始」ボタンをクリックすると、学習が実行されます。処理が終わると、「モデルの評価結果」というヘッダーの下に、計算された正解率が表示されます。

さらに、予測結果をまとめた混同行列のヒートマップが表示され、モデルの性能を視覚的に確認できます。

最終的なコード

少し長くなりますが、これまでのステップを統合した最終的なapp.pyのコードは以下の通りです。

Python
%%writefile app.py
import streamlit as st
import pandas as pd
from sklearn.model_selection import train_test_split
import lightgbm as lgb
from sklearn.metrics import accuracy_score, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

st.title('簡易AutoMLツール(分類)')
st.write('アップロードしたデータで、LightGBMの分類モデルを自動で学習し評価します。')

# 1. ファイルアップロード
uploaded_file = st.file_uploader("CSVファイルをアップロードしてください", type='csv')

if uploaded_file is not None:
    df = pd.read_csv(uploaded_file)
    st.success('ファイルのアップロードが完了しました。')

    st.header('データフレーム')
    st.dataframe(df)

    # 2. 学習設定のUI
    st.header('モデルの学習設定')
    options = df.columns.tolist()
    target_variable = st.selectbox('目的変数(予測したい項目)を選択', options)
    # 目的変数以外をデフォルトの説明変数とする
    default_features = [col for col in options if col != target_variable]
    feature_variables = st.multiselect('説明変数(予測に使う項目)を選択', options, default=default_features)

    # 3. モデル学習の実行
    if st.button('モデルの学習を開始'):
        if not feature_variables:
            st.error('説明変数を1つ以上選択してください。')
        else:
            with st.spinner('モデルを学習中です...'):
                # データの準備
                X = df[feature_variables]
                y = df[target_variable]

                # 訓練データとテストデータに分割
                X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

                # モデルの学習 (LightGBM)
                model = lgb.LGBMClassifier(random_state=42)
                model.fit(X_train, y_train)

                # 予測と評価
                y_pred = model.predict(X_test)
                acc = accuracy_score(y_test, y_pred)

            st.header('モデルの評価結果')
            st.write(f'**正解率:** {acc:.2f}')

            # 混同行列の可視化
            st.subheader('混同行列')
            cm = confusion_matrix(y_test, y_pred)
            fig, ax = plt.subplots()
            sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=ax)
            ax.set_xlabel('予測ラベル')
            ax.set_ylabel('正解ラベル')
            st.pyplot(fig)

まとめと今後の展望

ここまでお付き合いいただきありがとうございました。全3回にわたる連載の最終回として、LightGBMを搭載した「簡易AutoMLツール」を開発しました。

Streamlitが単なる可視化ツールにとどまらず、モデル活用のための強力なプロトタイピングツールであることが実感できたのではないでしょうか。

今後は、自身のプロジェクトにおいて必要なツールを企画/作成してみてください。

より詳しくStreamlitについて学びたい方は以下書籍も参考にしてください。

Amazon.co.jp: Streamlit入門 Pythonで学ぶデータ可視化&アプリ開発ガイド 技術の泉シリーズ eBook : 山口 歩夢: 本
Amazon.co.jp: Streamlit入門 Pythonで学ぶデータ可視化&アプリ開発ガイド 技術の泉シリーズ eBook : 山口 歩夢: 本

コメント

タイトルとURLをコピーしました