机器学习中分类任务评价指标
分类任务的评价指标核心是衡量 “预测结果与真实标签的匹配程度”,基础源于混淆矩阵,衍生出单维度指标、综合指标、排序指标及多分类适配指标,不同指标适配不同业务场景。
# 生成示例数据
X, y = datasets.make_classification(n_samples=1000, n_features=20, n_classes=2,
random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=42)
# 训练模型
model = LogisticRegression(random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1] # 正类的预测概率
一、基础:混淆矩阵(Confusion Matrix)
混淆矩阵是所有分类评价指标的核心,通过划分 “预测标签 - 真实标签” 的四种组合,量化分类结果的分布。
核心定义
TP(True Positive):真实标签为正类,预测标签也为正类(真阳性)。
TN(True Negative):真实标签为负类,预测标签也为负类(真阴性)。
FP(False Positive):真实标签为负类,预测标签为正类(假阳性,误判)。
FN(False Negative):真实标签为正类,预测标签为负类(假阴性,漏判)。
# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
tn, fp, fn, tp = cm.ravel()
print("=== 二分类评价指标 ===")
print(f"混淆矩阵:\n{cm}")
print(f"TN: {tn}, FP: {fp}, FN: {fn}, TP: {tp}")
二分类混淆矩阵结构
混淆矩阵=[TNFPFNTP]\text{混淆矩阵} = \begin{bmatrix} TN & FP \\ FN & TP \end{bmatrix}混淆矩阵=[TNFNFPTP]
二、单维度基础指标
基于混淆矩阵计算,聚焦分类任务的单一核心需求(如 “判对率”“不漏判”“不错判”)。
1. 准确率(Accuracy)
定义:所有样本中预测正确的比例,是最直观的整体评价指标。
数学公式:
Accuracy=TP+TNTP+TN+FP+FN\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}Accuracy=TP+TN+FP+FNTP+TN
适用场景:数据分布均衡(正、负类样本数量接近)的通用场景。
# 1. 准确率 (Accuracy)
accuracy = accuracy_score(y_test, y_pred)
print(f"\n1. 准确率 (Accuracy): {accuracy:.4f}")
print(" 定义: 正确预测的样本数占总样本数的比例")
print(f" 公式: (TP + TN) / (TP + TN + FP + FN) = ({tp} + {tn}) / ({tp} + {tn} + {fp} + {fn})")
2. 精确率(Precision,查准率)
定义:预测为正类的样本中,真实为正类的比例,聚焦 “不错判”。
数学公式:
Precision=TPTP+FP\text{Precision} = \frac{TP}{TP + FP}Precision=TP+FPTP
适用场景:重视误判成本的场景(如垃圾邮件识别,避免正常邮件被误判)。
# 2. 精确率 (Precision)
precision = precision_score(y_test, y_pred)
print(f"\n2. 精确率 (Precision): {precision:.4f}")
print(" 定义: 预测为正类的样本中,实际为正类的比例")
print(f" 公式: TP / (TP + FP) = {tp} / ({tp} + {fp})")
3. 召回率(Recall,查全率)
定义:真实为正类的样本中,被正确预测为正类的比例,聚焦 “不漏判”。
数学公式:
Recall=TPTP+FN\text{Recall} = \frac{TP}{TP + FN}Recall=TP+FNTP
适用场景:重视漏判成本的场景(如疾病诊断,避免漏诊患病患者)。
3. 召回率 (Recall)
recall = recall_score(y_test, y_pred)
print(f"\n3. 召回率 (Recall): {recall:.4f}")
print(" 定义: 实际为正类的样本中,被正确预测为正类的比例")
print(f" 公式: TP / (TP + FN) = {tp} / ({tp} + {fn})")
4. 特异度(Specificity,真阴性率)
定义:真实为负类的样本中,被正确预测为负类的比例,聚焦 “负类判准率”。
数学公式:
Specificity=TNTN+FP\text{Specificity} = \frac{TN}{TN + FP}Specificity=TN+FPTN
适用场景:需要关注负类识别效果的场景(如异常检测中正常样本的识别)。
# 4. 特异度 (Specificity)
specificity = tn / (tn + fp)
print(f"\n5. 特异度 (Specificity): {specificity:.4f}")
print(" 定义: 实际为负类的样本中,被正确预测为负类的比例")
print(f" 公式: TN / (TN + FP) = {tn} / ({tn} + {fp})")
三、综合指标:平衡精确率与召回率
精确率与召回率通常呈负相关,综合指标通过融合二者,提供更全面的评价。
1. F1 分数(F1-Score)
定义:精确率和召回率的调和平均数,平衡二者权重(同等重要)。
数学公式:
F1=2×Precision×RecallPrecision+Recall=2TP2TP+FP+FNF1 = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} = \frac{2TP}{2TP + FP + FN}F1=2×Precision+RecallPrecision×Recall=2TP+FP+FN2TP
适用场景:希望同时兼顾 “不错判” 和 “不漏判”,且二者重要性相当。
# 5. F1分数 (F1-Score)
f1 = f1_score(y_test, y_pred)
print(f"\n4. F1分数 (F1-Score): {f1:.4f}")
print(" 定义: 精确率和召回率的调和平均数")
print(f" 公式: 2 × (Precision × Recall) / (Precision + Recall)")
2. Fβ 分数(Fβ-Score)
定义:加权调和平均数,可通过 β 调整召回率的权重(β>1 时召回率更重要,β<1 时精确率更重要)。
数学公式:
Fβ=(1+β2)×Precision×Recallβ2×Precision+Recall=(1+β2)TP(1+β2)TP+β2FN+FPF_\beta = (1 + \beta^2) \times \frac{\text{Precision} \times \text{Recall}}{\beta^2 \times \text{Precision} + \text{Recall}} = \frac{(1 + \beta^2)TP}{(1 + \beta^2)TP + \beta^2 FN + FP}Fβ=(1+β2)×β2×Precision+RecallPrecision×Recall=(1+β2)TP+β2FN+FP(1+β2)TP
适用场景:需要明确侧重召回率或精确率的场景(如 β=2 时更重视召回率)。
# 6. Fβ分数 (F-beta Score)
f_beta = f1_score(y_test, y_pred, beta=2) # beta=2表示更重视召回率
print(f"\n7. F2分数 (F2-Score): {f_beta:.4f}")
print(" 定义: F1分数的泛化,可以调整精确率和召回率的权重")
print(" 公式: (1 + β²) × (Precision × Recall) / (β² × Precision + Recall)")
3. 马修斯相关系数(MCC,Matthews Correlation Coefficient)
定义:考虑了所有混淆矩阵元素的综合指标,取值范围 [-1,1],1 为完美分类,0 为随机分类,-1 为完全错误分类。
数学公式:
MCC=TP×TN−FP×FN(TP+FP)(TP+FN)(TN+FP)(TN+FN)\text{MCC} = \frac{TP \times TN - FP \times FN}{\sqrt{(TP + FP)(TP + FN)(TN + FP)(TN + FN)}}MCC=(TP+FP)(TP+FN)(TN+FP)(TN+FN)TP×TN−FP×FN
适用场景:数据极度不平衡时,比准确率、F1 更可靠。
# 马修斯相关系数 (Matthews Correlation Coefficient)
mcc = matthews_corrcoef(y_test, y_pred)
print(f"16. 马修斯相关系数: {mcc:.4f}")
print(" 定义: 综合考虑TP、TN、FP、FN的平衡指标")
print(" 范围: -1(完全错误)到 1(完美预测)")
print(" 特点: 在不平衡数据中表现良好")
四、排序相关指标:评估概率输出质量
当模型输出分类概率而非直接标签时,需通过排序指标衡量概率的区分能力。
1. ROC 曲线与 AUC-ROC
ROC 曲线:以 “假阳性率(FPR)” 为横轴,“真阳性率(TPR=Recall)” 为纵轴的曲线,反映不同阈值下的分类权衡。
假阳性率公式:
FPR=FPTN+FPFPR = \frac{FP}{TN + FP}FPR=TN+FPFP
AUC-ROC(Area Under ROC Curve):ROC 曲线下的面积,取值范围 [0,1],越接近 1 说明模型区分能力越强。
数学公式(基于排序的计算方式):
设正类样本数为P,负类样本数为N,对所有样本按预测概率降序排序,记正类样本的排序名次为rankirank_iranki(从 1 开始),则:
AUC-ROC=1P×N∑i∈正类ranki−P(P+1)2N\text{AUC-ROC} = \frac{1}{P \times N} \sum_{i \in \text{正类}} rank_i - \frac{P(P + 1)}{2N}AUC-ROC=P×N1∑i∈正类ranki−2NP(P+1)
# 8. ROC曲线和AUC
fpr_roc, tpr_roc, thresholds_roc = roc_curve(y_test, y_pred_proba)
auc_score = roc_auc_score(y_test, y_pred_proba)
print(f"8. AUC-ROC: {auc_score:.4f}")
print(" 定义: ROC曲线下的面积,衡量分类器整体性能")
print(" 范围: 0.5(随机猜测)到 1.0(完美分类器)")
2. PR 曲线与 AUC-PR
PR 曲线:以 “精确率” 为纵轴,“召回率” 为横轴的曲线,聚焦正类样本的识别效果。
AUC-PR(Area Under PR Curve):PR 曲线下的面积,取值范围 [0,1],在数据不平衡场景下比 AUC-ROC 更敏感。
数学公式(积分形式):
AUC-PR=∫01Precision(r)dr\text{AUC-PR} = \int_{0}^{1} \text{Precision}(r) drAUC-PR=∫01Precision(r)dr
其中rrr为召回率,Precision(r)\text{Precision}(r)Precision(r)为对应召回率下的精确率。
# 9. 精确率-召回率曲线和AUC-PR
precision_pr, recall_pr, thresholds_pr = precision_recall_curve(y_test, y_pred_proba)
auc_pr = average_precision_score(y_test, y_pred_proba)
print(f"9. AUC-PR: {auc_pr:.4f}")
print(" 定义: 精确率-召回率曲线下的面积")
print(" 应用: 在不平衡数据集中比AUC-ROC更有意义")
五、多分类适配指标
二分类指标需扩展才能适用于多分类(k类),核心思路是 “拆解为多个二分类任务”。
1. 宏平均(Macro Average)
定义:对每个类别单独计算指标(如 Precision),再取算术平均,平等对待所有类别。
数学公式(以宏精确率为例):
Macro-Precision=1k∑i=1kPrecisioni\text{Macro-Precision} = \frac{1}{k} \sum_{i=1}^{k} \text{Precision}_iMacro-Precision=k1∑i=1kPrecisioni
同理可推导宏召回率(Macro-Recall)、宏 F1(Macro-F1)。
# 宏平均 (Macro Average)
precision_macro = precision_score(y_test_multi, y_pred_multi, average='macro')
recall_macro = recall_score(y_test_multi, y_pred_multi, average='macro')
f1_macro = f1_score(y_test_multi, y_pred_multi, average='macro')
print(f"12. 宏平均:")
print(f" 精确率: {precision_macro:.4f}")
print(f" 召回率: {recall_macro:.4f}")
print(f" F1分数: {f1_macro:.4f}")
print(" 定义: 对所有类别平等对待,计算每个类别的指标后取平均")
2. 微平均(Micro Average)
定义:先汇总所有类别的混淆矩阵(总 TP、总 FP、总 FN),再计算指标,侧重样本数量多的类别。
数学公式(以微精确率为例):
Micro-Precision=∑i=1kTPi∑i=1k(TPi+FPi)\text{Micro-Precision} = \frac{\sum_{i=1}^{k} TP_i}{\sum_{i=1}^{k} (TP_i + FP_i)}Micro-Precision=∑i=1k(TPi+FPi)∑i=1kTPi
同理可推导微召回率(Micro-Recall)、微 F1(Micro-F1)。
# 微平均 (Micro Average)
precision_micro = precision_score(y_test_multi, y_pred_multi, average='micro')
recall_micro = recall_score(y_test_multi, y_pred_multi, average='micro')
f1_micro = f1_score(y_test_multi, y_pred_multi, average='micro')
print(f"\n14. 微平均:")
print(f" 精确率: {precision_micro:.4f}")
print(f" 召回率: {recall_micro:.4f}")
print(f" F1分数: {f1_micro:.4f}")
print(" 定义: 将所有类别的TP、FP、FN汇总后计算指标")
3. 加权平均(Weighted Average)
定义:对每个类别单独计算指标,再按该类别的样本数量占比加权平均,平衡类别规模差异。
数学公式(以加权精确率为例):
Weighted-Precision=∑i=1k(niN×Precisioni)\text{Weighted-Precision} = \sum_{i=1}^{k} \left( \frac{n_i}{N} \times \text{Precision}_i \right)Weighted-Precision=∑i=1k(Nni×Precisioni)
其中nin_ini为第iii类的样本数,NNN为总样本数,同理可推导加权召回率、加权 F1。
# 加权平均 (Weighted Average)
precision_weighted = precision_score(y_test_multi, y_pred_multi, average='weighted')
recall_weighted = recall_score(y_test_multi, y_pred_multi, average='weighted')
f1_weighted = f1_score(y_test_multi, y_pred_multi, average='weighted')
print(f"\n13. 加权平均:")
print(f" 精确率: {precision_weighted:.4f}")
print(f" 召回率: {recall_weighted:.4f}")
print(f" F1分数: {f1_weighted:.4f}")
print(" 定义: 按每个类别的样本数加权计算平均值")
六、指标选择核心原则
数据均衡性:平衡数据用准确率、F1;不平衡数据用 MCC、AUC-PR、加权平均。
业务优先级:漏判代价高(如疾病诊断)选高召回率;误判代价高(如垃圾邮件)选高精确率。
模型输出形式:仅输出标签用混淆矩阵、准确率、F1;输出概率用 AUC-ROC、AUC-PR。
分类类型:二分类直接用基础指标;多分类优先选加权平均(兼顾类别规模)。
补充:
1. 对数损失(Log Loss,交叉熵损失 Cross-Entropy Loss)
定义:
衡量模型预测概率与真实标签之间的 “不确定性差异”,值越小表示概率预测越准确。
适用场景:
所有输出概率的分类任务(二分类、多分类),是训练分类模型时常用的损失函数,也可作为评价指标。
数学公式:
二分类:设真实标签为y∈{0,1},预测为正类的概率为p,则:
Log Loss=−1N∑i=1N[yilog(pi)+(1−yi)log(1−pi)]\text{Log Loss} = -\frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(p_i) + (1 - y_i) \log(1 - p_i) \right]Log Loss=−N1∑i=1N[yilog(pi)+(1−yi)log(1−pi)]
多分类:设真实标签为yi∈{0,1,...,k−1}y_i \in \{0,1,...,k-1\}yi∈{0,1,...,k−1},(one-hot 编码),预测第c类的概率为pi,cp_{i,c}pi,c
Log Loss=−1N∑i=1N∑c=0k−1yi,clog(pi,c)\text{Log Loss} = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=0}^{k-1} y_{i,c} \log(p_{i,c})Log Loss=−N1∑i=1N∑c=0k−1yi,clog(pi,c)
2. 布里尔分数(Brier Score)
定义:
衡量概率预测的 “校准误差”,即预测概率与真实结果(0/1)的平方差均值,值越小表示概率越校准。
特点:
比对数损失更稳健(对极端概率不敏感),同时包含 “可靠性”(概率是否准确)和 “分辨率”(区分正负例的能力)。
适用场景:
二分类概率预测的校准评估(如天气预报中 “降雨概率” 的准确性)。
数学公式:
对二分类任务,真实标签y∈{0,1},预测概率p:
Brier Score=1N∑i=1N(pi−yi)2\text{Brier Score} = \frac{1}{N} \sum_{i=1}^{N} (p_i - y_i)^2Brier Score=N1∑i=1N(pi−yi)2
3.科恩卡帕系数(Cohen’s Kappa)
定义:
衡量模型预测与真实标签的一致性,扣除了随机猜测导致的一致性,比准确率更适合不平衡数据或评判标注者一致性。
核心思想:
Kappa=观测一致性−随机一致性1−随机一致性Kappa = \frac{\text{观测一致性} - \text{随机一致性}}{1 - \text{随机一致性}}Kappa=1−随机一致性观测一致性−随机一致性
适用场景:类别不平衡的分类任务、多标注者一致性检验(如医学影像标注)。
数学公式:
设混淆矩阵中第iii类的真实样本数为TiT_iTi,预测样本数为PiP_iPi,总样本数为N,则:
随机一致性=∑i=1kTi×PiN2\text{随机一致性} = \sum_{i=1}^{k} \frac{T_i \times P_i}{N^2}随机一致性=∑i=1kN2Ti×Pi
Kappa=Accuracy−随机一致性1−随机一致性\text{Kappa} = \frac{\text{Accuracy} - \text{随机一致性}}{1 - \text{随机一致性}}Kappa=1−随机一致性Accuracy−随机一致性
(取值范围:[-1,1],1 表示完美一致,0 表示与随机猜测一致,负数表示比随机更差)
4. 汉明损失(Hamming Loss)
定义:
衡量预测标签与真实标签之间的 “逐标签错误率”,即错误标注的标签占总标签数的比例。
适用场景:
多标签分类(如文本多标签分类、图像多标签识别)。
数学公式:
设样本数为N,总标签数为L,对第iii个样本,真实标签集合为YiY_iYi ,预测标签集合为Y^i\hat{Y}_iY^i ,则:
Hamming Loss=1N×L∑i=1N∣YiΔY^i∣\text{Hamming Loss} = \frac{1}{N \times L} \sum_{i=1}^{N} \left| Y_i \Delta \hat{Y}_i \right|Hamming Loss=N×L1∑i=1NYiΔY^i
其中,YiΔY^iY_i \Delta \hat{Y}_iYiΔY^i表示YiY_iYi与Y^i\hat{Y}_iY^i的对称差集(即只在其中一个集合中的标签),∣⋅∣\left| \cdot \right|∣⋅∣为集合大小。(取值范围:[0,1],0 表示所有标签预测正确)
5.杰卡德相似系数(Jaccard Index,交并比 IoU)
定义:
衡量两个标签集合的相似度,即交集大小与并集大小的比值,适用于评估 “标签集合整体匹配度”。
扩展:
在多标签分类中,通常计算所有样本的杰卡德系数均值(称为 “平均杰卡德系数”)。
适用场景:多标签分类、目标检测(评估预测框与真实框的重叠度)。
数学公式:
对单个样本,真实标签集合Y,预测标签集合Y^\hat{Y}Y^:
Jaccard(Y,Y^)=∣Y∩Y^∣∣Y∪Y^∣\text{Jaccard}(Y, \hat{Y}) = \frac{|Y \cap \hat{Y}|}{|Y \cup \hat{Y}|}Jaccard(Y,Y^)=∣Y∪Y^∣∣Y∩Y^∣
平均杰卡德系数:
Mean Jaccard=1N∑i=1NJaccard(Yi,Y^i)\text{Mean Jaccard} = \frac{1}{N} \sum_{i=1}^{N} \text{Jaccard}(Y_i, \hat{Y}_i)Mean Jaccard=N1∑i=1NJaccard(Yi,Y^i)
(取值范围:[0,1],1 表示标签集合完全匹配)

被折叠的 条评论
为什么被折叠?



