别再为数据不平衡发愁了!手把手教你用imbalanced-learn搞定分类难题(附实战代码)
2026/6/4 5:53:58 网站建设 项目流程

数据科学家的秘密武器:用imbalanced-learn破解类别不平衡困局

金融风控团队的小张最近遇到了一个棘手问题——在信用卡欺诈检测模型中,正常交易样本占比99.8%,欺诈交易仅占0.2%。尽管模型准确率高达99.9%,但实际捕获的欺诈案例却不足30%。这种典型的类别不平衡问题,正是数据科学家在日常工作中最常面临的挑战之一。

1. 为什么类别不平衡会让模型"失明"?

传统机器学习算法在设计时通常假设各类别样本分布均衡,当面对极端不平衡数据时,模型会倾向于预测多数类以获得表面上的高准确率。以医疗诊断为例:

评估指标不处理不平衡处理后
准确率99.1%98.3%
召回率12.4%89.7%
F1-score0.210.91

关键问题在于:对于罕见但重要的类别(如欺诈、癌症病例),我们更关心的是模型识别少数类的能力,而非整体准确率。这正是imbalanced-learn库的价值所在——它提供了超过20种专门设计的采样算法,能有效改善模型对少数类的识别性能。

2. 快速搭建不平衡数据处理流水线

让我们通过一个电商异常订单检测的案例,演示如何构建端到端的处理流程:

from imblearn.pipeline import Pipeline from imblearn.over_sampling import SMOTE from imblearn.under_sampling import RandomUnderSampler from sklearn.ensemble import RandomForestClassifier # 构建组合采样管道 model = Pipeline([ ('over', SMOTE(sampling_strategy=0.1, k_neighbors=5)), ('under', RandomUnderSampler(sampling_strategy=0.5)), ('classifier', RandomForestClassifier()) ]) # 训练评估流程 model.fit(X_train, y_train) print(classification_report(y_test, model.predict(X_test)))

提示:SMOTE的sampling_strategy参数控制生成样本的比例,k_neighbors决定生成样本时的邻域范围

常用采样方法组合策略:

  • 过采样+欠采样组合:SMOTE+ENN通常表现最佳
  • 纯过采样:适合数据量小的场景,但可能过拟合
  • 纯欠采样:适合计算资源有限的情况
  • 集成方法:如EasyEnsemble对极端不平衡效果显著

3. 高级技巧:超越基础采样方法

当基础SMOTE效果不佳时,可以尝试这些进阶技术:

3.1 边界敏感采样技术

from imblearn.over_sampling import BorderlineSMOTE # 只对边界样本进行过采样 bsmote = BorderlineSMOTE(kind='borderline-1', sampling_strategy='auto') X_res, y_res = bsmote.fit_resample(X, y)

BorderlineSMOTE的两种模式:

  • borderline-1:在边界附近生成新样本
  • borderline-2:仅在边界多数类侧生成样本

3.2 基于聚类的采样优化

from imblearn.over_sampling import KMeansSMOTE # 先聚类再在各簇内部分别过采样 kmsmote = KMeansSMOTE(cluster_balance_threshold=0.1) X_res, y_res = kmsmote.fit_resample(X, y)

3.3 自适应采样策略

ADASYN算法会根据样本的学习难度自动调整生成数量:

from imblearn.over_sampling import ADASYN adasyn = ADASYN(n_neighbors=5, sampling_strategy='minority') X_res, y_res = adasyn.fit_resample(X, y)

4. 实战:金融风控案例全流程

让我们看一个完整的信用卡欺诈检测实现:

# 数据准备 fraud = pd.read_csv('creditcard.csv') X = fraud.drop('Class', axis=1) y = fraud['Class'] # 定义评估函数 def evaluate_model(X, y, model): cv = StratifiedKFold(n_splits=5) scores = cross_val_score(model, X, y, scoring='roc_auc', cv=cv, n_jobs=-1) return np.mean(scores) # 测试不同采样策略 strategies = { '原始数据': DummyClassifier(), 'SMOTE': SMOTE(), 'SMOTE+ENN': SMOTEENN(), 'BalanceCascade': BalancedRandomForestClassifier() } results = {} for name, strategy in strategies.items(): model = Pipeline([('sampler', strategy), ('model', LogisticRegression())]) results[name] = evaluate_model(X, y, model)

采样方法性能对比表:

方法AUC得分训练时间(s)内存占用(MB)
原始数据0.8721.250
SMOTE0.9523.8210
SMOTE+ENN0.9615.1180
BalanceCascade0.9688.7320

在真实项目中,我发现对于千万级样本的金融数据,采用分层采样+集成学习的组合往往能在效果和效率间取得最佳平衡。一个实用的技巧是先用10%数据测试不同采样策略效果,再全量应用最优方案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询