def 小児科医():

かけだし小児科医が仕事の合間にプログラミングを勉強するブログです。

第1回Kaggle反省会

 
前回

 

defpediatric.hatenablog.com

 

はじめに

 

そんなこんなでとりあえずものは試しで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!!)

 
線形回帰の一種
過学習を防ぐために正則化手法を使用している。
 
以下GPTの解説
具体的には、リッジ回帰の損失関数は次のようになります:
L = Σ(yi - (α + Σβj * xij))^2 + λΣβj^2
ここで、
  • Lは損失関数です。
  • yiはi番目の観測値(ターゲット)です。
  • αはバイアス項(切片)です。
  • βjはj番目の特徴量の係数です。
  • xijはi番目の観測値のj番目の特徴量です。
  • λは正則化パラメータで、モデルの複雑さに対するペナルティを調節します。λが大きければ大きいほど、モデルはより単純な形(つまり係数が小さい形)を好むようになります。 
 
学んだこと
  • EDAが大事
  • 特徴量は都合の良いようにいじった方がいい。
  • モデルの選択とか考える前にまずは特徴量の作成&不要な特徴量の削除
  • Less is More
  • 英語ができないと困る

 

感想

英語含め意味わからないことが多いが意外と初心者でも面白い。

他の勉強する時間やが消滅するので、中毒性が高くて危険。

またやりたい。やる。