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


メジャーな勾配ブースティングライブラリであるLightGBMを使用します。
ユーザーがデータをアップロードし、予測したい項目を選ぶだけで、自動でモデルが学習し、性能を評価するアプリを目指します。
今回作成するアプリの機能
完成するアプリは、以下の機能を持ちます。
- データと目的の選択: ユーザーがCSVファイルをアップロードし、予測の「目的変数」と、予測に使う「説明変数」を選択
- モデル学習: ボタンをクリックすると、選択されたデータでLightGBMの分類モデルを学習
- 結果の評価: 学習済みモデルの精度(正解率)を表示
- 結果の可視化: 予測結果を混同行列で可視化し、モデルの性能を視覚的に確認
ステップ1:ライブラリの準備とUIの設計
まず、機械学習に必要なライブラリscikit-learn
とlightgbm
をインストールします。次に、ユーザーが変数を選択するためのUIを作成します。
ライブラリのインストール
Google Colabのセルで、以下のコマンドを実行してください。
!pip install streamlit pyngrok pandas scikit-learn lightgbm
UI作成のコード
ファイルアップロード機能に加え、目的変数と説明変数を選択するためのst.selectbo
とst.multiselect
を配置します。
%%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によるモデル学習と評価のロジックを追記します。
# (前半のコードはステップ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
のコードは以下の通りです。
%%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について学びたい方は以下書籍も参考にしてください。
コメント