ポケットモンスター(Pocket Monster)、通称ポケモン(Pokemon)、は株式会社ポケモン(The Pokemon Company)が発売しているゲームソフト、およびそれらを題材にしたメディアミックス作品群を指します。
ポケモンは、そのキャラクター性、また収集・育成・交換・対戦といった普遍的な価値から国内外問わず人気を博しています。

そんなポケモンの対戦で非常に重要となる要素の一つとして種族値(Base Stats)が挙げられます。種族値とは、その名の通り、ポケモンの種族ごとに定まった値を指します。

例えば、ピカチュウの種族値は以下の通りとなります。

なまえ 写真 HP こうげき ぼうぎょ とくこう とくぼう すばやさ 合計
ピカチュウ 25.jpg 35 55 40 50 50 90 320

これより、ピカチュウは素早さの高い種族だということがわかります。対戦では、この要素が非常に重要となります。

本記事では、ポケモンの外見から種族値を予測するアルゴリズム、またその予測結果を紹介します。

動機 -Motivation-

ポケモンの外見から種族値を予測することに何の意味があるのか、と思われる方もいるかもしれません。

確かにあなたがポケモン図鑑を所持しており、既知のポケモンに遭遇した場合、ポケモン図鑑を検索することでそのポケモンの種族値を直ちに知ることができ、おおよその強さを測ることができます。

しかし、あなたの準備が不十分な状態で未知のポケモンに遭遇した場合を想像してみてください。相手の強さがわからない状態で、戦えばいいか、逃げればいいのかもわからないと思います。

そんな時に、相手の外見から相手の種族値を予測することができれば、意思決定のための非常に強力な武器となりますね。

種族値回帰問題 -Base Stats Regression Problem-

それでは実際この問題をどのように解いてくいくか、を紹介します。

まず、前提としてポケモンの外見的特徴と種族値には、以下のように何らかの相関があると考えます。

スライド2.png

スライド4.png

もちろん上に挙げたものにも例外は存在します。
例えば、ミュウやセレビィなどは図鑑における占有面積は小さいですが、高い種族値合計を持っています。

なまえ 写真 HP こうげき ぼうぎょ とくこう とくぼう すばやさ 合計
ミュウ 151.jpg 100 100 100 100 100 100 600
セレビィ 251.jpg 100 100 100 100 100 100 600

しかし、このような占有面積が小さい、かつ高い種族値合計を持つポケモンはほとんどが伝説のポケモンとなっています。

そこで、例外は存在するものの、全体としては上に挙げた画像のような傾向を持っていると仮定します。
これより、特徴を適切に捉えることで、ポケモンの外見から種族値を予測することができます。

スライド5.png

使用するアルゴリズム -Algorithm-

今回、予測したいパラメータは以下の7種類("HP"、"攻撃"、"防御"、"特攻"、"特防"、"素早さ"、"合計")となります。

予測のおおまかな手順としては次の2ステップとなります。

  1. 勾配ブースティングを用いた個別パラメータの予測
  2. 合計値を用いた個別パラメータに対する補正

以下では、それぞれの手順についてみていきます。

勾配ブースティングを用いた個別パラメータの予測 -Prediction by Gradient Boosting-

まず、はじめにそれぞれのパラメータについて予想を行います。

今回は、機械学習コンペなどでよく用いられる勾配ブースティング決定木(Gradient Boosting Decision Tree)を使用します。勾配ブースティング決定木は、MNISTデータに対して、ニューラルネットの最高精度と同等の精度を出したり、また高速な実装xgboostなどで有名な手法です。

以前の記事で仕組みを解説しているので、気になる方はどうぞ。(数式が多めです)

ざっくり説明すると、以下の図のように画像に対して質問を繰り返し、成長させた木をさらに直列に繋げることにより、種族値を予測することができます。

スライド6.png

合計値を用いた個別パラメータに対する補正 -Correction for Indivisual Parameters by Total Value-

さて、前節で未知のポケモンに対する種族値の予測を行うことができました。しかし、上記のやり方はそれぞれのパラメータに対する予測を独立に行なっているため、以下のようなケースが生じます。

