【Python】混合正規分布EMアルゴリズムによるボートレーサクラスタリング

プログラミング

やっていることはほとんど意味の無いことですが、EMアルゴリズムを使ってみたかったので、Pythonで使ってみました。

また、機械学習を勉強するための参考書を以下で紹介しています!よかったら見ていってください。

機械学習を勉強するためのオススメ参考書(理論・Python・Webアプリ)
統計・機械学習に関しては授業で習ったところありますが、結構忘れてしまっています(。また、Rの演習の授業はありましたが、Pythonは学生のころには使っていません。機械学習・データサイエンスを勉強するにあたり、私が参考にしている参考書を一挙ご紹介したいと思います。

EMアルゴリズムとは?

確率モデルのパラメータを最尤推定する方法の一つです。今回は、混合ガウス分布のEMアルゴリズムをpythonで使ってみます。

混合正規分布EMアルゴリズムによるボートレーサーランクのクラスタリング

今回行うのは、1コースを走るレーサーの勝率データから、各レーサーのランク(A1、A2、B1、B2)を推定することが目的となります。データの便宜上、1コースを走るレーサーのみを対象としています。これをやることに何の意味もありません(;´・ω・)EMアルゴリズムを私が持っているデータで使ってみたかっただけです(;´・ω・)

使用するライブラリのインポート

GMMで混合ガウス分布のEMアルゴリズムを使うことができます。

Google Driveのマウント

今回もGoogle Colabを使うので、Google Driveとのマウントを取ります。

競艇データ(番組表+オッズ)読み込み

2017年1月1日からの全会場・全レースの番組表+オッズのデータを読み込みます。これらのデータはスクレイピングで引っ張ってきました。

 

各レースの1コース選手のランクと勝率のみ抜き取り

1コースを走る選手のランクと勝率のみをdf_allから抜き取ります。また、各ランクごとに別のデータフレームに抜き取ります。

ランクごとのレーサーヒストグラムの描画

勝率を横軸により、各ランクのレーサーがどの程度いるかを見てみましょう。

ボートレーサー勝率データ

これを見ると、各ランクごとの勝率ヒストグラムは正規分布になっているように見えます。ただし、1コースでのデータのため、B2ランクのデータ数が圧倒的に少ない(B2ランクの選手は1コースをあまり走らない)。これらの正規分布を推定できるかどうかをEMアルゴリズムを用いてやってみます。

混合正規分布EMアルゴリズムモデルの定義と学習

さっそく、EMアルゴリズムを使ってみます。A1、A2、B1、B2の4つにラベル分けしたいので、n_componentsは4とします。

モデルの定義・学習は超簡単に書けてしまいます。

混合正規分布EMアルゴリズムモデルの推定結果

EMアルゴリズムでは、各データが正規分布に従っているという仮定のもと、どういった正規分布に従っているかを推定します。

ボートレーサー勝率データのEMアルゴリズムによる分類

n_components=4としたため、4つの正規分布が推定します。が、実際のデータ分布とは少しずれてしまっています。ランク=B2のデータの存在を上手く認識できなかった影響と思われます。

ランク=B4のデータを除いてEMアルゴリズムを再トライ

ランク=B4のデータが数と少なすぎ、全体の推定に悪影響を及ぼしたので、ランク=B4のデータを取り除き、再度EMアルゴリズムを回してみます。n_componentsは3とします。

ボートレーサ勝率データのEMアルゴリズムによる分類

B2の正規分布が少しずれている様な気がするが、まぁだいたい正規分布の推定ができています。

まとめ

競艇において、各レーサーの勝率を横にとったヒストを見てみると正規分布に従ってそうなことが分かりました。そのため、混合正規分布におけるEMアルゴリズムを使って、正規分布推定をしてみたところ比較的上手くいきました。あ!クラスタリングはしてない。まぁいいか。

コメント