Kaggle 地震・感想戦(前編)

Jun Koda
13 min readJun 11, 2019

--

2019年6月3日に終わった Kaggle LANL Earthquake Prediction¹ の感想戦です。感想戦というのは囲碁将棋などの対局が終わった後に勝負を振り返って読み筋、形勢判断を披露するやつです。時間に沿って長々と書く機械学習と関係ないゲームプレイ日記。簡潔に知りたい人は disucussion に書いた solution も見てみてください。

概要

実験室地震の「地面」の揺れのデータから地震までの時間 time to failure を予測する。実験室地震のことを failure と言うらしい。実験室で「プレート」をじわじわ動かしていくと、別のプレートが引きづられていって限界に達するとドンと地震になる。

図1 実験装置の図²

地震は約10秒毎に起こって、テストデータでは 150,000 timestep の約0.03秒の区間から地震までの時間を推測しないといけない。訓練データはテストデータとは違って連続した約160秒のデータ。評価指標は mean absolute error (MAE).

イメージ

図2 time to failure と 150,000 timestep 毎の標準偏差 std

図2は訓練データのテストデータと同じ長さの 150,000 timestep 毎の標準偏差 (std, 橙色) を計算したもの。プレートには継続的にエネルギーが加えられていって、地面の振動もだんだん大きくなっていく。エネルギーが限界に達すると何かをきっかけに大地震になる。時には中地震が起きて、エネルギーの一部が発散されて大地震までの時間が伸びる。例えば7番目の区間は真ん中で大きな中地震が起きているので、std が一時的に下がり、区間の長さも16秒とこの中では最長となっている。

初手から振り返る

1/15日ごろ

初手 sample_submission. 予想値がすべて 0 の公式のサンプルファイルを提出してみた。タイタニックとMNISTのチュートリアルを除いた、私の記念すべき Kaggle 初提出。その後、標準偏差 と time to failure の間に線を一本エイヤと引く線形回帰からスタートして、Gradient boosting decision tree を初めて使ったりした。

1/26

いろいろ特徴量を追加していって、Public leader board (LB) 1.465 の 8位、さらに最高で 1.407、4位まで行く。機械学習は素人だけど、自然科学ならこんなもんよと調子に乗る。しかし、この後何をやってもこの自己新を更新できなくなってしまい、行き詰まる。そして最後の最後までこのスコアで変わらず public 675位まで落ち続けることになる。

sample_submission 4.017 というのも謎で、これは public set の time to failure の平均が 4.017 秒であることを意味するけど、訓練データの平均は 5.5 秒くらいである。訓練データと同じ分布からランダムにサンプルした結果ではまず無い平均値なので³、テストデータでは地震間隔が訓練データよりも短い平均8秒くらいなのだろうか?

2/12 〜 3/23

スコアは上がらないしテストデータは謎なので、電線コンペに移る。Jupyter notebook の作成日時を見てみると、この間ひとつも地震関連のものを作ってない。Malware の惨状を伝え聞いて public は必ずしもランダムに選択されたものとは限らないと聞く。なるほど、地震でもランダムではなくて連続した区間に違いない。

4月

電線コンペを終え、暗号 playground で遊んだりしていたけれど、久しぶりに地震に帰ってきた。電線では伝え聞いていた “trust your CV” を身を以て体験したり、訓練データとテストデータの差に苦しんだりした。地震でもテストデータとの違いを理解しないといけない。

図3 訓練データ全てで訓練して同じデータに適用した予想値(橙)

ところで、普通に予測すると図3のようになる。地震直後の time to failure である橙色の三角形の高さはだいたいどれも同じになる⁴。これは 0.03秒という短いデータの中では、大地震の直後だということしかわからず、将来中地震が起こるのかどうか、すんなり大地震が起こるのか、地震になりそうだけどならない状態で粘るかといった遠い将来のことは分かりようがないことを示唆している。なのでモデルは訓練データの高さ達の median を選ぶことくらいしかできない。重要なのはこの高さが訓練データのたった15個の高さの分布を反映していることである。テストデータに対する最適な高さは何か?これを求めてテストデータを探ることを始めた。

