4th Place Solution
運営者様、楽しいコンペをありがとうございました。
今回のタクシー需要予測コンペ4位(Public 5位)の解法を紹介させていただきます。
全体概要
今回はいただいたデータを全て使用してLightGBMモデルを構築しました。
工夫した点は下記2点です。それぞれRMSEを約2改善する程度の効果がありました。
- lag特徴量として、2~52週間前・同地点・同時刻の目的変数を特徴量に追加しました。
- 1週間前のlag特徴量を入れなかった理由は、今回の予測対象の1週間前に当たる2019-11-24~30はthanksgivingdayの影響を受けて目的変数の挙動が特殊になる関係で、特徴量 "1week_ago" がRMSEを悪化させる原因となることを回避するためです。
- 使用するデータの2017-11-20~26と2017-11-27~12-03、および2018-11-19~25と2018-11-26~12-02を入れ替えました。
- 前提として、LGBMのFeatureImportanceで上位に "52weeks_ago" がある中、thanksgivingdayが52週間周期ではない(2017-11-23, 2018-11-22, 2019-11-28)ことがEDAの結果から推測されたためです。
詳細
データの前処理
主に天気情報について前処理を行いました。
- 温度を摂氏に、風速をm/sに変換(後に体感温度を計算するため)
- 数字の後ろに文字(sやV)がついていた場合、それを別カラムに分解
- HourlySkyConditionsを分解し、分解された値を0~4にbinning
- 天気の時系列データを30分刻みに丸め、値を集約
- etc.
特徴量の作成
全て挙げるとキリがないため、効果があった代表的なものを記載します。合計で300超の特徴量を作成しました。
- 最寄り道路名
- 最寄り道路までの距離
- area・月・年始から数えた週(週no)・日・月&日・時刻・曜日・最寄り道路名・週no&曜日をTargetEncoding
- 2017年の目的変数を使ったため、正確にはTargetEncodingではありませんが。。
- 各祝日のフラグ(計10個の特徴量)
- 各祝日の3日前~3日後フラグ(計10×6個の特徴量)
- lag系特徴量
- 2~52週間前の同地点・同時刻の目的変数の値
- 2, 3, ..., N週間前の同地点・同時刻の目的変数の平均(N=3~52)
- 体感温度
- 30分後に雨が降るかどうかフラグ
- etc.
データの変更
全体概要で記載の通りです。モデルの学習期間は1年間だったため、結果的に2017年のデータの入れ替えは不要でした。
- 2017-11-20~26 ←→ 2017-11-27~12-03
- 2018-11-19~25 ←→ 2018-11-26~12-02
モデル構築
- LGBM
- 3つのmodelの予測値を平均
- モデル1
- 学習期間:2018-11-10~2019-11-09
- 検証期間:2019-11-17~23
- モデル2
- 学習期間:2018-11-03~2019-11-02
- 検証期間:2019-11-10~16
- モデル3
- 学習期間:2018-10-27~2019-10-26
- 検証期間:2019-11-03~09
- Optunaでチューニング
感想
モデル構築したい気持ちを抑え、EDAに期間の半分以上をかけた甲斐があったと感じています。また、時系列データのCV構築にも苦労したため、実装できなかったことが複数ありました。
以下は、備忘として実装したが効かなかったことを添えて残しておきます。
試したかったこと
- RandomForest、XGBoost、RNNとのアンサンブル
試したけど効かなかったこと
- 線形回帰モデルとのアンサンブル
- SARIMAモデルの使用(336期周期を指定すると処理落ちしてしまうため)
- 学習期間1年間、検証期間1週間のモデル78個の作成、予測値の平均