我正在寻找一种方法来缩小我的训练和测试数据的文件大小。
我想要的模型
我想训练一个模型来预测加密硬币价格是否上涨,并且在接下来的 10 分钟内 x%(0.4 左右(跳跃(即我希望模型回答是或否(。
每分钟我都会使用过去 3 小时的价格和交易量数据(这意味着 180 个数据点,每个数据点包含 5 个值打开、收盘、最高价、最低价和交易量(。
我目前的训练和测试集很大
因此,我的训练集和测试集是 csv 文件中的行,其中每行包含 5 x 180 = 900 个数字和一个标签(是或否(,大约 100k 行,我想这是一个非常庞大的数据集。
但是csv中的每一行都包含大部分冗余数据
但是csv文件中的每个"邻居"行只包含1个新数据点,因为每一行只有1分钟的"旧",因此只跳过了最旧的一分钟的数据点,而是引入了下一分钟的新点。
是否可以设置跟踪代码,以便csv文件只需要在每行中具有最新的分钟数据点?
如果使用数据API,则可以缓存输入。另外,也许TF对Kafka的支持可能会有所帮助,因为您可以将其建模为数据流。
另一种方法是在会话调用之间重用一些数据。然后你必须使用资源变量(在当前的Variable()
规范中,这意味着在构造函数中使用标志use_resource
(。这样,您的csv只能包含分钟级数据,您只需将其添加到变量中即可 - 从中创建一种圆缓冲区。
是的,您可以进行此设置,以便 CSV 文件只需要在每行中包含最新一分钟的数据。
如果 CSV 文件每行包含一个数据点,则可以按如下方式创建滑动窗口批处理:
在TF 1.12及更高版本中:
window_size = 180
dataset = tf.data.experimental.CsvDataset(filenames, defaults)
dataset = dataset.window(window_size=window_size, shift=1)
dataset = dataset.flat_map(lambda x: x.batch(window_size))
例如,如果您有一个包含元素的数据集{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
# Contains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
dataset = ...
dataset = dataset.window(window_size=3, shift=1)
dataset = dataset.flat_map(lambda x: x.batch(3))
it = dataset.make_one_shot_iterator()
nxt = it.get_next()
with tf.Session() as sess:
sess.run(nxt) # [1, 2, 3]
sess.run(nxt) # [2, 3, 4]
sess.run(nxt) # [3, 4, 5]
...etc...
在 TF 1.11 及更早版本中:
window_size = 180
dataset = tf.contrib.data.CsvDataset(filenames, defaults)
dataset = dataset.apply(tf.contrib.data.sliding_window_batch(window_size=window_size))