M5 Forecasting - Accuracy

 序盤のみですが、頑張ったので作った特徴を記念に書きたいと思います。

コンペの概要

主催Walmart

目的:POSデータを用いて各商品ごとの売上個数を予測する (外部データもOK)

特徴:POSデータがマスキングされている。
食品/おもちゃなど、カテゴリーレベルの粗い情報は与えられているが個々の商品情報はマスキング済み。そのため食品に属する商品と言っても加工食品なのか調味料なのかといった細か目な商品情報はわからない。

作った特徴

■価格弾力性

各商品の価格帯ごとに売上個数の標準偏差を価格弾力性の指標として使った。
多分コモディティ商品かどうかの属性情報にもなっていたと思う。

■競合商品との価格差

基本的には競合商品よりも安くなればなるほど、買われやすくなるはずなので、競合商品との価格差は重要な特徴になるはずと考えた。
例)ファブリーズ買おうと思ったけど、半額セールされてたリセッシュ買った 

※煙草のように嗜好性が強いカテゴリーに対しては効かなくて、多分コモディティ化しているカテゴリーでしか有効じゃないと思う。マルボロ吸ってる人は他の煙草ブランドが値下げされようがブランドスイッチしないのがその例。

ただ、各商品はマスキングされていて、競合商品も特定できない。
そのため、”欠品期間”を使って競合商品を特定した。
商品Aが欠品している期間に売上が跳ね上がった商品Bが競合商品であるはず。というロジック。このやり方で各商品ごとに競合商品を特定してdailyで価格差を算出。

■値下げによって心理的節目を割ったか

同じ10円の値下げでも1100→1090円の値下げと108円→98円の値下げでは消費者への心理的な影響が異なるため、値下げによって心理的節目を割った場合は1、そうでない場合0のフラグ付け。

■売り場の面積・質

売り場面積が小さかったり、棚の下段とか、売り場が悪いとそもそも存在にすら気づいてもらえない。反対に売り場面積が大きかったり、いわゆるゴールデンゾーンに置かれてると、それだけで買われやすくなるなど、売り場の良し悪しは各商品の売上に影響を与えるはず。

店側からすると売上に貢献してくれる商品を良い売り場に割り当てるはずで、
単純に売上金額の大きい商品ほど売り場が良くなると仮定。
売上金額は売上個数 × 価格で算出し、各商品ごとの疑似的な売り場の面積・質の良し悪しの特徴とした。
季節性回避のため、使用期間は前年。

 ■その他① train/testで商品の価格帯を揃える

trainでは特売セールされていたが、testではされてなかった。というようにtrain/testで価格帯が異なるのは汎化性能の意味で良くない。
そのため、test期間における各商品ごとのmin-maxの価格帯外のtrainデータを削った。(データを削りすぎたせいか、predict出来なかったので一部のデータは削る条件変えた記憶がある)

■その他② targetを0-1に正規化しxentropy loss最適化

予測値がマイナスになったりしたので、avitoのwinners solutionにもなっていたのを試した。ただ全体のスコアは改善しなかった。
https://www.kaggle.com/c/avito-demand-prediction/discussion/59885