見出し画像

社内でチーム組んでKaggleに参加してみた ~M5 Forecasting — Accuracy 参戦記~

※本稿はテックブログからの転載で、「Kaggleグローバルコンペに参加した」の記事(1/3)です。

JDSCから M5 Forecasting — Accuracy というコンペに3チームが出場して、見事全チームがメダル取りました。(銀2, 銅1)
希望者のみ業務外でのチーム参加だったのですが、Upgrade JDSC Day(2週間に1回取得でき、丸1日自己研鑽に使っていい日)を取得してKaggleをすることができ、メダルには報奨金制度アリという、学び続けたい人とってはたいへん幸せな環境でした。
今回は銅メダルを獲得したJSチームの参戦記をお届けします。


メンバー

・矢内 (DS)
この記事の執筆者。ラスベガスでポーカーで生計立ててた時期もある変人。
・永山さん (DS)
元F1エンジニア。フランスで長年働いていたこともある異色の経歴の持ち主で、本人曰く「社会人になってから努力の仕方を忘れた」らしい。自称時々面白い。ボケか本気か自爆か怪しい。
・松井さん (EN)
弊社ではシニアエンジニアクラスの実力を持っているが実はインターン生。「………うーむ まずいのォ あのインターンワシより強くねー?」というのは弊社では稀によく聞かれるセリフ。
・??? (FR)
元コンサルのフロントで起業経験もある方。謎に包まれた人物。


コンペに参戦する目的・目標

・目的
EN、FRチームのお二人にもkaggleを通じてデータサイエンスの世界を知ってもらいたいという動機でチーム結成をしました。DSの2人でkaggleの使い方や、EDAからモデル作成・予測までの流れ、GCPの使い方をレクチャーしていきました。
・目標
業務や学業もなかなかに忙しいので「もしメダルが取れたらいいね」くらいのテンションで参戦しました。実際にやってみて、想像以上に業務とkaggleの両立が大変で、kaggle master以上の方は本当にすごいなと感じました。(筆者は今回のコンペでkaggle expertへ昇格)


計画

・5月までkaggleの基本的な流れを理解したり、各々好きな技術試したりして遊んでいて、6月から本気出す。ARIMA試したり、LSTM試したりしてました。

▼きちんとスケジューリングしてくれる永山さん。別チームのスケジューリングもお楽しみに。

画像1

・6月から
ARIMAやLSTMの酷いスコア(我々のスキルの問題)に絶望したチームメンバーは結局kaggleの王道中の王道であるLGBMに手を出すことに。
・モデル作成の方針
not DSのお二人にレクチャーする側面もあったので、0ベースではなく、シンプルなLGBMのpublic kernelを参考にして行いました。もっとスコアの高いkernelはありましたが、自分達で考える余地を多く残したいという心持ちからこちらをbase lineとしてモデル改善に取り組みました。
謎の係数が乗算されていたので、それを削除して、public LB score 0.5408からのスタートでした。

特徴量

・上記notebookのevent以外の特徴量全部

・event_typeを one hot encodingしたもの(National, Sports, Religiousなどのイベントが複数同時開催されていた時に、event_type1, 2で分けるよりも情報がフェアに取得できるのと、public LBスコアが微増していたため)

・テキサスの洪水フラグ(テキサス以外はほぼ洪水なかったので)

・在庫フラグ「evaluation期間を全部1にする」 or 「evaluation期間直前の在庫フラグをそのまま28日間利用する」

validaiton方法があまりよくなかったため、本来効いていた特徴量(予測対象日から7日おきに遡って6週間の平均など)が入れられなかったのは反省点です。

Solution

今回チームで相談しながら方向性を決めたのは下記の点です。

validation方法(d_250から最後まで使用)

・hold out → 0.63257

・time series split → 0.66378

・random sampling → 0.5408 (seed変えてもそこまで変化しなかった)

時系列データをrandom samplingするのは今回みたいに連続性のあるデータ(商品の販売中止、新商品などがあるなど)の際には避けるべき手法なのですが、public LBのスコアのあまりの良さに目が眩んで最終的にvalidationにはrandom samplingを選んでしまいました。

public/private LBの差分

・5月と6月に差があることが過去データから推測できる

・洪水、謎係数(1.02などの係数をoutput fileに乗算すると謎にpublic LB scoreが上がるなど)

今回はpublic/private LBに差分がそれなりにあるであろうことは過去のデータを見たりしてわかっていたので、謎係数をどう取り扱うかは1つの勝負所だと思っていました。

売り切れ・未販売がある商品の処理、train_valに使用する期間

売り切れは在庫フラグで吸収し、train_valに使用する期間はday250からで、商品ごとに最初の売上が立つまでのデータは全て削除しました。

単一 or 複数モデル

・店ごとモデル

・州ごとモデル

・etc…

今回はシンプルな単一モデルを採用しました。複数モデル試す時間と気力がなかったとも言う(小声)

予測方法

・n日後予測モデル

・予測結果を使用するモデル

こちらは予測結果を再使用する方式でモデルを使用し、28回予測を回していく方針にしました。これは予測精度が高ければ高いほど有効な手法なので自分たちの作ったモデルを信じてこの手法にしました。

アンサンブル

・在庫フラグを最終日のまま使用したものの poisson, tweedie 分布のmax アンサンブル → 0.5057 (private 0.71855)

・在庫フラグを全てありとしたものの poisson, tweedie 分布の average アンサンブル → 0.50823 (private 0.66422)

上記のアンサンブルをさらにaverageアンサンブルしてチームで出し合った知恵の集合体を作ったところ Public LBスコア 0.50407 だったので、これをfinal submissionにしました。

結果として蓋を開けてみると、Private LBスコアは0.50407→ 0.68961 (515/5558team)と大幅に悪化してしまいました。(原因はvalidation)

感想

・業務との両立がとても大変

・前日に悪あがきするのは古今東西かわりなく・・

▼繁忙期とkaggle締め切りが重なったこともあり結構ギリギリまでやってました

画像2

▼松井さんも学業忙しい中外部データ引っ張ってくださったり活躍されてました!

・一生懸命考えた特徴量を追加してもスコアが下がるということを繰り返しているうちに心が折れそうになったこと(下画像参照)もありましたが、だいたいチームメンバーのどなたかが頑張っていたので、それにつられてモチベーションを保つことができたと思います。

▼これをn万回繰り返しました

画像3

・public kernelやpublic LBに踊らされずに自分を信じきれるようにもっと精進が必要だと感じました
・目標としていたメダルも銅ではありますが獲得できたので参加してよかったです。打ち上げでお寿司食べに行きます。


次回はsilver medalを獲得したJNチームの記事です!お楽しみに!


この記事が気に入ったらサポートをしてみませんか?