ML和DL算法评估(Precision/Recall/F1 score/Specificity/ROC/AUC/AP)总结

本文详细介绍了二分类问题中常用的机器学习性能评估指标,包括精确率(Precision)、召回率(Recall)、准确率(Accuracy)、F1分数(F1 score)、特异性(Specificity)、ROC曲线及AUC值等,并解释了每个指标的意义。

机器学习和深度学习算法评估

为了包含尽可能多的性能指标,我们这里只讨论二分类(0/1)问题,比较常见的性能指标包括但不仅限于Precision、Recall(又称为Sensitivity)、Accuracy,F1 score(f1),Specificity,ROC,AUC,AP(mAP),下面我们讨论一下这些指标的具体含义。
这里写图片描述
注:暂且用1代表正样本,0代表负样本

TP:实际为1,预测为1,预测正确,预测值为1(正样本),记为True Positive
TN:实际为0,预测为0,预测正确,预测值为0(负样本),记为True Negative
FP:实际为0,预测为1,预测错误,预测值为1(正样本),记为False Positive
FN:实际为1,预测为0,预测错误,预测值为0(负样本),记为False Negative

  • Precision(精确率)
     
    P=TPTP+FPP=TPTP+FP

     解释:精确率关注正样本,意义就是在所有预测为1(正样本)的样本中,预测正确的概率
  • Recall(召回率,又称为Sensitivity(敏感性))
     
# 题目重述 根据提供的 CSV 文件 `confusion_matrix.csv` 中的混淆矩阵数据,使用 Python 绘制混淆矩阵热力图,并计算以下指标:True Positive (TP)、False Positive (FP)、True Negative (TN)、False Negative (FN)、Accuracy、PrecisionRecallSpecificityF1-Score,同时绘制 ROC 曲线并计算 AUC 值,展示完整的算法实现过程。 --- # 详解 ### ✅ 步骤 1:读取数据并构建混淆矩阵 ```python import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from sklearn.metrics import roc_curve, auc from itertools import cycle # 读取CSV文件 df = pd.read_csv('confusion_matrix.csv', index_col=0) matrix = df.values classes = df.index.tolist() print("混淆矩阵:") print(df) ``` 输出: ``` 0a 3a 4a 5a 0a 81 5 3 0 3a 0 68 3 0 4a 10 8 9 34 5a 8 0 9 50 ``` --- ### ✅ 步骤 2:绘制混淆矩阵热力图 ```python plt.figure(figsize=(8, 6)) sns.heatmap(matrix, annot=True, fmt='d', cmap='Blues', xticklabels=classes, yticklabels=classes) plt.title('Confusion Matrix') plt.xlabel('Predicted Label') plt.ylabel('True Label') plt.show() ``` --- ### ✅ 步骤 3:逐类计算 TP, FP, TN, FN 对于多分类问题,采用**一对多(One-vs-Rest)**策略逐类计算: ```python n_classes = matrix.shape[0] metrics = {} for i in range(n_classes): tp = matrix[i, i] fp = matrix[:, i].sum() - tp fn = matrix[i, :].sum() - tp tn = matrix.sum() - tp - fp - fn accuracy = (tp + tn) / matrix.sum() precision = tp / (tp + fp) if (tp + fp) > 0 else 0 recall = tp / (tp + fn) if (tp + fn) > 0 else 0 specificity = tn / (tn + fp) if (tn + fp) > 0 else 0 f1 = 2 * precision * recall / (precision + recall) if (precision + recall) > 0 else 0 metrics[classes[i]] = { 'TP': tp, 'FP': fp, 'TN': tn, 'FN': fn, 'Accuracy': accuracy, 'Precision': precision, 'Recall': recall, 'Specificity': specificity, 'F1-Score': f1 } ``` 打印结果示例: ```python for cls, metric in metrics.items(): print(f"\n--- Class {cls} ---") for k, v in metric.items(): if isinstance(v, float): print(f"{k}: {v:.4f}") else: print(f"{k}: {v}") ``` --- ### ✅ 步骤 4:绘制 ROC 曲线 计算 AUC(多分类扩展) 由于是多分类问题,我们使用 OvR(One-vs-Rest)方式近似 ROC AUC。这里假设我们有预测概率(但原文件只有混淆矩阵)。 ⚠️ **注意:从混淆矩阵无法还原原始预测概率,因此无法精确绘制 ROC 曲线或计算 AUC。** 但我们可以通过**模拟方法演示流程**(假设有预测分数): ```python # 模拟真实标签预测分数(仅用于演示) from sklearn.preprocessing import label_binarize # 假设真实标签预测得分(举例说明) y_true = [] y_score = [] # 构造模拟数据以匹配混淆矩阵分布(简化处理) mapping = {'0a': 0, '3a': 1, '4a': 2, '5a': 3} inv_mapping = {v: k for k, v in mapping.items()} y_true.extend([0]*81 + [1]*71 + [2]*61 + [3]*67) # 总样本数对应每行sum np.random.seed(42) # 构造带噪声的预测分数(越接近正确类别得分越高) for true_label in y_true: score = np.random.randn(4) * 0.5 score[true_label] += 1.0 # 正确类别的得分偏高 y_score.append(score) y_score = np.array(y_score) y_true_bin = label_binarize(y_true, classes=[0,1,2,3]) # 计算每个类别的ROC曲线AUC fpr = dict() tpr = dict() roc_auc = dict() plt.figure(figsize=(8, 6)) colors = cycle(['aqua', 'darkorange', 'cornflowerblue', 'red']) for i, color in zip(range(n_classes), colors): fpr[i], tpr[i], _ = roc_curve(y_true_bin[:, i], y_score[:, i]) roc_auc[i] = auc(fpr[i], tpr[i]) plt.plot(fpr[i], tpr[i], color=color, lw=2, label=f'ROC curve of class {inv_mapping[i]} (AUC = {roc_auc[i]:.2f})') plt.plot([0, 1], [0, 1], 'k--', lw=2) plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Multi-class ROC Curve (One-vs-Rest)') plt.legend(loc="lower right") plt.grid(True) plt.show() print("AUC Scores:") for i in range(n_classes): print(f"Class {inv_mapping[i]}: AUC = {roc_auc[i]:.4f}") ``` > 🔔 **重要提示**:实际中,若仅有混淆矩阵,**不能可靠地绘制 ROC 或计算 AUC**,因为缺少预测置信度信息。 --- # 知识点(列出解答该问题需要的知识点) - **混淆矩阵与分类指标计算**:通过TP、FP等定义推导PrecisionRecall等指标,适用于评估分类性能。 - **多分类ROCAUC**:采用OvR策略将多类问题转为多个二分类问题,分别计算ROCAUC。 - **Seaborn热力图可视化**:利用`sns.heatmap()`直观展示混淆矩阵中各类别的预测分布情况。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值