しかし、この「最適な高さ」を精密に求めることができるとは思っておらず、運ゲーになることを恐れてあまりやる気が出てない様子。

テストデータ

まず、テストデータで地震が9回起きているということは、std が明らかに大きいので簡単に分かる。テストデータがひとつの連続した区間から切り取られてシャッフルされたものだと仮定して、区間の数がわかれば区間の長さの平均がわかる。しかし、両端に区間の一部が含まれている可能性があるので、テスト内の区間の数は実数で 8.0 から10.0 区間までありうる。地震から経過した時間 time scince failure の予測値を並べて何区間ありそうかプロットしてみると、8区間のようでもあり9区間のようでもある。

図4 Time since failure のヒストグラム。緑の実践が8区間の場合、破線が9区間の場合。

さらに std のヒストグラムも重要。Std は time since failure とともに大きくなって右に移っていく。

図5 time since failure 毎の std のヒストグラム。地震から時が経つにつれて右に移っていく。

これを重ね合わせてテストの time since failure 分布を探るというのもあるけど、まずは単純に2つの場合を重ね合わせてみる。エネルギーが蓄積されていく time since failure 7秒までを「前期」、その後のいつ大地震になってもおかしくない部分を「後期」と名付けて、後期の割合 f を求めてみた。前期・後期の割合を変えて重ね合わせてみて、テストデータの std の分布にあう割合を探す。後期 fraction f は test で 0.35、train で 0.27。つまり、テストデータの方が地震間隔が長そうだ。

図6: time since failure が前期のものと後期のものとの重ね合わせで、後期 fraction f を探る。微かに test の方が右に偏っているだけだけど、その区間の長さへの影響は意外と大きい。

こうやってテストの時間間隔の分布をいかに探るかが勝負と考えていた、平成が終わろうとするあの日までは……

4/27 p4677の衝撃

Discussion に投稿されたのは 4/25 だろうか?「その探し求めている地震間隔の情報、主催者の論文に乗ってるよ」というのである⁵。そんな馬鹿な。そんなことはあるはずがないと思った。

だって、主催者はこう言っている

For this challenge we selected an experiment that exhibits a very aperiodic and more realistic behavior compared to the data we studied in our early work, with earthquakes occurring very irregularly.

普通に読んで「Kaggler 達のために予想な困難な新しい実験データを用意したぜ」という事じゃないのか? “more realistic behavior compared to the data we studied in our early work” って言ってるのに、この直前にリストアップされている論文と同じデータのはずがなかろう。

事の重大さに気づいたのは 4/27だった。

図7 完全に一致! By llu.⁵ 訓練データの地震間隔と論文の sheer stress の間隔がまったく同じ。

Discussion の反応を見ると「テストデータは訓練データに似てるね」というものが多かったように思う。もし、主催者がデータの使い回しをせず、皆がテストデータでは平均地震間隔が短い8秒だと思い込んでいれば賞金は私のものだったのに(と、このときの日記に書いてある)。テストデータの地震間隔の情報は全員に行き渡ってしまった。だが、まだだ、私はまだ切り札をひとつ残している。(それは Public の time to failure の情報を調査して知っているということだけど、これも1週間後くらいに discussionで公開されることになる。)

Public set

Test data がわかったなら、次にやることは public 13% がそのどこに相当するか探ることだろう。それによりさらに private に特化することができる。こうして、私のテストデータを探るゲームは続く。科学?地震予知?そんなものは知らん。賞金ほしい、賞金で温泉に行きたい、温泉宿で Kaggle したい。

ひとつの値からのみなる予想値を提出して、public LB を探るというのは多くの人がやっていたようだ。こうやって判明した public の time to failure は図8のようになる。4秒くらいの山と9.5秒くらいの山からなる。

図8mykper: Public set time to failure distribution