$$
HP + 攻撃 + 防御 + 特攻 + 特防 + 素早さ \neq 合計
$$

そこで、今回は合計値を基準としてそれぞれの予測結果("合計値"を除く)に補正をかけます。例えば、"HP"であれば次のような補正をかけます。

$$
HP' = HP \times \frac{合計}{HP + 攻撃 + 防御 + 特攻 + 特防 + 素早さ\ \ \ \ \ \ \ \ \ \ \ \ \ }
$$

"HP"以外のパラメータにも同様の補正を与え、予測の整合性をとるものとします。これにより、

$$
HP' + 攻撃' + 防御' + 特攻' + 特防' + 素早さ' = \frac{HP + 攻撃 + 防御 + 特攻 + 特防 + 素早さ\ \ \ \ \ \ \ \ \ \ \ \ \ }{HP + 攻撃 + 防御 + 特攻 + 特防 + 素早さ\ \ \ \ \ \ \ \ \ \ \ \ \ } \times 合計 = 合計
$$

となり、それぞれの予測値の和が、予測された合計値に一致します。

※合計値で補正する理由
合計値で補正するという点に疑問を持たれた方もいるかもしれません。そもそも合計値も予測値であり、正しさが保証されているものではないのに、なぜその不確かな値を基準とするのか、という疑問はもっともです。

結論としては、合計値が他のパラメータの予測結果に対して、比較的信頼できるであろう、という信念のもと今回の補正を与えています。

理由としては、例えば進化前形態は(図鑑で表示される画像上での)サイズが小さく、進化後形態はサイズが大きいといった傾向があります。多くのポケモンでは、進化前よりも進化後の方が種族値の合計は高くなることが多く、ここに相関があると考えられます。
一方、それぞれのパラメータに関しては、色や形状、サイズといったものに対するばらつきが多く、予測しにくいものとなってます。

ここから、合計値が最も信頼のおけるパラメータだという仮説を立てました。

学習/予測に用いるデータ -Train/Test Data-

今回用いるデータはこちらからお借りしました。
http://rikapoke.hatenablog.jp/entry/pokemon_datasheet_gne7

各ポケモンの画像は図鑑画像を$100 \times 100$(pix)にリサイズしています。

スクリーンショット 2018-03-23 11.21.49.png

上記データには、第1世代から第7世代までのポケモンのデータが含まれていますが、今回はイレギュラーな形態(メガシンカ、ゲンシカイキなど)は除きます。

ここでは、第7世代の主人公になった気分で、第6世代までのポケモンを既知のものと仮定します。

種別 内容
訓練データ 第1世代~第6世代(図鑑No.1~721)
予測データ 第7世代(図鑑No.722~802)

予測結果 -Results-

第7世代のポケモンたち -7th Generation Pokemon-

ここでは、第7世代のポケモンの予測結果を見ていきます。

まず、御三家の一つの例から確認していきましょう。
図中で、赤字は真の種族値よりも超過している分、青字は不足している分をあらわします。
すなわち、予測値から()内の値を引くことで、真の値となります。

なまえ 写真 HP
(予測)
こうげき
(予測)
ぼうぎょ
(予測)
とくこう
(予測)
とくぼう
(予測)
すばやさ
(予測)
合計
(予測)
アシマリ 728.jpg 68
(+18)
66
(+12)
72
(+18)
63
(-3)
75
(+19)
47
(+7)
391
(+71)
オシャマリ 729.jpg 89
(+29)
70
(+1)
61
(-8)
63
(-28)
73
(-8)
49
(-1)
405
(-15)
アシレーヌ 730.jpg 91
(+11)
87
(+13)
96
(+22)
97
(-29)
104
(-12)
72
(+12)
547
(+17)

表から、アシマリが強く評価されすぎていますが、進化ごとに種族値の合計が大きくなる、という特徴は割とうまく反映されています。

次に、比較的うまく予測ができている例をいくつか挙げます。

