378. University of Liverpool - Ion Switching | liverpool-ion-switching
首先,我要感谢 Kaggle、主办方 @richardbj、所有的竞争对手,特别是我的两位出色的队友 @group16 和 @zidmie,他们拥有我有幸合作过的最敏捷、最聪明的思维方式。最后,考虑到我们在这次比赛中作为优化过程所付出的巨大努力,我们对排名前两位的团队中存在的数据泄露感到有些失望。我的队友们正在撰写一篇关于该解决方案的非常详细的博客文章。现在是他们的睡觉时间,所以我将简要写下我们的解决方案。
我们消除了漂移,添加了偏移/增益以使 signal-round(signal) = noise,并且我们去除了一些正弦波峰,特别是 50Hz。我们还在 350Hz 和 1150Hz 附近发现了一些小波峰。去除所有这些并不是一个完美的过程,所以我们通过不同的方法来做到这一点。最后,我们得到了一些略有不同的信号用于建模。
我们使用单个 HMM(隐马尔可夫模型),配合高度定制的 forward-backward(前向-后向)算法。建模过程的关键是将高类别的信号分解为低类别的子过程。让我们将信号类别表示为 cat 1, 2, 3, 4, 5, 6,对应的最大 open_channels 为 1, 1, 3, 5, 10, 4(cat 6 仅出现在测试集中)。从具有状态 [0, 0, 1, 1] 的 4x4 矩阵 Ptran 的 cat1 开始,我们将此矩阵扩展为每个更高类别的更大矩阵。例如:cat3 由三个 cat1 过程组合而成,那么它具有大小为 20x20 的 Ptran,其中每个状态可以取值 [0, 1, 2, 3],它是 0 或 1 的 3 个状态的组合,也就是 [0, 0, 1, 1] 的 3 个过程的 3 个状态的组合。对 cat4 和 cat5 进行类似的操作,其中 cat4 的 Ptran 大小为 56x56,cat5 的 Ptran 大小为 286x286。我们将原始矩阵 (4x4) 作为一个优化问题进行优化。
我们制作了一个高度定制的 fw-bw(前向-后向)算法。如果我们将时间 t 的信号落入每个状态的概率表示为 s(t)(其中每个状态是扩展 Ptran 矩阵中的一行),那么正常的前向传递是(粗略地,为了简单起见,这里我跳过了每个时间步计算的归一化步骤),我们表示 alpha0(t) = alpha0(t-1) x Ptran。类似地,在 t 停止的正常后向传递将是 beta0(t) = beta0(t+1) x Ptran^T,然后 pred(t) = alpha(t) * beta(t) * Psig。这里,Psig 是每个时间点噪声的高斯发射,我们可以将其作为参数进行优化,pred 是预测值。
我们发现通过在后向传递中整合前向的“记忆”,可以提高分数。所以定制过程是:
beta1(t) = [(beta1(t+1) x Ptran^T )^coef1] * [(alpha0(t))^(1 - coef1)]。
这个过程让我们得到了更好的 beta。类似地,我们执行另一轮传递,将 beta1 用作 alpha2 的“堆叠”特征,即:
alpha2(t) = [(alpha2(t-1) x Ptran )^coef2] * [(beta1(t))^(1 - coef2)]。
最后,这些 alpha 和 beta 的定制总和给了我们最终结果:
pred = [ c1 * (beta1) + (1-c1-c2) * alpha2 + c2 * (beta1 * alpha2) ] * Psig,
其中 c1, c2 也是需要优化的参数。
给定 pred,现在我们有了每个状态的概率(这里的状态是 cat1 的 4 个状态 [0 0 1 1] 之一,或 cat 3 的