タクシー需要予測

未来のタクシー需要を先読みしよう!

賞金: 100,000 参加ユーザー数: 268 4ヶ月前に終了

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個の作成、予測値の平均

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。