なまえ 写真 HP
(予測)
こうげき
(予測)
ぼうぎょ
(予測)
とくこう
(予測)
とくぼう
(予測)
すばやさ
(予測)
合計
(予測)
オドリドリ 741.jpg 75
(0)
73
(+3)
71
(+1)
83
(-15)
53
(-17)
94
(+1)
449
(-27)
ヌイコグマ 759.jpg 59
(-11)
62
(-13)
58
(+8)
53
(+8)
54
(+4)
47
(-3)
333
(-7)
タイプ:ヌル 772.jpg 77
(-18)
108
(+13)
93
(-2)
82
(-13)
87
(-8)
83
(+24)
530
(-4)

表より、各予測値が真の値からおおよそ$-20$~$+20$の間に入る、比較的安定した予測が行えていることがわかります。
オドリドリは、翼があるので期待通りすばやさが高くなっていますね。

次に、比較的大きく予想が外れいている例を挙げます。

なまえ 写真 HP
(予測)
こうげき
(予測)
ぼうぎょ
(予測)
とくこう
(予測)
とくぼう
(予測)
すばやさ
(予測)
合計
(予測)
ドヒドイデ 748.jpg 82
(+32)
86
(+23)
101
(-51)
78
(+25)
78
(-64)
70
(+35)
495
(0)
フェローチェ 795.jpg 84
(+13)
80
(-57)
85
(+48)
90
(-47)
94
(+57)
71
(-80)
504
(-66)
カミツルギ 798.jpg 61
(+2)
70
(-111)
83
(-48)
81
(+22)
64
(+33)
93
(-16)
452
(-118)

表より、ドヒドイデは合計値こそぴったり合っているものの、満遍なく予測が外れていることがわかります。
また、フェローチェ、カミツルギのように伝説ポケモンは特殊なパラメータをしていることが多く、全体的に精度はよくありませんでした。

やはり、他のポケモンと大きく違った外見、もしくは種族値をもつポケモンの予測は難しいですね。

それ以外 - Others-

最後に、ポケモン以外の種族値も見ていきましょう。

まずは、比較的ポケモンに近い外見を持つデジモンを見ていきます。

なまえ 写真 HP
(予測)
こうげき
(予測)
ぼうぎょ
(予測)
とくこう
(予測)
とくぼう
(予測)
すばやさ
(予測)
合計
(予測)
アグモン 808.jpg 85 91 87 87 85 77 512
ウォーグレイモン 809.jpg 86 107 88 92 81 89 543

思ってたより変わらないですね...。
ただひとまず進化前よりは強くなったので一安心です。

次にトレーナーを見ていきます。

なまえ 写真 HP
(予測)
こうげき
(予測)
ぼうぎょ
(予測)
とくこう
(予測)
とくぼう
(予測)
すばやさ
(予測)
合計
(予測)
ライバル 813.jpg 87 94 86 77 95 69 508
リーリエ 814.png 105 123 101 101 87 68 585

ライバルよりリーリエの方が強いんですね。
リーリエが物理で殴るのが効率が良さそうです。

最後にアイドルを見ていきます。

なまえ 写真 HP
(予測)
こうげき
(予測)
ぼうぎょ
(予測)
とくこう
(予測)
とくぼう
(予測)
すばやさ
(予測)
合計
(予測)
島村卯月 810.png 88 111 97 98 96 84 574
渋谷凛 811.png 90 117 103 104 96 86 596
本田未央 812.png 96 124 97 99 89 90 595

さすがに伝説級ですね。すごいです。
(背景部分はポケモンの図鑑と同様の処理をしているので、ここまで高いのはちょっと不思議ですね。)

結論 -Conclusion-

ここまで読んでいただいた方、ありがとうございました。

実は勾配ブースティングを使う前は、CNNを用いた回帰を行なっていたのですが、過学習がとんでもないことになっていたので、こちらを用いました。ただし、勾配ブースティングでもやはり過学習気味な気配は感じています。
訓練モデルが悪いのか、そもそも問題設定に無理があるのか...。

今回、ロス関数や精度、ハイパーパラメータなどについてはブログ中に載せてきませんでしたが、もし需要があるならそのうちソースコードを公開したいと思います。

記事に関してお気付きの点、またご感想がありましたら、遠慮なくコメントやTwitterの方でお声がけください。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.