ROC 曲线和混淆矩阵都是用来评估分类模型性能的工具
ROC曲线特别适用于比较不同模型或算法的性能,而混淆矩阵可以为我们提供更详细的分类结果信息。
ROC曲线是用于评估二元分类模型效果的工具。Scikit-learn提供了方便的工具来生成ROC曲线。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
import torch
# 假设您已经得到了模型的预测概率和真实标签
# predictions: [N, 2] N是样本数,2是类别数
# labels: [N]
predictions = torch.rand((100, 2))
labels = torch.randint(0, 2, (100,))
# 获取正类的预测概率
probs = predictions[:, 1]
# 计算ROC
fpr, tpr, thresholds = roc_curve(labels, probs)
roc_auc = auc(fpr, tpr)
# 绘图
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC)')
plt.legend(loc="lower right")
plt.show()
混淆矩阵是一个简单的工具,它可以显示真实标签和预测标签之间的对应关系。
from sklearn.metrics import confusion_matrix
import seaborn as sns
# 根据概率获取预测的标签
_, predicted_labels = predictions.max(1)
cm = confusion_matrix(labels, predicted_labels)
# 绘图
plt.figure(figsize=(5,5))
sns.heatmap(cm, annot=True, fmt=".0f", linewidths=.5, square = True, cmap = 'Blues_r');
plt.ylabel('Actual label');
plt.xlabel('Predicted label');
plt.title('Confusion Matrix');
plt.show()
注意:需要先安装matplotlib
, seaborn
和 scikit-learn
。可以使用pip来安装这些库。
了ROC曲线和混淆矩阵外,分类模型常用的性能指标还有准确率、精确度、召回率、F1分数等。这些指标都可以基于混淆矩阵的四个基本值(TP, FP, TN, FN)来计算。以下是这些指标的定义和如何使用Python代码实现它们:
准确率(Accuracy):所有预测正确的样本与总样本的比例。
def accuracy(TP, FP, FN, TN):
return (TP + TN) / (TP + FP + FN + TN)
精确度(Precision):正确预测为正的样本与所有预测为正的样本的比例。
def precision(TP, FP):
return TP / (TP + FP)
召回率(Recall)或灵敏度(Sensitivity):正确预测为正的样本与所有实际为正的样本的比例。
def recall(TP, FN):
return TP / (TP + FN)
F1分数(F1 Score):精确度和召回率的调和平均值。
def f1_score(precision_value, recall_value):
return 2 * (precision_value * recall_value) / (precision_value + recall_value)
注意,上述公式和代码片段是为二元分类设计的。多分类问题需要稍作调整或使用micro、macro等不同的计算方式。
此外,我们可以直接调用scikit-learn
库为我们提供了方便的函数来计算这些指标:
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
y_true = [1, 0, 1, 1, 0, 1]
y_pred = [1, 0, 1, 0, 0, 1]
print("Accuracy:", accuracy_score(y_true, y_pred))
print("Precision:", precision_score(y_true, y_pred))
print("Recall:", recall_score(y_true, y_pred))
print("F1 Score:", f1_score(y_true, y_pred))
“IOU”是Intersection over Union的缩写,它是一种测量对象检测算法预测边界框与实际边界框之间重叠程度的指标。IOU常用于计算目标检测和语义分割任务的准确性。
IOU定义为两个边界框交集的面积与它们并集的面积之比:
“mAP曲线”是基于不同IOU阈值的平均精确度。如果计算IoU并将其用于评估,以下是一个简单的Python代码示例,演示如何计算两个矩形的IoU:
def bb_intersection_over_union(boxA, boxB):
# 确定交集矩形的(x, y)坐标
xA = max(boxA[0], boxB[0])
yA = max(boxA[1], boxB[1])
xB = min(boxA[2], boxB[2])
yB = min(boxA[3], boxB[3])
# 计算交集矩形的面积
interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)
# 计算预测矩形和实际矩形的面积
boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)
boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)
# 通过取交集面积并除以预测和实际矩形的面积之和(减去交集面积)来计算并集
iou = interArea / float(boxAArea + boxBArea - interArea)
# 返回并集值
return iou
# 使用示例:
boxA = [10, 10, 50, 50] # 格式: [x1, y1, x2, y2]
boxB = [20, 20, 60, 60]
print(bb_intersection_over_union(boxA, boxB)) # 应该打印一个0到1之间的值