炼丹技巧--一技从Kaggle银牌飞入金牌。

2021-11-18 14:19:04 浏览数 (2)

炼丹笔记干货

作者:RSJ & 杰少,炼丹笔记嘉宾

三大黄金数据扩充技巧

简介

在Kaggle Google Brain序列大赛中,第三名的选手在特征工程的基础上融入三种数据扩充策略大大提升了模型的预测效果,直接从银牌外的分数冲进了前五,究竟是哪三种数据扩充策略呢?今天我们一起来学习研究一下Top选手的秘密:

  • Masking扩充策略;
  • Shuffling扩充策略;
  • Mixup扩充策略;

三大数据扩充策略

01Masking扩充

Masking的策略,在很多问题中就会被使用,有点类似于剪切,在Google Brain中作者在R和C上随机进行Masking。此处主要考虑到u_In这样的数字在EDA时发现其与压力的相关性很高,通过故意删除类型信息,再对模型进行了训练,可以让模型去理解u_In的一般语义。

代码语言:javascript复制
one_sample = get_sample(idx)
# Type masking
if random.random() < .2:
    if random.random() < .5:
        # maskring R
        one_sample['R'][:] = 0
    else:
        # masking C
        one_sample['R'][:] = 0

02Shuffling扩充

随机shuffle将在特定窗口内按顺序随机洗牌,等价于分窗口进行shuffle例如:

  • 假设我们有一个类似[1,2,3,4,5,6,7]的序列,窗口大小为3。首先在[0,1,2]之间随机洗牌;下一步洗牌[3,4,5],依此类推。
代码语言:javascript复制
one_sample = get_sample(idx)
# Shuffling sequence
if random.random() < .2:
    ws = np.random.choice([2, 4, 5])
    num = max_seq_len // ws
    idx = np.arange(0, max_seq_len)
    for i in range(num):
        np.random.shuffle(idx[i * ws:(i   1) * ws])
        one_sample = one_sample[idx]

03Mixup扩充

Mixup有点类似于创建合成序列的过程, 在Google Brain的比赛中Mixup数据扩充给模型最终的cv和lb分数都带来了非常大的提升。将公共排行榜上的单模型的得分从0.117提高到了0.1004。它的方式如下:

  • 随机选择并混合两个序列。例如,给定两个序列,如[1,2,3,4,5] 和[5,4,3,2,1] ,将它们对半混合以生成序列 [3,3,3,3,3]。

此时,我们讨论的重点是如何混合R和C类型信息,因为类型信息非常重要。事实上,在这个扩充之前,我们将R和C视为分类特征,并通过nn.embedding将它们嵌入。但是我们能够通过将嵌入更改为一个热点来混合这些R和C特性。如果有一个序列是C 20,另一个序列是C 50,那么one-hot的C将如下所示:

  • [0,1,0] 和 [0,0,1]。

然后像这样混合这两个Embedding:

  • [0,1,0]*0.5 [0,0,1]*0.5

然后我们最终可以得到这样的Embedding:

  • [0,0.5,0.5]
代码语言:javascript复制
one_sample = get_sample(idx)
# Mixup two sequences
if random.random() < 0.4:
    # Get new index
    idx = np.random.randint(len(indices_by_breath_id))
    sampled_sample = get_sample(idx)
    mix_cols = ['R', 'C', 'numeric_features', 'target']
    k = 0.5
    for col in mix_cols:
        one_sample[col] = (one_sample[col]*k   (1-k)*sampled_sample[col]) 

适用问题

适用于所有的时间序列问题。

参考文献

Single model scored 0.0975 w/o PID controller

0 人点赞