原本我沾沾自喜的设计了,一个day到index到样本的数据提取路线,每个过程都封装的很好。实际跑起来,发现训练前啥预处理没有,要花三十分钟(1933s)。从所有index选取不在drop_list的,普通写法特别耗时,转化为集合求差。三十分钟变成3秒。 很慢 idx = [i for i in all_idx if i not in dropidx] # very slow 很快 idx = sorted(list(set(all_idx) - set(dropidx))) 样本选取idx过程中,通过分布式提取并保存为pickle,训练可以开始的快些?groupby还是很耗时。
def get_idx_from_days2(data, selected_days, day_columns='Day', mode='train', train_sequence_length=2*24*6, predict_sequence_length=2*24*6, strides=1*6, max_lags=1):""" sample1: 固定间隔,每个间隔选一个sample2: 间隔1-6随机, 此时先选出每个的间隔序列,再cumsum到原始序列进行选择"""def func(data):return data.tail(predict_sequence_length - 1).index.tolist()def func2(data):return data.head(max(train_sequence_length, max_lags) + 1).index.tolist() cpu_count = os.cpu_count()all_idx = data.loc[data[day_columns].isin(selected_days)].index.tolist()data_grouped = data.groupby(['TurbID'])dropidx = joblib.Parallel(cpu_count)(joblib.delayed(func)(group) for name, group in data_grouped)dropidx = list(itertools.chain(*dropidx))if mode == 'train':dropidx2 = joblib.Parallel(cpu_count)(joblib.delayed(func2)(group) for name, group in data_grouped)dropidx2 = list(itertools.chain(*dropidx2)) dropidx += dropidx2 idx = sorted(list(set(all_idx) - set(dropidx)))return idx