噴火・潮吹きの定理

ポケモン対戦をいかにシンプルにできるか

【機械学習】ポケモンの図鑑説明文から合計種族値を予測してみた

前置き

 

ポケモンの図鑑説明文。

 

ポケモンを図鑑に登録すると、そのポケモンの身長や体重等と一緒に数行の説明文も読めるようになる。

 

f:id:colon_sem:20210918222426j:plain



ポケモンの細かな生態から伝記的要素に至るまで様々な記載があり、ポケモンの世界観を深めるのに一役買っている。読むだけでも楽しい。

 

そしておおまかな傾向として、強いポケモンには強そうな記載が、弱いポケモンには弱そうな記載がある。

 

例えば「凶暴な性格」とあれば最終進化で攻撃性能の高いポケモン、また「とりポケモンに狙われる」とあれば弱めの草・虫タイプの進化前ポケモン、という具合。

 

であれば、図鑑説明文だけからポケモンの強さまで予測できるのではないか?

 

もちろん例外もある(ダイパのヒードランの「火山の 洞穴に 生息。十字の ツメを 食いこませて 壁や 天井を はい回る。」が有名、というかネット上でさんざん言及されている)が、ではどこまで予測できて、どんな説明文が例外となるのだろうか?

 

気になったので実際に予測してみることにした。

 

 

使用データ

 

まずはポケモンの「強さ」だが、今回は合計種族値を使用した。もちろんポケモンには特性や技などの要素もあるが、対戦面での強さの指標として合計種族値定量的でわかりやすい。

 

ポケモンは進化させた方が強い」とよく言われるのも、進化すると(ほぼ必ず)種族値が上昇するからである。

 

次に使用する図鑑説明文について。

 

ポケモンwikiから、各ポケモンの名前・合計種族値・図鑑のバージョン・フォルム(メガシンカとか)・ひらがなと漢字のどちらか・日本語の図鑑説明文をスクレイピング(自動抽出)した。

 

地味に(派手に?)大変な作業で、2日ほどかかった。

 

f:id:colon_sem:20210918143836p:plain

こんな感じのデータを作成

この中から分析しやすい漢字の図鑑説明文のみを利用。ひらがなしかない説明文を漢字に変換して使うことも考えたが挫折した。

 

 

アルゴリズム

 

ポケモン関連で、機械学習・深層学習のアルゴリズムを使って分類や予測をするという試みは過去に何度かなされている。

 

その先行研究の一部がこちら(弊ブログの記事ではないです)。

qiita.com

qiita.com


筆者もこれに倣い、機械学習・深層学習で分析を試みた。

 

コンピュータで人間の言語を扱う分野を「自然言語処理」といい、この分野の様々なタスクで高精度を記録した新しめの深層学習手法に"BERT"というものがある(ググると論文・解説本・記事と色々出て来るので詳細は割愛)。

 

本記事でもそれを利用したい...のだが、いざやってみると「文章を入力して数値を出力する」実装がうまくいかない。なんか予測種族値が全て同じ値(379)になってしまう。

 

合計種族値379はほぼカモネギ(377)である。ポケモンを等しくカモネギ扱いするのはちょっと明らかにおかしい。

 

調べると、こういう挙動の場合は一旦BERTでベクトル化→ベクトルから学習・予測、とすると比較的まともな結果になるらしい。

 

今回はこの記事のコードをそのまま活用させてもらい、図鑑説明文をベクトル化した。

 

www.enoki.ifocus-network.com

 

図鑑説明文をベクトル化したら機械学習アルゴリズムで学習・予測。今回はxgboostを使用。筆者はまだ参加したことは無いが、大きな機械学習コンペ(Kaggleとか)でもよく使用される。

 

今回は以下のサイトの手法1を活用させてもらった。

qiita.com

 

ここでデータを「学習用データ」と「予測用データ」に分ける必要があるのだが、

 

「ウルトラサン・ウルトラムーン」以前が初出の図鑑説明文・合計種族値、5738組を学習用

「ソード・シールド」初出、1209組を予測用

 

とした。剣盾で初めて見る説明文を未知のものとして予測してみたい、というイメージ。

 

色々書いたが、要はこんな感じ。

 

f:id:colon_sem:20210918153746j:plain

 

 

合計種族値を予測できたら実際の値と比較!

 

 

予測結果・全体

 

まずは図鑑説明文から予測した種族値と正解の種族値にどの程度相関があるのかを見てみる。

 

