自学教程 学编程从这里开始

分类指标

分类任务不能只用准确率来评判模型好坏,尤其在样本不均衡场景下,准确率会产生误导。我们依靠混淆矩阵衍生出精确率、召回率、F1、AUC等指标综合评估分类模型。

1. 混淆矩阵

二分类四个基础定义:

  • TP(True Positive):真实正类,预测正类
  • TN(True Negative):真实负类,预测负类
  • FP(False Positive):真实负类,预测正类(误报)
  • FN(False Negative):真实正类,预测负类(漏报)
预测正预测负
真实正TPFN
真实负FPTN

2. 常用指标公式

准确率 Accuracy

Accuracy=TP+TNTP+TN+FP+FNAccuracy=\frac{TP+TN}{TP+TN+FP+FN}

全部样本预测正确的比例。

缺陷:样本不均衡时,高准确率没有参考价值。例如99%都是负样本,模型无脑预测负,准确率也能达到99%。

精确率 Precision(查准率)

Precision=TPTP+FPPrecision=\frac{TP}{TP+FP}

预测为正的样本里,真正是正样本的比例。
关注点:尽量少误报。适合垃圾邮件拦截、风控,不想误杀正常用户。

召回率 Recall(查全率)

Recall=TPTP+FNRecall=\frac{TP}{TP+FN}

所有真实正样本中,被成功找出的比例。
关注点:尽量不漏掉正样本。适合疾病筛查、故障检测,漏检代价很大。

F1-Score

精确率和召回率的调和平均,用来平衡两者:

F1=2×Precision×RecallPrecision+RecallF1=\frac{2\times Precision \times Recall}{Precision+Recall}

F1越高,精确率和召回率同时比较优秀。

ROC曲线与AUC

  • ROC:以FPR(假正率)为横轴、TPR(真正率)为纵轴,不断调整分类阈值画出的曲线
  • AUC:ROC曲线下面积,取值 [0,1]
  • AUC=1:完美分类;AUC=0.5:等价随机猜测;AUC<0.5:比随机还差

AUC优势:不受分类阈值影响,适合对比不同模型整体排序能力。

3. 多分类扩展

  • 宏平均 macro:每个类别单独算指标,直接取平均,平等看待所有类别
  • 加权平均 weighted:按各类样本数量加权,适合类别不均衡场景

4. Python 代码示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix, roc_auc_score, roc_curve

# 字体配置,解决 DejaVu Sans 中文缺失警告
plt.rcParams['font.sans-serif'] = ['SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

# 构造二分类数据
np.random.seed(42)
X, y = make_classification(n_samples=200, n_features=5, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:,1]

# 计算指标
acc = accuracy_score(y_test, y_pred)
pre = precision_score(y_test, y_pred)
rec = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
auc = roc_auc_score(y_test, y_prob)

print(f"准确率 Accuracy: {acc:.2f}")
print(f"精确率 Precision: {pre:.2f}")
print(f"召回率 Recall: {rec:.2f}")
print(f"F1 Score: {f1:.2f}")
print(f"AUC: {auc:.2f}")

# 绘制ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_prob)
plt.plot(fpr, tpr, color="#4472c4", label=f"AUC={auc:.2f}")
plt.plot([0,1],[0,1], color="#ed7d31", linestyle="--")
plt.xlabel("FPR 假正率")
plt.ylabel("TPR 真正率")
plt.title("ROC曲线")
plt.legend()
plt.show()

结果:

5. 指标选型参考

  • 正负样本均衡、简单场景:优先看准确率
  • 怕误报:优先精确率
  • 怕漏检:优先召回率
  • 需要兼顾精确率与召回率:F1
  • 比较模型排序能力、阈值可调:AUC

6. 常见误区

  1. 准确率越高模型越好:不均衡数据集极易踩坑
  2. 精确率和召回率可以同时无限拉高:二者存在权衡关系,阈值上调,精确率上升、召回下降
  3. AUC高就一定适合业务:AUC代表排序能力,不代表业务阈值下的精确/召回满足需求

思考题

  1. 风控场景,拒绝贷款给客户,FP和FN分别代表什么?业务更关注哪一个?
  2. 什么场景下F1比准确率更适合作为评价标准?
标签:

0 条笔记