ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

atmaCup オンサイトデータコンペ #2に参加してきました!

こんにちは!takapy(@takapy0210)です。

今回は、昨日(11月23日)行われた atmaCup#2に参加してきましたので、振り返りや諸々の感想などを残していければと思います。

このような経験の振り返りに関しては、YWTのフレームワークを使うと良いという噂を聞いたので実践してみます。

また、本コンペの公開範囲として

データの内容に関しては NG ですがカラム名や問題設定については公開OKの許可を頂いております。
ソースコードの公開は一度運営側とデータ提供社様との内容のチェック後であればOKです。公開したい方はコンペ終了後などに運営にご連絡下さい。

とのことでしたので、この範囲でお伝えできればと思います。

atmaCupとは

データ解析・アルゴリズムソリューション・システム開発を行うベンチャー企業atma株式会社( https://atma.co.jp )が主催するデータコンペティションです。 実際に参加者が会場に集まりチームでデータ解析を実施し、得た学びを共有します。

ということで、実際に1つの会場に集まりデータ分析を行います。

atma.connpass.com

今回から論理メダルに加えて物理メダルも付与されるということで、よりコンペティション感が増して参加者のモチベーションもあがっていたように見えました!

コンペの問題設定

「睡眠のアプリケーションから取得された睡眠情報とその日の日中のコンディションが紐付いたデータが与えられ、前日のユーザーのコンディションを予測する」というもので、評価指標はRMSEでした。

trainデータとtestデータに加えて、ユーザーアンケート情報がデータとして与えられました。
(このアンケート情報データはそこまで重要ではなかったようで、ここに時間をかけてしまってスコアが伸びなかった、という方が何名かいました)

余談ですが、東京から当日移動して参加された方も多く、懇親会で「我々のコンディションは(早起きしたので)低いですよね笑」なんて話をしたりしました。

(早起きチャレンジに無事成功した図)

結果

まずは結果から。

f:id:taxa_program:20191124124732p:plainf:id:taxa_program:20191124124810p:plain
左:Public / 右:Private

Public10位からのPrivateで13位(3位Down)でした!

強い人はやっぱりちゃんと強くて、カッコ良かったです。上位の方々、おめでとうございます!
(AutoMLおじさんに負けなくてよかったぁ・・・)

やったこと(Y)

お昼を挟んで前半、後半でまとめます。
(美味しいお弁当を頂いたのですが、コンペに夢中で写真を撮り忘れました!)

モデルはLightGBMで、KFold:5~10あたりでいろいろ試しました。

前半(10時30分〜13時)

  • 特徴量管理とパイプライン構築
    EDAしながら、以前発表した方法で特徴量管理とパイプラインを作るところから始めました。ここに結構時間がかかってしまい、結果的に初動が遅くなってしまいました。

  • First Sub
    データをざっと見てみると、カテゴリカルなものや日付や時間を表す特徴量がいくつかあったので、まずはベースラインを作ろうと思い、雑にOrdinal EncodingしてLightGBMにぶちこみました。その結果、0.6442という、いかにもベースラインっぽいモデルができました。

午前中で1subしかできなかった図

後半(13時30分〜18時)

  • FE

    • 日付や時間のデータを適切に前処理
    • ユーザーIDごとに集計した特徴量を追加
    • 会社IDとユーザーIDにそれぞれを紐づける特徴があったので、その紐付け特徴を除去したものを本当のユーザーIDとして追加
      →これで結構スコアがあがったのですが、懇親会で聞いたらこれはあんまり効かないはず、という助言をいただいたので、なぜあがったのか不明・・・汗
  • アンケート情報の追加

    • 時間もなかったので、欠損率が50%未満のカラムだけをOrdinal Encodingして、それをマージしました。これで若干スコアがあがりました。
  • ハイパーパラメータ調整

    • ここはヒューリスティックにいくつか試しました。しっかりチューニングすればもう少しスコアが伸びたかもしれません。
  • ブレンド

    • 学習に使用する特徴量を変えてモデルを複数作成し、ブレンドして予測しました。(これは最後のあがきでしたが、若干スコアあがりました)

最終的に1番良いSubを選べていたとしても、あまり順位は変わらなそうでした。

f:id:taxa_program:20191124133804p:plain
submit履歴

また、途中で主催者からベースラインモデルの生成〜SubmitまでのHands-Onもあり、コンペに参加したことのない人でもしっかりフォローしてもらえるようになっていました。(このベースライン生成コードはDiscussionでも共有されました)

わかったこと(W)

  • 特徴量管理とか学習パイプラインはめっちゃ良かった!けど、初動が遅くなりがち。

    • コマンド1発である程度のベースラインモデルができるスクリプトを作っておくと、短期決戦には良さそう。
  • 色々な自作スクリプト(関数)持っている人は手数が多い

    • 初動も早くなるし、その分いろいろ実験できるんだろうな〜と思いました
  • 強い人は強い

    • 強い
  • オンサイトコンペ面白い

    • 終わった後すぐに懇親会で「この特徴量が〜〜〜」とかいう話ができるのが面白かったです
  • 新調したスマホケースに新幹線の切符いれると、切符の磁気がやられて改札が通れなくなる

どんなことが重要だったのか

上位の方々の話を聞く限りでは

  • ユーザーIDごとの集計
  • ユーザーIDごとのtargetの平均を、targetから引いた値をtargetとして学習させる

あたりがポイントだったみたいです。

特に2つ目の発想なんかは、経験から導かれるものだと思うので、そういう意味でもKaggleなどでいろんなコンペに参加するのはとても大事だな、と思いました。

次にやること(T)

  • 初動を速くできるように、特徴量管理の方法を再考する。

  • 自作関数(スクリプト)を作る

    • 日付データとか、カテゴリデータとか、渡すとよしなに処理してくれるやつ

最後に

このようなオンサイトコンペは初参加でしたが、Kaggleなどのオンラインコンペとはまた違った面白さがありました。(Twitterでは知っている人と実際に会って話せるが最近多くて嬉しいです)

また、@nyker_gotoさんが1人でコンペサイトを構築したようなのですが、これがめっちゃ良いしすごかったです!(語彙力)
いや、本当に。スコア計算は提出直後にされるし(某nateみたいにメールでお知らせするから待っててね、とかならない)、ベストスコア更新すると「Congratulation!!!🎉」演出があるし・・・。

いちユーザーとしてとても使いやすかったです。

主催してくださいましたatma株式会社の運営の皆様、ランチスポンサーをしていただいた株式会社i-plugの皆様、ありがとうございました!

次回もあれば是非参加させていただきます!