我正在处理一个时间序列问题,其中有多个可能相关的数据集,其中的样本带有时间戳并具有一定的回溯度。
我的最终目标是从本质上修改我的损失,使任何正数成为“边”。
当我决定合并/改组数据时,我已经意识到问题的本质使我陷入一些完整性问题。
该模型可以根据以下内容部分推断输出:
1)样本的相似性(即,向前一个步骤的样本看起来与当前时间戳几乎相同,并且它们的输出也将有些相似)。
2)数据集之间的交叉引用,因为可以关联数据集。就是为模型提供特定时间戳的输出将使模型具有有关不同数据集的相同时间戳的信息。
由于这两个因素,我需要按时间戳划分验证数据,并提供足够的填充(回溯长度),以使样本不会重叠。例如,这意味着我将以最近一个月的数据作为验证数据,通过将之前的X个样本扔掉等于回溯长度来填充它,然后将所有先前的样本用于训练。>
这里有一些代码可以创建此填充,然后按时间戳对样本进行排序
SECONDS_IN_DAY = 86400
train_timestamp_end = int(time.time() - (SECONDS_IN_DAY * (days_of_validation + lookback_len)))
val_timestamp_start = train_timestamp_end + int(lookback_len * SECONDS_IN_DAY)
def val_sort(sample, output, train_X, train_Y, validation_X, validation_Y):
# first feature is timestamp
timestamp = sample[0]
if timestamp < train_timestamp_end:
train_X.append(sample)
train_Y.append(output)
elif timestamp > val_timestamp_start:
validation_X.append(sample)
validation_Y.append(output)
当我在火车时间戳上使用max()并在验证时间戳上使用min()时,我可以看到我的数据确实正确分开并且没有重叠。
我的问题是,这似乎是解决这些问题的正确方法吗?还有我没有考虑的其他问题吗?
这在某种程度上是一个单独的问题...我的数据以零为中心,我是否尝试设置基线,以便如果我的损失低于基线,则我的模型预测的结果好于平均值。对于我的输出,我的输出的本质是零中心,尽管实际上它实际上偏向一个方向。我现在正在做的是获取火车输出的平均值,并且我还将计算验证输出的平均值。然后,我将进行验证和培训损失,并将其与这些基准进行比较。就是如果从火车基线减去的火车损失为正,则表示我的模型具有“边”。
这是计算基线的代码(分别用于训练和验证输出)
def compute_baseline(actual):
avg = sum(actual) / len(actual)
averaged = []
for x in range(len(actual)):
averaged.append(avg)
return tf.Session().run(K.mean(K.abs(averaged - actual)))
计算基线后,我可以执行以下操作来获得模型相对于平均值的%优势。我不确定百分比优势是否是最好的方法,但是无论哪种方式,我的目标都是通过积极的指标来表明优势。
def mod_loss_hist(hist, baseline):
mod_hist = []
for x in range(len(hist)):
mod_hist.append(baseline / hist[x] - 1)
return mod_hist
这是正确的方法吗?这样可以完成我想要的吗?