我有一个不平衡的张量流窗口数据集,带有标签(超过 90% 的反例),我试图通过过滤来平衡。我在过滤时遇到问题,因为我的带有标签的窗口数据集不属于我在搜索中遇到的情况或 tensorflow 文档。
我正在研究基于时间序列数据预测二元分类的模型。我从一个时间序列数据帧开始,其中包含许多列(价格、交易量等),其中每一行是一分钟。
目前我仍然坚持过滤不同的标签。过滤后的下一步是获取两个过滤数据集的大小,找到较小的大小 (n),然后在对较大的数据集进行混洗后,将较小的数据集与较大的数据集中的 (n) 个元素连接起来。这样我就会有一个平衡的数据集,其中有相同数量的 1 和 0 标签。如果您有更好的想法,我会很高兴听到。
解释我的代码: DFrame 是一个包含价格、数量等列的 Pandas 数据框,每一行是不同的分钟,第一行是最早/最旧的时间段。DFrame 的最后一列是分类器 0 或 1。
然后我从切片创建一个 tensorflow 数据集,第一个输入是除最后一列中的标签外的所有 DFrame 列,第二个输入(标签)是最后一列,即分类器。
然后我使用窗口函数创建大小(事后看来)的窗口,当前为 512,这意味着(如果我没记错的话)它需要前 511 分钟以及当前分钟,并将其用作滚动窗口来关联当前分钟的标签。所以我的理解是x然后是512个数组的数组,从当前分钟的行到511分钟前的行,y是当前分钟的标签。所以 x 是一个包含 512 个数组的数组(每分钟的行,来自数据帧),而 y 只是一个整数,1 或 0。
理想情况下,我希望能够将相同的平衡逻辑应用于多类分类问题,我基本上为额外的价格变动范围添加了额外的标签。
错误来自过滤器。该模型似乎没有那个就可以运行,甚至可以训练我的 keras 模型。正如所解释的,一旦我开始使用过滤器来平衡数据集,我实际上想在过滤器之后添加更多代码,但我需要先过滤它。
tensor= tf.data.Dataset.from_tensor_slices((tf.constant(DFrame[DFrame.columns.values[:-1]].values), tf.constant(DFrame[DFrame.columns.values[-1]].values)))
tensor = tensor.window(hindsight,1,1,True)
tensor = tensor.shuffle(1000)
tensor = tensor.filter(lambda x,y: tf.equal(y, 0))
tensor = tensor.flat_map(lambda x,y:tf.data.Dataset.zip((x.batch(hindsight), y.batch(1))))
tensor = tensor.batch(Batch_size).prefetch(1)
TypeError: Failed to convert object of type <class 'tensorflow.python.data.ops.dataset_ops._VariantDataset'> to Tensor. Contents: <_VariantDataset shapes: (), types: tf.int64>. Consider casting elements to a supported type.
想通了,必须在平面地图之后执行过滤器,并为谓词指定 y[0] 而不仅仅是 y
def Tensify (dataframe, hindsight):
tensor = tf.data.Dataset.from_tensor_slices((tf.constant(dataframe[dataframe.columns.values[:-1]].values), tf.constant(dataframe[dataframe.columns.values[-1]].values)))
tensor = tensor.window(hindsight,1,1,True)
tensor = tensor.flat_map(lambda x,y: tf.data.Dataset.zip((x.batch(hindsight), y.batch(1))))
return tensor
def BalanceTensor(tensor, npos):
positive = tensor.filter(lambda x,y: tf.math.equal(y[0],1))
negative = tensor.filter(lambda x,y: tf.math.equal(y[0],0))
negative = negative.shuffle(1000)
negative = negative.take(npos)
tensor = positive.concatenate(negative)
return tensor
tensor = Tensify(DFrame, hindsight)
tensor = BalanceTensor(tensor, sum(DFrame["target"]))
tensor = tensor.shuffle(1000)
tensor = tensor.batch(Batch_size).prefetch(1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句