見出し画像

kaggleの地震コンペで3位になりました


kaggleで1月11日から6月4日にかけて行われていた「地震コンペ」に参加し、3位という成果を残すことができました。

この記事では、コンペの概要、参加の流れ、ソリューションについてまとめたいと思います。

この記事をもとに生放送で説明をしますした。良ければ視聴ください。


コンペの概要

実験室で、地震を起こした際の波形データが与えれ、何秒後に地震が発生するかを予想するコンペになっています。

具体的なデータはこのようなデータ。

1列目が振幅の大きさ、2列目が地震まで何秒かということを表しています。

トレーニングデータは、629,145,480行 x 2列、
テストデータは、150,000行のデータが2624個あり、そのそれぞれが地震発生まで何秒のデータかということを予測し提出します。


トレーニングデータ全部をplotすると次の図

テストデータの4つをplotしてみると次の図になります。

トレーニングデータの下段をみるとわかるように、0秒に16回到達しており、地震が16回発生していることがわかります。
また、はじめと終わりにも、地震データがあるため、全部で18回の地震のデータであるということがわかります。

テストデータの図からは、たまに大きくなっている箇所があるということと、このデータからなん秒後に地震が発生するかを予測するのは難しいのではないかという印象を受けます。

リーダーボード(順位表)の流れなど

このコンペは開催期間が約5ヶ月ととても長期間にわたるコンペでした。(Kaggleのコンペは2ヶ月から3ヶ月くらいの開催期間のものが多いので、kaggleのコンペの中でも、とても長い部類です)

私は、技術書典6でKaggleのチュートリアルを頒布してからの参加だったので、4月下旬からの参加と、約40日ぐらいの参加期間でした。


5月1日ごろには、チームメイトのhmdhmdさんと、牡蠣を食べにいって、お互い地震コンペで良い順位になったら、チームマージしようと誓い合う。

結果的に考えると、ここでhmdhmdさんに地震コンペに参加してもらえたのが1番のファインプレー。後でチームマージして情報交換する際に、全く参考になる情報がないのも嫌なので、実験管理もちゃんとするようになりました。

5月下旬はまだリーダーボードを追いかけていた時期。ひたすら特徴を作って、スコアが上がることを楽しんでいました。

自分のマシンだけだと特徴が作りきれなくて、GCP(googleのクラウド)にも手を出したりした。


5月26日ついにhmdhmdさんとチームマージ。この日までは一人でもくもくとやっていたので、チームマージして議論することができることにより、ものすごい進捗が生まれる。コンペ後にhmdhmdさんが言っている文殊の知恵というのはまさにそう。


5月28日頃、ディスカッションでtestデータについて議論されていることが重要なことに気づき、testデータにfittingしていかないといけないことに気づく


また、このディスカッションは、オールゼロから、オール12のサブミットなどを行い、testの最大値が9以上10未満、平均値が4.017ということなどを解き明かしているディスカッション。
平均4.017というのは、ランダムにサンプリングしてきた値としては小さいので、testデータはおそらく連続した1部分を切り取ったのではないかという予測がされている。

MAE(mean absolute error)という評価指標は、正解と予測の差の合計の平均なので、このようにLB Probingされやすい指標。


また、このディスカッションなどではトレーニングデータとテストデータが、p4677実験番号の地震から作成されたデータなのではないかという推測がされている。

この仮説について、5月28日ごろから検証の実験などを行い、その場合にどのように、サブミットファイルを作っていけば良いか議論と検証を行い、やり切ることができました!


ソリューション

ソリューションについては、twitterに書いたので、それを埋め込みます。
足りないところだけ少し補います。




testの形がわかりtest(この図の黄緑の部分)は、最大で10sぐらいのデータが多く、また地震発生後何秒かということを精度よく当てられるのであれば、地震発生直後であれば10s、地震発生1秒後は9sのように予測を行えば良い予測となるのではという発送で次のように、トレーニングデータのyを修正してしまうことにしている。


上記のcvというのは正確じゃなくて、
1つめ〜4つめの地震が検証データで、残りがtrainデータ。
5つめ〜8つめの地震が検証データで、残りがtrainデータ。
12個め〜15個目の地震が検証データで、残りがtrainデータ。
というように学習・推論してのスコアが良かったと言う意味。




finalサブミットに選んだのは次の2つ。
パブリックLBは、1.6台とベストスコアより0.2以上悪いものを選択しています。

最終モデルはLightGBMとRNN。LightGBMの特徴は、ほぼこのKernelこのKernelを参考にして作成した特徴でした。

まとめと告知

最後はtwitterに書いたsolutionを貼っただけになってしまいましたが、ここまでにしたいと思います。

年内にKaggleグランドマスターを目指して、Kaggleに専念しており、残り金メダル3つ。長らく金メダルが取れていなくて、9ヶ月ぶりくらいに2つめを取ることができました。


質問があれば、質問箱までお願いします。


個人的に驚いたこと

同じ時期にサンリオのキャラクター大賞が行われていて、なんと地震コンペの結果発表と、キャラクター大賞の結果発表は同じ日!

そして、私の大好きなポムポムプリンが、同じ3位という順位で終わっていました!

プリンは何度も1位になったことがあるので、本当は3位じゃ全然喜べないんですけどね。。。

プリンも前日の夜は100%目がさえて寝れていませんでした。




コメントお待ちしています。匿名の質問はマシュマロから→https://marshmallow-qa.com/currypurin