用tensorflow画ROC曲线

本文介绍了如何使用TensorFlow绘制ROC曲线。首先准备CSV数据,包含ID、预测分数和标签。然后通过Python程序`tf_roc.py`处理数据,设置精度参数。运行TensorBoard并查看结果,虽然TensorBoard不直接支持散点图,但通过调整`global_step`和数据比例,可以在TensorBoard中展示ROC曲线的关键信息。


1. 先准备好你的数据文件,csv格式,该文件共3列,第一列是数据id,第2列是预测分数(0到1),第3列是数据的label(0或1)

2. 运行下面的python程序:python tf_roc.py /tmp/predict_label.csv 200 /tmp/tb_roc

3. 其中第2个参数200表示画ROC曲线的精度,越大,曲线越精细。

4. 启动tensorboard: tensorboard --logdir=/tmp/tb_roc

5. 打开浏览器http://127.0.0.1:6006/, 结果如下图



6. 关于画图方法。其实tensorboard无法画散点图。因此这里采用SummaryWriter的add_summary中第2个参数global_step来替代ROC中的横坐标fpr。globa_step原来是用来表示训练时的迭代次数的。为了能在tb中显示出来,需要把tpr放大100倍,或是1000倍。

7. 代码如下

import sys
import tensorflow as tf

class tf_roc():
    def __init__(self, predict_label_file, threshold_num, save_dir):
        '''file format: dataid,predict_score,label
        the predict_score should be between 0 and 1
        the label should be 0 or 1
        threshold_num: number of threshold will plot'''
        #load predict_label_file to predicts and labels
        fd = open(predict_label_file)
        fdl = fd.readline()
        self.predicts = []
        self.labels = []
        self.total = 0
        while len(fdl) > 0:
            val = fdl.split(',')
            self.predicts.append(float(val[1])) 
            self.labels.append(True if int(val[2]) == 1 else False) 
            fdl = fd.readline()
            self.total += 1
        fd.close()
        self.threshold_num = threshold_num
        self.trues = 0 #total of True labels 
        self.fpr = [] #false positive
        self.tpr = [] #true positive
        self.ths = [] #thresholds
        self.save_dir = save_dir
        self.writer = tf.train.SummaryWriter(self.save_dir)

    def calc(self):
        for label in self.labels:
            if label:
                self.trues += 1
        threshold_step = 1. / self.threshold_num
        for t in range(self.threshold_num + 1):
            th = 1 - threshold_step * t
            tn, tp, fp, fpr, tpr = self._calc_once(th)
            self.fpr.append(fpr)
            self.tpr.append(tpr)
            self.ths.append(th)
            self._save(fpr, tpr)
        print self.fpr
        print self.tpr
        print self.ths

    def _save(self, fpr, tpr):
        summt = tf.Summary()
        summt.value.add(tag="roc", simple_value = tpr)
        self.writer.add_summary(summt, fpr * 100) #for tensorboard step drawable
        self.writer.flush()

    def _calc_once(self, t):
        fp = 0
        tp = 0
        tn = 0
        for i in range(self.total):
            if not self.labels[i]:
                if self.predicts[i] >= t:
                    fp += 1
                else:
                    tn += 1
            elif self.predicts[i] >= t:
                tp += 1
        #fpr = fp / float(fp + tn) #precision
        fpr = fp / float(fp + tp) #detection
        tpr = tp / float(self.trues)
        return tn, tp, fp, fpr, tpr

        
if __name__ == '__main__':
    predict_label_file, threshold_num, save_dir = sys.argv[1:4]
    roc = tf_roc(predict_label_file, int(threshold_num), save_dir)
    roc.calc()


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mao_feng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值