3

私はKerasを使用したマルチクラス分類問題に取り組んでおり、バイナリ精度とカテゴリ精度をメトリックとして使用しています。私のモデルを評価すると、私はバイナリの精度が非常に高く、カテゴリの精度がかなり低いです。私は自分のコードでバイナリ精度メトリックを作り直そうとしましたが、大したことはありません。私の理解では、これは私が再作成する必要があるプロセスであるということである。ここではKerasバイナリ精度メトリックの精度が高すぎます

def binary_accuracy(y_true, y_pred): 
    return K.mean(K.equal(y_true, K.round(y_pred)), axis=-1) 

は私のコードです:

from keras import backend as K 
preds = model.predict(X_test, batch_size = 128) 

print preds 
pos = 0.00 
neg = 0.00 

for i, val in enumerate(roundpreds): 

    if val.tolist() == y_test[i]: 
     pos += 1.0 

    else: 
     neg += 1.0 

print pos/(pos + neg) 

しかし、これはバイナリ精度によって与えられたものよりもはるかに低い値を示します。バイナリの精度は、マルチクラスの問題で使用する適切な指標でもありますか?もしそうなら誰も私がどこに間違っているのか知っていますか?

+3

マルチクラスの問題にバイナリ精度を使用しないでください。結果は意味をなさないでしょう。 –

答えて

2

したがって、binary_crossentropyを複数の予測に適用するとどうなるかを理解する必要があります。

  1. はのはsoftmaxから、あなたの出力は(0.1, 0.2, 0.3, 0.4)とワンホットエンコードされたグランドトゥルースが(1, 0, 0, 0)であると仮定しよう。
  2. binary_crossentropyは、0.5より高いすべての出力をマスクするので、ネットワークの外は(0, 0, 0, 0)ベクトルに変わります。 4つの指標のうちの3に真実(1, 0, 0, 0)を接地
  3. (0, 0, 0, 0)マッチ - これは完全に間違った答えため75%のレベルに精度を結果になります!

これを解決するには、単一のクラス精度を使用できます。

def single_class_accuracy(interesting_class_id): 
    def fn(y_true, y_pred): 
     class_id_preds = K.argmax(y_pred, axis=-1) 
     # Replace class_id_preds with class_id_true for recall here 
     positive_mask = K.cast(K.equal(class_id_preds, interesting_class_id), 'int32') 
     true_mask = K.cast(K.equal(y_true, interesting_class_id), 'int32') 
     acc_mask = K.cast(K.equal(positive_mask, true_mask), 'float32') 
     class_acc = K.mean(acc_mask) 
     return class_acc 

    return fn 
+0

私の答えはあなたを助けましたか?はいの場合 - 私は受け入れ、upvote :) –

関連する問題