👾

Pythonでモンスタータイプを予測!?

に公開

⚡ 【プログラミング初心者向け】Streamlit で作るモンスタータイプ予測AI

機械学習に興味があるけれど、何から始めればいいかわからない...そんな方に朗報です!今回は、Python の Streamlit と機械学習ライブラリを使って、モンスターの身長・体重・能力値からタイプを予測するAIアプリを作成します。

データ処理、機械学習モデルの構築、予測機能まで含む本格的なAIアプリを、初心者でも理解できるように詳しく解説していきます。

🌟 この記事を読めば...

機械学習とデータ処理の使い方を楽しく学べます 🎯

この記事では、単なる予測アプリを作るだけでなく、機械学習の基本であるデータ処理とモデル構築を徹底的に学べます。例えば:

  • データフレームの作成と操作
  • 機械学習モデルの学習と予測
  • データの前処理と分割
  • 予測精度の評価
  • インタラクティブな予測機能

プログラミングを楽しみながら機械学習の概念を身に着けましょう!

📁 フォルダとファイルの作成

1. フォルダ構造

monster-project/
├── monster.py
└── requirements.txt

2. 必要なライブラリをインストール

まず、requirements.txtファイルに以下を書きます:

streamlit>=1.28.0
pandas>=2.0.0
numpy>=1.24.0
scikit-learn>=1.3.0

これで、プロジェクトの準備が整いました!

⚡ モンスタータイプ予測AIを作ってみよう

さっそく、monster.py にコードを書いていきましょう!

1️⃣📱 アプリの基本設定

まずは、アプリの基本設定から始めます。

# 必要なライブラリをインポート
import streamlit as st  # Webアプリ作成用
import pandas as pd     # データ処理用
import numpy as np      # 数値計算用
from sklearn.model_selection import train_test_split  # データ分割用
from sklearn.ensemble import RandomForestClassifier   # 機械学習モデル
from sklearn.metrics import accuracy_score            # 精度評価用

# ===== 定数の定義 =====
RANDOM_SEED = 42       # 乱数シード(再現性のため)
TEST_SIZE = 0.2        # テストデータの割合(20%)
N_ESTIMATORS = 100     # ランダムフォレストの決定木の数

# ページ設定
st.set_page_config(
    page_title="モンスタータイプ予測AI",  # ブラウザのタブに表示されるタイトル
    page_icon="⚡",                      # ブラウザのタブに表示されるアイコン
    layout="wide"                       # レイアウトをワイドに設定
)

# タイトルとヘッダー
st.title("⚡ モンスタータイプ予測AI")  # メインタイトル
st.markdown("---")  # 区切り線
st.markdown("### 身長・体重・能力値からモンスターのタイプを予測しよう!")  # サブタイトル

cursor のターミナルで以下のコマンドを実行して画面表示を確認しましょう!

python -m streamlit run monster.py

2️⃣📊 モンスターデータの準備

次に、モンスターのサンプルデータをリストとして準備します。

