DEVELOPER’s BLOG
技術ブログ
Kaggle解説: 銅メダル獲得 NFLコンペについて
はじめに
KaggleのNFLコンペで2038チーム中118位となり、銅メダルをとることができました。以下に、参加してからの取り組みや、反省点を書いていきたいと思います。
コンペ参加前の状況
10ヶ月ほど前にTitanicコンペに参加してから、「Predicting Molecular Properties」と「IEEE-CIS Fraud Detection」というコンペに参加してみましたが、公開されているカーネルを少しいじってみた程度でメダルには到底届きませんでした。
コンペ概要
簡潔に書くと、アメフトのワンプレーごとに、ボール保持者がランプレーでいくらヤードを稼げるか?を予測するコンペです。しかしアメフトのルールを知らないため、はじめは全くわからなかったです。
アメリカンフットボールでは、野球のようにプレーごとにチームが攻撃と守備にきっちり分かれているようなのですが、今回の予測はこの攻撃側のランプレーに関係します。
攻撃側のチームはボールを保持し、相手陣地にできるだけ深く攻め込もうとするのですが、その方法が2パターンあります。パスプレーとランプレーです(パスプレーは省略します)。ランプレーは攻撃開始直後に、クォーターバックが走ってくる味方にすれ違いざまにパスを出し、そのボール保持者は相手を交わしながらできるだけ相手陣地の深いところまで、すなわちヤードを稼ごうとします。
今回予想するのは、このボール保持者が稼いだヤードが可能性のあるヤードそれぞれ以下である確率です。
例)3ヤード以下である確率:0.3、 4ヤード以下である確率:0.35、5ヤード以下である確率:0.38 .......
取り組み
以下では自分の取り組みを説明していきます。始めたのは、締め切りの約1ヶ月前からです。
コンペ概要理解とEDAなど
アメリカンフットボールの理解
アメフトのルールを知らなかったため、ここから始めました。サイトや動画を参考に進めました。
予測するものの理解
ランプレー時にオフェンスが得たヤードに関するもので、それぞれのヤード以下である確率を求めなければならないということをなんとか理解しました。ここからは、アメフトの動画はランプレーに絞って見ていました。
与えられたデータの内容
プレーごとのデータでした。まずそのプレーの情報で、日付と時刻、スタジアムの状態、天気と風速など。また、プレーに出場している22人それぞれの情報で、名前、身長体重、出身大学、ポジション、位置情報、進行方向や速度と加速度、背番号などが与えられていました。
モデル
多層ニューラルネットワーク(以下DNN)を使いました。今まではLGBMを使ってきたため、DNNを本格的に使うのは初めてでした。このカーネルと同じものです。
特徴量エンジニアリング
ベースのモデルができてからは、データ分析→そこから得られたアイデアを元に特徴量作る→スコア上がるかどうか?→データ分析 といったように仮説と検証の繰り返しでした。うまくいった特徴量を具体的に書いていきます。
攻撃チーム、守備チーム、ボール保持者(Rusher)、守備チームの前線選手などのそれぞれの戦績をランク付け
やはりアメフトにも強いチーム、弱いチームが存在し、同様にボール保持者の能力にも差があります。これを単純にターゲットエンコーディングしても良かったのですが、それは避けました。他の競技にも言えることですが、チームも選手も年によってかなり調子が上下します。そのままターゲットエンコーディングすると与えられたデータに過学習してしまうと思い、5つにランク分けし、エンコーディングしました。これは、リーダーボードのPublicからPrivateで、順位が約70位上がった要因にもなっていると思います。
ボロノイ図の面積を用いる
ボロノイ図というのは、平面上に配置された点に大して、その平面内の点を、どの点に最も近いかによって分割してできる図のことで、今回のコンペではこの記事でPythonで実装してくれています。僕はここから着想を得て、ボロノイ図によって分割された部分の面積を特徴量として加えてみることにしました。面積が無限大となってしまうのを防ぐため、うまくミラーリングを使う必要があるのですが、実装力不足のため数日を費やすこととなりました。しかし、この面積を標準化して特徴量として加えると期待以上にスコアがよくなったので達成感も十分にありました。ここで出した面積を元に、ある特定のポジションの選手の面積を利用するなど、さらに試行錯誤をしました。
選手同士の距離感
これは多くの方がされていると思います。ボール保持者と相手ディフェンスとの距離感を計算し、その平均や最小値、最大値などを利用しました。
上手くいかなかったこと
CNNを用いる
上記のことはコンペ終了1週間前には出来ており、銅メダル圏内にも入っていました。しかし、さらに順位をあげたいと思い、残り1週間は新しいことにチャレンジしました。そもそも僕が上記で作った特徴量は、主に選手の戦績と位置情報に関したものです。その位置情報を最もシンプルに用いることができるのはCNNではないか?と考えました。
つまり、選手の戦績やプレー時の状況、スタジアムなどプレー情報はシンプルなDNNにいれ、選手の位置情報と進行方向のベクトル、速度、加速度などはCNNに入れ、それをくっつけてしまい、最終的な出力を得ようというものです。題の通り、この試みは失敗しました。lossが全く下がらず、それまでのモデルより悪いスコアとなってしまいました。DNNの使用経験が少ないことによる安直な考えが原因ではないかと考えています。しかし、このコンペで1位であったチームはCNNを用いていたため、アイデア自体は悪くなかったのでは?とも思います。
数秒後の選手の位置を利用する
選手の進行方向のベクトル、速度、加速度が与えられているため、未来の選手の位置が求められると思い1秒後と0.5秒後の選手の位置を求め、それを用いて特徴量を作ったのですが、精度の向上には繋がりませんでした。他の参加者にはこの特徴量が効いたとコンペ後におしゃっていた方もいたので不思議です。
上位陣の解法
1st place solution
このチームは2位に大差をつけて1位となったのですが、とてもシンプルな解法で驚きました。選手の位置情報と速度、加速度をディフェンスとボール保持者、オフェンスとボール保持者、ディフェンスとオフェンスなどに分けた上で特徴量とし、モデルとしてCNNを使っていました。また、有用なCVを見つけたようで、CVのスコアをよくすることに注力することが出来たようです。
2nd place solution
Transformerという、主に自然言語処理で使われる手法があるのですがこの方はそれを使っています。上位の方の多くはこの手法を使っているようなので、僕もこの手法を理解したいと思います。
4th place solution
上記のTransformerは、Attentionという仕組みを用いているのですが、このチームはこのAttentionをDNNと組み合わせているようです。
ちなみにAttentionについてはこちらで解説しています。
まとめ
今回のコンペでは、データ分析→生まれたアイデアを元に特徴量作成→精度をあげる、という基本的な流れはうまくいきました。しかし、データ分析によって生まれたアイデアをモデルに反映させることはできず、それが上位陣との差であると感じました。もちろん、自力でメダル圏内に入れるようになったのは大きな成長であると思いますし、この経験と学びを生かして次回は銀メダルを狙いたいと思います。