趋近智
为了高效计算准确率、精确率、召回率、F1-分数和混淆矩阵等指标,可以使用 Scikit-learn 的 metrics 模块。此模块提供了优化函数,用于根据真实标签和模型生成的预测来评估分类模型。
假设您已经训练了一个分类器(例如前面讨论过的 LogisticRegression、KNeighborsClassifier 或 SVC),并在测试集上获得了预测结果,您通常会有两个数组:
y_true: 测试数据的真实标签。y_pred: 您的分类器对测试数据预测的标签。让我们看看如何使用这些数组来计算标准分类指标。
首先,确保从 sklearn.metrics 导入必要的函数。为了演示目的,我们定义一些示例真实标签和预测标签。在实际场景中,这些将来自于您的模型在测试集上的评估结果。
import numpy as np
from sklearn.metrics import (accuracy_score, confusion_matrix, precision_score,
recall_score, f1_score, classification_report)
# 示例真实标签(二元分类)
y_true = np.array([1, 0, 1, 1, 0, 0, 1, 0, 0, 1])
# 模型预测的示例标签
y_pred = np.array([1, 1, 1, 0, 0, 1, 1, 0, 0, 1])
# 多元分类的示例标签
y_true_multi = np.array([0, 1, 2, 0, 1, 2, 0, 1, 2])
y_pred_multi = np.array([0, 2, 1, 0, 0, 2, 0, 1, 2])
准确率是最简单的指标,表示正确预测的比例。它计算方式如下:
在 Scikit-learn 中,您使用 accuracy_score 函数:
# 计算准确率
acc = accuracy_score(y_true, y_pred)
print(f"Accuracy: {acc:.4f}")
# 预期输出:Accuracy: 0.7000
虽然容易理解,但请记住准确率可能会产生误导,特别是对于类别不平衡的数据集。
混淆矩阵提供了更详细的预测性能分解,显示了真反例 (TN)、假正例 (FP)、假反例 (FN) 和真正例 (TP) 的计数。
使用 confusion_matrix 函数:
# 计算混淆矩阵
cm = confusion_matrix(y_true, y_pred)
print("Confusion Matrix:")
print(cm)
# 预期输出:
# Confusion Matrix:
# [[3 2]
# [1 4]]
输出通常排列为:
[[TN, FP],
[FN, TP]]
因此,在我们的示例中:
将混淆矩阵可视化通常可以使其更易于解释。以下是您如何使用 Plotly 生成热力图的示例:
每类正确和不正确预测的细分。
对于多元分类问题,矩阵会相应扩展,显示每个实际类别与预测类别对的计数。
# 多元分类示例的混淆矩阵
cm_multi = confusion_matrix(y_true_multi, y_pred_multi)
print("\nMulti-class Confusion Matrix:")
print(cm_multi)
# 预期输出:
# Multi-class Confusion Matrix:
# [[3 0 0]
# [1 1 1]
# [0 1 2]]
这些指标能对性能的特定方面提供认识,尤其是在类别不平衡是问题时。
precision_score。recall_score。f1_score。# 计算正类别(标签 1)的精确率、召回率、F1-分数
precision = precision_score(y_true, y_pred) # 默认值:pos_label=1
recall = recall_score(y_true, y_pred) # 默认值:pos_label=1
f1 = f1_score(y_true, y_pred) # 默认值:pos_label=1
print(f"\nBinary Classification Metrics (for class 1):")
print(f"Precision: {precision:.4f}") # TP / (TP + FP) = 4 / (4 + 2) = 0.6667
print(f"Recall: {recall:.4f}") # TP / (TP + FN) = 4 / (4 + 1) = 0.8000
print(f"F1-Score: {f1:.4f}") # 2 * (Prec * Rec) / (Prec + Rec) = 0.7273
# 预期输出:
# Binary Classification Metrics (for class 1):
# Precision: 0.6667
# Recall: 0.8000
# F1-Score: 0.7273
处理多元分类指标:
对于多元分类问题,您需要使用 average 参数 (parameter)指定如何跨类别平均这些指标:
average='micro':通过计算总 TP、FN、FP 来全局计算指标。average='macro':计算每个标签的指标,并找到它们的未加权平均值。不考虑标签不平衡。average='weighted':计算每个标签的指标,并找到它们的按支持度(每个标签的真实实例数)加权平均值。考虑标签不平衡。average=None:单独返回每个类别的分数。# 使用不同平均方法计算多元分类指标
precision_macro = precision_score(y_true_multi, y_pred_multi, average='macro')
recall_weighted = recall_score(y_true_multi, y_pred_multi, average='weighted')
f1_micro = f1_score(y_true_multi, y_pred_multi, average='micro')
print(f"\nMulti-class Metrics:")
print(f"Macro Precision: {precision_macro:.4f}")
print(f"Weighted Recall: {recall_weighted:.4f}")
print(f"Micro F1-Score: {f1_micro:.4f}")
# 预期输出:
# Multi-class Metrics:
# Macro Precision: 0.6111
# Weighted Recall: 0.6667
# Micro F1-Score: 0.6667
通常,您会希望获得每个类别的精确率、召回率和 F1-分数的摘要,以及支持度(每个类别的真实实例数)。classification_report 函数以方便的文本格式提供了这些信息。
# 生成二元情况的分类报告
report_binary = classification_report(y_true, y_pred, target_names=['Class 0', 'Class 1'])
print("\nBinary Classification Report:")
print(report_binary)
# 预期输出:
# Binary Classification Report:
# 精确率 召回率 f1-分数 支持度
#
# 类别 0 0.75 0.60 0.67 5
# 类别 1 0.67 0.80 0.73 5
#
# 准确率 0.70 10
# 宏平均 0.71 0.70 0.70 10
# 加权平均 0.71 0.70 0.70 10
# 生成多元情况的分类报告
report_multi = classification_report(y_true_multi, y_pred_multi, target_names=['Class 0', 'Class 1', 'Class 2'])
print("\nMulti-class Classification Report:")
print(report_multi)
# 预期输出:
# Multi-class Classification Report:
# 精确率 召回率 f1-分数 支持度
#
# 类别 0 0.75 1.00 0.86 3
# 类别 1 1.00 0.33 0.50 3
# 类别 2 0.67 0.67 0.67 3
#
# 准确率 0.67 9
# 宏平均 0.81 0.67 0.67 9
# 加权平均 0.81 0.67 0.67 9
报告包括:
y_true 中每个类别的出现次数。Scikit-learn 的 metrics 模块提供了一种直接的方式来量化 (quantization)分类模型的性能。使用 accuracy_score、confusion_matrix、precision_score、recall_score、f1_score 等函数以及全面的 classification_report,您可以超越简单的准确率,对模型在不同类别上的行为方式获得更全面的理解,这对于构建有效的分类系统非常重要。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•