shu421 Blog

データサイエンスやKaggleなど

Kaggle ExpertからMasterまでの振り返り

こんにちは!shu421と言います。半年ほど前にKaggle Masterになったのでこれまでの振り返りを書きたいと思います。

目次

  • タイムライン
  • 最近の取り組み方
  • 最後に

タイムライン

まず、私がKaggleに登録してからこれまで参加したコンペを簡単に振り返りたいと思います。

これまで参加したコンペ

  • 2020年8月: Kaggle初参加
  • 2021年8月: Google Smartphone Decimeter Challenge 🥈初メダル獲得
  • 2021年11月: Google Brain - Ventilator Pressure Prediction 🥉Kaggle Expert昇格
  • 2022年3月: Feedback Prize - Evaluating Student Writing 🥉
  • 2022年11月: Feedback Prize - English Language Learning 🥈
  • 2023年3月: Learning Equality - Curriculum Recommendations 🥉
  • 2023年7月: Predict Student Performance from Game Play 🥇Kaggle Master昇格
  • 2023年10月: CommonLit - Evaluate Student Summaries 🥈
  • 2023年12月: Child Mind Institute - Detect Sleep States 🥇

Kaggle Expertになるまでの振り返りはこちらの記事に書いてあるのでぜひご覧ください。ここでは、Expert以降について書こうと思います。

Feedback Prize - English Language Learning

結果: チーム参加 117/2654位 🥈

学生が英語で書いた文章を、1~5点に採点する自然言語処理の回帰タスクでした。タスクとしては単純でしたが、CVとLBの相関があまり取れていなかったためshakeが激しいコンペでした。

このコンペでは基本的NLPコンペで活躍しているDeBertaを中心にモデルを大量に作り、アンサンブルするという方針が強かったです。私たちのチームは最終的に16モデルを作成し加重平均によりアンサンブルしました。ただし、シングルモデルの精度も重要で、AWPやSWA、Layer-wise Learning Rate Decayといった細かな手法を試しました。NLPの基礎的な手法を試せたので、とても勉強になりました。

Learning Equality - Curriculum Recommendations

結果: ソロ参加 99/1057位 🥉

与えられたtopicに対して、どのようなcontentが対応するかを予測する自然言語処理タスクでした。距離学習を用いて各topicとcontentのembeddingを学習し、類似度でマッチングさせる手法が主流でした。

このコンペでは、距離学習の基礎を学びました。手法としては聞いたことがあるレベルでしたが、実際に手を動かして実装したので良い経験になりました。

Predict Student Performance from Game Play

結果: チーム参加 10/2051位 🥇 Kaggle Master昇格

solution

training code

教育向けゲームの行動ログから、最後に提示される問題に正答するか否かを予測するテーブルデータの分類タスクでした。時系列情報も含まれているため、テーブルデータに強いGBDT以外にも1D CNNやTransformerといった系列データに強い深層学習モデルが使われていました。

私はコンペ開始1ヶ月時点で運よく銀上位に入れたため、近くにいたRyotaさんとチームを組みました。そこからはGBDTとNNを育てつつ、terekaさんstalloneさんthetaさんとマージし、最終的には6モデルをアンサンブルしました。特徴選択をFoldごとに行わなかったため若干shake downしてしまいましたが、金圏に残れたのでとても嬉しかったです。研究室で友人と1つずつスクロールして結果を確認したのですが、金を取れた時は思わず叫んでしまいました(研究室のみんなうるさかったですよねごめんなさい)。

ちなみにこのコンペはtime series APIが使われていたのですが、APIのバグでコンペ期間が2回伸び、最終的には4ヶ月半の長期戦となりました。終盤はかなり疲れていましたが、チームメンバーのおかげでなんとか最後まで続けることができました。ソロで参加していたら途中で投げていたと思います。

CommonLit - Evaluate Student Summaries

結果: チーム参加 61/2064位 🥈

solution

学生が書いた文章を採点する自然言語処理の回帰タスクでした。学習データとテストデータの分布に差があったため、そこそこshakeしました。

