Kaggle Competition: M5 Forecasting – AccuracyI tried it.
Kaggleコンペ:M5 Forecasting – Accuracy やってみました。
M5 Forecasting – Accuracyは2020年3月から6月に開催され約101ヵ国5558のチームが参加。
米国 (17%)、日本 (17%)、インド (10%)、中国 (10%)、ロシア (6%)、残りの 40% はその他の 96 か国からの参加があったらしいです。
Walmartの2011年〜2016年の売上個数データを使って販売数量を予測コンペで超多変量時系列予測になります。
既にコンペは終了していて最終評価で結果を提出できたチームは5582チームでした。
提供されるデータは米国3州(カリフォルニア州、テキサス州、ウィスコンシン州)にあるウォルマートの合計10店舗、商材は食材(FOODS)、おもちゃ(HOBBIES)、日用品(HOUSEHOLD)の3つのカテゴリで3049種類の商品の販売数量等のデータでデータの最終日以降の商材別の販売数量の4週間(28日間)を予測を行うという形です。
提供されるcsvファイルは
calendar.csv -各店舗・各商品における過去5年間の日別販売数量.
宗教行事やスポーツ等のイベント開催日とSNAP(連邦栄養補助プログラム)が利用できる日
※SNAP:最大の連邦栄養補助プログラムでElectronic Benefits Transferカードを介して、適格な低所得の個人や家族にメリットを提供します。
sell_prices.csv - 店舗ごと・商品ごとの日単位の販売価格
sales_train_validation.csv - 製品および店舗ごとの過去の日次販売単位データ
sales_train_evaluation.csv - 製品および店舗ごとの過去の日次販売単位データ
sample_submission.csv – 提出用のテンプレート
コンペは締め切りとなっているためsales_train_validation.csvは使わない事にしました。
答(sales_train_evaluation.csv)が既に開示されてしまっているためです。
コンペの評価は2段階でpublic(Validation Phase), private(Evaluation Phase)に分けたコンペ終了1ヶ月前にpublicの正解が公開されてさらに4週間(28日間)を予測するprivate(Evaluation Phase)という形式なので最終提出になるEvaluation Phaseをやってみました。
public(Validation Phase)
2011年1月29日から2016年4月24日までの約5年分の売上データから後の4週間(2016年4月25日から5月22日)の売上(販売数量)を予測します。
private(Evaluation Phase)
2020年6月1日からEvaluation Phaseとなり、2016年4月25日から5月22日の販売数量が公開され、後の4週間(2016年5月23日から6月19日)の販売数量を予測します。
まずはM5-Competitors-Guide(https://mofc.unic.ac.cy/m5-competition/)を軽く読んでデータ構成等の知識を入手。
モデルはxgboostを使いました。KaggleではLightGBM一択みたない風潮はありますし、トップ集団にいるメンバーの多くがLightGBMを使っているので間違いないとは思いますが一番使い慣れているxgboostであえて挑戦しました。
投入csvデータの合計サイズは12ギガバイトを超えました。ノートPCで3日間計算しました。
GPUを使えばかなり高速に計算できるのは知っていましたが家のPCでそれをやるをPCがハングしてしまい仕方なくCPUで計算させました。
本来は可視化したりしてデータの特徴を観察して方針を決めたりするのですがとりあえず特徴量は提供されたデータだけをつかって計算しました。
多くの挑戦者はスコアが5以上で、sample_submission.csv – 提出用のテンプレートをそのまま提出してもScore: 5.39065になります。約2000人くらいは何もしないで提出した疑惑があります。
つまり、
この山を越えないと「頑張ってない」とも言えます。
recursive featureを使いたくなかったのであくまで直感的ですが以下の特徴量だけ追加しました。
・過去28日の販売個数(month1=dplyr::lag(Unit_Sales, n = 28))
過去28日間の販売個数平均(month1_roll_mean=roll_meanr(month1,28))
過去28日間の販売個数標準偏差(month1_roll_sd=roll_sdr(month1,28))
・過去60日の販売個数(month2=dplyr::lag(Unit_Sales, n = 60))
過去60日間の販売個数平均(month2_roll_mean=roll_meanr(month2, 60))
過去60日間の販売個数標準偏差(month2_roll_sd=roll_sdr(month2, 60))
結果は以下のようになりました。
スコアが1.0以下に絞ると。
この辺でした。
もっと攻められるかと思いハイパラを弄りまくりましたこれが限界でした。
特徴量選択の重要性を改めて認識した。