グラフがこちら。

 

f:id:colon_sem:20210918163734p:plain

 

相関係数は0.43。

 

ばっちり予測できるわけでもなくてんでダメなわけでもなく、弱い相関がある。それなりに例外はあるけれど、全体の傾向としては正解の種族値が低いと予測種族値もなんとなく低めで、正解が高いと予測もまあまあ高いという感じ。

 

ただ、予測値と正解値をそのまま比較するのは難しそう。

 

誤差の平均(RMSE)は102。単純比較だと予想値と正解値が100くらいずれることも普通にあるらしい。

 

ここで着目したいのは、グラフの縦軸と横軸の範囲。

 

横軸の正解の種族値が175~720(ムゲンダイマックスのぞく)なのに対し、縦軸の予測種族値は301~613と範囲がやけに狭い

 

これについて見るため、予測種族値と正解種族値ヒストグラムを作って分布を見てみた。

 

f:id:colon_sem:20210918164239p:plain

 

分布の形が全然違う。予測値は400-450あたりを中央とした一つの山の分布正規分布?)。

 

これに対し、正解の分布は300-350と450-500あたりに2つの山を持っている

 

300-350あたりはストーリー序盤のポケモン(御三家の進化前とか)が該当し、450-500は進化して種族値が上がったポケモンが該当。

 

予測時にデフォルトでは結果をきれいな正規分布で表現する設定になっているので、実際の歪な分布に寄せるのは難しいのだろう、と予測。

 

以上より、分布が違うので、予測値と正解値を直接比較するのは難しいと判断した。

 

ただし、分布の形が違ってもデータ間の大小関係なら比べられるはず。なので今回は、「種族値の高さランキング」を予測値・正解値それぞれに作り、順位を比較してざっくり分析することにした。

 

それではいよいよ個別の予測結果を見ていく。

 

 

予測結果・個別

 

まず、個別のデータの値は分析環境や手法によって容易に変わるもので、本記事の結果が絶対ではないことは先に述べておく。

 


予測種族値が高い上位10体ポケモンと図鑑説明文を見ていく。

 

予測1位:ネクロズマあかつきのつばさ(シールド)

正解:13位(種族値680)

図鑑説明文:ルナアーラにとりついた姿。狂暴になりすべてを敵とみなしてレーザーで焼きつくす。

 

予測2位:ルナアーラ(シールド)

正解:13位(種族値680)

図鑑説明文:周囲から光をすべて奪い自らは満月の姿となり闇夜に光を放つ。

 

 

予測3位:ギルガルド・シールドフォルム(シールド)

正解:321位(種族値500)

図鑑説明文:強力な霊力で人やポケモンを操りギルガルドに都合の良い国をつくらせた。

 

予測4位:キュレム・フォルムチェンジ前(ソード)

正解:35位(種族値660)

図鑑説明文:レシラムとゼクロムを凌ぐほどの力をもつが極低温の冷気で封じられてしまっている。

 

予測5位:ウーラオス・一撃・キョダイマックス(ソード)

正解:115位(種族値550)

図鑑説明文:怒りの化身と呼ばれている。凄まじい形相と雄叫びで世界の邪気を払うという。

 

予測6位:マーシャドー(ソード)

正解:39位(種族値600)

図鑑説明文:拳法の達人の影に潜って動きをコピーしたため究極奥義を身につけた。

 

予測7位:ケルディオ・かくごのすがた(シールド)

正解:73位(種族値580)

図鑑説明文:体の奥底で眠っていた力を額のツノにまといすべてを切り裂く剣となった。

 

予測8位:ザマゼンタ・れきせんのゆうしゃ(ソード)

正解:31位(種族値670)

図鑑説明文:人の王と力をあわせガラルを救ったポケモン。金属を取り込み戦う。

 

予測9位:ルナアーラ(ソード)

正解:13位(種族値680)

図鑑説明文:月を誘いし獣という名前をもつ。あらゆる光をエネルギーに変えて生きている。

 

予測10位:バドレックス・馬なし(シールド)

正解:321位(種族値500)

図鑑説明文:大昔のガラルを統べていた伝説の王。心を癒し草木を芽吹かせる力がある。

 

上位にはしっかり伝説・幻・キョダイマックス等がランクイン。

 