このコンペでは基本的な自然言語処理の戦い方をしていたのですが、学習データとテストデータの分布差に対応できず、最終的には銀圏中位でした。上位の方はこの分布差にうまく対応しており、これができたか否かが上位との違いだったと思います。上位解法はかなり勉強になるので、時間があるときに読んでみると良いと思います。

Child Mind Institute - Detect Sleep States

結果: チーム参加 9/1877位 🥇

solution

training code

腕に装着したウェアラブル端末から得られるセンサーデータから、就寝時、起床時の時刻を予測するタスクでした。セグメンテーションやヒートマップ回帰として解くのが主流でした。

277人のユーザーについて1~3ヶ月間、5秒間隔でデータが取られていたので1人当たりの系列長が非常に長かったです。そのため、私はデータを1日ごとに区切り、CNNでダウンサンプリングしてからRNNやTransformerに入力するという手法を取りました。長い系列に対してNNを適用するのは初めてだったので、探り探りでしたがとても勉強になりました。

コンペ終了1ヶ月前に金圏ボーダーあたりまで行けたのでtomo20180402さんとチームマージし、そこからchrisさんYouri Matiounineさんとマージしました。最終的にはアンサンブルと後処理によって順位を伸ばし、無事金メダルを獲得することができました。評価指標が複雑だったり英語でのチャットなど不慣れなこともありましたが、とても楽しかったです。

最近の取り組み方

これまで色々なコンペに参加してきましたが、最近はどのように取り組んでいるかを書きたいと思います。

1. 資料をたくさん読む

よく言われていることですが、コードとディスカッションは全て読んでいます。評価指標・APIなどのバグや興味深いデータの特徴が書かれていることがあるため、vote数が少ないものも読んだ方が良いと思います。最近特に参考になったもので言うと、例えばPSPjackさんのディスカッションでは、新しいバージョンのtime series APIのバグが報告されていました。この時点では私はデバッグできていなかったので、とても助かりました。

また、過去コンペの解法や論文もたくさん読みます。睡眠コンペに参加していた時は、以下のような資料を参考にしていました。

睡眠コンペで参考にした資料

似ている過去コンペの解法は直接役に立つことが多いです。実際に睡眠コンペではヒートマップ回帰を実装しましたが、この解法はDFLを参考にしました。

論文もここに載っているものは読みましたし、Abstractだけであれば他にも読んでいます。モデルのアーキテクチャや特徴量の作り方、学習方法など参考になることが多いです。実際に睡眠コンペの序盤は論文を参考にして実装した睡眠データ向けのUNetを使っていました。

2. データをよく見る

これもよく言われていることですが、コンペに参加する際は生データをよく見ます。ちなみにリンクは貼れませんが、atmaCupgotoさんが言及していたり、分析モデル本にも生データをよく見るべきと記載があります。普段は学習データをローカルにデータをダウンロードし、NumbersやExcelを使ってデータを眺めています。人間が見てわかることはモデルにもわかるはずなので、何か使えそうな特徴がないか意識しながら確認しています。実際に生データを見ることで特徴量エンジニアリングのアイデアが浮かんだりモデリングの方針が立つことはよくあるので、コンペごとに必ずやっています。

また、当たり前ですがモデルの予測値がどのような挙動をしているかもよく見ます。予測値を可視化することで苦手なデータの特徴を見つけることができ、精度改善に繋がります。モデルをただ組んで精度を上げるだけではなく、モデルの挙動を理解することも大切です。

睡眠コンペではStreamlitでアプリを作成し、予測値の可視化をしていました

最後に

色々書きましたがまだチームマージでしか金メダルを取れていないので、いつかソロ金を取りたいです。今後も頑張ります。

この記事に関することや他のことなど何でも良いので、もし質問などありましたらXのDMまでお願いします。Private Sharingにならない範囲でKaggleに関することやその他データサイエンスに関することなど、雑談でも良いので気軽にお話しできたらと思います!