case-kの備忘録

備忘録です。

Kaggle備忘録 地震コンペ

Kaggleの地震コンペに参戦しました。結果は銅メダル圏内のPublic順位346位からPrivate順位885位落ち、メダルは取れませんでした。orz.....
(Publicで銅メダル圏に入った時はテンション上がりました。はい。)
ソリューションでもなんでもないんですが、備忘録と戒めの意味でこのコンペで自分なりに試したことを残しておきたいと思います。

地震コンペと評価指標

www.kaggle.com
コンペの目的としては地震発生までの残り時間を推定するものです。地震といっても装置で人工的に発生される地震です。
評価指標はMAE(mean absolute error)という絶対値の平均誤差でした。地震発生までの残り時間を誤差小さく推定できれば勝ちです。
Mean absolute error - Wikipedia

与えられたデータ

学習データとしては2カラムのデータが与えられました。地震のシグナル情報(acoustic_data)と地震発生残り時間(time_to_failure)が時系列で並んでいます。
f:id:casekblog:20190605195034p:plain:w300

テストデータにはシグナル情報ではなくセグメントとして提供されています。
(1セグメント = 150,000シグナル情報)
f:id:casekblog:20190605210124p:plain
テストデータのセグメントはシャッフルされており、セグメントを跨いだ場合は時系列にはなっておらず、
時系列問題でよく使われるLSTMなどは適用できない課題になってました。
(最初はなんで時系列なのに公開カーネルは交差検証でシャッフルしてるのか疑問でした)

EDA 仮説当たってテンション上がりつぶやく

まずは時系列問題で代表的な特徴量をいくつか作りました。
移動平均やトレンドなど時系列データでよく作られる特徴量は公開カーネルですでに作られており、
自分では特徴量を組み合わせて作ってはみたのですが、LightGBMで説明変数の重要度を確認しても、
良い特徴量は作れませんでした。
闇雲に作っても良い特徴量は作れないのでモデルの予測値でMAEが大きい箇所の特徴を調べました。
可視化したところ、地震発生後の誤差が大きいことがわかりました。
地震発生後、time_to_failureはリセットされるためMAEが大きくなっていると解釈しました。
(私のモデルでは地震発生後のtime_to_failureを9秒と予測してました。)
f:id:casekblog:20190605201502p:plain
地震前後を識別できるよう特徴量として2値ラベル与え、分類モデルを作りました。
地震発生後のセグメントは訓練データで128レコードしかなかったので、
同じラベル(地震発生前後)の特徴量の平均を取り、学習データを増やしたのち分類モデルでセグメントの地震前後を推定。
f:id:casekblog:20190605212036p:plain:w400

地震発生後を補正(地震発生後の中央値)したところスコアが改善しました。
f:id:casekblog:20190605214242p:plain:w500

夜中にテンション上がって呟いてしまいました(笑)

また、この特徴量はtime_to_failureを予測する回帰モデルでも重要だと思い、
テストデータに対しても推定ラベルを特徴量として与えました。
(分類モデルの性能はよかったので特徴量として使っても問題ないと思いました)


試したところLightGBMで最も重要な特徴量(label)と判定されました。
(EDAから妥当な特徴量を作れたので個人的にはかなりテンション上がりました。この時は本当に楽しかった。)
f:id:casekblog:20190605202632p:plain:w700

手元で信頼できるCVを作れない問題 orz

ここまでテンション上がってたんですが、汎化性の高い信頼できるCVを手元で作ることができませんでした。
データを増やし、ローカルではMAEが改善しましたが増やしたデータによって変わります。
地震発生前と地震発生後でデータが不均衡にならないようにしましたが、
地震発生前のtime_to_failureの大きさは1より大きく(16 ~ 0.3)、地震発生後のtime_to_failureは0.3より小さいので当然MAEは小さくなります。
このコンペはShakeが起こる(PLBの順位を信頼できない)可能性が非常に高いコンペだったので、
ローカルで信頼できる評価基準を作ることが大切だったですが、結局信頼できるCVを手元で作れなかったのです。
(とっても共感できたTweet)

結果発表〜〜

結果としてPublicでは銅メダル圏内でしたが、Privateで落選しました。
よく、Publicではなく信頼できるCVを作ると良いと言われますがそれがなかなか難しと感じるコンペでした。884位も落ちました(地震発生〜〜)

f:id:casekblog:20190605203437p:plain

上位ソリューションを読んで勉強したいと思います。
以上で備忘録終わりです。今回信頼できるCVは作れなかったものの、
時系列データや EDAから重要な特徴量を作り出せたことはよかったと思ってます。
次に活かすぞ〜!!