「怒り」「すべてを切り裂く」「凶暴」のような攻撃的なワード、「月を誘いし獣」「究極奥義」「極低温」のような中二病的というかスケールの大きいワード、国の歴史に関する記述がよく見られる。

 

攻撃的な内容が上位に来るのは予想通り。

 

中二病ワードについては、学習データにメガシンカの説明文(†血に濡れた三日月† とか)が含まれており、その影響もあるかも。

 

国の歴史の記述も壮大で伝記的なものもあり、伝説ポケモンが関わりそう、という印象なので上位も納得。というか一般ポケモンながら国の歴史を動かしているギルガルドが凄すぎる

 

 

次に予測種族値が低い10体。

 

予測1199位:ホルビー(シールド)

正解:1185位(種族値237)

図鑑説明文:危険に敏感。アーマーガアの羽音を聴きとるとあっという間に穴を掘って地面に潜る。

 

予測1200位:アママイコ(ソード)

正解:1078位(種族値290)

図鑑説明文:踊るようにターンして甘い香りをふりまく。そのにおいを嗅ぐと幸せな気持ちになる。

 

予測1201位:ヤドン・ガラルすがた(ソード)

正解:970位(種族値315)

図鑑説明文:いつもボーッとしているがたまに顔つきがピリッと引き締まる。食べているエサが原因らしい。

 

予測1202位:チラーミィ(ソード)

正解:1033位(種族値300)

図鑑説明文:しっぽで汚れを払い落す。掃除をするときに助かるが潔癖症なので大変。

 

予測1203位:モルペコ・まんぷくもよう(シールド)

正解:688位(種族値435)

図鑑説明文:どんなに食べてもすぐにお腹がすく。電気でローストしたタネを大切に持ち歩く。

 

予測1204位:クリムガン(ソード)

正解:490位(種族値485)

図鑑説明文:あなぐらに棲む。体が冷えると動けなくなるので日光浴は欠かさない。

 

予測1205位:シズクモ(シールド)

正解:1145位(種族値269)

図鑑説明文:普段は水の中で生活しているがエサを探しに陸に上がるときは水泡をかぶる。

 

予測1206位:ミニリュウ(ソード)

正解:1033位(種族値300)

図鑑説明文:滝つぼなど流れの激しい水辺で暮らしている。脱皮を繰り返して大きく育つ。

 

予測1207位:ヨクバリス(ソード)

正解:639位(種族値460)

図鑑説明文:しっぽに木の実を溜めこむ。溜めこみすぎてポロポロこぼすが鈍いので気がつかない。

 

予測1208位:レジロック(ソード)

