【Streamlit】AutoML入門:機械学習自動化の実装ガイド

Streamlit, AutoML入門 Streamlit
この記事は約21分で読めます。

こんにちは、JS2IIUです。

本記事では、「AutoML(自動機械学習)」の基本から、PythonのStreamlitを使って実際にAutoMLワークフローを構築・実行する方法までを丁寧に解説します。複数モデルの比較やハイパーパラメータ最適化、そしてStreamlitを使ったWebアプリケーションとしての実装を進めていきます。今回もよろしくお願いします。

1. はじめに

1.1 記事の概要と目的

本記事の目的は、AutoMLの基本概念を理解し、Streamlitを活用して自分でAutoMLの簡単なアプリケーションを作る方法を学ぶことにあります。AutoMLは機械学習モデルの構築や最適化の作業を自動化し、初心者や機械学習エンジニアの負担を減らす技術です。今回は、AutoMLのメリットや課題も整理しつつ、実際に複数のモデルを扱い、パフォーマンスを比較したり、ハイパーパラメータの最適化なども試してみます。

1.2 StreamlitとAutoMLの簡単な説明

  • Streamlitは、Pythonで簡単にデータサイエンス系のWebアプリを作成できるフレームワークです。対話的なUIを短時間で作れるため、分析結果の共有や、モデルの操作に適しています。
  • AutoMLは、機械学習モデルの選択、チューニング、評価を全自動または半自動で行う仕組みです。専門知識が少なくても効率よく高性能なモデルが作れます。

本ブログのStreamlit関連記事をまとめました。Streamlitについてさらに詳しく知りたい方はこちらもご覧ください。
Streamlit | アマチュア無線局JS2IIU

Streamlit
PythonのWEBフレームワークであるStreamlitについての記事を集めたページです。

2. AutoMLの基本概念

2.1 AutoMLの定義と目的

AutoML(Automated Machine Learning)は、特徴量生成、モデル選択、ハイパーパラメータチューニング、モデル評価を自動化して、手動での試行錯誤を減らすことを目的としています。主な処理フローは以下の通りです。

  1. データ前処理:欠損値処理やスケーリングなど。
  2. モデル探索:複数モデルの性能を比較。
  3. ハイパーパラメータ最適化:パラメータ空間の自動探索。
  4. 最良モデルの選択と出力

2.2 AutoMLのメリットと課題

  • メリット
    • 初心者でも効果的なモデルが構築できる。
    • モデル開発の時間短縮。
    • 複数モデル・設定の自動比較ができる。
  • 課題
    • ブラックボックス化しやすく、解釈が難しい。
    • 計算リソースが多く必要になる場合がある。
    • データの品質依存が大きい。

3. Streamlitを用いたAutoMLの実現方法

3.1 複数の機械学習モデルの統合方法

まずPythonでよく使われるモデル(例:決定木、ランダムフォレスト、ロジスティック回帰)を用意し、それらを一括で評価・比較できる仕組みを作ります。

Python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# データ準備
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# 複数モデル定義
models = {
    "Decision Tree": DecisionTreeClassifier(),
    "Random Forest": RandomForestClassifier(),
    "Logistic Regression": LogisticRegression(max_iter=200)
}

# 各モデルの学習・評価
results = {}
for name, model in models.items():
    model.fit(X_train, y_train)
    preds = model.predict(X_test)
    acc = accuracy_score(y_test, preds)
    results[name] = acc

print(results)

結果は以下のとおりです。

Plaintext
{'Decision Tree': 1.0, 'Random Forest': 1.0, 'Logistic Regression': 1.0}

3.2 モデル選定の基準:精度、速度、解釈性について

  • 精度(Accuracy, F1-scoreなど):最も重要視されることが多いです。
  • 速度(学習・予測時間):リアルタイム性が必要な場合は高速なモデルが望ましいです。
  • 解釈性(可視化や説明可能性):モデルの振る舞いを理解・説明したい場合に重視されます。

Streamlitでこれらをユーザーが切り替えながら見られるUIを作ることも可能です。

3.3 効率的なハイパーパラメータの最適化手法

AutoMLで重要な工程の一つがハイパーパラメータチューニング。頻繁に使われる手法は以下の通りです。

  • グリッドサーチ:パラメータ空間を網羅的に探索。
  • ランダムサーチ:ランダムにパラメータの組み合わせを試す。
  • ベイズ最適化:過去の結果を元に次の探索ポイントを決定(効率的)。

ここではsklearn.model_selection.RandomizedSearchCVを使った例を示します。

Python
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV


# データ準備
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

param_dist = {
    "n_estimators": [10, 50, 100, 200],
    "max_depth": [None, 5, 10, 20],
}

rf = RandomForestClassifier(random_state=42)
random_search = RandomizedSearchCV(
    rf, param_distributions=param_dist, n_iter=5, cv=3, random_state=42
)
random_search.fit(X_train, y_train)
print("Best params:", random_search.best_params_)
print("Best score:", random_search.best_score_)

結果は以下のとおりです。

Plaintext
Best params: {'n_estimators': 10, 'max_depth': None}
Best score: 0.9523809523809524

🔍 RandomizedSearchCVとは?

RandomizedSearchCV は、Scikit-learn ライブラリの中で提供されている クロスバリデーション付きのランダムなハイパーパラメータサーチ手法 です。

