اذهب إلى المحتوى
  • 0

كيفية حساب ال Precision و Recall و F1 score في تنسرفلو Tensorflow

عامر ابراهيم

السؤال

Recommended Posts

  • 1

في تنسرفلو يمكنك حسابهم بالشكل التالي اعتماداً على الصيغة العامة لهم:
1.png.d499a3cd5c5523c69990a3e61b8dec9b.png

بعد حساب القيم المتوقعة y_pred نقوم بحساب ال TP و TN و FP و FN ونستخدم الدالة count_nonzero للقيام بذلك:

TP = tf.count_nonzero(y_pred  * y_true)
TN = tf.count_nonzero((y_pred - 1) * (y_true - 1))
FP = tf.count_nonzero(y_pred * (y_true - 1))
FN = tf.count_nonzero((y_pred - 1) * y_true)

ثم نقوم بتطبيق القوانين السابقة مباشرةً:

precision = TP / (TP + FP)
recall = TP / (TP + FN)
f1 = 2 * precision * recall / (precision + recall)

عموماً إذا لم تكن تستخدم graph فيمكنك أيضاً استخدام التوابع الجاهزة في sklearn لذا سأترك لك روابط لهم:

في الرابط هنا تجد شرح لل TP و ال TN إلخ..

 

تم التعديل في بواسطة Ali Haidar Ahmad
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

كما أوضح علي في الإجابة، فان المعادلات تلخص كل شئ، حيث أنه لحساب f1-score يجب حساب  precision وكذلك recall لذا فانه تمثل الموازنه بين الطريقتين ، وهي مناسبة للغاية اذا كنت تريد اختيار النموذج بناء على التوازن بين الحسابتين.

وتتميز f1-score بانها تحقق التوازن بين نسبة القيم الصحية التي تم توقعها بالنسبة للعدد الايجابي الكلى precision وهي دقة النموذج  و نسبة القيم الصحيحة التي تم توقعها بالنسبة للقيم الصحيحة كلها وهي recall  تعبر عن مدى اكتمال النموذح، لذلك فهي تعتبر طريقة مهمة للقياس.

وهي تتواجد في tensorflow مباشرة كالتالي:

tfa.metrics.F1Score(
    num_classes: tfa.types.FloatTensorLike,
    average: str = None,
    threshold: Optional[FloatTensorLike] = None,
    name: str = 'f1_score',
    dtype: tfa.types.AcceptableDTypes = None
)

مثال لكيفية استخدامها كالتالي:

metric = tfa.metrics.F1Score(num_classes=3, threshold=0.5)
y_true = np.array([[1, 1, 1],
                   [1, 0, 0],
                   [1, 1, 0]], np.int32)
y_pred = np.array([[0.2, 0.6, 0.7],
                   [0.2, 0.6, 0.6],
                   [0.6, 0.8, 0.0]], np.float32)
metric.update_state(y_true, y_pred)
result = metric.result()
result.numpy()

>>> [ 0.5 , 0.8 , 0.66666667 ] 

وبداخل النموذج يمكنك استخدامها كالتالي:
 

  pred = multilayer_perceptron(x, weights, biases)
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

    with tf.Session() as sess:
    init = tf.initialize_all_variables()
    sess.run(init)
    for epoch in xrange(150):
            for i in xrange(total_batch):
                    train_step.run(feed_dict = {x: train_arrays, y: train_labels})
                    avg_cost += sess.run(cost, feed_dict={x: train_arrays, y: train_labels})/total_batch         
            if epoch % display_step == 0:
                    print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(avg_cost)

    #metrics
    y_p = tf.argmax(pred, 1)
    val_accuracy, y_pred = sess.run([accuracy, y_p], feed_dict={x:test_arrays, y:test_label})

    print "validation accuracy:", val_accuracy
    y_true = np.argmax(test_label,1)
    print "Precision", sk.metrics.precision_score(y_true, y_pred)
    print "Recall", sk.metrics.recall_score(y_true, y_pred)
    print "f1_score", sk.metrics.f1_score(y_true, y_pred)
    print "confusion_matrix"
    print sk.metrics.confusion_matrix(y_true, y_pred)
    fpr, tpr, tresholds = sk.metrics.roc_curve(y_true, y_pred)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...