🤷‍♀️

Noviceが行くyukiCup2023summer反省会RTA Any%

2023/07/31に公開

yukiさん(@yuki93753711)ら主催のコミュニティコンペに参加した際の備忘録です。(大体の人間よりスコアが低かったので有用な情報は)ないです。個人的な備忘録と今後頑張ることのまとめになります。

コンペ内容(5時間)

https://www.kaggle.com/competitions/yukicup2023summer
このコンペは中古バイクの価格予測でした。中古車に関連する基本情報に加えて、バイクのスペックと査定を出している店舗の情報の3種類のCSVファイルから価格を予測するものでした

結果

結果は38位/43(うちベースラインサブが1つ)でした。人数が多いコミュニティコンペだとベースラインを作るだけでも一定の順位になることがあるのですが、エキスパート以上の参加者が多い内輪コンペでは容赦なく下位10%に入ることに成功しました。

ただ、コンペ参加歴がほとんどない初参加者でもきちんとスコアを出している人もいたので言い訳していても始まりません。以下に反省点と成長した点をまとめます。

反省会チャート構築

人格とスコアの分離(4時間)

普通の人はそうでもないようですが、自分は眼高手低のプライドだけ李徴ばりに高いエンジニアなので、このまま反省を書き連ねると人格と今の実力を切り離せずに劣等感から学習性無気力に陥ってしまいます。そこで反省会を始める前に、「データ分析コンペの順位が低くても自分の価値は失われない」と心の中でまず3回唱えることで人格と実力の分別と乱数調整を行います。
データ分析コンペの順位が低くても自分の価値は失われない
データ分析コンペの順位が低くても自分の価値は失われない
データ分析コンペの順位が低くても自分の価値は失われない

ここで乱数調整に失敗していまい、リカバリのためにお風呂と美味しいアイスを用意する必要がありました。

改善点を探す(3時間)

https://www.kaggle.com/code/rsakata/yukicup2023summer-2nd-place-solution
KagglerつよつよのJackさんが爆速でnotebookを公開してくれているので、自分のものと見比べることで今後の方針について自分であれこれ悩むイベントをスキップします。

グラマスのコード 食う。
グラマスの力 もらう。
グラマスやっつける力 欲しい だから食う。

よく知っているツールを使う

今回のコンペ、制限時間の関係から使える手法に限りがあり、初手LightGBMに走る解法を参考にベースラインを作り始めたのは良かったのですが、LightGBMのバージョン更新に伴う文法のアップデートでかなり躓きました。例を挙げると、lightgbm.trainのオプションがちょっと見ないうちに変更されていたり、なんならlightgbm.cvというクロスバリデーション用のAPIが用意されていたり...。

自前でささっとベースラインを組むというのは、ツールも含めて使い慣れているもので、「アイデア実装」というスコア変動の核心部分に到達する時間を少しでも短縮するために必要なことなのかもしれません。

細部を気にして完成しない

時間制限のあるコンペなので、初心者はなおさらコードの綺麗さを気にしている場合ではなさそうです。元々notebookのチラ裏感は嫌いで、細かな関数型の指定や、python scriptに流用可能な関数として実装しないと気持ち悪かったり、どうせ自分しか読まないノートブックのアウトラインを綺麗に書いて満足したりなどのタイムロスが目立ちました。
(まるで授業ノートを綺麗に書いてテストの点が悪い生徒のよう。)

極力シンプルなコードを書く(綺麗なコードではない)

ベースラインは最悪人のコードを持ってきて始めれば良いのですが、結局自前で組んでいないため、そこからアイデアを追加してコードを発展させていく際にいじった変数が影響を及ぼす範囲を把握しきれていないのが辛い所でした。
ちなみにベースラインを作った時点で16時になっていた。途中で他事も結構していたのですが、それにしても残り2時間では人のアイデアを実装する時間もありませんでした。

短期決戦コンペに思うこと

今回のコンペ期間は1日という短期決戦で、制限時間がかなり限られているコンペできっちりパイプラインを組むのはかえって要領が悪く感じました。普段はpytorch lightning+yaml+mlflow/tensorboardでパラメータを管理しているのですが、時間も少ないので今回はnotebookオンリーで参加しました。ここら辺はコードというよりツールの選択なので、締め切りに合わせた適切なツールを選択する必要がありそうです。一方でお世辞にもプロダクト向けに流用できるコードではないとも感じました。普段の業務でもコーディングスタイルを書き分けることでより効率的に開発できそうです。

進歩した点(30分)

あまり自分の粗さがしばかりしていても疲弊して次のコンペに出る気が失せるので、これまでちょいちょい出ていたコンペと比べて進歩した点を探します。

オリジナル改善でスコアが上昇した

まず自前で組んだベースラインが初心者用ベースラインを越えていたのは地味に嬉しかったです。中身としては、

  1. LightGBM
  2. 数値と文字列の混在した行のクレンジング
  3. insuranceを保険と車検の行に分離
    することで少しだけスコアが上昇しました。

ここでタイマーストップです。色々ガバが目立ちますが、記録は1日半といった所でしょうか。まずまずのタイムです。

最後に

完走した感想ですが、シンプルなテーブルデータコンペでも解法は十人十色で面白かったです。一方で効いてる特徴量は一致していて、方向性は収斂していくのがつよつよKagglerの実力を感じました。discordサーバーでの参加もライブ感を感じられて良かったです。コンペを開催してくださったyukiさんをはじめ、運営のみなさんに感謝します。ありがとうございました。

Discussion