返回列表

7th Place Solution - Part 1: Removing Noise from Signal

378. University of Liverpool - Ion Switching | liverpool-ion-switching

开始: 2020-02-24 结束: 2020-05-25 药物研发 数据算法赛
第7名方案 - 第1部分:去除信号噪声

第7名方案 - 第1部分:去除信号噪声

作者: Pascal Pfeiffer | 排名: 第7名 | 发布时间: 2020-05-26

恭喜所有的获奖者!

首先,我要感谢我优秀的队友 @philippsinger@dott1718@cdeotte,感谢大家精彩的团队合作。每个人都为了获得最佳结果付出了巨大的努力,我很期待再次与你们组队。

在这篇文章中,我将详细介绍我们从提供的信号中去除噪声的流程。之后,@cdeotte 将在我们最终提交的模型中详细介绍我们使用的模型。请参阅他的讨论 这里

数据清洗

在这个挑战中,最困难但同时回报也最大的事情之一就是数据集(训练集和测试集)的清洗。在组队之前,我专门研究这一部分,并且只使用了公开的内核,比如 WaveNet 内核。感谢 @siavrez 提供的这个内核!我还发现 HMM(直接使用 hmmlearn)是快速测试清洗效果的一个不错选择,但我们没有在最终解决方案中使用 HMM。

原始数据可以分为 10 秒或 50 秒的批次,“signal”(信号)与“open_channels”(开放通道)之间已经显示出 0.8017 的皮尔逊相关性。

为了便于理解,我将根据其对应的最大开放通道数和开放概率或其类型,用“颜色”来指代训练集和测试集的部分内容。测试集中的“粉色”部分被假设为最大通道数为 5 且开放概率较低。

正弦漂移

在比赛初期,有人发现训练集和测试集的部分内容被添加了人工正弦漂移(https://www.kaggle.com/c/liverpool-ion-switching/discussion/133874)。该漂移被识别为一个 50 秒长的半正弦波(或仅为其前 10 秒),振幅为 5,可以通过以下代码片段去除:

def sine_func(x, a, b):
    return -a * np.sin(b * x)

sine_drift = sine_func(np.linspace(0, 499999, 500000), -5, np.pi / 500000)
sine_drift_short = sine_drift[:100000]

# 清理训练集
train_csv.loc[train_csv["100k_batch"] == 5, 'signal'] -= sine_drift_short  # batch 2 第一段
train_csv.loc[train_csv["500k_batch"] == 6, 'signal'] -= sine_drift
train_csv.loc[train_csv["500k_batch"] == 7, 'signal'] -= sine_drift
train_csv.loc[train_csv["500k_batch"] == 8, 'signal'] -= sine_drift
train_csv.loc[train_csv["500k_batch"] == 9, 'signal'] -= sine_drift

# 清理测试集
test_csv.loc[test_csv["100k_batch"] == 0, 'signal'] -= sine_drift_short
test_csv.loc[test_csv["100k_batch"] == 1, 'signal'] -= sine_drift_short
test_csv.loc[test_csv["100k_batch"] == 4, 'signal'] -= sine_drift_short
test_csv.loc[test_csv["100k_batch"] == 6, 'signal'] -= sine_drift_short
test_csv.loc[test_csv["100k_batch"] == 7, 'signal'] -= sine_drift_short
test_csv.loc[test_csv["100k_batch"] == 8, 'signal'] -= sine_drift_short
test_csv.loc