ROC曲线的横轴为假正例率(FPR), 纵轴为真正例率(TPR),其曲线下面的面积为AUC
FPR = FP/(FP+TN)
TPR = TP/(TP+FN)
绘制ROC曲线的关键是弄懂ROC曲线的含义,然后改变分类概率的阈值。
代码说明:
predict是用tensorflow写的神经网络计算出来的分类概率,
j是从0%~100%的分类概率阈值(默认的二分类概率阈值是50%),
k是一共有144个样本数量。
predict = sess.run(tf.nn.softmax(logits), feed_dict={
images: testing_images,
labels: testing_labels})
AUC_pro = predict[:, 0]
probability = predict[:, 0]*100 # 有18x8=144个
TP = 0
TN = 0
FP = 0
FN = 0
FPR_list = []
TPR_list = []
for j in range(100): # 101
for k in range(144):
if probability[k] <= j: # 预测为1
if testing_labels[k] == 1: # 真实为1
TP = TP + 1
elif testing_labels[k] == 0: # 真实为0
FP = FP + 1
elif probability[k] > j: # 预测为0
if testing_labels[k] == 1: # 真实为1
FN = FN + 1
elif testing_labels[k] == 0: # 真实为0
TN = TN + 1
FPR = FP/(FP+TN)
TPR = TP/(TP+FN)
FPR_list.append(FPR)
TPR_list.append(TPR)
TP = 0
TN = 0
FP = 0
FN = 0
prediction_tensor = tf.convert_to_tensor(AUC_pro)
label_tensor = tf.convert_to_tensor(testing_labels)
auc_value, auc_op = tf.metrics.auc(label_tensor, prediction_tensor, num_thresholds=100)
sess.run(tf.global_variables_initializer())
sess.run(tf.local_variables_initializer())
sess.run(auc_op)
value = 1 - sess.run(auc_value)
print("AUC:" + str(value))
ax5.plot(FPR_list, TPR_list)
plt.show()