次の一投の行方を予測! プロ野球データ分析チャレンジ

ストライク? ヒット? それともホームラン!?

賞金: 100,000 参加ユーザー数: 326 6ヶ月前に終了

7th Solution(kfsky)

  kfskyと申します。 今回初投稿です。まず運営・参加の皆様ありがとうございました。

プロ野球はあまり知らなかったのですが、今回のコンペティションで、野球選手を少し覚えることができました(笑) 個人的に、今回は途中で(一時的に、、、)2位まで行けたのでモチベーションが出たコンペでした。ただ、どうしても1位の方が抜けなく、その後は皆様に抜かれていった。。。という形です。すでに皆様も解法も挙げている中で恐縮ですが、初のTOP10位だったので投稿させていただきます。  

解法
前処理

train とtest のデータの構造が異なることはトピックに内にも共有されていました。 https://prob.space/competitions/npb/discussions/columbia2131-Post0bae12df9ec3007c4cce

色々と試したのですが、一番効いたのはDT-SNさんの前処理でした。そこから少し弄って https://prob.space/competitions/npb/discussions/DT-SN-Post2126e8f25865e24a1cc4

特徴量生成

特徴量に関しては、すでに色々出ているので詳細は省きますが、以下の項目に効果がありました。

  • BallYの予測結果を特徴量に生成  学習データにしかない特徴量を予測して、新しい特徴量にするということを実施しました。speedなどの項目がトピックで上がってましたが、自分はBallYなどの特徴量を予測して新しい特徴量としました。  ただ、予測精度があまり良くなかったので個人的には疑問が残る感じでした。。

  • counts, runnerの特徴をまとめた特徴量  カウントの状態をまとめるなどして、新たな特徴量にすることも効果がありました。

train_df["total_counts2"] = train_df[['S', 'B', 'O', 'totalPitchingCount']].apply(lambda x: '{}-{}-{}-{}'.format(x[0], x[1], x[2],x[3]),axis=1)
test_df["total_counts2"] = test_df[['S', 'B', 'O','totalPitchingCount']].apply(lambda x: '{}-{}-{}-{}'.format(x[0], x[1], x[2],x[3]),axis=1)
Model
  • LightGBMのパラメータとKFold  不均衡データは今回初めてなので、パラメータの設定がわからなかったのですが、class_weightを "balanced" に設定したところ効果がありました。  また、Foldの設定は、GameIDのGroupKFold で上手く行きました。

  • アンサンブルに関して  今回、学習データをテストテータに近づけるために、学習データからサンプリングを行うことをしています。そのため、サンプリングの偏りによって、overfitしてしまわないか?などが気になったので、複数のサンプリングの設定で学習データを生成して、予測結果を出していきました。結果的にはPublicにoverfitしてしまった形となってしまいました。

ソース

解法はGithubに公開しております。 https://github.com/kfsky/BaseBall-result-prediction-Probspace

感想

直近3回のコンペティションに参加させていただき、少しずつ成果が出てきてきました。 この調子で、次回のコンペティションも頑張って行きたいと思います。ありがとうございました。

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。