33
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ポケモン機械学習

Posted at

────────────────────────────────
全体の考え方(最初に)
────────────────────────────────

「すばやさ」と「こうげき」の関係を見るときは、
何を知りたいかによって使う手法が変わります。

大きく分けると:

  1. 関係があるか知りたい
  2. 数式で表したい・予測したい
  3. 複雑な関係も捉えたい
  4. タイプ分けしたい
  5. 全体の構造を見たい
  6. 判定したい
  7. 学習結果が良いか確かめたい

以下、それぞれ解説します。

No 名前 攻撃 素早さ
001 フシギダネ 49 45
002 フシギソウ 62 60
003 フシギバナ 82 80
004 ヒトカゲ 52 65
005 リザード 64 80
006 リザードン 84 100
007 ゼニガメ 48 43
008 カメール 63 58
009 カメックス 83 78
010 キャタピー 30 45
011 トランセル 20 30
012 バタフリー 45 70
013 ビードル 35 50
014 コクーン 25 35
015 スピアー 90 75
016 ポッポ 45 56
017 ピジョン 60 71
018 ピジョット 80 91
019 コラッタ 56 72
020 ラッタ 81 97
021 オニスズメ 60 70
022 オニドリル 90 100
023 アーボ 60 55
024 アーボック 85 80
025 ピカチュウ 55 90
026 ライチュウ 90 110
027 サンド 75 40
028 サンドパン 100 65
029 ニドラン♀ 47 41
030 ニドリーナ 62 56
031 ニドクイン 82 76
032 ニドラン♂ 57 50
033 ニドリーノ 72 65
034 ニドキング 102 85
035 ピッピ 45 35
036 ピクシー 70 60
037 ロコン 41 65
038 キュウコン 76 100
039 プリン 45 20
040 プクリン 70 45
041 ズバット 45 55
042 ゴルバット 80 90
043 ナゾノクサ 50 30
044 クサイハナ 65 40
045 ラフレシア 80 50
046 パラス 70 25
047 パラセクト 95 30
048 コンパン 55 45
049 モルフォン 65 90
050 ディグダ 55 95
051 ダグトリオ 100 120
052 ニャース 45 90
053 ペルシアン 70 115
054 コダック 52 55
055 ゴルダック 82 85
056 マンキー 80 70
057 オコリザル 105 95
058 ガーディ 70 60
059 ウインディ 110 95
060 ニョロモ 50 90
061 ニョロゾ 65 95
062 ニョロボン 95 70
063 ケーシィ 20 90
064 ユンゲラー 35 105
065 フーディン 50 120
066 ワンリキー 80 35
067 ゴーリキー 100 45
068 カイリキー 130 55
069 マダツボミ 75 40
070 ウツドン 90 55
071 ウツボット 105 70
072 メノクラゲ 40 70
073 ドククラゲ 70 100
074 イシツブテ 80 20
075 ゴローン 95 35
076 ゴローニャ 120 45
077 ポニータ 85 90
078 ギャロップ 100 105
079 ヤドン 65 15
080 ヤドラン 75 30
081 コイル 35 45
082 レアコイル 60 70
083 カモネギ 90 60
084 ドードー 85 75
085 ドードリオ 110 110
086 パウワウ 45 45
087 ジュゴン 70 70
088 ベトベター 80 25
089 ベトベトン 105 50
090 シェルダー 65 40
091 パルシェン 95 70
092 ゴース 35 80
093 ゴースト 50 95
094 ゲンガー 65 110
095 イワーク 45 70
096 スリープ 48 42
097 スリーパー 73 67
098 クラブ 105 50
099 キングラー 130 75
100 ビリリダマ 30 100
101 マルマイン 50 140
102 タマタマ 40 40
103 ナッシー 95 55
104 カラカラ 50 35
105 ガラガラ 80 45
106 サワムラー 120 87
107 エビワラー 105 76
108 ベロリンガ 55 30
109 ドガース 65 35
110 マタドガス 90 60
111 サイホーン 85 25
112 サイドン 130 40
113 ラッキー 10 50
114 モンジャラ 55 60
115 ガルーラ 95 90
116 タッツー 40 60
117 シードラ 65 85
118 トサキント 67 63
119 アズマオウ 92 68
120 ヒトデマン 45 85
121 スターミー 75 115
122 バリヤード 45 90
123 ストライク 110 105
124 ルージュラ 50 95
125 エレブー 83 105
126 ブーバー 95 93
127 カイロス 125 85
128 ケンタロス 100 110
129 コイキング 10 80
130 ギャラドス 125 81
131 ラプラス 85 60
132 メタモン 48 48
133 イーブイ 55 55
134 シャワーズ 65 65
135 サンダース 65 130
136 ブースター 130 65
137 ポリゴン 60 40
138 オムナイト 40 35
139 オムスター 60 55
140 カブト 80 55
141 カブトプス 115 80
142 プテラ 105 130
143 カビゴン 110 30
144 フリーザー 85 85
145 サンダー 90 100
146 ファイヤー 100 90
147 ミニリュウ 64 50
148 ハクリュー 84 70
149 カイリュー 134 80
150 ミュウツー 110 130
151 ミュウ 100 100

