Skip to main content

评估指标

核心概念:混淆矩阵 (Confusion Matrix)

在介绍具体的评估指标之前,我们首先需要理解混淆矩阵,因为很多分类指标都源于它。混淆矩阵是一个表格,用于可视化分类模型的性能。对于一个二分类问题(例如,预测“是”或“否”,“正类”或“负类”),混淆矩阵通常如下所示:

预测为正类 (Predicted Positive) 预测为负类 (Predicted Negative)
实际为正类 (Actual Positive) TP (真正例) FN (假负例)
实际为负类 (Actual Negative) FP (假正例) TN (真负例)
  • TP (True Positive,真正例): 模型正确地将正类样本预测为正类。
    • 例子: 实际是垃圾邮件,模型也预测为垃圾邮件。
  • TN (True Negative,真负例): 模型正确地将负类样本预测为负类。
    • 例子: 实际不是垃圾邮件,模型也预测不是垃圾邮件。
  • FP (False Positive,假正例,Type I Error,第一类错误): 模型错误地将负类样本预测为正类 (误报)。
    • 例子: 实际不是垃圾邮件,但模型预测为垃圾邮件。
  • FN (False Negative,假负例,Type II Error,第二类错误): 模型错误地将正类样本预测为负类 (漏报)。
    • 例子: 实际是垃圾邮件,但模型预测不是垃圾邮件。

现在我们基于混淆矩阵来介绍各个评估指标:

1. 准确率 (Accuracy)

  • 定义: 模型正确预测的样本数占总样本数的比例。
  • 公式: Accuracy = (TP + TN) / (TP + TN + FP + FN)
  • 通俗解释: 模型预测对的比例有多大。
  • 适用场景:
    • 当各个类别的样本数量比较均衡时,准确率是一个很好的衡量指标。
  • 局限性:
    • 类别不平衡的情况下,准确率可能会产生误导。例如,在一个99%的样本都是负类的数据集中,一个把所有样本都预测为负类的“愚蠢”模型也能达到99%的准确率,但这显然不是一个好模型。
  • 例子: 100封邮件,90封非垃圾邮件,10封垃圾邮件。模型将所有邮件都预测为非垃圾邮件。
    • TP=0, TN=90, FP=0, FN=10
    • Accuracy = (0 + 90) / (0 + 90 + 0 + 10) = 90 / 100 = 90%。看起来很高,但它完全没能识别出垃圾邮件。

2. 精确率 (Precision)

  • 定义: 在所有被模型预测为正类的样本中,有多少是真正的正类。
  • 公式: Precision = TP / (TP + FP)
  • 通俗解释: 模型预测为“阳性”的那些结果中,到底有多少是真的“阳性”。(“查准率”)
  • 关注点: 尽量不把负类样本错误地预测为正类 (即减少 FP)。
  • 适用场景:
    • 假正例 (FP) 的代价很高时,我们希望精确率高。
    • 例如:
      • 垃圾邮件检测: 如果把一封重要的邮件(负类)错误地识别为垃圾邮件(正类)并过滤掉,用户可能会错过重要信息。这时希望精确率高。
      • 癌症诊断(如果“患癌”是正类): 如果一个健康的人(负类)被误诊为癌症(正类),会带来巨大的心理压力和不必要的治疗。
  • 例子(续上): 模型将1封非垃圾邮件预测为垃圾邮件,将9封垃圾邮件预测为垃圾邮件。
    • 假设 TP=9 (9封垃圾邮件被正确识别)
    • 假设 FP=1 (1封非垃圾邮件被错误识别为垃圾邮件)
    • Precision = 9 / (9 + 1) = 90%。意味着模型预测为垃圾邮件的邮件中,90%真的是垃圾邮件。

3. 召回率 (Recall) / 灵敏度 (Sensitivity) / 真阳性率 (True Positive Rate, TPR)

  • 定义: 在所有实际为正类的样本中,有多少被模型正确地预测出来
  • 公式: Recall = TP / (TP + FN)
  • 通俗解释: 所有真正的“阳性”样本中,模型找回来了多少。(“查全率”)
  • 关注点: 尽量不错过任何一个正类样本 (即减少 FN)。
  • 适用场景:
    • 假负例 (FN) 的代价很高时,我们希望召回率高。
    • 例如:
      • 癌症诊断(如果“患癌”是正类): 如果一个癌症患者(正类)被漏诊为健康(负类),可能会延误治疗,危及生命。这时希望召回率高。
      • 金融欺诈检测: 漏掉一个欺诈交易(正类)可能会造成巨大损失。
  • 例子(续上): 假设总共有10封真正的垃圾邮件。
    • TP=9 (9封垃圾邮件被正确识别)
    • FN=1 (1封垃圾邮件被错误地识别为非垃圾邮件,即漏报)
    • Recall = 9 / (9 + 1) = 90%。意味着所有真正的垃圾邮件中,模型成功识别出了90%。

