【问题标题】:How can I filter and balance a Windowed Tensorflow dataset with a binary classification label, based on the label?如何根据标签过滤和平衡带有二进制分类标签的 Windowed Tensorflow 数据集?
【发布时间】:2019-08-06 13:08:36
【问题描述】:

我有一个带有标签的不平衡张量流窗口数据集(超过 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.

【问题讨论】:

    标签: tensorflow tensorflow-datasets


    【解决方案1】:

    想通了,必须在平面地图之后执行过滤,并指定 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 2020-10-23
      • 2021-04-19
      • 2017-11-03
      • 1970-01-01
      • 2017-11-08
      • 2014-06-05
      • 2018-09-13
      相关资源
      最近更新 更多