基于预测值的 Keras 自定义召回指标

Posted

技术标签:

【中文标题】基于预测值的 Keras 自定义召回指标【英文标题】:Keras custom recall metric based on predicted values 【发布时间】:2018-01-25 00:05:44 【问题描述】:

我想在 keras 中实现一个自定义指标,假设前 k% 最可能的 y_pred_probs 为真,计算召回率。

numpy 我会这样做。对 y_preds_probs 进行排序。然后取kth 索引处的值。注意k=0.5 会给出中间值。

kth_pos = int(k * len(y_pred_probs))
threshold = np.sort(y_pred_probs)[::-1][kth_pos]
y_pred = np.asarray([1 if i >= threshold else 0 for i in y_pred_probs])

来自Keras custom decision threshold for precision and recall 的答案非常接近,但假设决定哪些y_pred 被假定为真的阈值是已知的。如果可能,我想结合这些方法并在 Keras 后端实现基于ky_pred 的阈值值。

def recall_at_k(y_true, y_pred):
    """Recall metric.
    Computes the recall over the whole batch using threshold_value from k-th percentile.
    """
    ###
    threshold_value = # calculate value of k-th percentile of y_pred here
    ###

    # Adaptation of the "round()" used before to get the predictions. Clipping to make sure that the predicted raw values are between 0 and 1.
    y_pred = K.cast(K.greater(K.clip(y_pred, 0, 1), threshold_value), K.floatx())
    # Compute the number of true positives. Rounding in prevention to make sure we have an integer.
    true_positives = K.round(K.sum(K.clip(y_true * y_pred, 0, 1)))
    # Compute the number of positive targets.
    possible_positives = K.sum(K.clip(y_true, 0, 1))
    recall_ratio = true_positives / (possible_positives + K.epsilon())
    return recall_ratio

【问题讨论】:

【参考方案1】:

感谢您引用我之前的回答。

在这种情况下,如果你使用的是 tensorflow 后端,我建议你使用这个tensorflow function:

tf.nn.in_top_k(
    predictions,
    targets,
    k,
    name=None
)

它输出一个布尔张量,如果答案属于前 k 个,则为 1,如果不属于,则为 0。

如果您需要更多信息,我已经链接了 tensorflow 文档。我希望它有所帮助。 :-)

【讨论】:

以上是关于基于预测值的 Keras 自定义召回指标的主要内容,如果未能解决你的问题,请参考以下文章

Keras 中基于输入数据的自定义损失函数

:keras中的评估指标及自定义评估指标

如何在 keras 模型中实现汉明损失作为自定义指标

Tensorflow 2.0:自定义 keras 指标导致 tf.function 回溯警告

使用 Keras 为损失函数构建自定义指标,但有错误

keras:如何编写自定义的损失函数来聚合帧级预测到歌曲级预测