Kaggle過去コンペ解説 Ion Switching 5th Solution
今回はKaggleで過去に開催されたコンペ Ion Switchingの、5th Solutionを解説していきます。
0. 概要
0.1 目的
コンペの目的は与えられた一次元信号を処理し、開いているイオンチャネルの数を予測することです。
イオンチャネルは動植物に存在する孔形成タンパク質であり、感染症や痛覚、筋肉収縮など様々な生体現象に関連します。これについてのより深い知見は医療分野に大きく貢献します。
このイオンチャネルが開くときに電流が流れ、科学者はこの現象を迅速に自動で検出できるシステムの開発を望んでいます。
0.2 評価指標
評価指標はF1スコアです。
Precision(TP/TP+FP)とRecall(TP/TP+FN)の調和平均で表される、予測バランスの取れた評価指標です。
提出ファイル(submission.csv)形式
timeに対応する時間の、開いているチャネル数を予測します。
# submission.csv
time,open_channels
500.0000,0
500.0001,2
etc.
0.3 データ
今回のコンペで与えられるデータはシンプルです。
- train.csv
以下の列を持つ二次元配列
time: 時間
signal: 信号
open_channels: 開いているチャネル数 - test.csv
以下の列を持つ二次元配列
time: 時間
signal: 信号
学習用に上記train.csvデータのみが与えられ、これを用いてtest.csvのtimeとsignalに対応するopen_channelsを予測します。
train.csvのデータ形状は(5000000, 3)なので、データ数は500万です。
1. 5th Solution解説
今回はEMIN OZTURKさんの5th Solution 「5th Place Solution with Code」を解説します。
1.1 適切なデータセットの作成
このコンペティションのデータセットにはトレンド性が含まれており、時間に応じて一定の規則的な値の増減が存在しました。
このノイズは参加者のGibaさんによって発見され、修正方法が公表されました。これを利用した適切なデータセットを利用します。
1.2 データ拡張
私たちは有用なデータ拡張を発見しました。
データを10個に分割した内の6番目と9番目を単純に足し合わせて、11個目のデータを作成するのです。
もう少し具体的に言えば、これは2つの「隠れマルコフモデルにピンクノイズとホワイトノイズを足したデータ」を足し合わせたものです。
詳細は以下の論文とDiscussionにまとまっています。
・論文: Deep-Channel uses deep neural networks to detect single-molecule events from patch-clamp data
・Discusison "Hidden hidden" Markov Models and why this competition is not really over...
1.3 検証手法とOOFの作成
ここでは、検証手法の適切性の判断と、特徴量としてのOOFの作成を行います。
Group-5Foldクロスバリデーションを以下の全モデルで使用し(その前は2Foldクロスバリデーションを使用していた)、問題がないか確認しました。
使用モデル
・3つのLGBM (LightGBM)
・RFC (ランダムフォレスト分類機)
・MLP (多層パーセプトロン)
・BiGRU (双方向GRU)
・KNN (K近傍法)
・SVM (サポートベクタマシン)
また、これらのOOF(Fold分割法の予測結果)がWaveNetのスタッキングに使用できるか試しました。
この結果、以下の手法のOOFをWaveNetの特徴量として利用することにしました。
スタッキングモデル
・RFC (ランダムフォレスト分類機)
・LGBM (LightGBM)
・MLP (多層パーセプトロン)
また、RFCとLGBMのデータセットは、10秒毎のバッチでグループ化し、lead-lag特徴量を使用しました。
1.4 WaveNetモデル
私たちのモデルはほとんどのチームと同じWaveNetで、Trigramさんの素晴らしいnotebookに幾つかの改良を加えたものです。
改良
・独自のデータセットとOOF特徴
・signalに関連する他の特徴量は使用していません
・単純だが効果的なWaveNet
# 単純だが効果的なWaveNet
inp = Input(shape = (shape_))
x = wavenet_block(inp, 16, 3, 8)
x = wavenet_block(x, 32, 3, 12)
x = wavenet_block(x, 64, 3, 4)
x = wavenet_block(x, 128, 3, 1)
out = Dense(11, activation = 'softmax', name = 'out')(x)
model = models.Model(inputs = inp, outputs = out)
opt = Adam(lr = LR)
model.compile(loss = losses.CategoricalCrossentropy(), optimizer = opt, metrics = ['accuracy'])
・単純な学習率スケジューラー
・F1 Macroに基づいた最適な重み
・TestデータとTrainデータのtimeに反転拡張を適用
・スライド窓による予測
# スライド窓による予測
def sliding_predict(model, x):
pred = np.zeros((x.shape[0], 100_000, 11))
for begin in range(0, 100_000, SLIDE):
end = begin + GROUP_BATCH_SIZE
pred[:, begin:end, :] += model.predict(x[:, begin:end, :])
return pred
1.5 XGBによる調整
特徴量として
- WaveNetの予測
- signal
- ノイズ(signal - WaveNetの予測)
のみを使用したXGBを使用して、最終調整を行ったところ、LBのスコアは上昇しましたが、PrivateスコアはXGBを使用しないものとほとんど同じでした。
詳細はこちらから確認できます。
見どころ
個人的に参考になった部分を記述します。
・LGBM,MLPなどによるスタッキング
・lead-lag特徴の利用
・時間軸の反転によるデータ拡張(時系列による特徴を逆から学習)
まとめ
Ion Switching 2023の5th Solutionを解説しました。
一次元の信号データに対する処理について色々と知ることができました。ぜひ実際のSolutionも確認してみて下さい。
今回は以上です。読んでいただきありがとうございました。
Discussion