1. 不平衡分类中的基准模型选择指南
在机器学习实践中,特别是处理不平衡分类问题时,新手常犯两个致命错误:一是直接应用复杂算法而不建立性能基准,二是错误地使用分类准确率作为评估指标。这两个错误往往导致模型看似表现良好,实则毫无实用价值。
性能基准为我们提供了模型是否具备实际技能的最低标准,也是衡量所有后续模型改进的参照点。对于不平衡分类问题,选择正确的评估指标和对应的基准策略尤为关键——因为不同指标需要不同的"无技能"基准模型。
2. 不平衡分类的核心评估指标
2.1 评估预测类别的指标
当我们需要评估模型直接预测的类别标签时,主要考虑以下指标:
准确率(Accuracy):正确预测占总预测的比例。在不平衡数据上容易产生误导,例如在99%负例的数据集上,即使全部预测为负也能获得99%准确率。
G-Mean:敏感度(真正例率)和特异度(真负例率)的几何平均数。同时考虑了正负类的识别能力,特别适合类别不平衡场景。
F-Measure系列:
- F1分数:精确率和召回率的调和平均数
- F0.5分数:更强调精确率
- F2分数:更强调召回率
2.2 评估预测概率的指标
当模型输出的是类别概率时,我们使用以下指标:
ROC AUC:受试者工作特征曲线下面积,反映模型在不同阈值下的整体分类能力。
PR AUC:精确率-召回率曲线下面积,特别适合高度不平衡的数据集。
Brier分数:概率预测的校准程度,数值越小越好。
3. 基准模型策略详解
3.1 五种基本基准策略
对于二分类问题,我们通常考虑五种基准策略:
- 均匀随机猜测(Uniform): 以50%概率随机预测0或1
- 分层随机猜测(Stratified): 按数据集中的类别比例随机预测
- 多数类(Majority): 总是预测多数类
- 少数类(Minority): 总是预测少数类
- 类别先验(Prior): 预测每个类别的先验概率
在scikit-learn中,这些策略可通过DummyClassifier实现:
from sklearn.dummy import DummyClassifier # 均匀随机 uniform_clf = DummyClassifier(strategy='uniform') # 分层随机 stratified_clf = DummyClassifier(strategy='stratified') # 多数类 majority_clf = DummyClassifier(strategy='most_frequent') # 少数类 minority_clf = DummyClassifier(strategy='constant', constant=1) # 类别先验 prior_clf = DummyClassifier(strategy='prior')3.2 指标与基准策略的对应关系
3.2.1 准确率的基准策略
最佳策略:预测多数类
原理:准确率只关心预测正确的比例。在不平衡数据中,多数类占比高,预测多数类能最大化正确预测数。
实验验证: 在99%负例的数据集上测试:
>Uniform 0.501 (0.015) >Stratified 0.980 (0.003) >Majority 0.990 (0.000) # 最优 >Minority 0.010 (0.000) >Prior 0.990 (0.000)3.2.2 G-Mean的基准策略
最佳策略:均匀随机猜测
原理:G-Mean是敏感度和特异度的几何平均。只预测一个类别会导致另一类别的识别率为0,从而使G-Mean为0。均匀随机给两个类别同等机会。
实验验证:
>Uniform 0.507 (0.074) # 最优 >Stratified 0.021 (0.079) >Majority 0.000 (0.000) >Minority 0.000 (0.000) >Prior 0.000 (0.000)3.2.3 F-Measure的基准策略
最佳策略:预测少数类
原理:F-Measure是精确率和召回率的调和平均。预测少数类能获得完美的召回率(1.0),精确率等于少数类比例(0.01),F1约为0.02。
实验验证:
>Uniform 0.020 (0.007) >Stratified 0.020 (0.040) >Majority 0.000 (0.000) >Minority 0.020 (0.000) # 最优 >Prior 0.000 (0.000)3.2.4 ROC AUC的基准策略
最佳策略:分层随机猜测
原理:ROC AUC的无技能水平是0.5,通过按类别比例随机预测可以达到。
实验验证:
>Uniform 0.500 (0.000) >Stratified 0.506 (0.020) # 最优 >Majority 0.500 (0.000) >Minority 0.500 (0.000) >Prior 0.500 (0.000)3.2.5 PR AUC的基准策略
最佳策略:分层随机猜测
原理:PR AUC的无技能水平等于正类比例(0.01),通过按类别比例随机预测可以达到。
实验验证:
>Uniform 0.010 (0.000) >Stratified 0.010 (0.000) # 最优 >Majority 0.010 (0.000) >Minority 0.010 (0.000) >Prior 0.010 (0.000)4. 实践建议与常见陷阱
4.1 指标选择指南
- 高度不平衡数据(>100:1):优先考虑PR AUC和F-Measure
- 中等不平衡(10:1~100:1):G-Mean和ROC AUC更合适
- 关注假阳性成本:使用F0.5或强调特异度的指标
- 关注假阴性成本:使用F2或强调召回率的指标
4.2 实现注意事项
- 交叉验证设置:
from sklearn.model_selection import RepeatedStratifiedKFold cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)- 自定义评分函数:
from sklearn.metrics import make_scorer from imblearn.metrics import geometric_mean_score gmean_scorer = make_scorer(geometric_mean_score)- 概率指标的特殊处理:
from sklearn.metrics import precision_recall_curve, auc def pr_auc(y_true, probas_pred): p, r, _ = precision_recall_curve(y_true, probas_pred) return auc(r, p)4.3 常见错误排查
警告"UndefinedMetricWarning":当某个类别未被预测时会出现,检查基准策略是否适合当前指标。
ROC/PR曲线退化为单点:当模型总是预测相同类别时发生,需要改用概率预测或调整策略。
基准分数异常高:通常说明选择了错误的基准策略,如在不平衡数据上用准确率和多数类策略。
分数方差过大:增加交叉验证的重数(n_repeats)或使用更大的测试集。
5. 完整实现示例
以下是一个综合评估所有指标的完整示例:
from numpy import mean, std from sklearn.datasets import make_classification from sklearn.dummy import DummyClassifier from sklearn.model_selection import cross_validate from imblearn.metrics import geometric_mean_score from sklearn.metrics import (accuracy_score, f1_score, roc_auc_score, precision_recall_curve, auc) # 创建不平衡数据集 X, y = make_classification(n_samples=10000, weights=[0.99], random_state=42) # 定义评估指标 scoring = { 'accuracy': 'accuracy', 'f1': 'f1', 'gmean': make_scorer(geometric_mean_score), 'roc_auc': 'roc_auc', 'pr_auc': make_scorer(lambda y_true, probas_pred: auc(*precision_recall_curve(y_true, probas_pred)[:2]), needs_proba=True) } # 评估所有策略 strategies = ['uniform', 'stratified', 'most_frequent', ('constant', {'constant':1}), 'prior'] for strategy in strategies: if isinstance(strategy, tuple): clf = DummyClassifier(strategy=strategy[0], **strategy[1]) name = 'Minority' if strategy[1]['constant']==1 else 'Custom' else: clf = DummyClassifier(strategy=strategy) name = { 'uniform': 'Uniform', 'stratified': 'Stratified', 'most_frequent': 'Majority', 'prior': 'Prior' }[strategy] scores = cross_validate(clf, X, y, scoring=scoring, cv=5) print(f"\n{name} Strategy:") for metric in scoring: print(f"{metric}: {mean(scores[f'test_{metric}']):.3f} (±{std(scores[f'test_{metric}']):.3f})")6. 高级技巧与扩展
多类不平衡问题:将指标扩展为宏平均(macro-average)或加权平均(weighted)
成本敏感学习:为不同误分类设置不同代价,调整基准策略
自定义基准:根据业务需求设计特定的基准策略
早期停止基准:当模型性能无法显著超越基准时停止调优
指标组合:根据业务需求组合多个指标,如F1+ROC AUC
在实际项目中,我通常会先建立所有相关指标的基准,然后针对最重要的1-2个指标进行优化。例如在欺诈检测中,我会同时关注PR AUC(主要指标)和F2分数(强调召回),确保模型在整体性能和关键类别识别上都能超越基准水平。