kaggleコンペ【March Machine Learning Mania 2021 - NCAAM】体験記

# まえがき
本記事は[March Machine Learning Mania 2021 - NCAAM](https://www.kaggle.com/c/ncaam-march-mania-2021)というkaggleで2021/2/26~2021/4/7(最終submitは2021/3/19)まで開催されているコンペにペアで参加したので、自身のソリューション公開と共に、これからコンペティションに参加される方にとって何か参考になればと思います。
(3/27時点：88/707 ブロンズメダル圏内)

# コンペ概要
概要をざっくり説明すると、以下のようなコンペになります。
・アメリカの大学対抗バスケットボールトーナメント大会本戦のチーム勝敗予測を行う
・男子バスケの試合のみを扱う（同時開催で[女子バスケ結果予測](https://www.kaggle.com/c/ncaaw-march-mania-2021)も開催）
・コンペティションとして毎年開催されている
・予測結果の最終submit後に、実際の試合結果がLeaderBoardに反映されスコア, 順位が上下する
・最終参加チーム数は707チーム（メダル獲得は~100位）

リアルタイムで行われる試合の結果がスコアに反映され、それによってLeaderBoardが変動する方式は個人的に面白いなと思いました。
毎日kaggleを覗きに行きたくなりますよね。

毎年開催されているコンペなので過去の上位ソリューションやEDAは非常に参考になると思います。
また、開催から最終submitまで期間が短い且つ参加タイミングが2021/3/5と最終submitまで2週間と十分な時間が確保できそうになかった為、コンペ経験の浅いビギナーが1から自分なりのEDAやモデル構築を行うと間に合わなくなると考えました。

そこで、一緒にチームを組んだ方と相談して以下のような戦略で行く事に決めました。
1. 参考にするノートブックを絞る
2. 過去のコンペ情報・ドメイン知識収集(与データ把握含む)
3. 収集した情報を基にした特徴量作成
4. 使用するモデルのパラメータチューニング
5. 最終調整

恐らくそこまで奇抜な事はやっておらず、王道の戦略ではあると思いますが、これらについて詳細を書いていきます。

# 1. 参考にするノートブックを絞る
簡単にコンペ概要を把握した後、参考にするノートブック選定に入りました。
kaggleでは世界中のコンペ経験が豊富な方達が、「コンペを今から始める皆さんへ」という意味合いでスタートダッシュが切れるように、必要最低限のノートブックを公開してくれています。
その中で、筆者は以下の2つの公開ノートブックをベースに進めていく事にしました。
1. [NCAAM 2021 - Features only](https://www.kaggle.com/tunguz/ncaam-2021-features-only)
2. [NCAAM 2021 Feature Importance w/ GPU XGBoost SHAP](https://www.kaggle.com/sssshota/ncaam-2021-feature-importance-w-gpu-xgboost-shap/edit)

選定理由は、
・どちらのノートブックも分かりやすく書かれており編集がしやすい事
・コンペを進めるのに必要なフレームワークが出来上がっていた事
・lightgbmを初めとするgbdt系モデルは学習が速くある程度の精度が出せる事
が大きな理由です。

# 2. 過去情報・ドメイン知識収集(与データ把握含む)
ノートブックの土台を決めたら、それに肉付けをしていく為に情報収集に入りました。
やったこととしては、
・与えられたデータ内容の確認
・ドメイン知識の収集
・過去に開催された同コンペ上位者のソリューション, スコア確認
の主に3つになります。
### 与えられたデータ内容の確認
[こちら](https://www.kaggle.com/c/ncaam-march-mania-2021/data)からダウンロードできるcsvデータがどのようなデータ構造になっているのかを確認し、最終的に使うデータは以下のcsvデータになりました。
1. MNCAATourneyCompactResults.csv
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877776/429dc12b-9fdf-2800-be7e-f754bdfbb50a.png)
2. MNCAATourneySeeds.csv
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877776/e3def240-df39-d0de-d826-354e79dd8c9d.png)
3. MRegularSeasonCompactResults.csv
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877776/c28835a2-60e7-6d4d-dcaa-95fe47f88fb8.png)
4. MMasseyOrdinals.csv
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877776/3b576516-7b73-9bae-b52a-0fe33f4b0452.png)

### ドメイン知識の収集
筆者はバスケ経験がなく正直どんなスポーツかも良く分かっていなかったので、以下の記事を参考にバスケの試合分析や勝敗に関連する要素にどんなものがあるのかを学びました。
1. [B.STATS+ スタッツ用語集](https://bstatsplus.com/glossary)
各種スタッツの計算方法が書かれていてとても参考になりました。
2. [Re:ゼロから始めるML生活 数字で見るバスケットボール](https://www.nogawanogawa.com/entry/basketball_analysis)
3. [MARCH MADNESS PREDICTION USING MACHINE LEARNING TECHNIQUES](https://run.unl.pt/bitstream/10362/33864/1/TGI0135.pdf)
全て読み込めた訳ではないですが、過去コンペでのスコアや有効なモデルについて議論がありました。(今となってはもっと読み込めば良かったと思っています…)

このような形でバスケの試合に関する知識を調査して蓄えていきました。

### 過去に開催された同コンペ上位者のソリューション, スコア確認
これについては本コンペの[ディスカッション](https://www.kaggle.com/c/ncaam-march-mania-2021/discussion/222390)で紹介されていたので、こちらを参考に過去コンペでの最終的な上位者スコアや、これまでの上位者がざっくりどういったソリューションを用いたのかを参考にしました。

# 3. 収集した情報を基にした特徴量作成
いよいよここから特徴量作成に入ります。試合スタッツ基本的なデータは与えられているので
>1. [B.STATS+ スタッツ用語集](https://bstatsplus.com/glossary)

こちらの記事を参考に、「Four Factors」と呼ばれる試合中の重要な要素を初めとする応用的なスタッツ特徴量を作成しまし、各チームが何年にシードを獲得したのかどうかという特徴量も同時に与えました。
また、
>1. [NCAAM 2021 - Features only](https://www.kaggle.com/tunguz/ncaam-2021-features-only)

ベースにする事にしたこちらのノートブックでは、過去のトーナメントでの試合情報から、翌年のトーナメントの試合結果を予測するようなデータ構築にしていたので、レギュラーシーズンの試合勝敗や、チームの試合結果（戦績）を基に、同じ年のトーナメントの結果を予測するデータ構築に変更しました。
（例：2020年のトーナメント結果を予測したい→2020年までのレギュラーシーズンの結果を学習に用いる）

# 4. 使用するモデルのパラメータチューニング
学習・推定させるデータ構築が済んだので、「如何にして精度を保ったまま過学習を防ぐか」を以下のサイトを参考にしてチューニングを行いました。（今回のコンペではここに一番時間を費やした気がします）
1. [lightgbm　公式ドキュメント](https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html)
2. [機械学習】ハイパーパラメータチューニングの仕方](https://qiita.com/R1ck29/items/50ba7fa5afa49e334a8f)
3. [LightGBMを使ったクラス分類モデルの構築](https://hackerdemy.com/2020/09/15/lightgbm-classification/)
4. [LightGBM(gbdt)のパラメータ/Tuningの個人的まとめ](https://zenn.dev/mosamosa/articles/07d0076c9292136a3639)
最終的には公式ドキュメントを読み込むことになるのですが、パラメータチューニングの入り口としては個人の方が経験的にまとめて下さったサイトも参考になりました。
GridSearchやoptuna等の探索的なチューニングも検討したのですが、今回のコンペには適さないと結論付け使用しませんでした。（理由は後述します）

# 5. 最終調整
ここまで来た段階でペアを組んだ方と以下のディスカッションを実施しました。
・今回使用するモデルのベストパラメータについて
・モデルに使用する特徴量の組み合わせ
・**最終的に推定する予測確率の分布の形について(結果的にここが最重要)**

今回のコンペの評価指標である[logloss](https://www.kaggle.com/c/ncaam-march-mania-2021/overview/evaluation)値を小さくするためには、0~1まで連続値をとる確率の分布形が正規分布ではなく「0.5付近を谷にして0, 1が分布の山となる形」且つ「0.5以上を勝利予測、0.5以下を敗北予測とした時、0.5以上の予測数と0.5以下の予測数ができる限り等しくなる(トーナメントの勝利数と敗北数は必ず一致するから)」ような予測結果でなくてはいけませんでした。
予測結果をこれに近づけるために、**パラメータチューニングは手動である必要がありました。**
(もっと深く調べれば探索的チューニングでもできたのかも知れません。)

チューニング前はこんな感じの分布でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877776/a41ced8b-980d-d90c-bccd-da0a9ce59217.png)
これだと実際の勝敗がどちらでもloglossの値が改善されなさそうな事がイメージできます。

この条件を満たす分布を出力するようなモデルのパラメータをチームで最終提出期限一杯までやり込みました。(ここは完全に力業だったと振り返っています…)
その結果、最終的な提出結果の分布はこんな分布になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/877776/73b5b076-0565-94b6-8ec0-8d9a3e7fa3ce.png)
理想的な分布形からは遠いですが、この分布であれば予想が当たっていた時にlogloss値の改善が進むので、上位を狙える形に近いのかなと考えています。（試合が荒れたり予想が外れていると逆効果にはなりますが…）

# おわりに
体験記という形でコンペ中に考えた・実行した事等を書いてみました。
参加したコンペの期間が短く、「正直もっと色々やれる事はあったな〜」と思っています。
これからコンペを始める方で、「参加したものの進め方がイマイチよくわからない」という方の何かの参考になればと思います。
また、著者の[Github](https://github.com/shota1201/for_visitors)に今回参加したコンペのソースコードを公開していますので、興味のある方は見てみて下さい。

3/27執筆現在ではブロンズメダル圏内ではありますが、まだ試合を残してますのでどうなるかは分かりません。メダルが取れれば良いなぁと思っております。