atmaブログ

atma株式会社の公式ブログです。

atmaCup#2 インターン生参加記録 #atmaCup

はじめに

はじめまして、atmaでインターンをしている植田 (@tellmoogry)と申します
今回のatmaCup#2では一般参加者として参加させていただきました
本記事は1参加者目線からみたコンペの参加記事となります

コンペ概要

今回のタスクは"睡眠データをもとにその人の睡眠の質を予測する"というものでした。
データはユーザーごとにtrain, testで連続した時系列データが与えられました。
目的変数はユーザーが入力した[1,2,3]の3段階で与えられ、値が小さいほどその人の睡眠の質が低いことを表します。
評価指標はRMSEでした。*1

public, private*2の中身については事前に以下のような説明がありました。

private/public は時系列によって分割されています。具体的には特定のユーザーに対してもっとも新しいデータを private / 次に新しいデータを public としています。 private / public の割合は 1:1 です。

要するに特定のユーザーaについてtrainには10/1~10/15のデータ、testには10/16~10/19までのデータがあったときに
10/16, 10/17がpublic、10/18, 10/19がprivateといった感じです。

f:id:atma_inc:20191125130730p:plain

その他に与えられたカラムとしては
・ユーザー情報:性別や年齢、会社など、睡眠に関するアンケート内容
・睡眠情報:いつ寝ていつ起きたか、アプリの中で計算された睡眠の質など
また上記のアンケート結果はユーザーに紐づけられた別テーブルの欠損が多いデータでした。

タスクが睡眠という全員に馴染みのあるものなので、自分が普段寝るときのお気持ちを上手く特徴量に表すことや、与えられた特徴量がアプリの内部で算出された独特なものも多かったので、アプリに対する理解(=カラムへの理解)を深めるということが求められました
10:30~18:00までの7時間という短い時間の中でデータへの理解を深めるか、特徴量を沢山作るかの時間配分もひとつ勝負のポイントだったのではないかと思います。

コンペ中に取り組んだこと

特徴量
・睡眠の質に関わる特徴量(睡眠時間など)について前日との差分
・アンケート結果のうち数値系の特徴追加
・カテゴリや、連続データをカテゴリ化したものに対してgroupbyして統計量
・月日をsin, cosに変換
・金土日祝日フラグ
・count encoding
・データのクリーニング
・userごとのtarget encoding
・理想睡眠時間と実際との差分

バリデーション
user_idでstratified

モデル
・メインのLGBM
・stacking用の random forest

結果

昼の15時ごろの時点で2~3位あたりをうろちょろしていて、当時順位の近かった@e-toppoさんとマージをして2人のモデルを混ぜたら1位に浮上しました。(当時2人のモデルの相関が0.8程度だったらしく、goodマージでした)
そこから主にe-toppoさんの力でコンペ終盤までスコアを伸ばしながら1~2位を維持することができ、終了時は1位で終えることができました。

が、結果は最後shakedownしてPublic 1st / Private 4thでした。
賞金でポケモン買いたかったです...

f:id:atma_inc:20191126125948p:plainf:id:atma_inc:20191126130019p:plain

結果を聞くと上位の方が作成していた、ユーザーのtarget平均からの差分を予測する問題に変えることが重要だったみたいです
(結局targetはユーザーが入力した値であってある意味当てにならない。ユーザーの中で相対的な睡眠の良し悪しを予測する方が良い。という理解をしています。)
アプリを使う人の気持ちからの仮説検証面で取り組みが弱かったのが最後の敗因に感じました。

参加して良かった点

・強者と直接話せる
今回も前回に引き続き、GrandMasterの方々をはじめとしたkaggleで結果を残している本当に強い人たちが数多く参加していました。
そういった人たちとオフラインで机を並べて戦える上に、終了後はどの特徴が効いたか効かなかったか、その特徴量を作るに至った理由のような、solutionには書かれないような試行錯誤の過程をコンペが終わったその場で議論できて1日とは思えないほど濃い時間を過ごせて学びが多かったです。

やさしい解説
これまでのatmaCup同様今回も毎回初学者に向けて@nyker_gotoによる特徴量作成からLGBMの学習まで一連の流れについて、ハンズオン形式での解説がありました。Kaggle Masterにある程度気軽に質問できる場があるのは初学者のスタートダッシュにとても良いと思います!僕はインターン生になる前からこれまでのatmaCupに全て参加していて、最初は初学者として参加していましたが参加するたびに成長を感じるので、ぜひ初学者の人にもおすすめしたいと思います!

他にもatmaCupで知り合った人と一緒にkaggleに参加したり、勉強会に参加したりと色んなキッカケになる場かなと思いますので次回以降もぜひ皆さんに参加していただきたいと思います! それでは次回atmaCup#3でお会いしましょう!! f:id:atma_inc:20191126175115j:plain

*1:予測値と真値の二乗誤差を平均してから平方根を取ったもの

*2:コンペ期間中に分かる仮スコアと、コンペが終了してから初めて分かる順位計算に用いられるスコア