378. University of Liverpool - Ion Switching | liverpool-ion-switching
首先,我要感谢 Kaggle 和主办方 @richardbj 组织了这场比赛。我觉得具有科学和数学背景的比赛最有趣。当然,出现数据泄露总是令人遗憾的。
我创建的解决方案是 4 个非常相似的 Keras 模型的平均值。它们基于高斯混合模型的结果对信号进行编码,使用 Dense 层和 BiGRU 层进行初始处理(头部)以创建特征,使用 Wavenet 模型进行主要处理,最后使用 Dense 层创建分类。此外,还使用了基于随机森林分类器(RFC)和基于直方图的梯度提升分类(HGB)的两个树模型作为堆叠输入。
以下是对各个部分的描述:
数据被分成了每批 500,000 条记录。这是通过数据集 df(针对训练集和测试集)执行 df.batch = df.index // 500000 完成的。同样地,创建了 100,000 条记录的片段和 10,000 条记录的窗口的划分。
最初,可以根据片段上的均值标准差值将片段分类为类型 1,...,5。
正如 @cdeotte 所指出的,信号包含正弦漂移。使用 Python 脚本自动移除了训练和测试数据的这种漂移。这是通过在整个批次上拟合并减去一条正弦曲线来完成的,如果在批次上无法实现,则在片段上进行。
这里以及片段类型定义的重要部分是,要在没有任何目视检查的情况下自动执行此操作,并能够在新测试数据上执行脚本。否则,解决方案将无效。
结果信号如下所示,正如论坛中已经讨论过的那样。对于带有批次号的训练数据:
以及带有片段 ID 的测试数据:
训练数据在批次 8 中包含异常值。我没看到任何修正方法,因此将其从训练数据中剔除。
当获取每个开放通道的信号值并计算每个窗口的平均值时,会得到一个有趣的图表:
这表明,对于开放通道值,片段类型 1、2、3 和 4 的信号强度大致相等,但对于片段类型 5 则发生了偏移。
我评估了使用片段类型进行建模甚至拆分模型的可能性。我得出的结论是,这将是一个错误,并且可能严重过拟合。相反,我将片段类型 1、2、3 和 4 归为片段组 0,将片段类型 5 归为片段组 1,并在建模中将片段组用作特征。
目标变量 Y = 开放通道数基于 HMM(隐马尔可夫模型)。信号 X 是 Y 的函数,但包含高斯噪声。评估条件分布 P(X|Y=k, Segment) 得到的正态分布均值为 mu_k = mu_0 + k*delta,但标准差在片段类型之间略有不同,且片段组 1 的标准差较大。下图显示了一个样本片段通过 GMM 对信号的近似:
红色曲线显示了正态分布的加权和,其中心对应于与开放通道值相关的离散均值(垂直线),权重等于该开放通道值的目标值比例。
将信号建模为 GMM 使得能够使用正态分布密度函数 N(mu, sigma)(X) 将信号 X 编码为向量 (f_k), k =0,…,10,其中均值 mu_k 和 sigma 取决于片段类型。
这种信号编码是模型的关键输入之一。