こんにちは!takapy(@takapy0210)です。
今回は、昨日(11月23日)行われた atmaCup#2に参加してきましたので、振り返りや諸々の感想などを残していければと思います。
このような経験の振り返りに関しては、YWTのフレームワークを使うと良いという噂を聞いたので実践してみます。
また、本コンペの公開範囲として
データの内容に関しては NG ですがカラム名や問題設定については公開OKの許可を頂いております。
ソースコードの公開は一度運営側とデータ提供社様との内容のチェック後であればOKです。公開したい方はコンペ終了後などに運営にご連絡下さい。
とのことでしたので、この範囲でお伝えできればと思います。
atmaCupとは
データ解析・アルゴリズムソリューション・システム開発を行うベンチャー企業atma株式会社( https://atma.co.jp )が主催するデータコンペティションです。 実際に参加者が会場に集まりチームでデータ解析を実施し、得た学びを共有します。
ということで、実際に1つの会場に集まりデータ分析を行います。
今回から論理メダルに加えて物理メダルも付与されるということで、よりコンペティション感が増して参加者のモチベーションもあがっていたように見えました!
atmaCup入賞者には(リアル)メダルが付与されます!! #atmaCup pic.twitter.com/HRkoiSQbpy
— atma株式会社 (@atma_inc) November 23, 2019
コンペの問題設定
「睡眠のアプリケーションから取得された睡眠情報とその日の日中のコンディションが紐付いたデータが与えられ、前日のユーザーのコンディションを予測する」というもので、評価指標はRMSEでした。
trainデータとtestデータに加えて、ユーザーアンケート情報がデータとして与えられました。
(このアンケート情報データはそこまで重要ではなかったようで、ここに時間をかけてしまってスコアが伸びなかった、という方が何名かいました)
余談ですが、東京から当日移動して参加された方も多く、懇親会で「我々のコンディションは(早起きしたので)低いですよね笑」なんて話をしたりしました。
(早起きチャレンジに無事成功した図)
起床チャレンジ成功 #atmaCup
— takapy | たかぱい (@takapy0210) November 22, 2019
結果
まずは結果から。
Public10位からのPrivateで13位(3位Down)でした!
強い人はやっぱりちゃんと強くて、カッコ良かったです。上位の方々、おめでとうございます!
(AutoMLおじさんに負けなくてよかったぁ・・・)
やったこと(Y)
お昼を挟んで前半、後半でまとめます。
(美味しいお弁当を頂いたのですが、コンペに夢中で写真を撮り忘れました!)
モデルはLightGBMで、KFold:5~10あたりでいろいろ試しました。
前半(10時30分〜13時)
特徴量管理とパイプライン構築
EDAしながら、以前発表した方法で特徴量管理とパイプラインを作るところから始めました。ここに結構時間がかかってしまい、結果的に初動が遅くなってしまいました。First Sub
データをざっと見てみると、カテゴリカルなものや日付や時間を表す特徴量がいくつかあったので、まずはベースラインを作ろうと思い、雑にOrdinal EncodingしてLightGBMにぶちこみました。その結果、0.6442という、いかにもベースラインっぽいモデルができました。
午前中で1subしかできなかった図
前半折り返し 結局1subしかできなかった・・・ #atmaCup pic.twitter.com/SBDgFraxb6
— takapy | たかぱい (@takapy0210) November 23, 2019
後半(13時30分〜18時)
FE
- 日付や時間のデータを適切に前処理
- ユーザーIDごとに集計した特徴量を追加
- 会社IDとユーザーIDにそれぞれを紐づける特徴があったので、その紐付け特徴を除去したものを本当のユーザーIDとして追加
→これで結構スコアがあがったのですが、懇親会で聞いたらこれはあんまり効かないはず、という助言をいただいたので、なぜあがったのか不明・・・汗
アンケート情報の追加
- 時間もなかったので、欠損率が50%未満のカラムだけをOrdinal Encodingして、それをマージしました。これで若干スコアがあがりました。
ハイパーパラメータ調整
- ここはヒューリスティックにいくつか試しました。しっかりチューニングすればもう少しスコアが伸びたかもしれません。
ブレンド
- 学習に使用する特徴量を変えてモデルを複数作成し、ブレンドして予測しました。(これは最後のあがきでしたが、若干スコアあがりました)
最終的に1番良いSubを選べていたとしても、あまり順位は変わらなそうでした。
また、途中で主催者からベースラインモデルの生成〜SubmitまでのHands-Onもあり、コンペに参加したことのない人でもしっかりフォローしてもらえるようになっていました。(このベースライン生成コードはDiscussionでも共有されました)
わかったこと(W)
特徴量管理とか学習パイプラインはめっちゃ良かった!けど、初動が遅くなりがち。
- コマンド1発である程度のベースラインモデルができるスクリプトを作っておくと、短期決戦には良さそう。
色々な自作スクリプト(関数)持っている人は手数が多い
- 初動も早くなるし、その分いろいろ実験できるんだろうな〜と思いました
強い人は強い
- 強い
オンサイトコンペ面白い
- 終わった後すぐに懇親会で「この特徴量が〜〜〜」とかいう話ができるのが面白かったです
新調したスマホケースに新幹線の切符いれると、切符の磁気がやられて改札が通れなくなる
どんなことが重要だったのか
上位の方々の話を聞く限りでは
- ユーザーIDごとの集計
- ユーザーIDごとのtargetの平均を、targetから引いた値をtargetとして学習させる
あたりがポイントだったみたいです。
特に2つ目の発想なんかは、経験から導かれるものだと思うので、そういう意味でもKaggleなどでいろんなコンペに参加するのはとても大事だな、と思いました。
userごとにスコアの傾向が異なるので、学習する前にターゲットの平均をターゲット値から差し引くのがポイントだった。target encodingのような特徴量を入れてimplicitに考慮するより、最初に差し引いた方が良い結果になってた。
— hakubishin (@jy_msc) November 24, 2019
userごとのtarget平均と、めっちゃ効くと話題になったinteraction feature1つ追加したらスコア爆上がり・・・
— takuoko (@takuoko1) November 24, 2019
いろいろ実験したけど、未来の情報使ったfeature以外悪さしてるのがなくてここが勝負の分かれ目だったようです pic.twitter.com/xXinYj6AgX
次にやること(T)
初動を速くできるように、特徴量管理の方法を再考する。
自作関数(スクリプト)を作る
- 日付データとか、カテゴリデータとか、渡すとよしなに処理してくれるやつ
最後に
このようなオンサイトコンペは初参加でしたが、Kaggleなどのオンラインコンペとはまた違った面白さがありました。(Twitterでは知っている人と実際に会って話せる
が最近多くて嬉しいです)
また、@nyker_gotoさんが1人でコンペサイトを構築したようなのですが、これがめっちゃ良いしすごかったです!(語彙力)
いや、本当に。スコア計算は提出直後にされるし(某nateみたいにメールでお知らせするから待っててね、とかならない)、ベストスコア更新すると「Congratulation!!!🎉」演出があるし・・・。
いちユーザーとしてとても使いやすかったです。
主催してくださいましたatma株式会社の運営の皆様、ランチスポンサーをしていただいた株式会社i-plugの皆様、ありがとうございました!
次回もあれば是非参加させていただきます!