# ===== モンスターデータの準備 =====
monster_data = [
    # でんきタイプ
    # 左から
    # 身長:0.4m, 体重:6.0kg, HP:35, 攻撃:55, 防御:40, 特攻:50, 特防:50, 素早さ:90, タイプ:でんき
    [0.4, 6.0, 35, 55, 40, 50, 50, 90, "でんき"], 
    [0.6, 9.9, 60, 90, 55, 90, 80, 110, "でんき"],
    [1.5, 90.5, 80, 100, 70, 110, 80, 80, "でんき"],
    [0.3, 4.0, 25, 45, 23, 60, 45, 65, "でんき"],
    [0.8, 24.5, 50, 65, 45, 85, 65, 95, "でんき"],
    
    # みずタイプ
    [0.5, 9.0, 44, 48, 65, 50, 64, 43, "みず"],
    [1.0, 22.5, 64, 66, 68, 81, 76, 50, "みず"],
    [1.6, 85.5, 84, 86, 88, 111, 101, 60, "みず"],
    [0.4, 7.0, 30, 40, 35, 50, 40, 55, "みず"],
    [0.9, 19.0, 55, 65, 55, 85, 65, 85, "みず"],
    
    # ほのおタイプ
    [0.6, 8.5, 39, 52, 43, 60, 50, 65, "ほのお"],
    [1.1, 19.0, 58, 64, 58, 80, 65, 80, "ほのお"],
    [1.7, 90.5, 78, 84, 78, 109, 85, 100, "ほのお"],
    [0.4, 4.4, 25, 45, 23, 60, 45, 65, "ほのお"],
    [0.9, 19.0, 50, 65, 45, 85, 65, 95, "ほのお"],
    
    # くさタイプ
    [0.7, 6.9, 45, 49, 49, 65, 65, 45, "くさ"],
    [1.0, 13.0, 60, 62, 63, 80, 80, 60, "くさ"],
    [2.0, 100.0, 80, 82, 83, 100, 100, 80, "くさ"],
    [0.3, 2.9, 20, 40, 20, 60, 40, 60, "くさ"],
    [0.8, 12.8, 45, 60, 45, 85, 65, 85, "くさ"],
    
    # いわタイプ
    [0.4, 20.0, 50, 80, 100, 30, 30, 20, "いわ"],
    [1.0, 115.0, 80, 110, 130, 55, 55, 45, "いわ"],
    [0.3, 12.0, 30, 60, 80, 20, 20, 25, "いわ"],
    [0.8, 45.0, 60, 90, 110, 45, 45, 35, "いわ"],
    [0.5, 25.0, 40, 70, 90, 25, 25, 30, "いわ"],
    
    # ドラゴンタイプ
    [1.8, 210.0, 91, 134, 95, 100, 100, 80, "ドラゴン"],
    [2.2, 250.0, 95, 145, 130, 120, 120, 120, "ドラゴン"],
    [0.6, 8.5, 41, 64, 45, 50, 50, 50, "ドラゴン"],
    [1.2, 33.0, 61, 84, 65, 70, 70, 70, "ドラゴン"],
    [1.8, 110.0, 81, 134, 95, 100, 100, 100, "ドラゴン"]
]

📝 データ構造の詳細説明:

  • リスト(list) - 複数のデータを順番に管理するデータ構造

    • 角括弧[]で囲んで、カンマ区切りで要素を並べる
    • 例:[身長, 体重, HP, 攻撃, 防御, 特攻, 特防, 素早さ, タイプ]
    • 各モンスターの特徴を1つのリストで表現
  • データの特徴 - 機械学習に適した形式

    • 数値データ:身長、体重、能力値
    • カテゴリデータ:タイプ(でんき、みず、ほのおなど)
    • 一貫した形式でデータを整理

3️⃣📊 データフレームの作成

リストデータをpandasのデータフレームに変換します。

# ===== データフレームの作成 =====
# pandas.DataFrame():リストからデータフレームを作成
# columns:列名を指定
df = pd.DataFrame(monster_data, columns=[
    '身長(m)', '体重(kg)', 'HP', '攻撃', '防御', '特攻', '特防', '素早さ', 'タイプ'
])

📝 データフレームの詳細説明:

  • pd.DataFrame() - pandasのデータフレームを作成する関数

    • リストや辞書から表形式のデータを作成
    • 列名を指定してデータを整理
    • データの分析や処理に最適
  • データフレームの特徴 - 表形式のデータ構造

    • 行と列で構成された表
    • 列名でデータにアクセス可能
    • 統計処理や機械学習に適している

4️⃣🔧 データの前処理

機械学習に適した形式にデータを準備します。

# ===== データの前処理 =====
# 特徴量(予測に使うデータ)とターゲット(予測したいデータ)に分離
X = df[['身長(m)', '体重(kg)', 'HP', '攻撃', '防御', '特攻', '特防', '素早さ']]  # 特徴量
y = df['タイプ']  # ターゲット(予測したいタイプ)

# ===== データの分割 =====
# train_test_split():データを学習用とテスト用に分割
# test_size=TEST_SIZE:定数で定義したテストデータの割合
# random_state=RANDOM_SEED:定数で定義した乱数シード
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=TEST_SIZE, random_state=RANDOM_SEED)

📝 データ前処理の詳細説明:

  • 特徴量(X) - 予測に使用するデータ

    • 身長、体重、能力値などの数値データ
    • 機械学習モデルが学習するための入力データ
  • ターゲット(y) - 予測したいデータ

    • モンスターのタイプ(でんき、みず、ほのおなど)
    • 機械学習モデルが予測する目標データ
  • train_test_split()関数 - データを学習用とテスト用に分割

    • test_size=0.2:データの20%をテスト用に使用
    • random_state=42:再現性のための乱数シード
      • 乱数シードを固定することで、毎回同じ分割結果が得られる
      • 実験や検証を繰り返し行う際に重要
      • 42は慣習的によく使われる値
    • 学習用データ:モデルの学習に使用
    • テスト用データ:モデルの性能評価に使用

