1. 不平衡分类问题概述在机器学习实践中我们经常会遇到类别分布极不均衡的数据集。比如在信用卡欺诈检测中正常交易可能占99.9%而欺诈交易仅占0.1%。这种类别比例严重失衡的情况被称为不平衡分类问题。传统分类算法在这种场景下表现往往不佳因为它们默认假设类别分布大致均衡优化目标是整体准确率。对于1:100的极端不平衡数据模型只需将所有样本预测为多数类就能达到99%的准确率但这显然毫无实用价值。2. 重采样技术基础原理2.1 过采样与欠采样对比重采样技术通过调整训练集的类别分布来解决不平衡问题主要分为两大类过采样(Oversampling)增加少数类样本随机复制少数类样本使用SMOTE等算法生成合成样本优点保留所有原始信息缺点可能导致过拟合欠采样(Undersampling)减少多数类样本随机删除多数类样本基于Tomek Links等算法删除边界样本优点降低计算成本缺点可能丢失重要信息2.2 为什么需要组合使用单独使用任一种方法都有明显局限仅过采样少数类样本高度重复模型容易记住特定样本仅欠采样丢弃大量潜在有用信息模型可能欠拟合组合策略可以发挥两者优势先过采样少数类增加其代表性再欠采样多数类消除冗余信息最终获得平衡且具有代表性的训练集3. 手动组合重采样方法3.1 随机过采样随机欠采样实现以下是使用imbalanced-learn库实现随机组合的完整示例from imblearn.pipeline import Pipeline from imblearn.over_sampling import RandomOverSampler from imblearn.under_sampling import RandomUnderSampler from sklearn.tree import DecisionTreeClassifier # 定义采样策略 over RandomOverSampler(sampling_strategy0.1) # 少数类增加到多数类的10% under RandomUnderSampler(sampling_strategy0.5) # 多数类减少到少数类的2倍 # 构建管道 pipeline Pipeline([ (oversample, over), (undersample, under), (model, DecisionTreeClassifier()) ])关键参数解析sampling_strategy0.1少数类样本数将达到多数类的10%sampling_strategy0.5采样后多数类样本数是少数类的2倍3.2 SMOTE随机欠采样实现更高级的组合方式是使用SMOTE生成合成样本from imblearn.over_sampling import SMOTE # 使用SMOTE替代随机过采样 over SMOTE(sampling_strategy0.1, k_neighbors5) under RandomUnderSampler(sampling_strategy0.5) pipeline Pipeline([ (smote, over), (undersample, under), (model, DecisionTreeClassifier()) ])SMOTE核心参数k_neighbors5生成新样本时考虑的最近邻数算法原理在特征空间中对少数类样本的k近邻进行线性插值4. 预定义组合策略解析4.1 SMOTETomek 组合SMOTE与Tomek Links的预定义组合from imblearn.combine import SMOTETomek resampler SMOTETomek( tomekTomekLinks(sampling_strategymajority), smoteSMOTE(sampling_strategy0.1) )工作流程SMOTE生成新的少数类样本识别Tomek Links不同类别的最近邻对移除多数类中的Tomek Link样本适用场景当多数类中存在大量边界噪声时需要更干净的决策边界时4.2 SMOTEENN 组合SMOTE与Edited Nearest Neighbors的更激进组合from imblearn.combine import SMOTEENN resampler SMOTEENN( ennEditedNearestNeighbours(sampling_strategyall), smoteSMOTE(sampling_strategy0.1) )ENN的特点移除被3个最近邻误分类的样本比Tomek Links更激进会清理更多样本可设置为处理所有类别或仅多数类5. 评估方法与实验设计5.1 交叉验证策略不平衡数据应使用分层交叉验证from sklearn.model_selection import RepeatedStratifiedKFold cv RepeatedStratifiedKFold( n_splits5, n_repeats3, random_state42 )为什么选择ROC AUC准确率在不平衡数据中具有误导性AUC综合考量了真正例率和假正例率对类别分布不敏感5.2 完整评估示例from sklearn.datasets import make_classification from sklearn.model_selection import cross_val_score # 生成不平衡数据 X, y make_classification( n_samples10000, weights[0.99], random_state42 ) # 评估流程 scores cross_val_score( pipeline, X, y, scoringroc_auc, cvcv, n_jobs-1 ) print(fMean AUC: {scores.mean():.3f})6. 实战经验与调优建议6.1 采样策略选择指南方法组合适用场景优点缺点随机过采样欠采样快速基线测试实现简单可能引入噪声SMOTE随机欠采样一般不平衡数据避免简单复制需调参k_neighborsSMOTETomek边界噪声明显时清理边界点计算成本较高SMOTEENN高质量数据需求更干净的数据可能过度清理6.2 常见问题解决方案问题1SMOTE生成不合理的样本检查特征缩放确保所有特征在相同尺度调整k_neighbors对于小数据集使用较小的k值考虑使用Borderline-SMOTE变体问题2模型过拟合重采样数据在交叉验证中应用重采样避免数据泄漏尝试不同的随机种子增加正则化强度问题3计算资源不足先欠采样再过采样减少数据量使用随机欠采样替代Tomek/ENN考虑使用NearMiss等高效欠采样算法7. 进阶技巧与扩展思考7.1 动态采样比例调优不要固定使用1:1的平衡比例可以尝试# 动态调整采样比例 ratio {0: 5000, 1: 1000} # 自定义比例 over SMOTE(sampling_strategyratio)比例选择策略基于类别误分类成本调整通过验证集性能网格搜索使用领域知识指导7.2 集成学习方法结合将重采样与集成学习结合from imblearn.ensemble import BalancedRandomForestClassifier model BalancedRandomForestClassifier( n_estimators100, sampling_strategyauto, replacementTrue )集成优势每棵树的训练集采用不同采样策略自动处理不平衡问题通常比单模型重采样表现更好7.3 代价敏感学习替代方案除了重采样还可以考虑from sklearn.svm import SVC model SVC( class_weight{0:1, 1:10}, # 少数类错误成本更高 probabilityTrue )适用场景当重采样不可行时如数据量极大类别误分类成本明确已知时需要保持原始数据分布时