────────────────────────────────
【相関】関係があるか調べたい
────────────────────────────────

目的
・攻撃が高いポケモンほど素早いのか?
・何となく関係がありそうか?

手法の意味

● ピアソン相関
→ 直線的な関係の強さを見る
「攻撃が上がると、だいたい比例して素早さも上がるか」

● スピアマン相関
→ 順位の関係を見る
「攻撃が高い順に並べたとき、素早さも高い順になりやすいか」

● ケンドールτ
→ データが少ない・外れ値があるときに安定
「例外が混じっても関係があるか」

使うタイミング
・散布図を描いた直後
・まず雰囲気をつかみたいとき

────────────────────────────────
【回帰】数式で表したい・予測したい
────────────────────────────────

目的
・「攻撃 → 素早さ」を式で説明したい
・攻撃から素早さを予測したい

手法の意味

● 線形回帰
→ 直線で近似
Speed ≈ a × Attack + b

● 重回帰
→ HPや防御なども同時に考える
「攻撃だけでなく他の要素も影響しているか」

● Ridge / Lasso
→ 余計な影響を抑える
「説明が複雑になりすぎるのを防ぐ」

● 多項式回帰
→ 曲線で近似
「中間あたりだけ速い、などの傾向」

● スプライン回帰
→ 区間ごとに滑らかにつなぐ
「低攻撃帯・高攻撃帯で性質が違う」

使うタイミング
・レポートや説明資料
・「式」として示したいとき

────────────────────────────────
【非線形モデル】複雑な関係を捉えたい
────────────────────────────────

目的
・単純な直線では説明できない
・条件によって傾向が変わる

手法の意味

● 決定木
→ 「もし攻撃が○以上なら〜」というルール
理解しやすい

● ランダムフォレスト
→ 決定木をたくさん組み合わせる
精度が高い

● 勾配ブースティング / XGBoost
→ 間違いを修正しながら学習
実務や競技でよく使われる

● ガウス過程回帰
→ 予測の不確かさも分かる
「このあたりは自信がない」

使うタイミング
・精度を重視するとき
・関係がかなり複雑なとき

────────────────────────────────
【クラスタリング】タイプ分けしたい(教師なし)
────────────────────────────────

目的
・高速型・高火力型などに分けたい
・ラベルなしで分類したい

手法の意味

● k-means
→ 指定した数に分ける
「3タイプに分ける」など

● 階層クラスタリング
→ 似ている順にまとめる
進化系の傾向を見るのに向く

● DBSCAN
→ 密集している所だけグループ化
極端なポケモン(外れ値)も見つかる

● GMM
→ 確率的に分類
「どちらのタイプにも近い」

使うタイミング
・タイプ分けの発見
・探索的分析

────────────────────────────────
【可視化・次元削減】全体構造を見たい
────────────────────────────────

目的
・種族値全体の傾向を把握したい
・2次元で見やすくしたい

手法の意味

● PCA
→ 情報を保ったまま軸を減らす
「火力寄り・耐久寄り」などの軸

● t-SNE
→ 分布の形を見る
近いポケモン同士が集まる

● UMAP
→ t-SNEより速く構造保持
最近よく使われる

使うタイミング
・プレゼン
・直感的な理解

────────────────────────────────
【分類】判定したい
────────────────────────────────

