Kaggleの地震コンペに参戦してみました。結果は銅メダル圏内のPublic順位346位からPrivate順位885位落ち(メダルは取れませんでした。orz.....)、ソリューションでもなんでもないんですが、備忘録と戒めの意味でこのコンペで自分なりに試したことを残しておきたいと思います。
地震コンペと評価指標
www.kaggle.com
コンペの目的としては地震発生までの残り時間を推定するものです。地震といっても装置で人工的に発生させる地震です。
評価指標はMAE(mean absolute error)という絶対値の平均誤差でした。地震発生までの残り時間を誤差小さく推定できれば勝ちです。
Mean absolute error - Wikipedia
与えられたデータ
学習データとしては2カラムのデータが与えられました。地震のシグナル情報(acoustic_data)と地震発生残り時間(time_to_failure)が時系列で並んでいます。
テストデータにはシグナル情報ではなくセグメントとして提供されています。
(1セグメント = 150,000シグナル情報)
テストデータのセグメントはシャッフルされており、セグメントを跨いだ場合は時系列にはなっておらず、
時系列問題でよく使われるLSTMなどは適用できない課題になってました。
(最初はなんで時系列なのに公開カーネルは交差検証でシャッフルしてるのか疑問でした)
EDA 仮説当たってテンション上がりつぶやく
まずは時系列問題で代表的な特徴量をいくつか作りました。
移動平均やトレンドなど時系列データでよく作られる特徴量は公開カーネルですでに作られており、
自分では特徴量を組み合わせて作ってはみたのですが、LightGBMで説明変数の重要度を確認しても、
良い特徴量は作れませんでした。
闇雲に作っても良い特徴量は作れないのでモデルの予測値でMAEが大きい箇所の特徴を調べました。
可視化したところ、地震発生後の誤差が大きいことがわかりました。
地震発生後、time_to_failureはリセットされるためMAEが大きくなっていると解釈しました。
(私のモデルでは地震発生後のtime_to_failureを9秒と予測してました。)
地震前後を識別できるよう特徴量として2値ラベル与え、分類モデルを作りました。
地震発生後のセグメントは訓練データで128レコードしかなかったので、
同じラベル(地震発生前後)の特徴量の平均を取り、学習データを増やしたのち分類モデルでセグメントの地震前後を推定。
地震発生後を補正(地震発生後の中央値)したところスコアが改善しました。
また、この特徴量はtime_to_failureを予測する回帰モデルでも重要だと思い、
テストデータに対しても推定ラベルを特徴量として与えました。
(分類モデルの性能はよかったので特徴量として使っても問題ないと思いました)
試したところLightGBMで最も重要な特徴量(label)と判定されました。
(EDAから妥当な特徴量を作れたので個人的にはかなりテンション上がりました。この時は本当に楽しかった。)
手元で信頼できるCVを作れない問題 orz
ここまでテンション上がってたんですが、汎化性の高い信頼できるCVを手元で作ることができませんでした。
データを増やし、ローカルではMAEが改善しましたが増やしたデータによって変わります。
地震発生前と地震発生後でデータが不均衡にならないようにしましたが、
地震発生前のtime_to_failureの大きさは1より大きく(16 ~ 0.3)、地震発生後のtime_to_failureは0.3より小さいので当然MAEは小さくなります。
このコンペはShakeが起こる(PLBの順位を信頼できない)可能性が非常に高いコンペだったので、
ローカルで信頼できる評価基準を作ることが大切だったですが、結局信頼できるCVを手元で作れなかったのです。
(とっても共感できたTweet)
"Trust your cv", Trustできるcvが得られないので難しい(それはそう)
— u++ (@upura0) 2019年5月30日