roc auc总结

一、ROC,AUC是什么?

ROC的全称是Receiver Operating Characteristic Curve,中文名字叫“受试者工作特征曲线”。
ROC曲线下的面积就是AUC(Area Under the Curve)。
在这里插入图片描述

#二分类混淆矩阵如下:
在这里插入图片描述
该曲线的横坐标为假阳性率(False Positive Rate, FPR),FPR= FP/(TN+FP) = 1- TN/(TN+FP)= 1- 特异性。
注:特异性 = TN / (TN+FP)
纵坐标为真阳性率(True Positive Rate, TPR),TPR = TP/(TP+FN) = Recall。

二、ROC怎么画?

ROC的x轴是误诊率,y轴是漏诊率。可是一个分类器只可能得到一个数字,如何画出那条曲线呢?
步骤如下:

  1. 将分类器预测为正例的概率从小到大排序;
  2. 把每两个样本间的概率作为阈值,小于该阈值的分为负例,大于该阈值的分为正例;
  3. 分别计算TPR和FPR;
  4. 转步骤2;
  5. 当所有阈值都被枚举完之后,获得一组(TPR, FPR)的坐标点,将他们画出来。

三、ROC,AUC有什么用?

AUC用于衡量“二分类问题”机器学习算法的性能(泛化能力)。

四、二分类 & 多分类的ROC曲线:python实现

#二分类

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.metrics import confusion_matrix
import os

path = "D:/bert_pred/"
test_data = pd.read_csv(os.path.join(path, "predicate_score_value20201225.csv"), engine = 'python', encoding = 'gbk')
label = [1, 0]
label_lst = list(test_data['label'])
label_lst = [int(j) for j in label_lst]

#混淆矩阵
pred_label = list(test_data['pred_label'])
cm = confusion_matrix(label_lst, pred_label, labels = [1, 0])
print("混淆矩阵为:\n", cm)

fpr, tpr, thresholds = metrics.roc_curve(y_test, pred_label)
auc = metrics.auc(fpr, tpr)
print("AUC : ", auc)
plt.figure()
plt.plot([0, 1], [0, 1], 'b--')
plt.plot(fpr, tpr, 'ro--', label='BERT(area = {:.3f})'.format(auc))
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC curve')
plt.legend(loc='best')
plt.show()

在这里插入图片描述

#多分类及多标签

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import label_binarize
import os
import luckycat

path = "D:/bert_pred/"
test_data = pd.read_csv(os.path.join(path, "predicate_score_value20201218.csv"), engine = 'python', encoding = 'gbk')

label = ['上游', '下游', '其他']
label_data = list(np.array(test_data['label']))
label_lst = []
for j in label_data:
    label_lst.append((j,))
label_lst
#混淆矩阵
pred_label = list(test_data['pred_label'])
cm = confusion_matrix(label_lst, pred_label, labels = ['上游', '下游', '其他'])
print("混淆矩阵为:\n", cm)

pred_score = list(np.array(test_data['pred_score']))
y_score = []
for i in range(len(pred_score)):
    y_score.append(pred_score[i].strip().split(' '))

pre_score = []
for i in range(len(y_score)):
    pre_score.append([float(i) for i in y_score[i]])
pre_score = np.array(pre_score, dtype='float32')

y_one_hot = label_binarize(np.array(label_lst), classes=label)
print(y_one_hot)

# print(metrics.roc_auc_score(y_one_hot, pre_score, average='micro'))
# fpr, tpr, thresholds = metrics.roc_curve(y_one_hot.ravel(), pre_score.ravel())
# auc = metrics.auc(fpr, tpr)
# print(auc)

fpr = dict()
tpr = dict()
roc_auc = dict()
#法1:
n_classes = len(label)
for i in range(n_classes):
    fpr[label[i]], tpr[label[i]], _ = metrics.roc_curve(y_one_hot[:, i], pre_score[:, i])
    roc_auc[label[i]] = metrics.auc(fpr[label[i]], tpr[label[i]])
    print("第{0}类:{1}的假正率为:{2}".format(i, label[i], fpr[label[i]]))
    print("第{0}类:{1}的真正率(召回率)为:{2}".format(i, label[i], tpr[label[i]]))
    print("第{0}类:{1}的AUC值为:{2}".format(i, label[i], roc_auc[label[i]]))
    mpl.rcParams['font.sans-serif'] = u'SimHei'
    mpl.rcParams['axes.unicode_minus'] = False
    plt.plot(fpr[label[i]], tpr[label[i]], c='r', lw=2, alpha=0.7, label=u'AUC=%.3f' %(roc_auc[label[i]]))
    plt.plot((0, 1), (0, 1), c='#808080', lw=1, ls='--', alpha=0.7)
    plt.xlim((-0.01, 1.02))
    plt.ylim((-0.01, 1.02))
    plt.xticks(np.arange(0, 1.1, 0.1))
    plt.yticks(np.arange(0, 1.1, 0.1))
    plt.xlabel('False Positive Rate', fontsize=13)
    plt.ylabel('True Positive Rate', fontsize=13)
    plt.grid(b=True, ls=':')
    plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)
    plt.title(u'模型分类后的ROC和AUC', fontsize=17)
    plt.savefig(os.path.join("D:\\bert_pred\\roc_auc\\", "roc_{}.png".format(label[i])))
    plt.show()
#法2:
fpr["micro"], tpr["micro"], _ = metrics.roc_curve(y_one_hot.ravel(), pre_score.ravel())
roc_auc["micro"] = metrics.auc(fpr["micro"], tpr["micro"])

#整体的ROC曲线和AUC值
mpl.rcParams['font.sans-serif'] = u'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
#FPR就是横坐标,TPR就是纵坐标
print("AUC值为:{}".format(roc_auc))
plt.plot(fpr["micro"], tpr["micro"], c='r', lw=2, alpha=0.7, label=u'AUC=%.3f' %(roc_auc["micro"]))
plt.plot((0, 1), (0, 1), c='#808080', lw=1, ls='--', alpha=0.7)
plt.xlim((-0.01, 1.02))
plt.ylim((-0.01, 1.02))
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel('False Positive Rate', fontsize=13)
plt.ylabel('True Positive Rate', fontsize=13)
plt.grid(b=True, ls=':')
plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)
plt.title(u'模型分类后的ROC和AUC', fontsize=17)
plt.savefig(os.path.join("D:\\bert_pred\\roc_auc\\", "roc_{}.png".format('整体')))
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值