人生,27位がとれるならM5は僕を救った.
27位なんてとれない 形式が違うんだから...
原曲 ヨルシカ/8月,某,月明かり
#はじめに
2020年3月から6月にかけて開催されていたコンペKaggle M5 Forecasting Accuracyに参加しました.
27位(上位0.4%)相当のモデルを提出したのですが,
形式を間違え 最下位になってしまったので解法を悼みます.
僕に知り合いの人は今度会ったら慰め代としておごってください.
さて僕らが地獄に落ちるまでの物語をお楽しみ下さい.
#コンペ概要
Kaggle M5 Forecasting:ウォルマート(スーパーマーケット)の売上予測コンペ
過去1913日間の売上データから未来の28日間における商品(3049種)ごとの売上(販売数量)予測.
対象店舗はカリフォルニア州、テキサス州、ウィスコンシン州にある10店舗.
与えられたデータは
-過去の売上(IDごと,ストアごと,品目ごとなど)
-価格の推移,
-カレンダー(祝日など)
評価指標は基本的にはRMSE(ちょっとテクニカルなWRMSSEというものでしたが今回は省略)
#モデル
LGBMをStoreごと予測日ごとに作成(下図)
※基本的に時系列予測は非常に難易度が高いタスクである為,私のリソースはほとんどモデル作成について費やしました.チームメイトが特徴量作成やベースモデル構築などをやってくれて本当にありがたかったです.
###方針
時系列データの予測は,機械学習に向いていない(参考)という話もあったので最初は統計モデルやLSTMを試しました.何故かうまく行かず.そこでできるだけデータを支配するダイナミクスが揃うように地域ごと,予測日ごとにLGBMを作成しました.
-LGBMにした理由
統計モデルやLSTMなど時系列予測のために作られたモデルは基本的に大きなダイナミクスを学習しているように思います.でも今回予測したいのは商品ごと,つまり小さなダイナミクスなのです.例えば,日本人全体の動きは予測できても個人個人の予測は難しい気がします(日本人はラーメンが好きな気がするのですが,読者のあなたがラーメンが好きか分かりません.あ,僕は担々麺が好きです).そこで表現力の高いLGBMにお願いしてみることにしました.
###店舗ごとにモデルを作成した理由
EDA notebookを参考にしてストアごとの売上推移を可視化すると,結構動きがstoreごとに異なることに気が付きました.
またUMAPを使ってクラスタリングしてみたところFOODSはだいたい同じように分布をしているのに対してHOBBBIESは地域差が顕著でした.
これらの結果から店舗ごとに売れるもの売れないものがあり,それを支配するダイナミクスは異なると考えモデルを分けることにしました.店舗のあるカリフォルニア州、テキサス州、ウィスコンシン州はそれぞれ地理的に離れており,売れ方が異なるのは妥当だと考えました.
###日毎に予想した理由
Discussionで行われているように再帰的なモデルがいいのか日毎に予測したほうがいいのかは今回の重要なポイントでした.私達は,単純に大きく外さない安全な道を選択しました.実際に再起的モデルにするとpermutation importanceをみるとlag1がマイナスに振り切っていました
#特徴的エンジニアリング
基本的な特徴量(移動平均,ある期間のmax/minなど)
・商品の値段が上昇、減少をしてからの経過日数
・売り上げを初めて記録した日
これ以前のデータは学習に入れませんでした.
・Ordered TS
時系列データ用のリークしないTarget encodingのようなものです
・特定の期間での売り上げの最大値と、最小値を記録してからの経過日数
これは時間の概念を学習モデルに教えてあげたくて作りました.
・過去の売上における0から10の割合
その時点での売上の確率分布を表現するために作成しました.また,売上が0の場合は在庫切れ?なのか突然現れていたので0に関わる統計量を入れる必要があると考え導入しました.
###特徴量作成時に考えていたこと
統計的に意味のある特徴量を入れようとしました
加えて
・チームメイト:購買意欲に関わるものが分かれば売上がわかるはず
・書いてる人:LGBMが知らない情報を教えてあげようと考え時間に関わるもの
を考えて入れていました.
実際に,デノイズ処理なや波形の複雑度,フーリエ空間での特徴量など様々試しましたがなかなか有効なものは多くは存在しませんでした.
#CV方針
直近の3ヶ月のデータを用いました。一部特異的にCVが改善したものは採用せずひたすらにロバストに作って行くことを気をつけました.Darker magicやPublic leaderboardを当てにしなかったのは過適合を疑っていた為です.
#サブミット前のslack
Iwamo 8:49 PM 頭働いてなさすぎて笑う
チームメイト 9:10 PM 一応確認頼んだ
Iwamo 9:10 PM 大丈夫そうだけどな
#そして死
前述の通り,提出形式の一部を間違え提出していない人と同じ順位,つまり 最下位でした...
#あったかもしれない世界線
未練がましく本来のモデルでのスコアを載せます.
#最後に
チームメイトには申し訳ない気持ちでいっぱいです.最後に確認されてたのに...
実はkaggleを初めて半年程度なのですが,本当に多くのことを学べているように思います.
本当に悔しいですが,これからもがんばります.