tensorflow - Keras 中填充输出的 F1 分数

标签 tensorflow machine-learning scikit-learn keras metrics

我在 Keras 中有 LSTM 序列标记器,用于高度不平衡的数据。因此,我想使用(多类)F1 分数作为模型的主要指标。我有两个问题:

1) 我在数据中使用零填充(因此在我的嵌入中使用 mask_zero=True),并且自动计算屏蔽数据的所有损失。但是,我认为必须手动完成屏蔽才能进行自定义指标计算?有没有有效的矢量化解决方案?

2)是否可以通过sklearn's f1_score implementation进入模型的编译(也许在以某种方式包装之后)?立即,它不起作用,因为显然是一个占位符而不是一个 numpy 数组传递给它(我使用 tensorflow 后端..)

[UPD] 鉴于我的实现,现在存在这个问题:我不确定是否也有可能屏蔽模型的输出。 因为如果我们不关心“pad”输入位置的模型输出(它们无论如何都不会造成损失),那么输出中也可能存在一些随机垃圾,这会影响 F1 指标。理想情况下也只有零。

最佳答案

切换到以下内容(基于 this code ):

import numpy as np
from keras.callbacks import Callback
from sklearn.metrics import f1_score


class ZeroPaddedF1Score(Callback):
    def on_train_begin(self, logs={}):
        self.val_f1s = []


    def on_epoch_end(self, epoch, logs={}):
        y_true = np.argmax(self.validation_data[1], axis=-1)
        y_pred = np.argmax(self.model.predict(self.validation_data[0]), axis=-1)
        val_f1 = zero_padded_f1(y_true, y_pred)
        self.val_f1s.append(val_f1)
        print ' - val_f1: %f' % (val_f1)


def zero_padded_f1(y_true, y_pred):
    y_pred_flat, y_true_flat = [], []
    for y_pred_i, y_true_i in zip(y_pred.flatten(), y_true.flatten()):
        if y_true_i != 0:
            y_pred_flat.append(y_pred_i)
            y_true_flat.append(y_true_i)
    result = f1_score(y_true_flat, y_pred_flat, average='macro')
    return result

它可能无法与 model.compile 一起使用(因为它使用 numpy 数组进行操作,因此是一个已经编译的模型),但它作为回调来完成这项工作。

关于tensorflow - Keras 中填充输出的 F1 分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49825670/

相关文章:

machine-learning - 基于词袋模型的快速 k-NN 搜索

r - 如何执行训练、测试和验证集来进行预测

python - 编写在 Python 中使用的并行 C/C++ 模块的最简单方法

Scipy 稀疏 CSR 矩阵到 TensorFlow SparseTensor - Mini-Batch 梯度下降

tensorflow - 使用tf.metrics.mean_absolute_error时,获取 'AttributeError: '元组'对象没有属性 'dtype''

python - 输入和输出之间的相关熵

python - 合并数字和文本特征以进行类别分类

python - 使用 Python 进行套索回归 : Simple Question

tensorflow - SQuAD 挑战中的 EM 分数

python - tensorflow 稀疏分类交叉熵与 logits