Ich würde gerne eine benutzerdefinierte Metrik in Keras, die den Rückruf berechnet unter der Annahme, dass die oberen k% höchstwahrscheinlich y_pred_probs
sind wahr.Keras benutzerdefinierte Rückruf Metrik basierend auf vorhergesagten Werte
In numpy
würde ich es tun, wie folgt. Sortiere die y_preds_probs. Dann nimm den Wert unter k
Index. Hinweis k=0.5
würde den Medianwert geben.
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])
Die Antwort aus: Keras custom decision threshold for precision and recall ist ganz in der Nähe, aber davon ausgeht, dass der Schwellenwert für die Entscheidung, welche y_pred
ist wahr angenommen ist bereits bekannt. Ich würde gerne die Ansätze kombinieren und implementieren das Finden der Schwelle_Wert basierend auf k
und y_pred
ist im Keras-Backend, wenn möglich.
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