主要参数
ROC 曲线和混淆矩阵都是用来评估分类模型性能的工具
ROC曲线(Receiver Operating Characteristic curve):
- ROC曲线描述了当阈值变化时,真正类率(True Positive Rate, TPR)和假正类率(False Positive Rate, FPR)之间的关系。
- TPR(也称为灵敏度或召回率)是正实例中正确预测为正的比例。
- FPR是负实例中错误预测为正的比例。
- ROC曲线下的面积(AUC-ROC)可以量化分类器的整体性能,值介于0和1之间。一个完美的分类器的AUC-ROC为1,而随机猜测的AUC-ROC为0.5。
- ROC曲线主要用于评估二元分类问题,但也可以扩展到多分类场景。
混淆矩阵(Confusion Matrix):
- 混淆矩阵是一个表格,用于显示实际类别与预测类别之间的对应关系。
- 对于二元分类问题,混淆矩阵有四个组成部分:真正(True Positive, TP),假正(False Positive, FP),真负(True Negative, TN)和假负(False Negative, FN)。
- TP: 正确预测的正样本数。
- FP: 错误预测的正样本数。
- TN: 正确预测的负样本数。
- FN: 错误预测的负样本数。
- 除了基本的四个值,还可以计算其他的性能指标,如精确度、召回率、F1分数等。
- 对于多分类问题,混淆矩阵将扩展为一个更大的方阵,其中每一行代表一个实际类别,每一列代表一个预测类别。
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之间的值