4. F1 分数 (F1 Score)

  • 定义: 精确率和召回率的调和平均数。它试图在精确率和召回率之间找到一个平衡。

  • 公式: F1 Score = 2 * (Precision * Recall) / (Precision + Recall)

  • 通俗解释: 一个综合考虑了“查准”和“查全”的指标。

  • 特性:

    • 当精确率和召回率都较高时,F1分数才会高。
    • 如果其中一个指标很低,F1分数也会相应较低。
    • 取值范围在 [0, 1] 之间,1 表示完美。
  • 适用场景:

    • 当你希望同时关注精确率和召回率,并且它们的重要性相当时。
    • 特别是在类别不平衡的情况下,F1分数通常比准确率更能反映模型的真实性能。
  • 例子(续上):

    • Precision = 0.9, Recall = 0.9
    • F1 Score = 2 * (0.9 * 0.9) / (0.9 + 0.9) = 2 * 0.81 / 1.8 = 1.62 / 1.8 = 0.9。

    你也可以有 F-beta Score,它可以让你更侧重精确率或召回率: F_beta = (1 + beta^2) * (Precision * Recall) / ((beta^2 * Precision) + Recall)

    • beta > 1:更侧重召回率。
    • beta < 1:更侧重精确率。
    • beta = 1:就是 F1 Score。

5. ROC 曲线 (Receiver Operating Characteristic Curve)

  • 定义:假正例率 (False Positive Rate, FPR) 为横坐标,以真正例率 (True Positive Rate, TPR,即召回率) 为纵坐标绘制的曲线。
    • FPR (假正例率): 在所有实际为负类的样本中,被模型错误预测为正类的比例。 FPR = FP / (FP + TN)。它表示模型将负类误判为正类的程度。
  • 绘制过程:
    • 分类模型通常会输出一个概率值(或置信度分数),表示样本属于正类的可能性。
    • 通过改变分类阈值 (threshold) (例如,从0到1),我们可以得到一系列不同的 (FPR, TPR) 点。
    • 将这些点连接起来就构成了 ROC 曲线。
  • 通俗解释:
    • ROC 曲线展示了在不同“误报”(FPR)水平下,模型能达到的“查全”(TPR)水平。
    • 曲线越靠近左上角 (0,1) 点(即 FPR 接近0,TPR 接近1),模型的性能越好。这意味着模型能在保持较低误报率的同时,实现较高的查全率。
    • 对角线 (从 (0,0) 到 (1,1)) 代表随机猜测的模型。
  • 优点:
    • 对于类别不平衡的数据集,ROC 曲线是一个比较稳健的评估工具,因为它不直接依赖于类别的分布,而是关注不同阈值下的表现。

6. AUC (Area Under the ROC Curve)

  • 定义: ROC 曲线下方的面积。
  • 取值范围: 0 到 1。
  • 解释:
    • AUC = 1: 完美的分类器。
    • 0.5 < AUC < 1: 分类器优于随机猜测。AUC 值越大,分类器性能越好。
    • AUC = 0.5: 分类器与随机猜测无异。
    • AUC < 0.5: 分类器比随机猜测还差 (通常意味着标签可能反了,或者模型学到了错误的关系)。
  • 通俗解释: AUC 值可以理解为:随机抽取一个正样本和一个负样本,分类器将正样本的预测概率排在负样本之前的概率。
  • 优点:
    • 提供了一个单一的数值来概括 ROC 曲线所代表的模型性能。
    • 对分类阈值的选择不敏感。

如何选择评估指标?

选择哪个评估指标取决于你的具体业务需求和对不同类型错误的容忍度:

  • 类别均衡,且各类错误代价相近: 准确率 (Accuracy) 可能就足够了。
  • 类别不平衡,或不同错误类型代价不同:
    • 关注“不错杀好人”(减少 FP): 看重精确率 (Precision)。例如,垃圾邮件过滤。
    • 关注“不放过坏人”(减少 FN): 看重召回率 (Recall)。例如,疾病诊断,金融欺诈。
    • 希望在精确率和召回率之间取得平衡: 看重 F1 分数 (F1 Score)。
    • 想全面评估模型在不同决策阈值下的表现,尤其在不平衡数据下: 使用 ROC 曲线和 AUC。

在实际应用中,通常会查看多个指标来全面评估模型性能。例如,一个模型可能有很高的精确率但召回率很低,这意味着它预测为正类的结果很可靠,但错过了很多真正的正类。

使用 Python 库 (例如 Scikit-learn):

Scikit-learn 的 sklearn.metrics 模块提供了计算这些指标的函数:

from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_curve, roc_auc_score
import matplotlib.pyplot as plt

# 假设 y_true 是真实标签,y_pred 是模型预测的类别标签,y_prob 是模型预测为正类的概率

# 混淆矩阵
cm = confusion_matrix(y_true, y_pred)
print("Confusion Matrix:\n", cm)

# 准确率
acc = accuracy_score(y_true, y_pred)
print("Accuracy:", acc)

# 精确率
prec = precision_score(y_true, y_pred) # 默认计算正类的精确率
print("Precision:", prec)

# 召回率
rec = recall_score(y_true, y_pred) # 默认计算正类的召回率
print("Recall:", rec)

# F1分数
f1 = f1_score(y_true, y_pred) # 默认计算正类的F1分数
print("F1 Score:", f1)

# ROC曲线和AUC
fpr, tpr, thresholds = roc_curve(y_true, y_prob) # y_prob是模型预测为正类的概率
auc_score = roc_auc_score(y_true, y_prob)
print("AUC:", auc_score)

# # 绘制ROC曲线 (示例)
# plt.figure()
# plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (area = {auc_score:.2f})')
# plt.plot([0, 1], [0, 1], color='navy', lw=2, 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')
# plt.legend(loc="lower right")
# plt.show()