通常のグリッドサーチ(GridSearchCV)は、指定されたすべてのパラメータの組み合わせを総当たりで試しますが、
RandomizedSearchCV は、指定した回数(n_iter)だけランダムにサンプリングして試行します。

✅ 特徴・メリット

  • 高速: グリッドサーチに比べて試行回数を制限できるため、計算コストが少ない。
  • 大規模パラメータ空間に向いている
  • 確率分布を使ってパラメータをサンプリングできる(scipy.statsを利用可能)。
  • クロスバリデーション(CV)付きでモデル性能の過学習を防げる。

🧪 主な引数

Python
RandomizedSearchCV(
    estimator,          # モデル(例: RandomForestClassifierなど)
    param_distributions, # 探索するパラメータとその分布
    n_iter=10,           # 試行回数
    scoring=None,        # 評価指標(例: "accuracy", "neg_mean_squared_error"など)
    cv=None,             # クロスバリデーション分割数(例: 5)
    random_state=None,   # 乱数シード(再現性確保)
    verbose=0,           # ログ出力の詳細度
    n_jobs=None          # 並列処理数(-1で全CPU使用)
)

4. Streamlitアプリケーション上でのAutoMLワークフローの構築

4.1 構築方法の説明

Streamlitを使うことで、モデル選択やハイパーパラメータの切り替え、評価指標の可視化を簡単に行うUIを作れます。大まかな流れは以下の通りです。

  1. 入力データの読み込み・前処理を行う。
  2. サイドバーでモデルやハイパーパラメータをユーザーが選択できるように設定。
  3. 選択に応じてモデルを学習・評価。
  4. 結果をグラフやテーブルで表示。

4.2 具体的な実装例

以下は、Streamlitで簡単なAutoMLデモを作るコードです。サイドバーでモデルとパラメータを選択し、精度を画面に表示します。

AutoML demo
Python
import streamlit as st
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# データ準備
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# Streamlit UI設定
st.title("簡単AutoMLデモ")

model_name = st.sidebar.selectbox(
    "モデルを選択してください",
    ("Decision Tree", "Random Forest", "Logistic Regression")
)

if model_name == "Decision Tree":
    max_depth = st.sidebar.slider("最大深さ (max_depth)", 1, 20, 5)
    model = DecisionTreeClassifier(max_depth=max_depth)
elif model_name == "Random Forest":
    n_estimators = st.sidebar.slider("木の数 (n_estimators)", 10, 200, 100)
    model = RandomForestClassifier(n_estimators=n_estimators)
else:
    max_iter = st.sidebar.slider("最大反復回数 (max_iter)", 50, 300, 200)
    model = LogisticRegression(max_iter=max_iter)

# モデル学習
model.fit(X_train, y_train)
preds = model.predict(X_test)
acc = accuracy_score(y_test, preds)

st.write(f"選択モデル: **{model_name}**")
st.write(f"モデルの精度(Accuracy): **{acc:.4f}**")

5. 実践例:複数モデルの効果的な活用とパフォーマンス比較

5.1 事例の紹介と目的

ここでは「Irisデータセット」を用いて、複数モデルを同一条件で比較し、どのモデルが最も適しているかを評価します。目的は精度比較だけでなく、学習時間や推論時間も考慮した総合評価を行う点にあります。

5.2 実装方法

下記のコードでは複数モデルのトレーニング時間と予測時間を計測し、精度と合わせて表示しています。

Python
import time
import pandas as pd

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# データ準備
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)


models = {
    "Decision Tree": DecisionTreeClassifier(max_depth=5),
    "Random Forest": RandomForestClassifier(n_estimators=100),
    "Logistic Regression": LogisticRegression(max_iter=200),
}

results = []

for name, model in models.items():
    start_train = time.time()
    model.fit(X_train, y_train)
    train_time = time.time() - start_train

    start_pred = time.time()
    preds = model.predict(X_test)
    pred_time = time.time() - start_pred

    acc = accuracy_score(y_test, preds)
    results.append({
        "Model": name,
        "Accuracy": acc,
        "Training Time (s)": train_time,
        "Prediction Time (s)": pred_time
    })

df_results = pd.DataFrame(results)
print(df_results)
Plaintext
                 Model  Accuracy  Training Time (s)  Prediction Time (s)
0        Decision Tree       1.0           0.000401             0.000064
1        Random Forest       1.0           0.040742             0.001595
2  Logistic Regression       1.0           0.004645             0.000046

5.3 結果と考察

上記結果から、精度と速度のトレードオフを見つけ、用途に応じたモデル選びの参考になるでしょう。例えば高速に結果を出したいなら決定木、精度重視ならランダムフォレスト、解釈性も考えるならロジスティック回帰を選ぶ、といった判断が可能です。

6. まとめ

  • AutoMLは機械学習モデル作成の効率化に欠かせない技術。
  • Streamlitを用いることで、AutoMLワークフローをインタラクティブなWebアプリとして実装可能。
  • 複数モデルの比較、ハイパーパラメータの調整を簡単に行う方法を紹介。
  • 今後の技術進歩により、更に使いやすく、透明性の高いAutoMLが期待される。

本記事で紹介した基礎から実装例までを活用し、ご自身のプロジェクトで機械学習の自動化に挑戦してみてください。わからない点があれば、公式ドキュメントやコミュニティでの情報収集も積極的に行うことをおすすめします。データサイエンスの学びがより楽しく、効率的になることを願っています。

参考リンク集

最後まで読んでいただきありがとうございました。

コメント

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