炼丹笔记干货
作者:RSJ & 杰少,炼丹笔记嘉宾
三大黄金数据扩充技巧
在Kaggle Google Brain序列大赛中,第三名的选手在特征工程的基础上融入三种数据扩充策略大大提升了模型的预测效果,直接从银牌外的分数冲进了前五,究竟是哪三种数据扩充策略呢?今天我们一起来学习研究一下Top选手的秘密:
01Masking扩充
Masking的策略,在很多问题中就会被使用,有点类似于剪切,在Google Brain中作者在R和C上随机进行Masking。此处主要考虑到u_In这样的数字在EDA时发现其与压力的相关性很高,通过故意删除类型信息,再对模型进行了训练,可以让模型去理解u_In的一般语义。
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例如:
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。它的方式如下:
此时,我们讨论的重点是如何混合R和C类型信息,因为类型信息非常重要。事实上,在这个扩充之前,我们将R和C视为分类特征,并通过nn.embedding将它们嵌入。但是我们能够通过将嵌入更改为一个热点来混合这些R和C特性。如果有一个序列是C 20,另一个序列是C 50,那么one-hot的C将如下所示:
然后像这样混合这两个Embedding:
然后我们最终可以得到这样的Embedding:
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