はじめに
前回は、「Sports Analyst Meetup #4」でのLTに向けて、「Sumo Reference」から収集したデータを用いて特徴量作成のための簡単な可視化を実施しました。
本記事では、ベンチマークとなる機械学習モデルを構築します。ベンチマークに新しい特徴量を加えることで、性能の変化も確認します。
ベンチマークの構築
特徴量
特徴量としては、前回の記事で取得した「1〜14日目の勝敗」と、可視化を通じて予測に寄与しそうだと確認した「14日目終了時点での勝数」を用います。
- day_1, day_2, ... , day_14: N日目の勝敗(1 or 0)
- wins_at_day_14: 14日目終了時点での勝数
目的変数
- final_day: 15日目の勝敗(1 or 0)
機械学習モデル
Kaggleでテーブル形式データを扱う上での定番になっている「LightGBM」を用います。
Validation の構築
今回2000〜2019年のデータを取得していますが、test検証用に2015年以降のデータは学習に用いないことにします。
split_datetime = 201501 train = df[df['datetime']<split_datetime] test = df[~(df['datetime']<split_datetime)]
その上で、Validationは下図のように時系列で切りました。具体的には、validationに用いる28場所分のデータを、1場所ずつズラしていくことで複数の {train, valid} のペアを作成しています。それぞれでvalidationのデータセットに対する性能を今回はAUCで測り、それらの平均をCVスコアとして採用しています。ペアの数をいくつにするかは計算量との兼ね合いですが、現時点ではさほど計算量が多くないので30組を作成しました。
評価性能
CVスコアはAUC: 0.52895で、二値分類なのでランダムよりは僅かに良い程度の性能になりました。 "gain" で測定した feature importanceは次の通りです。「wins_at_day_14」が圧倒的に高い値で、その他は相対的に0に近いです。(強いて挙げれば「day_1」が高く、定性的には「初日の結果が場所全体の調子に影響を与え得る」くらいの解釈ができるかもしれません)
testデータセットでの性能を見たところ、AUCはCVとほぼ同様の0.54になりました。(こんなにcurve感のないAUCも珍しいですね)
0.5を閾値にした場合、正答率と混同行列は次の通りでした。
from sklearn.metrics import accuracy_score accuracy_score(y_test, y_sub)
0.5304761904761904
from sklearn.metrics import confusion_matrix confusion_matrix(y_test, y_sub)
array([[333, 187], [306, 224]])
新しい特徴量の追加
追加する特徴量
追加する特徴量は「千秋楽の対戦相手の14日終了時点での勝数」です。理由は単純で、本人の「14日終了時点での勝数」が効くなら、同様に対戦相手のものも効くだろうという発想です。