💡 データ分割をわかりやすく図解化

5️⃣🤖 モデルの学習

ランダムフォレストモデルを学習させます。

# ===== モデルの学習 =====
# RandomForestClassifier():ランダムフォレスト分類器
# n_estimators=N_ESTIMATORS:定数で定義した決定木の数
# random_state=RANDOM_SEED:定数で定義した乱数シード
model = RandomForestClassifier(n_estimators=N_ESTIMATORS, random_state=RANDOM_SEED)

# fit()メソッド:モデルにデータを学習させる
model.fit(X_train, y_train)

# ===== モデルの評価 =====
# predict()メソッド:テストデータで予測を実行
y_pred = model.predict(X_test)

# accuracy_score():予測精度を計算
accuracy = accuracy_score(y_test, y_pred)

📝 機械学習モデルの詳細説明:

  • RandomForestClassifier() - ランダムフォレスト分類器

    • 複数の決定木を組み合わせたアンサンブル学習
    • 過学習を防ぎ、高い精度を実現
    • n_estimators=100:100個の決定木を使用
  • fit()メソッド - モデルにデータを学習させる

    • 特徴量(X_train)とターゲット(y_train)を使用
    • モデルがデータのパターンを学習
  • predict()メソッド - 新しいデータで予測を実行

    • 学習済みモデルが予測結果を出力
    • テストデータでモデルの性能を評価
  • accuracy_score()関数 - 予測精度を計算

    • 正解率(accuracy)を0〜1の値で表示
    • 例:0.85 = 85%の精度

💡 ランダムフォレストをわかりやすく図解化

6️⃣🎨 タイプアイコンの定義

各タイプに対応するアイコンを定義します。

# ===== タイプアイコンの定義 =====
# タイプ別のアイコンを定義
type_icons = {
    "でんき": "⚡",
    "みず": "💧", 
    "ほのお": "🔥",
    "くさ": "🌿",
    "いわ": "🪨",
    "ドラゴン": "🐉"
}

📝 辞書の詳細説明:

  • 辞書(dictionary) - キーと値のペアでデータを管理

    • 波括弧{}で囲んで、キーと値を:で区切る
    • 例:{"でんき": "⚡", "みず": "💧"}
    • キーで値にアクセス可能
  • 辞書の特徴 - キーと値の対応関係

    • キー:タイプ名(文字列)
    • 値:アイコン(絵文字)
    • 効率的なデータ検索が可能

7️⃣📱 メインコンテンツと予測機能

インタラクティブな予測機能を実装します。

# ===== メインコンテンツ =====
# ===== 予測機能 =====
st.markdown("---")  # 区切り線
st.header("🔮 モンスターのタイプを予測")

# 入力フォーム
col1, col2 = st.columns(2)

with col1:
    st.subheader("📏 基本情報")
    # 最小値:0.1, 最大値:10.0, 初期値:1.0, ステップ:0.1
    height = st.number_input("身長 (m)", min_value=0.1, max_value=10.0, value=1.0, step=0.1)
    # 最小値:0.1, 最大値:500.0, 初期値:50.0, ステップ:0.1
    weight = st.number_input("体重 (kg)", min_value=0.1, max_value=500.0, value=50.0, step=0.1)

with col2:
    st.subheader("⚔️ 能力値")
    hp = st.number_input("HP", min_value=1, max_value=255, value=50)
    attack = st.number_input("攻撃", min_value=1, max_value=255, value=50)
    defense = st.number_input("防御", min_value=1, max_value=255, value=50)
    sp_attack = st.number_input("特攻", min_value=1, max_value=255, value=50)
    sp_defense = st.number_input("特防", min_value=1, max_value=255, value=50)
    speed = st.number_input("素早さ", min_value=1, max_value=255, value=50)

実際に入力して確認しましょう!

📝 UIコンポーネントの詳細説明:

  • st.columns() - 複数のカラムを作成

    • 例:col1, col2 = st.columns(2) - 2つのカラムを作成
    • レイアウトを整理して見やすく表示
  • st.number_input() - 数値入力欄を作成

    • min_value:最小値
    • max_value:最大値
    • value:初期値
    • step:増減の単位
  • st.metric() - メトリクス(指標)を表示

    • 予測精度などの重要な数値を強調表示
    • フォーマット指定で見やすく表示