目的
・「高速型かどうか」を決めたい
・条件で分けたい

手法の意味

● ロジスティック回帰
→ はい/いいえの確率

● SVM
→ 境界線を引く
はっきり分かれる場合に強い

● k-NN
→ 近いポケモンを参考に判断

● 決定木分類
→ ルールとして説明できる

────────────────────────────────
【評価】学習がうまくいっているか
────────────────────────────────

目的
・モデルは信用できるか?
・当てはまりすぎていないか?

指標の意味

● R²
→ どれだけ説明できているか

● MSE / RMSE
→ 予測誤差の大きさ

● 交差検証
→ 偶然うまくいっていないか

● バイアス・バリアンス
→ 単純すぎ/複雑すぎの確認

────────────────────────────────
一言まとめ
────────────────────────────────

・関係を見る → 相関
・式にする → 回帰
・複雑なら → 木・アンサンブル
・分けたい → クラスタリング
・見たい → 次元削減
・判断 → 分類
・信用できる? → 評価

# Program Name: full_model_landscape_matplotlib_allinone_with_formula.py
# Creation Date: 20251219
# Purpose: One matplotlib figure that unifies major statistical & ML models
#          and displays their functional forms (formula/structure) on each subplot.

"""
Task:
Regression: Attack -> Speed

Models:
1) Linear Regression
2) Ridge / Lasso
3) Decision Tree
4) Random Forest
5) Gradient Boosting
6) SVM (SVR)
7) GAM (Spline-based)
8) Bayesian / GPR
9) Neural Network (MLP)
10) Deep Learning (DNN)

Output:
- Single 2x5 matplotlib figure
- Each subplot shows:
  - data + fitted curve
  - model equation / structural formula (text)
"""

# =========================================================
# 0. Libraries
# =========================================================
import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.svm import SVR
from sklearn.preprocessing import SplineTransformer
from sklearn.pipeline import make_pipeline
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF
from sklearn.neural_network import MLPRegressor

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

np.random.seed(42)
tf.random.set_seed(42)

# =========================================================
# 1. Data (paired)
# =========================================================
data = [
 (49,45),(62,60),(82,80),(52,65),(64,80),(84,100),(48,43),(63,58),(83,78),
 (30,45),(20,30),(45,70),(35,50),(25,35),(90,75),(45,56),(60,71),(80,91),
 (56,72),(81,97),(60,70),(90,100),(60,55),(85,80),(55,90),(90,110),
 (75,40),(100,65),(47,41),(62,56),(82,76),(57,50),(72,65),(102,85),
 (45,35),(70,60),(41,65),(76,100),(45,20),(70,45),(45,55),(80,90),
 (50,30),(65,40),(80,50),(70,25),(95,30),(55,45),(65,90),(55,95),
 (100,120),(45,90),(70,115),(52,55),(82,85),(80,70),(105,70),(70,95),
 (110,95),(50,35),(65,45),(95,55),(20,90),(35,105),(50,120),(80,35),
 (100,45),(130,55),(75,40),(90,55),(105,70),(40,70),(70,100),(80,20),
 (95,35),(120,45),(85,90),(100,105),(65,15),(75,30),(35,45),(60,70),
 (90,60),(85,75),(110,110),(45,45),(70,70)
]

attack = np.array([d[0] for d in data])
speed  = np.array([d[1] for d in data])
X = attack.reshape(-1,1)
y = speed

x_plot = np.linspace(attack.min(), attack.max(), 300).reshape(-1,1)

# =========================================================
# 2. Models
# =========================================================
lin   = LinearRegression().fit(X, y)
ridge = Ridge(alpha=10).fit(X, y)
lasso = Lasso(alpha=0.1).fit(X, y)

tree = DecisionTreeRegressor(max_depth=4).fit(X, y)
rf   = RandomForestRegressor(n_estimators=200, random_state=42).fit(X, y)
gb   = GradientBoostingRegressor(random_state=42).fit(X, y)

svr = SVR(kernel="rbf", C=100, epsilon=5).fit(X, y)

gam = make_pipeline(
    SplineTransformer(n_knots=6, degree=3),
    LinearRegression()
).fit(X, y)

gpr = GaussianProcessRegressor(kernel=RBF(length_scale=30)).fit(X, y)
gpr_mean, gpr_std = gpr.predict(x_plot, return_std=True)

