目录
1.二分类评价标准介绍
2. Tensorflow实现代码
在进行二分类后需要对分类结果进行评价,评价的标准除了常用的正确率之外还有召回率精确度,虚警率和漏警率等。首先介绍一下最常用的正确率
正确率(Accuracy)表示政府样本被正确分类的比例,计算公式如下:
其中NTP 表示正类样本被正确分类的数目,NTN表示负类样本被正确分类的数目,NFP表示负类样本被分为正类的数目,NFN表示正类样本被分为负类的数目。
精确率(Precision)表示原本为正类样本在所有被分为正类样本(正的被分为正的+错的被分为正的)的比例
召回率(Recall)表示原本为正类样本在原本正类样本(正的被分为正的+正的被分为错的)的比例
虚警率(False alarm)表示负类样本被分为正类样本在所有负类样本中的比例
漏警率表示(Missing alarm)表示正类样本被分为负类样本在所有正类样本中的比例
计算公式已经在第一节给出了,代码实现最难的部分不是计算而是对于数据格式的转换。本文背景为,利用保存好的模型在测试集上进行测试,然后对测试集的分分类结果进行评估。建议先看下这篇博客: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})