より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

機械学習でポケモンのバトルを攻略する〜Python その2 Advent Calendar 2018 - Qiita 25日目

Python その2 Advent Calendar 2018 - Qiita 25日目に投稿です。

はじめに

今回はKaggleのデータセット「Wheedle's Cave」でデータ分析を行いたいと思います。

www.kaggle.com

Kaggleのカーネルで学ぶデータ分析「ポケモン、データだぜ!」 - Better Engineer Life以前の記事でも紹介しましたが、ポケモンのステータスと勝敗結果のデータがあります。

これを用いて、勝敗を予測しようというものです。

ヒトカゲフシギダネ、どっちが強い?

なんて、子供の頃、思いを馳せたものです。

それを今、この手で実現します。そのために、学生時代、勉強してきたのですから。

環境

ツールはDataloreを使います。Jupyter Notebookの亜種です。詳しくは私の記事などを見て下さい。

これは問題ないのですが、使用者が以下のようなレベルなので注意してください。

データについて

データは三つです。

combat.csvとpokemon.csvからモデルを作成し、test.csvのデータを予測してみろということになります。

コンペではないですし、test.csvには結果が含まれてません。

そこに夢を感じます。

2値問題に置き換える

使うデータは2つです。

f:id:rimever:20181222234005p:plain
pokemon.csv

f:id:rimever:20181222234018p:plain
combats.csv

バトルのデータ(combats.csv)では、1つ目のポケモンの番号と2つ目のボケモンの番号が与えられて、勝った方のポケモンの番号が結果となっています。

この2つを一見したところ、

では、自分のやりたいことを実現するにはどうすればいいんだと戸惑ってしまいました。

しばらく考えた後、これは2値問題なのだと。

1つ目のポケモンと2つ目のポケモンの番号が与えられたとき、1つ目のポケモンが勝つか負けるかという話に持ち込みたいところです。

なので、2つのデータを組み合わせて

が含まれるデータを生成したいところです。

そうすれば、 Kaggle で有名なタイタニック生存予測と同じ2値問題に持ち込めると目論見で進めます。

pandasのmerge関数を用いて、バトル結果の DataFrameをステータスのDataFrameで肉付けしていきます。

データの全体像を掴む

では準備が出来たところで、アルゴリズムだ、なんだとする前にデータの相関を見ることにします。

f:id:rimever:20181223170211p:plain

ざっくりみた感じでは、「すばやさ」「こうげき」「とくこう」が強く関連付いているように見えます。

すばやさ最強説

私がポケモンをやってる子供時代は、とりあえず、素早いポケモンで先手必勝が戦略だった気がします。

ヒトデのスターミーを大事に育ててる子供達が何人もいました。

ポケモンにおいて素早さは先手を取れるかなので、先手かどうかに変換します。

では、両者のすばやさを比較して、先手かどうかに変換し、その値で判定してみます。

f:id:rimever:20181223170607p:plain

え……。94%!?

これだけで、驚愕の精度。

こんなはずでは、なかったのですが。

ランダムフォレスト

ランダムフォレストを試してみます。

f:id:rimever:20181224090849p:plain

97.54%となりました。かなりの精度。

単純なすばやさ判定を上回りましたね。

94%という高いハードルでしたが、それものともせずに超えました。さすが、機械学習アルゴリズム

すばやさについては先制攻撃ができるかで十分と判断し、削除して精度を上げています。

世代(赤・緑の頃を第1世代、金・銀を第2世代と数える)とかポケモン番号は不要と思ったのですが、削除すると精度が下がってしまいました。

どうしてもこれだけのデータだとポケモンのわざとか特性が含められないので、それをこの辺りの値が多少補完してるのでしょうか。

LightGBMを試す

LightGBMを試すことにします。ローカルのインストールは苦戦した記憶があるのですが、Dataloreだと普通にインストールできました。

LightGBMの2値問題は0~1の値に変換されてしまうので、TrueとFalseの変換は自力で行わないとなさそう。

f:id:rimever:20181224090212p:plain

99.08% メリークリスマス。

おわっ、怖いくらいの精度になってしまいました。私の手柄というよりは、アルゴリズムがすごいだけです。

こんな簡単なゲームではないでしょう。ポケモンは。

でなければ、世界の人々が熱狂しないですから。

なんか、バグってないかが心配です。参考値でお願いします。

初代ポケモンもバグ技で一気にレベル100にするという裏技を思い出しました。

さいごに

実際のtest.csvを使ってどうなるかは、昔の攻略本風に言います。

この先は、君の目で確かめてくれ!