Keras custom decision threshold for precision and recall

前端 未结 1 1262
甜味超标
甜味超标 2020-12-25 09:06

I\'m doing a binary classification using Keras (with Tensorflow backend) and I\'ve got about 76% precision and 70% recall. Now I want to try to pla

1条回答
  •  旧时难觅i
    2020-12-25 09:45

    create custom metrics like this :

    Edited thanks to @Marcin : Create functions that returns the desired metrics with threshold_value as argument

    def precision_threshold(threshold=0.5):
        def precision(y_true, y_pred):
            """Precision metric.
            Computes the precision over the whole batch using threshold_value.
            """
            threshold_value = threshold
            # 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)))
            # count the predicted positives
            predicted_positives = K.sum(y_pred)
            # Get the precision ratio
            precision_ratio = true_positives / (predicted_positives + K.epsilon())
            return precision_ratio
        return precision
    
    def recall_threshold(threshold = 0.5):
        def recall(y_true, y_pred):
            """Recall metric.
            Computes the recall over the whole batch using threshold_value.
            """
            threshold_value = threshold
            # 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
        return recall
    

    now you can use them in

    model.compile(..., metrics = [precision_threshold(0.1), precision_threshold(0.2),precision_threshold(0.8), recall_threshold(0.2,...)])
    

    I hope this helps :)

    0 讨论(0)
提交回复
热议问题