如何根据标签过滤和平衡带有二元分类标签的 Windowed Tensorflow 数据集?

How can I filter and balance a Windowed Tensorflow dataset with a binary classification label, based on the label?

我有一个带有标签的不平衡张量流 windowed 数据集(超过 90% 的负面例子),我试图通过过滤来平衡它。我在过滤时遇到问题,因为我的带标签的 windowed 数据集不属于我在搜索或 tensorflow 文档中遇到的情况。

我正在开发一个模型来预测基于时间序列数据的二元分类。我从一个包含多列(价格、交易量等)的时间序列数据框开始,其中每一行都是一分钟。

目前我仍然停留在过滤不同的标签上。过滤后的下一步是获取两个过滤后的数据集的大小,找到较小的大小 (n),然后在对较大的数据集进行洗牌后,将较小的数据集与较大数据集中的 (n) 个元素连接起来。这样我就会有一个平衡的数据集,其中包含相同数量的 1 和 0 标签。如果您有更好的想法,我会很高兴听到。

解释我的代码: DFrame 是一个 pandas dataframe,包含价格、交易量等列,每一行都是不同的分钟,第一行是 earliest/oldest 时间段。 DFrame 的最后一列是分类器 0 或 1。

然后我从切片创建一个张量流数据集,第一个输入是所有 DFrame 列,除了最后一列中的标签,第二个输入(标签)是最后一列是分类器。

然后我使用 window 函数创建 windows 大小(事后看来),目前是 512,这意味着(如果我没记错的话)它需要前 511 分钟以及当前分钟并将其用作滚动 window 以与当前分钟的标签相关联。所以我的理解是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)