如何使用Tensorflow和scikit-learn绘制ROC曲线?

时间:2016-04-29 13:13:35

标签: python scikit-learn tensorflow roc

我试图从tensorflow提供的CIFAR-10示例的修改版本绘制ROC曲线。它现在有2个班而不是10个班。

网络的输出称为logits,其格式为:

  

[[ - 2.57313061 2.57966399] [0.04221377 -0.04033273] [-1.42880082   1.43337202] [-2.7692945 2.78173304] [-2.48195744 2.49331546] [2.0941515 -2.10268974] [-3.51670194 3.53267646] [-2.74760485 2.75617766] ...]

首先,这些logits实际代表什么?网络中的最后一层是" softmax linear"形式WX + b。

该模型可以通过调用

来计算准确度
top_k_op = tf.nn.in_top_k(logits, labels, 1)

然后在图表初始化后:

predictions = sess.run([top_k_op])
predictions_int = np.array(predictions).astype(int)
true_count += np.sum(predictions) 
...
precision = true_count / total_sample_count

这很好用。

但是现在如何从中绘制ROC曲线?

我一直在尝试" sklearn.metrics.roc_curve()"功能(http://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_curve.html#sklearn.metrics.roc_curve),但我不知道如何使用我的" y_score"参数。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

'y_score'这里应该是一个数组,对应于每个样本被分类为正数的概率(如果你的y_true数组中标记为1则为正)

实际上,如果您的网络使用Softmax作为最后一层,那么模型应输出此实例的每个类别的概率。但是您在此处提供的数据不符合此格式。我检查了示例代码:https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10.py 它似乎使用了名为softmax_linear的层,我对这个例子知之甚少,但我想你应该用Logistic Function处理输出,把它变成概率。

然后将它与您的真实标签'y_true'一起提供给scikit-learn函数:

y_score = np.array(output)[:,1]
roc_curve(y_true, y_score)

答案 1 :(得分:-1)

import tensorflow as tf
tp = [] # the true positive rate list
fp = [] # the false positive rate list
total = len(fp)
writer = tf.train.SummaryWriter("/tmp/tensorboard_roc")
for idx in range(total):
    summt = tf.Summary()
    summt.value.add(tag="roc", simple_value = tp[idx])
    writer.add_summary (summt, tp[idx] * 100) #act as global_step
    writer.flush ()

然后开始张量板:

tensorboard --logdir=/tmp/tensorboard_roc

tensorboard_roc

有关详细信息和代码,您可以访问我的博客:http://blog.csdn.net/mao_feng/article/details/54731098