Panel応用編 第9回: Panelと機械学習モデルの連携 (前半)

Python
この記事は約6分で読めます。

こんにちは、JS2IIUです。今回は、機械学習の出力表示用にPanelを活用する事例を紹介していきます。よろしくお願いします。

はじめに

機械学習は、データの分析や予測において重要なツールであり、ビジネスや科学のさまざまな分野で利用されています。Panelを使えば、機械学習モデルをインタラクティブなWebアプリケーションに統合し、リアルタイムで予測や分析結果を表示するダッシュボードを簡単に構築することができます。今回は、Scikit-learnやTensorFlowを使って機械学習モデルを訓練し、それをPanelアプリに統合する方法を紹介します。

最終的に出来上がるイメージはこちらの動画で確認して下さい。

1. 機械学習モデルの準備

まず、Scikit-learnを使ってシンプルな分類モデルを訓練し、それをPanelアプリケーションに統合する基本的な流れを見ていきます。

1.1 Scikit-learnでのモデル訓練

以下の例では、Irisデータセットを使用してロジスティック回帰モデルを訓練し、新しい入力データに対して分類を行います。

pip install scikit-learn
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
import panel as pn

pn.extension()

# データセットの読み込みと分割
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# ロジスティック回帰モデルの訓練
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)

# 新しいデータに対する予測関数
def predict_iris(sepal_length, sepal_width, petal_length, petal_width):
    input_data = [[sepal_length, sepal_width, petal_length, petal_width]]
    prediction = model.predict(input_data)
    return iris.target_names[prediction][0]
  • load_iris() でIrisデータセットを読み込み、train_test_split() で訓練データとテストデータに分割します。Irisデータセットは、がく片と花弁の長さと幅に基づいて3つの種(Setosa、Versicolor、Virginica)に分類されます。
  • LogisticRegression を使ってロジスティック回帰モデルを作成し、訓練データを使ってモデルを訓練します。
  • predict_iris() 関数では、ユーザーが入力した花の特徴(がく片や花弁の長さ・幅)に基づいて予測を行い、対応するクラス名(Setosa、Versicolor、Virginica)を返します。

1.2 モデルの評価

訓練したモデルの性能をテストデータで評価することも重要です。次に、モデルの精度を表示します。

# モデルの精度を計算
accuracy = model.score(X_test, y_test)
print(f"Model accuracy: {accuracy:.2f}")
  • model.score() を使って、テストデータに基づくモデルの精度を計算します。精度は、分類が正確に行われた割合を表し、0.0から1.0の範囲で表示されます。

2. Panelアプリケーションに機械学習モデルを統合

次に、訓練済みのモデルを使ってリアルタイムで予測を行うPanelアプリケーションを作成します。ユーザーは、花の特徴を入力し、それに基づいてリアルタイムで分類結果を得ることができます。

2.1 入力フォームの作成

ユーザーが花の特徴を入力できるインターフェースを作成し、予測結果を表示します。

# 入力ウィジェットの作成
sepal_length = pn.widgets.FloatSlider(name='Sepal Length', start=4.0, end=8.0, step=0.1, value=5.0)
sepal_width = pn.widgets.FloatSlider(name='Sepal Width', start=2.0, end=4.5, step=0.1, value=3.0)
petal_length = pn.widgets.FloatSlider(name='Petal Length', start=1.0, end=7.0, step=0.1, value=4.0)
petal_width = pn.widgets.FloatSlider(name='Petal Width', start=0.1, end=2.5, step=0.1, value=1.0)

# 予測結果を表示するためのパネル
prediction_result = pn.pane.Markdown("## Prediction: ")

# 予測を実行する関数
def update_prediction(event):
    prediction = predict_iris(sepal_length.value, sepal_width.value, petal_length.value, petal_width.value)
    prediction_result.object = f"## Prediction: {prediction}"

# 予測ボタンの作成
predict_button = pn.widgets.Button(name='Predict')

# ボタンクリック時に予測を実行
predict_button.on_click(update_prediction)

# レイアウトの作成
layout = pn.Column(
    "## Iris Flower Classification",
    sepal_length,
    sepal_width,
    petal_length,
    petal_width,
    predict_button,
    prediction_result
)

layout.servable()
pn.serve(layout)
  • FloatSlider ウィジェットを使って、ユーザーが花の特徴(がく片と花弁の長さと幅)を調整できるインターフェースを作成します。
  • predict_button をクリックすると、update_prediction() 関数が呼び出され、ユーザーが入力したデータに基づいて予測が行われます。結果は Markdown パネルに表示されます。

このコードにより、ユーザーが花の特徴を入力し、リアルタイムでIrisデータセットに基づいた分類予測を得られるインタラクティブなアプリケーションが構築されます。

まとめ

前半では、Scikit-learnを使用して機械学習モデルを訓練し、それをPanelアプリケーションに統合する方法を学びました。ユーザーがリアルタイムで予測を実行できるインターフェースを簡単に作成することができました。後半では、TensorFlowを使ったディープラーニングモデルをPanelアプリケーションに統合する方法を紹介します。次回もお楽しみに!

コメント

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