Tensorflow计算正确率、精确率、召回率、虚警率和漏检率

目录

1.二分类评价标准介绍

2. Tensorflow实现代码


1.二分类评价标准介绍

在进行二分类后需要对分类结果进行评价,评价的标准除了常用的正确率之外还有召回率精确度,虚警率和漏警率等。首先介绍一下最常用的正确率

正确率(Accuracy)表示政府样本被正确分类的比例,计算公式如下:

其中NTP 表示正类样本被正确分类的数目,NTN表示负类样本被正确分类的数目,NFP表示负类样本被分为正类的数目,NFN表示正类样本被分为负类的数目。

精确率(Precision)表示原本为正类样本在所有被分为正类样本(正的被分为正的+错的被分为正的)的比例

召回率(Recall)表示原本为正类样本在原本正类样本(正的被分为正的+正的被分为错的)的比例

虚警率(False alarm)表示负类样本被分为正类样本在所有负类样本中的比例

漏警率表示(Missing alarm)表示正类样本被分为负类样本在所有正类样本中的比例

2. Tensorflow实现代码

计算公式已经在第一节给出了,代码实现最难的部分不是计算而是对于数据格式的转换。本文背景为,利用保存好的模型在测试集上进行测试,然后对测试集的分分类结果进行评估。建议先看下这篇博客:Tensorflow在训练好的模型上进行测试。

直接上代码,其中函数的predict是预测结果,也就是神经网络的输出,real是真实的标签,sess就是tensorflow当前的会话,feed_dict是需要喂的数据。下面详细讲解一下代码

函数tf.argmax()返回值是是数值最大值的索引位置,如果最大值位置相同,则分类正确,反之则分类错误

    predictions = tf.argmax(predict, 1)
    actuals = tf.argmax(real, 1)

下面的代码是将上述代码获得到变量设置为元素为0或者1的矩阵,在后面计算的时候只需要按照逻辑与计算即可

    ones_like_actuals = tf.ones_like(actuals)
    zeros_like_actuals = tf.zeros_like(actuals)
    ones_like_predictions = tf.ones_like(predictions)
    zeros_like_predictions = tf.zeros_like(predictions)

后面的都是按第一节公式计算的部分

 tp_op = tf.reduce_sum(
        tf.cast(
            tf.logical_and(
                tf.equal(actuals, ones_like_actuals),
                tf.equal(predictions, ones_like_predictions)
            ),
            "float"
        )
    )

    tn_op = tf.reduce_sum(
        tf.cast(
          tf.logical_and(
            tf.equal(actuals, zeros_like_actuals),
            tf.equal(predictions, zeros_like_predictions)
          ),
          "float"
        )
    )

    fp_op = tf.reduce_sum(
        tf.cast(
          tf.logical_and(
            tf.equal(actuals, zeros_like_actuals),
            tf.equal(predictions, ones_like_predictions)
          ),
          "float"
        )
    )

    fn_op = tf.reduce_sum(
        tf.cast(
          tf.logical_and(
            tf.equal(actuals, ones_like_actuals),
            tf.equal(predictions, zeros_like_predictions)
          ),
          "float"
        )
    )

完整函数代码

def tf_confusion_metrics(predict, real, session, feed_dict):

    predictions = tf.argmax(predict, 1)
    actuals = tf.argmax(real, 1)

    ones_like_actuals = tf.ones_like(actuals)
    zeros_like_actuals = tf.zeros_like(actuals)
    ones_like_predictions = tf.ones_like(predictions)
    zeros_like_predictions = tf.zeros_like(predictions)

    tp_op = tf.reduce_sum(
        tf.cast(
            tf.logical_and(
                tf.equal(actuals, ones_like_actuals),
                tf.equal(predictions, ones_like_predictions)
            ),
            "float"
        )
    )

    tn_op = tf.reduce_sum(
        tf.cast(
          tf.logical_and(
            tf.equal(actuals, zeros_like_actuals),
            tf.equal(predictions, zeros_like_predictions)
          ),
          "float"
        )
    )

    fp_op = tf.reduce_sum(
        tf.cast(
          tf.logical_and(
            tf.equal(actuals, zeros_like_actuals),
            tf.equal(predictions, ones_like_predictions)
          ),
          "float"
        )
    )

    fn_op = tf.reduce_sum(
        tf.cast(
          tf.logical_and(
            tf.equal(actuals, ones_like_actuals),
            tf.equal(predictions, zeros_like_predictions)
          ),
          "float"
        )
    )
    tp, tn, fp, fn = session.run([tp_op, tn_op, fp_op, fn_op], feed_dict)

    tpr = float(tp)/(float(tp) + float(fn))
    fpr = float(fp)/(float(fp) + float(tn))
    fnr = float(fn)/(float(tp) + float(fn))

    accuracy = (float(tp) + float(tn))/(float(tp) + float(fp) + float(fn) + float(tn))

    recall = tpr
    precision = float(tp)/(float(tp) + float(fp))

    f1_score = (2 * (precision * recall)) / (precision + recall)

    

 

计算评价标准的函数不难,难得是调用函数,贴一下使用训练好的模型进行测试的代码,这部分可以结合:https://blog.csdn.net/sinat_35821976/article/details/80765145 来看。

with tf.Session() as sess:
    saver = tf.train.import_meta_graph('./model.ckpt.meta')
    saver.restore(sess, './model.ckpt')# .data文件
    pred = tf.get_collection('pred_network')[0]

    graph = tf.get_default_graph()
    x = graph.get_operation_by_name('x').outputs[0]
    y_ = graph.get_operation_by_name('y_').outputs[0]

    y = sess.run(pred, feed_dict={x: test_x, y_: test_y})

最后一行y,即网络输出是tensor,而实际标签test_y的类型也是ndarray。但是在函数def tf_confusion_metrics(predict, real, session, feed_dict)中predict、real需要为tensor类型,feed_dict中的数据不能为tensor类型,因此需要讲y转为ndarry类型,然后将test_y转为tensor类型,然后调用函数。具体实现如下:

predictLabel = tf.constant(y)
predictLabel =  predictLabel.eval()         # 将tensor转为ndarray
realLabel = tf.convert_to_tensor(test_y)    # 将ndarray转为tensor
tf_confusion_metrics(y, realLabel, sess, feed_dict={predict: predictLabel , real:test_y})

 

你可能感兴趣的:(机器学习,TensorFlow)