テンソルフローを使用してマルチクラス分類を行うときにクラスごとの精度またはリコールを行う方法はありますか?Tensorflowの多クラス分類のための賢明な精度とリコール?
たとえば、各バッチからy_trueとy_predがある場合、クラスが2つ以上ある場合は、クラスごとに精度やリコールを行うための機能的な方法がありますか?
テンソルフローを使用してマルチクラス分類を行うときにクラスごとの精度またはリコールを行う方法はありますか?Tensorflowの多クラス分類のための賢明な精度とリコール?
たとえば、各バッチからy_trueとy_predがある場合、クラスが2つ以上ある場合は、クラスごとに精度やリコールを行うための機能的な方法がありますか?
をtensorflow使用することができます。ドキュメント(https://www.tensorflow.org/api_docs/python/tf/metrics/precision)によれば、ラベルと予測の両方がboolにキャストされるため、バイナリ分類にのみ関係しています。例をワンホットエンコードすることは可能でしょうか?それはうまくいくでしょうか?しかし、これについてはわからない。
また、これらの関数は、質問が尋ねるように、各クラスのメトリックを別々に計算しません。特定のクラスが他のクラスよりも頻繁にデータに表示される場合、これらのメトリックはそれらの頻繁なクラスによって支配されます。一般に望まれるのは、各クラスの個別の呼び出しと精度を計算し、それらをクラス全体で平均して全体的な値を得ることです( 'tf.metrics.mean_per_class_accuracy'に似ています)。これらの値は、不均衡なデータを持つ 'tf.metrics.recall'と' tf.metrics.precision'を使って得られる値とは異なる可能性があります。 – Avi
実際、私は間違っていた。 'tf.metrics.mean_per_class_accuracy'は何か違うことをしていて、この質問の良い参考資料ではありません。 – Avi
tf.metrics.precision/recall
の機能では、マルチクル精度、リコール、f1を行うことはできません。あなたは、3クラスのシナリオのために、このようsklearnを使用することができます。
from sklearn.metrics import precision_recall_fscore_support as score
prediction = [1,2,3,2]
y_original = [1,2,3,3]
precision, recall, f1 = score(y_original, prediction)
print('precision: {}'.format(precision))
print('recall: {}'.format(recall))
print('fscore: {}'.format(fscore))
これは、精度の配列を印刷リコール値が、あなたが好きなようにそれをフォーマットします。
ここでは、n = 6クラスの問題のために私のために働いている解決策です。さらに多くのクラスがある場合、この解決策はおそらく遅く、ループの代わりに何らかのマッピングを使用する必要があります。
テンソルlabels
の行に1つのホットエンコードされたクラスラベルがあり、テンソルlabels
のロジット(またはポスト)があるとします。 tf.metrics.recall
内で、変数labels
とpredictions
は、機能の使用を可能にする2変数の場合、のように、ブールベクトルに設定されていることを
y_true = tf.argmax(labels, 1)
y_pred = tf.argmax(logits, 1)
recall = [0] * n
update_op_rec = [[]] * n
for k in range(n):
recall[k], update_op_rec[k] = tf.metrics.recall(
labels=tf.equal(y_true, k),
predictions=tf.equal(y_pred, k)
)
注:n
はクラスの数であればその後、これを試してみてください。
これらの関数は、質問が尋ねるように、各クラスごとにメトリックを個別に計算しません。 – Avi