2017-08-16 13 views
4

ケラスでカスタムメトリックを実装したいと考えています。最も高い確率の上位k%がy_pred_probsであると仮定してリコールを計算します。予測値に基づくKerasカスタムリコールメトリック

numpyで私は次のようにします。 y_preds_probsをソートします。次に、k番目のインデックスの値を取得します。ノート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年代を決定するための閾値が既に知られていることを前提としています。私はアプローチを組み合わせて、可能であればKeracバックエンドでky_predに基づいてthreshold_valueを見つけることを実装したいと思います。

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 

答えて

2

私の以前の回答を引用してくれてありがとう。あなたはtensorflowバックエンドを使用している場合

この場合

、私はあなたが使用することをお勧めこのtensorflow function:それはboolsのテンソルを出力

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

は、1答えは、それならば、Kと0を先頭に属している場合しません。

詳細が必要な場合は、テンソルフローのドキュメントをリンクしています。私はそれが助けて欲しい:-)

関連する問題