正解:73位(種族値580

図鑑説明文:体のあらゆる部分が岩でできている。体が削れても自分で岩をつけて治す。

 

準伝説ポケモンが予測最下位を取ってしまった。そんな...

 

ただこれは学習・予測の失敗というより「強いポケモンなのに図鑑説明文が弱い」という要素が強そう。

 

体のあらゆる部分が岩でできている。体が削れても自分で岩をつけて治す。」という文章から想像できるポケモンは何か? 体が削れることもある岩タイプのポケモンイシツブテとかダンゴロとかではないだろうか?

 

シールド版だと「最新の科学技術を使い岩の体を調べたが脳や心臓を見つけられなかった。」という説明文で予測は201位と割と妥当な結果になっている。

 

ソード版でもさすがにもう少しどうにかした方が良かったのではないか...?

 

他のポケモンを見てみると、マイナス描写(「鈍い」「ボーっとしている」「体が冷えると動けなくなる」)が多く、これは妥当。ホルビーの「アーマーガアから身を隠す」も食物連鎖の下位っぽくて良いマイナス描写。

 

一方でシズクモミニリュウなど生態を淡々と描写するタイプも多かった。種族値高めのポケモンの説明文が攻撃的だったり壮大だったりすることが多く、その反対ということだろうか。

 

ただ種族値が高いポケモンの生態を淡々描写することもできるので、なぜ低い予想値になるのかはよくわからない。

 


次に、正解値種族値の順位と予測種族値の順位にギャップがあったポケモンを見ていく。


まずは予測種族値の順位が正解より高くなったポケモン

 

順位差:1026位分

予測52位:ニャース・ガラルのすがた(ソード)

正解:1078位(種族値290)

図鑑説明文:戦闘的な海洋民族と暮らすうちに鍛えられ体のあちこちが黒鉄に変化した。

 

順位差:995位分

予測32位:デスマス・ガラルのすがた(ソード)

正解:1027位(種族値303)

図鑑説明文:呪いが刻まれた粘土板がデスマスに憑りついた。怨念パワーを吸いとっているという。

 

順位差:995位分

予測203位:コスモッグ(ソード)

正解:1198位(種族値200)

図鑑説明文:別の宇宙からやって来た。ガスの体はとても軽くそよ風にも流れてしまうほどだ。

 

順位差:983位分

予測44位:ゴビット(シールド)

正解:1027位(種族値303)

図鑑説明文:粘土からつくられたポケモン。何千年も前の主の命令を今も守っている。

 

順位差:964位分

予測114位:ニャース・キョダイマックス(シールド)

正解:1078位(種族値290)

図鑑説明文:キョダイマックスのパワーにより胴体は伸びに伸びて額の小判は大判に変わった。

 

順位差:941位分

予測194位:ドラメシヤ(ソード)

正解:1135位(種族値270)

図鑑説明文:古代の海で暮らしていた。ゴーストポケモンとしてよみがえりかつてのすみかをさまよっている。

 

順位差:923位分

予測104位:デスマス・ガラルのすがた(シールド)

正解:1027位(種族値303)

図鑑説明文:強い恨みをもつ魂に古代の粘土板が引き寄せられポケモンになったといわれる。

 

順位差:907位分

予測202位:モンメン(ソード)

正解:1109位(種族値280)

図鑑説明文:綿を飛ばして身を守る。台風の風に流され地球の裏側にいくことも。

 

順位差:901位分

予測258位:ココガラ(ソード)

正解:1159位(種族値254)

図鑑説明文:どんな強敵にも挑みかかる勇敢な性質。返り討ちに遭いながらも鍛えられていく。

 

順位差:894位分

予測36位:ピカチュウ・キョダイマックス(ソード)

正解:930位(種族値320)

図鑑説明文:膨張したキョダイマックスのパワーによって体がふくれて空まで伸びるしっぽになった。

 

最も予測が上振れたのはニャース・ガラルのすがたのソード版。「戦闘的」「鍛えられ」のような力強い内容になっている。

 

他にもココガラやキョダイマックス勢などが「低い種族値だけどパワフルな内容」で高めの予測値を出している。

 

一方でデスマスゴビット・ドラメシヤ等ゴーストタイプも、進化前でもおどろおどろしい説明文を貰っているせいか、順位が高くなっている。

 

モンメンコスモッグの吹き飛ばされ勢は意外。「地球の裏側」「別の宇宙」あたりのスケールの大きな単語の影響があるかもしれないが、詳細はよくわからない。

 

 

そして、予測値が正解値より低くなったポケモンは以下の通り。

 

順位差:-936位分

予測969位:メタグロス(ソード)

正解:39位(種族値600)

図鑑説明文:気温が氷点下になると磁力が強まるので雪山に棲むメタグロスはとても元気。

 

順位差:-936位分

予測1091位:トドゼルガ(ソード)

正解:155位(種族値530)

図鑑説明文:2、30匹で群れをつくる。敵に襲われるとリーダーは体を張って群れを守る。

 

順位差:-939位分

予測978位:ザルード・とうちゃん(ソード)

正解:39位(種族値600)

図鑑説明文:群れを離れ人間の子どもを育てる。子どもが泣き止む匂いのついた布を巻く。

 

順位差:-948位分

予測1081位ラプラス(シールド)

正解:133位(種族値535)

図鑑説明文:寒さに強く氷の海も平気。皮膚はスベスベで少しだけひんやりしているよ。

 

順位差:-962位分

予測999位:ヨワシ・むれたすがた(シールド)

正解:37位(種族値620)

図鑑説明文:陣形を組んで強い敵に立ち向かう。戦いで傷つくと散り散りになって1匹にもどる。

 

順位差:-970位分

予測1009位:ドラパルト(ソード)

正解:39位(種族値600)

図鑑説明文:ツノの穴にドラメシヤを入れて暮らす。戦いになるとマッハのスピードでドラメシヤを飛ばす。

 

順位差:-1009位分

予測1194位:カバルドン(シールド)

正解:185位(種族値525)

図鑑説明文:体の穴にはたまに石が詰まる。石を取ってくれるのでイシズマイを大切に守る。

 

順位差:-1026位分

予測1181位:ガオガエン(シールド)

正解:155位(種族値530)

図鑑説明文:乱暴なふるまいも目につくが小さいポケモンを助ける優しい一面ももっている。

 

順位差:-1072位分

予測1193位:トゲキッス(ソード)

正解:121位(種族値545)

図鑑説明文:争い事やもめ事が起こる場所には姿を見せない。近ごろはほとんど見かけない。

 

順位差:-1121位分

予測1160位:カイリュー(ソード)

正解:39位(種族値600)

図鑑説明文:溺れている人やポケモンを見つけると助けずにはいられない心優しいポケモン

 

順位差:-1135位分

予測1208位:レジロック(ソード)

正解:73位(種族値580)

図鑑説明文:体のあらゆる部分が岩でできている。体が削れても自分で岩をつけて治す。

 

レジロックは別格として、進化前と区別がつかない描写ラプラスの「皮膚はスベスベでひんやり」、メタグロスの「雪山に住む個体は元気」とか)のポケモンの予測値が低く出るのはわかる。

 

