2019–03–21 に終了した私が初めて参加した Kaggle のコンペティション、 VSB Power Line Fault Detection 通称「電線」の感想を書きます。だらだら書きます¹。
Kaggle を知ったのは Google に買収されて話題になった2017年。アカウントを作ってみたものの、あの頃はコンペは常に開催されているわけではなく、ようやく来たと思えば「アザラシの種類を判定せよ」とアザラシが大量に転がっている写真を与えられたりして、途方に暮れて挫折。そして月日が流れ、rebulid.fm で久々に Kaggle を名前を聞いて覗いてみると、たくさんコンペが同時開催されている。地震コンペや電線コンペの1次元データならなんとかなるかもと挑戦してみた。
概要
舞台は高電圧が流れる電線。絶縁体であってほしいところが完全ではなく、微弱な電流が流れてしまう「部分放電」がテーマ。これを放置しておくと絶縁体が徐々に破壊されていって「絶縁破壊」に至り、たぶんショートのようなひどいことになるので、電圧のデータから検知するのが目的。問題を複雑にしているのは「コロナ放電」などで、これは空気に電流が逃げるだけで設備にダメージを与えるわけではないので問題ないらしい。電圧が乱れていても問題があるとは限らないのが難しい。
データ処理
交流の上に乗っているツンツンが重要なので、タイムステップ1000毎に平均と最大などの percentile をとってその差をとった。
フーリエ変換を使って高周波と低周波に分離する方法もあるのは分かっていたけれども、単純な平均でも大差はあるまいと思って採用しなかった。コンペ終了後に wavelet 変換によるノイズ除去というのがあるのを知って感動した。人類の叡智、信号処理の真髄という気がする。このカーネルはコンペ中も評価が高かったものの、この劇的な denoising に気付かなかった。カーネルのスコアしか見ないのいくない。
特徴量
基本となるモデルは Public Kernel として公開したもので、
Max-mean が大きい区間(赤)を選んで、その中で max, mean をとった。全体のmax も取ってる。
スコアは(大きいほど良くて最大 1.0、確率を01にする閾値は 0.25)
catboost
Local CV Public Private
0.690 0.655 0.647
(Local cross validation set (5-fold strafication), public leader board, private leader board.)
Hyperparamter tuning をしなくてもそこそこ良い結果を出すと言われる CatBoost だけれど、この場合は overfit してしまって、learning rate を0.006 に下げるという工夫が必要だった。もっと色々試した人³によれば、他のパラメタ次第では learning rate 0.25 くらいまでいけるらしい。Gradient boosting decision tree はぼんやりとしか分かっていないので、どのパラメタをどうしたらいいか分かってない。今後の Kaggle のためにもっとしっかり勉強したい。
Asymmetry
その後、論文² を読んだら無害なノイズは上下対称な場合が多いと書いてあったので、同じく 1000 タイムステップ毎に非対称さ
v_max = max(v) - mean
v_min = mean - min(v)
asymmetry = max(v_max, v_min)/min(v_max, v_min)
という量を導入して全体の max をとった。
これはそんなに劇的な効果はなくpublic ではスコアが下がった。しかしlocal CV は上がったし、役に立つはずという信念で最終モデルのひとつに採用。結果的に private でも 0.025 くらい上がった。
catboost + asymmetry
Local CV Public Private
0.726 0.643 0.672
Training data と test data が違う
電線コンペ最大の悩みは training data と test data が明らかに違うという問題だった。Public leader board のスコアは local CV よりも明らかに悪い。
コンペ終了間近のロックマン氏のハック⁴によれば、test data の positive fraction は 2.3% だという(training data は 6%.)実は自分でもヒストグラムを見比べることで 2% くらいじゃないかという推測は出来ていたのだけども、分からないところが残りこの結果はkernel で発表せずお蔵入りにした。
Positive fraction が Matthews correlation coefficient にどう影響を与えるかは CV の confusion matrix から簡単に計算できて⁵、public スコアが local CV よりも悪いというのは positive fraction が少ないことで定性的には説明できる。しかし、これで完全理解とはいかず 2%仮説よりもスコアが良い気もする。Train-test の統計的な違いは結局よく分からなかった。
RNN
げきつよカーネルの再現性のなさにのたうち回る
時は前後して CatBoost のモデルを公開した後、別のモデルも模索し始めた。このコンペ最強の public kernel (public 0.694)⁶ は Bruno Aquino 氏のbidirectional LSTM + Attention モデルであった。RNN, LSTM, Attention, 何を言っているのか分からないという人は Andrew Ng 先生のコースで学べるのでオススメ。というか私がそうだった。教科書やネットの情報を斜め読みしてもさっぱり分からなかったけどこれを聞いたらすぐ分かった(気になった)。モデル自体はすごく簡単でこれで翻訳ができるというのだから不思議。人類の叡智。
Public kernel を勉強のため写経して、自分なりに特徴量を削ったり追加したりしてみたものの結果が安定しない。バグを混入させたか? どうやっても元のスコア 0.694 よりも小さく 0.65 くらいにしかならない。2週間くらいのたうち回ったのち、もしやと思って元のカーネルをそのまま fork して commit した:
Bruno氏 げきつよカーネル fork
Local CV Public private
0.706 0.658 0.627
再現しねえ・・・・・・
上記の asymmetty をここにも追加してみたり、いくつか改良を試みたけど時間切れ:
RNN
Local CV Public Private
0.711 0.596 0.607
この結果を自分のモデルと混ぜることにした。
Stacking わからん
複数のモデルの結果を混ぜて強化する stacking. 巷の噂では Logistic regegression なんかを使うらしいけど、なんでそれでいいのか理屈がわかっていないし、この場合はあまりうまくいっている気がしなかった。時間切れになり、結局確率を単純に平均した。
mean(catboost + asymmetry, RNN)
Local CV Public Private
0.742 0.647 0.691
閾値は local CV でスコアが最大になるものを選び直した。
そして締め切り
電線コンペはスコアが不安定すぎてサイコロだという意味と投了しましたの「投げた」のダブルミーニング。Public スコアでは public kernel を最後まで超えられず、あきらめムード。
結果はまさかの金メダル。Public leader board は 0.65 なので private 0.69 は運が良かったとしか言えない。
終了後、最近のコンペは shake up/down が多すぎるという批判を見かけたけどもっともだと思う。ポーカーなどランダム性の多いゲームはたくさんあるけどそれらは数をこなせる。3ヶ月かけて競った結果がランダムではやる気を削いでしまう。電線に関して言えば不均衡データで実質的なデータ数が少ないのに 0 1 で予測するのは良くなかった。連続的な確率を使えばもっと安定したスコアになったと思う。
もちろんデータが増やせればもっと安定する。現在のデータ量はギガバイトで見れば小さくはなく妥当な量だと思うけど、それでもデータが足りなくて有力なディープラーニングが活躍できない問題も Kaggle の今後の課題だと思う。
結果は出来過ぎだけど、自分なりにモデル作ってみて公開できたのは良かった。素人っぽい手作りモデルながら意外に健闘した。RNN を勉強するモチベーションになって Coursera のコースをひとつ修了したのも良かった。今は地震コンペをやりつつ次のコンペを待っています。
[1]: 円城塔『プロローグ』
日本語は、なんとなく文字列を処理しながらだらだらと愚痴を連ねていくという仕事には向いていると思う。私小説というやつだね
[2]: Misák et al., 2017, A complex classification approach of partial discharges from covered conductors in real environment https://ieeexplore.ieee.org/document/7909221
[3]: George Okromchedlishvili https://www.kaggle.com/c/vsb-power-line-fault-detection/discussion/85198
[4]: Neuron Engineer https://www.kaggle.com/ratthachat/a-heuristic-to-understand-your-mcc
[5]: Grizzly_A https://www.kaggle.com/c/vsb-power-line-fault-detection/discussion/82591
[6]: Bruno Aquino https://www.kaggle.com/braquino/5-fold-lstm-attention-fully-commented-0-694