返回列表

16th place solution

435. Indoor Location & Navigation | indoor-location-navigation

开始: 2021-01-28 结束: 2021-05-17 共享出行与停车 数据算法赛
第16名方案

第16名方案

作者: kuto (团队成员: yuki, fkubota, kuto, sqrt4kaido, sinchir0)
比赛: Indoor Location Navigation
排名: 16th Place

祝贺所有的获奖者,非常感谢主办方举办了如此有趣的比赛!我将分享我们的解决方案。

摘要

Indoor-solution (1)


数据集

我们的数据集基于 indoor-unified-wifi-ds。主要的区别如下:

  • 如果路径点的时间戳与WiFi的最后可见时间戳之差超过10秒,则删除该数据。(这一点非常重要)
  • 测试数据也按照与训练数据相同的方式创建了基于WiFi的数据集,以便在推理过程中对时间戳进行平均。因此,数据行数大约是原始数据的三倍。
  • 隐藏的路径点通过线性插值卡尔曼滤波进行补充。这可以预期对数据起到填充效果。
    スクリーンショット 2021-05-18 8 41 25

模型

用于预测 xy 的模型

我们的模型基于 LSTM by Keras with Unified Wi-Fi Feats。由于该LSTM模型不是基于时间序列的,我们也使用了MLP模型。
使用的特征如下:

  • 80个 BSSID
  • 80个 RSSI
  • 站点ID (site id)
  • 楼层 (在推理时,我们使用其他模型预测的值)

用于预测楼层的模型

  • lightGBM (也尝试了 BiLSTM)
  • 作为分类问题进行学习
  • 为每个站点创建模型
  • 将每个路径文件作为一行创建数据集
  • 使用 StratifiedGroupKFold
  • 特征:
    • BSSID
    • 平均 RSSI
    • 最大 RSSI
    • 提取在测试集和训练集中都存在的 BSSID

训练 (两阶段)

第一阶段

  • 几乎如上图所示。
  • 自定义损失函数
    我们数据集中的每个数据都有 timediff(路径点时间戳与WiFi组时间戳之间的时间差)。这个 timediff 越大,给定的目标与真实值之间的差异就越大。因此,我们根据 timediff 应用加权损失。
# timediff -> weight
timediff = df['timediff'].astype(np.float32).abs().values
weight = 1- (timediff/np.max(timediff)) 

class WeightedMSELoss(nn.Module):
    def __init__(self):
        super().__init__()
        self.loss = nn.MSELoss(reduction='none')

    def forward(self, input, target, weight):
        input = input.float()
        target = target.float()
        weight = torch.stack((weight, weight), 1).float()  
        loss = self.loss(input, target) * weight 
        return loss.mean()

第二阶段

通过添加以下元素重新学习:

  • 通过伪标签添加测试数据
  • 如果 oof 误差超过 40米,则删除训练数据(也尝试删除超过 20米的数据)

<h
同比赛其他方案