疑問とは:

  1. 一定の予想値で提出した Public LB のスコアと山ふたつの理論値が 2–3% ほど合わない。スコアは小数点以下4桁あることを考えると誤差が大きすぎる。
  2. 連続した1つの区間だと仮定すると「本当の高さ」は 4.5秒ということは無さそうだから、これは端っこで切られた結果で9.5秒の方が高さ(time to failure の極大値)ということになりそうだ。しかし、手もとの訓練データの区間ごとのスコアと比べると 1.4 という public LB は大きい。9.5秒の区間なら 1.1 とかいってもいいはず。この違いは何?
  3. 2624 個のテストデータは約102秒に相当する。しかし、training data の終わりから 9回目の地震の終わりまで 107秒ある。この 5秒はどこに行ったのか?

プログラムがちゃんと動いているようだけど、結果がたまに少しおかしいということは時々ある。そして、「たまに」「少し」ならいいかと放っておくと、ほぼ確実に後で目を覆いたくなるようなバグだったと気づく。これは何かとんでもない勘違いの兆候なのか?Public は連続した区間でないのか?テストデータは論文のテストデータとは違うのか?もう、何もわからない。

5/13 隙間

ふと思った。主催者はテストデータは重なり合っていないとは言っているけど、隙間なく切り取ったとはいっていない。テストデータとテストデータの間に隙間があったらどうだろう?これを新たなパラメータにしてフィットしてみたところ見事 5% くらいの隙間を追加することで leaderboard probing の結果と4桁一致させることができた。さらに、5%の隙間を入れるようにすると 2624個のテストデータは 102秒ではなく、107秒に相当することになる。論文と同じ。エウレカ!テストデータは論文と同じに違いない。私、もう迷わない。もう何も恐くない。我に支点を与えよ、さればローマをも滅してくれよう。

ところで public は std がテストの中で2番目に大きい中地震(9つの大地震から数えると11番目に std が大きいデータ)を含んでいて、その time to failure は 3.416秒。Public 13% は N=348 個だと探るのと同じ方法でわかる。論文のグラフと見比べるとテストの第1か第2区間が有力。つまり、public の 9.5秒は極大値ではなくてもっと大きな山の残りの可能性が高い。疑問点 (2) のPublic LB の値もそれを示唆している。それならこれは training 直後が public になったと考えるのが自然。4秒のほうが9.5秒の直前でないとすると test の一番最後だろうか。ひとつの連続区間でないというのは一番単純な答えではないけども止むを得ない。As simple as possible, but not simpler.

ターゲットにすべき private の地震間隔はわかった。残り4週間。あとはこのターゲットに向けて最適化する。(後編に続く)

長くないですか?5000字くらいなので、読む側ならそうでもないかも。特徴量などの話はページを変えて明日にでもすぐ書きます。後半はもっと機械学習の話っぽくなるかも。

[1] https://www.kaggle.com/c/LANL-Earthquake-Prediction

[2] Shreedharan et al., Characterization of Acoustic Emissions From Laboratory Stick-Slip Events in Simulated Fault Gouge https://www.onepetro.org/conference-paper/ARMA-2017-0362

[3] 訓練データを平均 μ = 5.6、標準偏差 σ’ = 3.6 だとして、そこから N = 340 個のサンプルをランダムに取り出した場合、そのサブサンプルの平均は中心極限定理から 平均 μ, 標準偏差は σ = σ’/sqrt(N) = 0.2 の正規分布に近くなる。訓練の 5.6 と public の 4.0 は 8 σ 離れている。まず起こらない。

[4] 過学習になってないことは 10 fold, shuffule 有り無し両方などで確認済み。訓練データ自身の推測ならモデルによっては高さを過学習することはできるけど、過学習したモデルは当然 validation set では成績が悪い。

[5] mykper https://www.kaggle.com/c/LANL-Earthquake-Prediction/discussion/90664#latest-535844

[6] In https://www.kaggle.com/c/LANL-Earthquake-Prediction/discussion/77525#latest-524782

[7] mykper https://www.kaggle.com/c/LANL-Earthquake-Prediction/discussion/91583#latest-535268

--

--