ROC曲线
ROC曲线是一种评估分类器性能的图形工具,它以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制。ROC曲线特别需要注意以下几点:
- ROC曲线要与45度对角线比较,对角线表示随机猜测的结果,ROC曲线越靠近左上角,表示分类器越好。
- ROC曲线下面积(AUC)可以反映分类器的整体性能,AUC越大,表示分类器越好。
- ROC曲线可以用来比较不同的分类器或者不同的阈值设置,选择最佳的模型或者阈值。
- 绘制ROC曲线时,需要传入真实标签和预测为正类的概率值,而不是预测的0-1标签。
一、使用随机生成的数据进行绘制
安装对应库,代码可以直接用
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
import numpy as np
import time
def Draw_Roc():
# 生成随机数据
np.random.seed(0)
n_samples = 1000
n_classes = 2
# 真实标签
y_true = np.random.randint(n_classes, size=n_samples)
# 模拟三个模型的预测概率
y_score1 = np.random.rand(n_samples).reshape(-1,1)
y_score2 = np.random.rand(n_samples).reshape(-1,1)
y_score3 = np.random.rand(n_samples).reshape(-1,1)
# 定义颜色和线条样式
colors = ['blue', 'red', 'green','c']
linestyles = ['-', '--', '--', '--']
# 绘制ROC曲线并计算AUC值
plt.figure(figsize=(7, 5))
for i, y_score in enumerate([y_score1,y_score2,y_score3,y_score4]):
# 计算每个类别的TPR和FPR
fpr = dict()
tpr = dict()
roc_auc = dict()
for j in range(n_classes-1):
fpr[j], tpr[j], _ = roc_curve(y_true == j, y_score[:, j])
roc_auc[j] = auc(fpr[j], tpr[j])
# 计算微平均TPR和FPR
fpr["micro"], tpr["micro"], _ = roc_curve(y_true.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
# 绘制微平均ROC曲线并添加图例
plt.plot(fpr["micro"], tpr["micro"],
color=colors[i], linestyle=linestyles[i],
label='Model {0} (AUC = {1:0.2f})'
''.format(i, roc_auc["micro"]))
plt.plot([0, 1], [0, 1], 'k--') # 绘制对角线作为参考线
plt.xlim([0.0, 1.0]) # 设置x轴范围
plt.ylim([0.0, 1.05]) # 设置y轴范围
plt.xlabel('False Positive Rate') # 设置x轴标签
plt.ylabel('True Positive Rate') # 设置y轴标签
plt.title('ROC curve of mutiple-class models') # 设置标题
plt.legend(loc="lower right") # 设置图例位置
plt.savefig('rand_data_show')
plt.show() # 显示图像
if __name__ == '__main__':
Draw_Roc()
二、使用真实数据绘制
代码如下:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
import numpy as np
import time
def Draw_Roc():
# 读取训练好的模型中的真实标签和预测为正类的概率值
data1 = pd.read_csv('result_textcnn_Fast')
y_true = np.array(data1['true_label_0']).reshape(-1,1)
y_score1 = np.array(data1['0']).reshape(-1,1)
data2 = pd.read_csv('result_bilstm_Fast')
y_score2 = np.array(data2['0']).reshape(-1,1)
data3 = pd.read_csv('result_cnnbilstm_Fast')
y_score3 = np.array(data3['0']).reshape(-1, 1)
data4 = pd.read_csv('result_bilstmAtt_Fast')
y_score4 = np.array(data4['0']).reshape(-1, 1)
n_classes = 2
# 定义颜色和线条样式
colors = ['blue', 'red', 'green','c']
linestyles = ['-', '--', '--', '--']
model_name = ['TextCNN','TextRNN','TextRCNN','Att-BiLSTM']
# 绘制ROC曲线并计算AUC值
plt.figure(figsize=(7, 5))
for i, y_score in enumerate([y_score1,y_score2,y_score3,y_score4]):
# 计算每个类别的TPR和FPR
fpr = dict()
tpr = dict()
roc_auc = dict()
for j in range(n_classes-1):
fpr[j], tpr[j], _ = roc_curve(y_true == j, y_score[:, j])
roc_auc[j] = auc(fpr[j], tpr[j])
# 计算微平均TPR和FPR
fpr["micro"], tpr["micro"], _ = roc_curve(y_true.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
# 绘制微平均ROC曲线并添加图例
plt.plot(fpr["micro"], tpr["micro"],
color=colors[i], linestyle=linestyles[i],
label='Model {0} (AUC = {1:0.2f})'
''.format(model_name[i], roc_auc["micro"]))
plt.plot([0, 1], [0, 1], 'k--') # 绘制对角线作为参考线
plt.xlim([0.0, 1.0]) # 设置x轴范围
plt.ylim([0.0, 1.05]) # 设置y轴范围
plt.xlabel('False Positive Rate') # 设置x轴标签
plt.ylabel('True Positive Rate') # 设置y轴标签
plt.title('ROC curve of different models') # 设置标题
plt.legend(loc="lower right") # 设置图例位置
plt.savefig('real_data_show')
plt.show() # 显示图像
if __name__ == '__main__':
Draw_Roc()