機械学習周りのプログラミング中心。 イベント情報
ポケモンバトルAI本電子書籍通販中

ポケモン×人工知能 2技関係によるパーティ強さの予測(実験編)

手法編からの続きです。

実験

まず、学習データの準備です。パーティを10,000個用意して、別の100個のパーティとバトルさせることにより勝率を求めました。

各特徴量を用いてパーティの勝率へ線形回帰します。 単純な最小二乗法でも学習は可能でしたが、「多重共線性」という問題があるため重み \boldsymbol{w}の要素が1,000以上の大きな値になってしまい、分析が困難でした。 そのため、リッジ回帰という手法を用いることで完全ではないにせよ分析可能な結果を得ることができました。

リッジ回帰の実装はscikit-learnライブラリを用いました。

http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RidgeCV.html#sklearn.linear_model.RidgeCV

9,000個のデータで学習し、残りの1,000個で評価しました。

まず、使用した特徴量ごとの回帰精度を示します。以前の記事で示したように、Pはポケモンの種類、Mは技の種類です。PMはポケモンとその技の組み合わせを示しています。

P PP M MM PM 決定係数R2
Y 0.388
Y 0.312
Y Y 0.691
Y Y 0.388
Y Y 0.383
Y Y Y 0.847
Y Y Y Y Y 0.874

決定係数R2は回帰の良さを表す指標で、もっとも良い場合で1、最も悪い場合で(回帰先の期待値を定数で出すモデルで)0となります。 ポケモンと技の組み合わせ情報がパーティの強さを予測するうえで有用であることがわかりました。 ポケモンの情報だけ、技の情報だけの場合より、両方の情報がある状況のほうが大きく精度が向上することがわかります。

そして、線形モデルの良い点は、学習で求められた重み \boldsymbol{w}から各特徴量次元の寄与度を測れる点です。 今回、特徴量 \boldsymbol{x}の要素はすべて0か1であり、勝敗({1, -1})に回帰しているため、対応する重みが正の大きな値であればパーティを強くする効果のある特徴、負の大きな値であればパーティを弱くする効果のある特徴であるとみなすことができます。

現在実装されているポケモンは9種類、技は20種類に制限されていることに注意してください。

実装したポケモンダグトリオフーディン・ゲンガー・ナッシー・スターミー・ルージュラケンタロスラプラス・サンダース

実装した技:ふぶき・10まんボルト・サイコキネシス・のしかかり・じこさいせい・リフレクター・でんじは・かげぶんしん・きりさく・いわなだれはかいこうせん・あくまのキッス・どくどく・ あなをほる・にどげり・かいりき・メガドレイン・あやしいひかり・ナイトヘッド・はねる

まずはP特徴のみで回帰したときの係数を、大きい順に並べて示します。

特徴の意味 係数
ゲンガー 0.251
ナッシー 0.137
ケンタロス 0.031
スターミー -0.012
ラプラス -0.042
フーディン -0.043
サンダース -0.053
ダグトリオ -0.126
ルージュラ -0.144

ゲンガーの係数が最大です。これは、ゲンガーがパーティに入っていると勝率が大きく高まるということを意味しています。ゲンガーはゴーストタイプで、20種類の技のうち5種類を無効化できるところが強い要因だと思われます。 ダグトリオは係数が低いです。この環境だと強力な技「じしん」が使えない点が厳しいものと思われます。ルージュラは「ふぶき」で凍らないというメリットがありますが、意外にも最下位となりました。

次にM特徴のみで回帰したときの係数を、大きい順に並べて示します。

特徴の意味 係数
ふぶき 0.111
サイコキネシス 0.101
10まんボルト 0.095
あくまのキッス 0.069
じこさいせい 0.067
きりさく 0.062
はかいこうせん 0.039
のしかかり 0.037
いわなだれ 0.025
どくどく 0.023
あやしいひかり 0.022
かげぶんしん 0.018
かいりき 0.009
メガドレイン -0.003
あなをほる -0.010
にどげり -0.037
ナイトヘッド -0.084
でんじは -0.107
リフレクター -0.109
はねる -0.177

妥当な順位だといえるのではないでしょうか。こおりタイプ以外の相手を27%の確率で即死させるふぶきが最強です。何の効果もない「はねる」がちゃんと最下位になりました。 「でんじは」も使い方によっては強力ですが、行動選択がランダムなため複数回無駄に使ってしまうなどの事態が生じやすいと思われます。 この序列はあくまで「行動をランダムに選んだ場合」の技の良さを示すものであることに注意が必要です。

最後に、すべての特徴量(P, PP, M, MM, PM)を用いて回帰したときの係数を示します。

まずは値が大きいものから10個示します。

特徴の種類 特徴の意味 係数
PM フーディン&サイコキネシス 0.156
PM ナッシー&サイコキネシス 0.139
PM ケンタロス&きりさく 0.134
PM サンダース&10まんボルト 0.128
PM スターミー&サイコキネシス 0.123
PM ケンタロス&はかいこうせん 0.119
PM ゲンガー&サイコキネシス 0.111
P ゲンガー 0.107
PM ゲンガー&10まんボルト 0.105
PM ゲンガー&ふぶき 0.105

ポケモンとタイプが一致する技の係数が非常に高いことがわかります。ポケモン単独、技単独では測れないポケモンと技の相性のよさを定量化することができていると考えられます。

次に、値が小さいものから10個示します(一部省略)。

特徴の種類 特徴の意味 係数
PM ナッシー&はねる -0.156
PM (はねる関係省略)
PM ケンタロス&ナイトヘッド -0.097
PM ナッシー&でんじは -0.096
PM (でんじは関係省略)
PM (ナイトヘッド関係省略)
PM ゲンガー&リフレクター -0.088
MM でんじは&あくまのキッス -0.084
P ルージュラ -0.065
PM (リフレクター関係省略)
PM フーディン&にどげり -0.054
PM ルージュラ&あなをほる -0.053
P ダグトリオ -0.053
PM (にどげり関係省略)
PM ケンタロス&メガドレイン -0.049

まず、はねる等の弱い技とポケモンの組み合わせが目立ちます。次に、「でんじは&あくまのキッス」という技と技の組み合わせが登場しました。 どちらも相手を状態異常にする技ですが、状態異常は複数種類掛けることができないため、この2つの技を両方覚えるのは良くないということが係数に表れています。 また、「フーディン&にどげり」や「ケンタロス&メガドレイン」のように、ポケモンの「こうげき」「とくしゅ」の能力値の大小関係と技が合っていない場合の係数が低いことがわかります。

以上で分析したように、2技関係特徴量により、ポケモンプレイヤーの直観に沿う形でパーティの強さを定量的に予測できることがわかりました。 この技術を用いることで、ランダムにパーティを組み替えるよりも効率的に強いパーティを探索できるようになることが期待できます。

今後はまずポケモン・技の種類を増加させる実装を行ったうえで、今回提案した手法を取り入れながら強いパーティの構築技術を模索していきたいと考えています。