はじめに
データサイエンティストへ職種を変え、学習の一環として、nishikaの「Jリーグ出場時間予測」コンペに参加しました。本記事では、コンペ参加までの学習内容、コンペの内容・感想を紹介します。
学習内容
前職はインフラエンジニアで運用保守を行っていました。そのため、プログラミング言語に触れた経験も無かったため、Pythonの基礎から学習できる教材として、「東京大学のデータサイエンティスト育成講座」を購入し、読み進めました。
本書籍は機械学習のための統計数学も説明があり、ハンズオン形式で学習が可能であることなど、未経験の方でも学びやすい教材かと思います。学習モデルはsklearnのみですが、検証やパラメータチューニングまで網羅しています。
その他の学習モデルとして、先輩方からLightGBMを紹介されたので、ネットの情報を頼りに学習を行いました。
コンペ概要
-
Jリーグ選手の出場時間予測(https://www.nishika.com/competitions/6/summary )
開幕時のJ1選手データから、その年の試合出場時間合計を予測するテーブルデータの回帰問題 -
期間:2020年8月〜2020年10月、参加者数:409名
-
評価指標:RMSE
-
データ:
訓練データは2016年~2018年のJ1選手データ(1414行 × 37列)
テストデータは2019年のJ1選手データ(488行 × 37列)
その他、1試合毎の出場時間、退場記録や、チーム移籍情報のjsonファイル
※異常値あり(年俸の欠損、国名のtypo など) -
特徴量:
数値は年俸、身長、体重、誕生日、過去3年間各々の出場時間合計・出場試合数など
カテゴリは国籍、在籍チーム、登録ポジション、ユース経験、過去3年間各々の在籍チームなど
取り組み
学習モデルは LightGBM 、パラメータチューニングは Optuna を利用し、特徴量エンジニアリングで精度を向上させていきました。有効だった特徴量は以下の通りです。
-
チーム×ポジション毎の順位付け
試合に出場するか否かは、チーム内、更には同一ポジション内での相対評価で決まると考えて、年齢や身長などの特徴量をチーム内での順位、またはチーム×ポジション内での順位に変換した特徴量を追加した。 -
ポジション毎の予測値
ポジション毎に有効な特徴量は異なる(例えば、過去の得点数はGKには有効では無く、FWには有効である...等)と考え、ポジション毎に学習したモデルを使い特徴量を生成した。 -
選手移籍情報の予測値
その他のデータである選手移籍情報を用いて、開幕情報の選手データから、その年に移籍するか否かを予測するモデルを作成した。その予測値を特徴量として追加した(リークを防ぐように気を付けていたら、上手く検証ができなくなってしまいました)。
最終結果
-
5位 (409名中)
検証ができなかったため、「選手移籍情報の予測値」を追加した予測結果は最終提出に選びませんでしたが、この予測結果の最終スコアは2位に位置する精度でした。 -
上位者の解法
- CVは選手名でのGroupKFold
- モデルはLightGBM、CatBoost、XGBoost、RandomForest のいずれかの組合せのアンサンブル
- 欠損値の処理(出場時間の近い選手の値、過去3年間いずれかの出場時間であれば前後の値から補完など)
感想
- nishika について
- 2019年12月にオープンした比較的新しい日本のコンペサイト
※Jリーグの出場時間予測では、コード共有や議論はあまり活発では無い印象でした。
- 2019年12月にオープンした比較的新しい日本のコンペサイト
- 現在、開催中のコンペは下記の通り - 判例の個人情報の自動マスキング(https://www.nishika.com/competitions/7/summary ) - クラシック音楽の作曲家分類(https://www.nishika.com/competitions/8/summary )
-
コンペに参加してみて良かったこと
- ドメイン知識の取得
特徴量を作る上で、J1、J2の試合数や移籍する選手が多いなどのJリーグに関する知識が得られました。この経験により、全く知らない業界の知識を調べることへの抵抗感は無くなったかと思います。
- ドメイン知識の取得
- データ分析の面白さ 与えられたデータを確認し、仮説・検証を行い、精度として結果がでる一連の流れを経験できました。特に仮説・検証では、アイデアを形にして、結果を見るという点に魅力を感じました。