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 卡片。