【问题标题】:Calculating AUC per group in tensorflow 2.0在 tensorflow 2.0 中计算每组的 AUC
【发布时间】:2021-09-18 17:59:01
【问题描述】:

我们有一个简单的用户数据集 U 和项目 I 和二元结果 Y。数据集很大(100K 用户、10M 项目、1.5B 交互)并且按时间顺序排列。我们正在训练一些模型,比如说一个简单的 MF 模型,它可以为我们提供预测 f(U, I) = Yhat

训练完成后,我们希望得到曲线下的面积。所以我们想要将项目i 映射到AUC。现在使用映射器{i: tf.keras.metrics.AUC} 并屏蔽每个批次的答案会给我们带来内存错误。组合的 AUC 对象(每个项目一个)太大。

有效的是为每个项目保存另一个数据集并进行预测,保存 AUC 等。但是,我们不希望创建两个数据集。关于我们如何处理这样的事情有什么建议吗?

【问题讨论】:

    标签: python tensorflow auc


    【解决方案1】:

    我自己也遇到过这个问题。您想针对 x 中的信息对指标执行 groupby 操作,但该信息不在 y 或 y_hat 中。

    度量就像损失一样,它们只能看到 y_true 和 y_hat。由于有关 U 和 I 的信息未提供给损失/指标,因此您没有足够的信息来构建执行此分组的自定义指标。

    解决此问题的一个困难方法是围绕您的真实模型构建一个模型,该模型序列化 y_hat、U 和 I。然后您的自定义指标可以反序列化 y_hat、U 和 I,并以分组方式存储信息。如果将每个项目的 AUC 定义为每次交互的 AUC 的平均值,那么它就足够紧凑,可以存储在内存中。如果没有,那么您可能需要在自定义指标中将信息存储到磁盘。我建议使用 gdbm,它在 python 中有一个简单的界面。

    
    
    def serialize(u, i, y):
      return tf.concat(
          [tf.reshape(u, [-1]),
           tf.reshape(i, [-1]),
           tf.reshape(y, [-1])])
    
    
    def deserialize(s):
      u = tf.reshape(s[:xyz], [..., ..., ...])
      i = tf.reshape(s[xyz, abc], [..., ..., ...])
      y = tf.reshape(s[abc:], [..., ..., ...])
    
      return u, i, y
    
    def AUCPerItem(tf.keras.metrics.Metric):
      def __init__(self):
        self.auc_per_item = {}
    
      def update(y_true, y_pred):
        for serialized_example in y_pred:
          u, i, y = deserialize(serialized_example)
          # do calcualtions and store in self.auc_per_item
    
    
    # Model takes U and I as inputs, and outputs y_hat.
    model = get_and_train_model()
    
    input_u = tf.keras.Input(...)
    input_i = tf.keras.Input(...)
    y_hat = model(input_u, input_i)
    output = serialize(input_u, input_i, y_hat)
    
    wrapper = tf.keras.Model([input_u, input_i], output)
    
    

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 2021-10-07
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2016-10-01
      • 2011-06-21
      • 2019-11-16
      • 2020-05-23
      相关资源
      最近更新 更多