2nd place solution概要 (public 3rd, private 2nd)
運営様、コンペ開催ありがとうございました。参加者の皆様もありがとうございました。時系列データの扱い方知りたいなーと思って始めたコンペだったので学ぶこと多かったです。
2nd solutionの概要をご紹介します。コードが古すぎてリファクタできず、概要だけのシェアになってしまうことご容赦ください……。
EDAして気づいた主なこと
- 78箇所で動きが結構バラバラにみえる、緯度経度でグループ化もできなそう(な気がする) -> データ数的に78モデルバラバラにしても予想できそう。足りなければ後でregionを統合するのもありだし
- 長期的トレンドがありそう-> prophetでのtrend計算して引き算した値を学習、最後に足し合わせてみよう(これも78モデル別々)。あと2017/1/1からの日数とか週数も特徴量にいれてみよう
- 休日は大きく影響する->前後日付や、休日が木曜の場合の金曜も特徴量に入れよう(後に->ルール的にアウトになり、ただの休日フラグに)
- 天気は雨とか影響しそうだけど、影響がよくわからない。。。->前処理も面倒だし放っておこう
ここで時系列の特徴量(quarterとかis_month_endとか)を30個ほど作ってlightGBMで学習するとpublic 19前半くらいのスコアでした
その後やったこと
- アンサンブル:validationを2019-11-24
,2019-11-17,2019-11-10,2019-11-3の4つにして学習した結果を単純平均(prophetデータのleakに気をつけなくてはと思ったがサボった)->public 18.5くらい
- regionごとのハイパラチューニング:region78 x 期間4=312モデルで多すぎるのでnum_leavesのみ。7,15,31,63,127,255に固定したモデルで流し、それぞれモデルに最適な値を機械的に選択なので意外と簡単->public 18.0くらい
- 特徴量追加を頑張る:朝昼晩というありきたりな特徴量が効いた。mini_forestさんの発見を借用( https://comp.probspace.com/competitions/taxi_demand/discussions/mini_forest-Post1a9434c0c2c1552abca3 )天気は結局visibilityが微妙に効いた・・・
- 悪あがき:評価指標から考えて過大評価する方がスコアが上がりやすい(需要増大を大外れすると傷が大きい)ので、最終値を1.02倍してround upした(1.02はpublicみて調整)
もっとできたかなということ
- regionごとの分析:特に絶対値が大きいregionを調べると良いことがあったかもしれない
- regionの統合:78モデルに分けるとデータ数が少なくなるので、似通ったregionを統合しそこをカバーすると何かみえたかもしれない
- アンサンブル対象追加:2018-12-1~などはデータが少なすぎかなと思って試さなかったけど試さない理由はなかった
- 特徴量作成:天気系は掘る部分まだありそう。datascienceさんの休日はカテゴリにするアイデアとか、yanaboさんの2~52週間前・同地点・同時刻の目的変数とか、勉強になりました!