8️⃣🔮 予測実行と結果表示

予測ボタンと結果表示機能を実装します。

# 予測ボタン
if st.button("🔮 タイプを予測", type="primary"):
    # 入力データを配列に変換
    input_data = np.array([[height, weight, hp, attack, defense, sp_attack, sp_defense, speed]])
    
    # predict()メソッド:新しいデータで予測を実行
    predicted_type = model.predict(input_data)[0]
    
    # 予測確率を取得
    prediction_proba = model.predict_proba(input_data)[0]
    # タイプ名を取得
    type_names = model.classes_
    
    # 結果表示
    st.markdown("---")  # 区切り線
    st.subheader("🎉 予測結果")
    
    # 予測されたタイプがtype_iconsに存在する場合はそのアイコンを、存在しない場合は❓を変数iconに代入
    icon = type_icons.get(predicted_type, "❓")
    st.success(f"**予測タイプ**: {icon} {predicted_type}タイプ")
    
    # 予測確率を表示
    st.subheader("📊 タイプ別予測確率")
    proba_df = pd.DataFrame({
        'タイプ': type_names,
        # 確率をパーセントで表示
        '確率(%)': [f"{prob*100:.1f}%" for prob in prediction_proba]
    })
    # データフレームを表示
    st.dataframe(proba_df, use_container_width=True)

予測を実行してみましょう!

📝 予測機能の詳細説明:

  • np.array() - NumPy配列を作成

    • 機械学習モデルが理解できる形式に変換
    • 2次元配列として入力データを整形
  • model.predict() - 予測を実行

    • 学習済みモデルが新しいデータのタイプを予測
    • 最も可能性の高いタイプを返す
  • model.predict_proba() - 予測確率を取得

    • 各タイプの予測確率を0〜1の値で返す
    • 例:でんきタイプの確率が0.8 = 80%
  • model.classes_ - モデルが学習したクラス(タイプ)名を取得

    • 予測確率とタイプ名を対応させるために使用
  • st.dataframe() - データフレームを表形式で表示

    • use_container_width=True:幅を画面に合わせる
    • 見やすい表形式でデータを表示

💡 予測確率をわかりやすく図解化

🎉 完成!

おめでとうございます!

今回出来上がった画面はこちらです 👇

実際に様々なモンスターの特徴を入力して予測を試してみましょう!!

🎯 まとめ:モンスタータイプ予測AIで学んだこと

今回作成したモンスタータイプ予測AIは、以下のような多くの重要な概念が含まれています:

  • データ処理 - pandasを使ったデータフレーム操作
  • 機械学習 - scikit-learnを使ったモデル構築
  • データ分割 - 学習用とテスト用データの分離
  • 予測機能 - 新しいデータでの予測実行
  • UI/UX設計 - インタラクティブな入力フォーム

今回のモンスタータイプ予測AIの特徴:

  • データ管理 - モンスターの特徴データを整理
  • 機械学習モデル - ランダムフォレストによる高精度予測
  • インタラクティブ入力 - 身長・体重・能力値の入力
  • 予測確率表示 - 各タイプの確率を詳細表示
  • 視覚的フィードバック - アイコンとメトリクス表示

🚀 次のステップ

今回学んだ機械学習を応用して、以下のような機能を追加してみましょう:

  1. データ拡張 - より多くのモンスターデータを追加
  2. 特徴量エンジニアリング - 新しい特徴量の作成
  3. モデル比較 - 複数の機械学習モデルを比較
  4. データ可視化 - グラフやチャートでの結果表示
  5. モデル保存 - 学習済みモデルの保存と読み込み

機械学習は、このように少しずつ機能を追加していくことで、どんどん面白くなります!今回学んだデータ処理と機械学習は、AI開発の基本中の基本なので、しっかりと理解しておきましょう!


🎓 プログラミング学習におすすめ

プログラミング未経験の方には CyTech(サイテック) がおすすめです!

CyTech は、未経験から IT エンジニアを目指す人向けのオンライン学習プラットフォームで、基礎から実務レベルのスキルを最短 10 ヶ月で習得できるカリキュラムを提供しています。
HTML/CSS/JavaScript/PHP/SQL/Git などのプログラミング言語に加え、デザイン、英語なども学べる総合的なプラットフォームです。
今後随時学習できるプログラミング言語増加予定!
エンジニア学習にお困りの方はまずは CyTech 無料カウンセリングでお悩み解消!

Discussion