ただトドゼルガ・とうちゃんザルード・イワパレスガオガエンカイリュー「他者を守る」描写の予測値が低いのはあまりしっくりこない。

 

その中でもカイリューガオガエンの説明文に両方とも「優しい」という単語が含まれている。これについて、図鑑説明文の表現を少し変えて再予測してみた。

 

カイリュー

溺れている人やポケモンを見つけると助けずにはいられない心優しいポケモン

→1160位

溺れている人やポケモンを見つけると助けずにはいられないポケモン

→878位相当

 

 

ガオガエン

乱暴なふるまいも目につくが小さいポケモンを助ける優しい一面ももっている。

→1181位

乱暴なふるまいも目につくが小さいポケモンを助ける一面ももっている。

→1185位相当

乱暴なふるまいも目につくがポケモンを助ける優しい一面ももっている。

→1003位相当

 

そこまで劇的に順位は変わらないが、カイリューは「優しい」を取り除くと順位が上がり、ガオガエンは「優しい」ではなく「小さい」と除いたときに順位がわずかに上昇。

 

これ以上の細かい分析は精度的に難しいが、他者を守る系の強めのポケモンがあまり強く予想できない可能性が分かった。弱肉強食の世界だ...

 

(おまけ)トゲキッスでこんな実験をした。

 

争い事やもめ事が起こる場所には姿を見せない近ごろはほとんど見かけない

→1160位

争い事やもめ事が起こる場所で姿を見せる近ごろはよく見かける。(逆トゲキッス

→1161位相当

 

図鑑の意味を真逆にして逆トゲキッスを生成しても順位は全く変わらなかった。もっと根本的に変える必要があるらしい。

 

 

最後に、順位がほぼ変わらなかったポケモン

 

順位差:‐1位分

予測743位:トロッゴン(ソード)

正解:742位(種族値410)

図鑑説明文:体内で石炭をつくりだす。昔のガラルでは落とした石炭を生活に利用した。

 

順位差:‐1位分

予測622位:レアコイル(ソード)

正解:621位(種族値465)

図鑑説明文:3匹のコイルが連結した。強力な電波を放ちまわりの様子を観測する。

 

順位差:1位分

予測525位:デスバーン(シールド)

正解:526位(種族値483)

図鑑説明文:影のような体に触れてはいけない。絵に刻まれた恐ろしい記憶を見せられるぞ。

 

なかでもトロッゴンは、予測種族値そのものも410.3という値が出ていて、正解値410とほぼ一致した。今回一番予測がうまくいったポケモントロッゴン(ソード)である。

 

 

まとめ

 

本記事では、ポケモンの図鑑説明文からポケモンの強さ(合計種族値)を予測することを試みた。その結果、

 

・予測値と正解値には弱めの相関がみられた。

壮大な表現、力強い表現、攻撃的な表現の説明文だと高めの予想値が出た。

マイナス描写や淡々とした描写だと低めの予想値が出た。優しさの描写でも低く出るかもしれない。

・予想と正解の乖離について、分析精度の粗さも原因の1つだが、明らかに「強いポケモンに弱そうな説明文」「弱いポケモンに強そうな説明文」というそもそも予測が難しいデータも存在した。

 

ことが分かった。

 

アルゴリズムの項で述べたように、今回はBERTでベクトル化→xgboostで予測、という2段階の実験になったことが心残りだった。

 

BERTでそのまま合計種族値を予測できればもう少し精度の高い分析になったかもしれない。