mlp = MLPRegressor(hidden_layer_sizes=(30,30), max_iter=500, random_state=42).fit(X, y)

dnn = Sequential([
    Dense(32, activation="relu", input_shape=(1,)),
    Dense(32, activation="relu"),
    Dense(1)
])
dnn.compile(optimizer="adam", loss="mse")
dnn.fit(X, y, epochs=200, verbose=0)

# =========================================================
# 3. Matplotlib ALL-IN-ONE
# =========================================================
plt.figure(figsize=(18, 10))

# --- 1 Linear ---
plt.subplot(2,5,1)
plt.scatter(attack, speed)
plt.plot(x_plot, lin.predict(x_plot))
plt.title("Linear Regression")
plt.text(0.05,0.95,
         f"y = {lin.coef_[0]:.2f}x + {lin.intercept_:.2f}",
         transform=plt.gca().transAxes, va="top")

# --- 2 Ridge / Lasso ---
plt.subplot(2,5,2)
plt.scatter(attack, speed)
plt.plot(x_plot, ridge.predict(x_plot), label="Ridge")
plt.plot(x_plot, lasso.predict(x_plot), label="Lasso")
plt.legend()
plt.title("Ridge / Lasso")
plt.text(0.05,0.95,
         "min ||y−Xw||² + λ||w||",
         transform=plt.gca().transAxes, va="top")

# --- 3 Tree ---
plt.subplot(2,5,3)
plt.scatter(attack, speed)
plt.plot(x_plot, tree.predict(x_plot))
plt.title("Decision Tree")
plt.text(0.05,0.95,
         "if x<a: c₁ else: c₂",
         transform=plt.gca().transAxes, va="top")

# --- 4 RF ---
plt.subplot(2,5,4)
plt.scatter(attack, speed)
plt.plot(x_plot, rf.predict(x_plot))
plt.title("Random Forest")
plt.text(0.05,0.95,
         "y = avg(Tree₁…Treeₙ)",
         transform=plt.gca().transAxes, va="top")

# --- 5 Boosting ---
plt.subplot(2,5,5)
plt.scatter(attack, speed)
plt.plot(x_plot, gb.predict(x_plot))
plt.title("Boosting")
plt.text(0.05,0.95,
         "y = Σ η·Treeₜ(x)",
         transform=plt.gca().transAxes, va="top")

# --- 6 SVM ---
plt.subplot(2,5,6)
plt.scatter(attack, speed)
plt.plot(x_plot, svr.predict(x_plot))
plt.title("SVM (SVR)")
plt.text(0.05,0.95,
         "f(x)=ΣαᵢK(xᵢ,x)+b",
         transform=plt.gca().transAxes, va="top")

# --- 7 GAM ---
plt.subplot(2,5,7)
plt.scatter(attack, speed)
plt.plot(x_plot, gam.predict(x_plot))
plt.title("GAM")
plt.text(0.05,0.95,
         "y = Σ f_k(x)",
         transform=plt.gca().transAxes, va="top")

# --- 8 GPR ---
plt.subplot(2,5,8)
plt.scatter(attack, speed)
plt.plot(x_plot, gpr_mean)
plt.fill_between(x_plot.ravel(),
                 gpr_mean-2*gpr_std,
                 gpr_mean+2*gpr_std,
                 alpha=0.3)
plt.title("Bayesian / GPR")
plt.text(0.05,0.95,
         "f(x) ~ GP(m,k)",
         transform=plt.gca().transAxes, va="top")

# --- 9 MLP ---
plt.subplot(2,5,9)
plt.scatter(attack, speed)
plt.plot(x_plot, mlp.predict(x_plot))
plt.title("Neural Network")
plt.text(0.05,0.95,
         "y=W₂σ(W₁x)",
         transform=plt.gca().transAxes, va="top")

# --- 10 DNN ---
plt.subplot(2,5,10)
plt.scatter(attack, speed)
plt.plot(x_plot, dnn.predict(x_plot), linewidth=2)
plt.title("Deep Learning")
plt.text(0.05,0.95,
         "y=W₃σ(W₂σ(W₁x))",
         transform=plt.gca().transAxes, va="top")

plt.tight_layout()
plt.show()
33
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?