2017-08-16 8 views
4

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 

Antwort

2

Danke für das Zitieren meiner vorherigen Antwort.

In diesem Fall, wenn Sie tensorflow Backend verwenden, würde ich Ihnen diese tensorflow function verwenden vorschlagen:

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

Es einen Tensor bools ausgibt, 1, wenn die Antwort gehört k und 0, wenn es nach oben nicht.

Wenn Sie weitere Informationen benötigen, habe ich die Tensorflow-Dokumentation verknüpft. Ich hoffe, es hilft. :-)

Verwandte Themen