自転車コンペ
2021/10/01~2021/10/27にsignateで開催されたSIGNATE Student Cup 2021秋【予測部門】で377人中26位になり銀メダルを獲得しました。
コンペの概要
予測する日以前のデータを使用し、予測当日での70ヶ所の駐輪場での利用可能な自転車数を予測する回帰問題。
時系列データで1時間ごとの値が与えられた。
予測する日は複数あり、それらは全てが連続しているわけではなく前後に訓練に回せるデータがある場合もある。
しかし、上記に書いた通り予測する日に対し翌日からのデータを使用するのは禁止。
リークに注意する必要があった。
利用可能な自転車数から気候など様々な特徴量が4つのテーブルから与えられた。
評価指標はRMSE(root mean squared error)
したこと
今回は単独での参加だったのでEDAからモデリングまで自分でやりました。
-
feature engineering
平日、祝日、休日や春夏秋冬の季節を作成しました。 -
train & validation
予測する日以前のデータの全てをtrainにまわしました。欠損したところはその直前の予測日以前のデータでtrainしたモデルでの予測値を代入し、pseudo labelingをしました。 1つ目のlgbmでoptunaを使いハイパーパラメータを最適化し、他にも流用しました。 120個のlgbmをtrainすることになりましたが、結局は月毎で12個つくった方が精度が出るみたいです。 validationを上記の訓練する状況に似せようと1日だけにしたのが悪手なのかも... seed値を変えた3つの120個のlgbmのセットをensambleに使いました。
他にやりたかったこと
- LSTMやTabnetなどのNNも試してみたかった。
- ラグ特徴量のような時系列データで効果的な特徴量も作りたかった。
- RFのハイパーパラメータを最適化し使おうとしたが何時間たっても終わる気配がせず断念。 最適化しなかった場合、lgbmとensambleするとlgbmのRandom Seed Averageよりも精度が低かった。
- station毎にモデルを訓練させたかった。
反省点
多くありますが、
- 最初にEDAがあまく、予測フラグが立っていない行の目的変数がNaNであることがありえることに気付かず、精度が出ませんでした。 EDAは大切!
- train用のデータの説明変数に目的変数を入れたままなのに気付かず、お手上げ状況になった。 GBDTへの理解が足らず、リークした際の状況を推測できなかったのが原因。
- カテゴリ変数のencodingを一切関数を使わずに行ったため、次からは使いたい。
とても参考になったもの
使ったコードはこちらです。
- 前の記事 : 宇宙人コンペ
- 次の記事 : SwinTransformerで物体検出
- 関連記事 :