paper2skills Playbook

Imbalanced Data Handling(不平衡数据处理)

Skill-Imbalanced-Data-Handling · 12-ML基础

causalforecasting广告与投放MAS与智能体工程WF-B 广告优化WF-H 复购增长
年化 ROI150-300 万元
实现难度⭐⭐☆☆☆
业务视角
适用角色数据分析师 / 数据工程师 · 运营负责人 · 产品经理
适用平台选品评分 · 差评预测 · 用户流失预警 · 广告出价预测
什么情况下用想用机器学习解决业务问题,但不知道该选什么模型;模型上线后效果越来越差不知道为什么
成功是什么样的选对算法工具减少 50% 试错时间,模型上线后可监控可解释,数据团队和业务团队建立共同语言
业务痛点
不知道该用什么模型模型准确率不稳定业务不相信模型结果模型黑盒说不清为什么这么预测

1. 解决的问题

流失率 5%,直接用 XGBoost 训练,Recall 只有 0.3——70% 的流失用户没被识别

2. 核心算法逻辑

解决"少数类样本太少,模型学不到东西"的问题。在母婴电商中,流失(5%)、欺诈(<1%)、高价值转化(3%)都是典型不平衡场景。常规模型在不平衡数据上会偏向多数类,导致 Recall 极低。

3. 业务应用场景

业务问题:流失率 5%,直接用 XGBoost 训练,Recall 只有 0.3——70% 的流失用户没被识别。需要至少 0.8 Recall 才能触发有效的挽留策略。

数据要求:100,000 条用户特征 + 流失标签。需对比 4 种方案:Baseline / SMOTE / Class Weight / SMOTE + Tomek Links

预期产出: - Baseline: Recall=0.30, Precision=0.45 - SMOTE: Recall=0.75, Precision=0.35 - Class Weight: Recall=0.78, Precision=0.38 ← 最优 - SMOTE+Tomek: Recall=0.72, Precision=0.33

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • ROI 预估:流失预测场景 Recall 从 0.3 提升到 0.78,月增收 $144,000;欺诈检测场景减少误拦截挽回 $15,000/月。年化贡献 150-300 万元
  • 实施难度:⭐⭐☆☆☆(2 星)— imbalanced-learn + sklearn API 一致,但需要反复实验找最优组合
  • 优先级评分:⭐⭐⭐⭐⭐(5 星)— 母婴电商中流失、欺诈、稀有事件场景极多,是模型落地的核心瓶颈
  • 评估依据:Model Evaluation + CV 确保你"知道模型不好",Imbalanced Data Handling 让你"能做点什么来改善"。三者构成 ML 基础的质量闭环

7. 代码模板

代码块数量:1 · 路径:未检测到

"""
Imbalanced Data Handling Toolkit
不平衡数据处理工具集 — 重采样 / 类别权重 / 阈值调优

适用场景:流失预测、欺诈检测、稀有事件预警
"""

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from sklearn.metrics import classification_report, roc_auc_score
from imblearn.over_sampling import SMOTE, BorderlineSMOTE
from imblearn.under_sampling import RandomUnderSampler
from imblearn.combine import SMOTEENN, SMOTETomek
from typing import Dict, Tuple, List


def compare_imbalance_strategies(
    X: np.ndarray,
    y: np.ndarray,
    model=None,
    verbose: bool = True
) -> pd.DataFrame:
    """
    对比多种不平衡处理策略的效果
    
    Args:
        X: 特征矩阵
        y: 标签 (0/1)
        model: 基础模型(默认 XGBoost)
    
    Returns:
        DataFrame: 各策略的 Recall/Precision/F1/AUC 对比
    """
    model = model or XGBClassifier(random_state=42, eval_metric='logloss')
    pos_ratio = y.mean()
    
    strategies = {
        'Baseline (No Treatment)': None,
        'Class Weight (balanced)': 'balanced',
        'SMOTE': SMOTE(random_state=42),
        'Borderline SMOTE': BorderlineSMOTE(random_state=42),
        'SMOTE + Tomek Links': SMOTETomek(random_state=42),
        'SMOTE + ENN': SMOTEENN(random_state=42),
    }
    
    results = []
    for name, strategy in strategies.items():
        X_res, y_res = X, y
        
        if strategy == 'balanced':
            m = XGBClassifier(random_state=42, scale_pos_weight=(1-pos_ratio)/pos_ratio, 
                              eval_metric='logloss')
        elif strategy is not None:
            X_res, y_res = strategy.fit_resample(X, y)
            m = XGBClassifier(random_state=42, eval_metric='logloss')
        else:
            m = XGBClassifier(random_state=42, eval_metric='logloss')
        

8. 论文来源

未自动抽取;请查看原始 Skill 卡片。