第1回Kaggle反省会
前回
はじめに
そんなこんなでとりあえずものは試しでKaggleのコンペティションに参加してみようと思った。
なんとなーく簡単そうなやつをチョイス。
選んだのがForecasting Mini-Course Salesというやつ。
ディスカッションを見てパクれば大体いい感じのスコアにはなるみたいだが、別に休日に趣味でぽちぽちしている身としては順位は割とどうでもいいので、まずはディスカッションは見ずにやってみることにした。
タスク:各日付-国-店舗-品目の組み合わせに対応する品目の売上を予測するモデルを作成すること。
評価方法:SMAPE(対象平均絶対パーセント誤差)
やってみたこと
-
説明変数が質的データだったので、one-hot encordingを行った。
-
季節の要素があるかもしれないと思ったので、日付データは月を説明変数とした。
-
モデルはXGBoostを使ってクロスバリデーションでパラメータを設定した。
-
one-hot encordingよりLabel encordingの方が有用っぽかったので変更した
-
Ridgeモデルとアンサンブルしてみた(適当に重み付けした)
-
アンサンブルにDNNを混ぜてみた
-
アンサンブルにはスタッキングを使用した。
-
Random Forestも混ぜてみた。
-
アンサンブルはバリデーションのSMAPEの逆数に基づいて加重平均をとってみた。
結果…
Public score: 47
Private score: 49
668th/1172(57%)
案の定惨敗である。が、正直1000位くらいだと思ってたので意外と真ん中より下くらいなんだぁと思った。
ここまでは割とどうでもよくで、反省会として1位の人がどういう感じでやったのかを見てみた。
…英語がよくわからなくて詰んだ。
ざっくりこんな感じか?(信憑性なし)
1位の解法:Less is more
前処理
-
各国の祝日を特徴量として使用
-
祝日なのに売り上げが上昇しない場合は採用しない
-
新年とクリスマスは外れ値となる可能性があるため除外し、別にモデル化する
-
(さらにエストニアは12/26、カナダは12/26-27も祝日のため、この外れ値に該当すると判断)
-
日本はクリスマスでも働くやばい国なので、クリスマスも通常日としてカウントする。
-
日付データはそれぞれ、年、月、週、日に分解
-
各国のGDPを考慮
-
祝日はガウス分布に従うとしてなんか色々(よくわからん。
-
クロスバリデーションで特徴量選択(2020年はバリデーションには使用せず)
-
→正弦波で周期性を示すと、それのみでモデル化できた。
モデル
Ridge回帰(Less Is More!!)
学んだこと
- EDAが大事
- 特徴量は都合の良いようにいじった方がいい。
- モデルの選択とか考える前にまずは特徴量の作成&不要な特徴量の削除
- Less is More
- 英語ができないと困る
感想
英語含め意味わからないことが多いが意外と初心者でも面白い。
他の勉強する時間やが消滅するので、中毒性が高くて危険。
またやりたい。やる。