在样本不均衡(二分类任务中,正负类比例严重偏斜)的情况下,提高 AUC(Area Under the ROC Curve) 有一些针对性的策略,主要分为以下几类:
✅ 一、数据层面的方法
1. 过采样(Oversampling)
- SMOTE(Synthetic Minority Over-sampling Technique):通过插值生成少数类样本。
- ADASYN:对难以分类的少数类样本生成更多合成样本。
2. 欠采样(Undersampling)
- 随机删减多数类样本,适用于数据量大、模型训练成本高的情况。
3. 分层采样(Stratified Sampling)
- 保证训练集和验证集中正负类分布与整体一致,避免评估偏差。
✅ 二、损失函数与加权策略
1. 类别加权交叉熵损失
loss_fn = nn.BCEWithLogitsLoss(pos_weight=torch.tensor([class_weight]))
pos_weight = N_neg / N_pos
,可用来平衡损失函数中正负类样本的权重。
2. Focal Loss
- 使模型更关注难以分类的样本。
# α是类别权重,γ是聚焦因子
FL(p_t) = -α_t * (1 - p_t)^γ * log(p_t)
3. AUC-Oriented Loss(高级)
- 如 AUC maximization loss、RankNet/BPR loss,可以直接优化排序性能而非分类准确率。
✅ 三、模型层面的方法
1. 调整阈值策略
- 默认0.5阈值可能不适用于不平衡数据,使用 最佳AUC对应的阈值(通过验证集找出)。
2. 集成学习
- 使用如 XGBoost、LightGBM、CatBoost 等对样本不均衡较鲁棒的模型。
- Bagging + UnderSampling 或 Boosting + Class Weights 是常见组合。
3. 模型不确定性估计
- 可以用 MC Dropout 或 置信度评估 筛选高置信度的样本用于伪标签或重新加权。
✅ 四、评估与调参策略
1. 用 AUC 作为超参数优化目标
- 使用如 Optuna、Ray Tune,将 AUC 作为目标函数进行搜索。
2. 使用验证集而非训练集评估 AUC
- 防止因过拟合导致 AUC 偏高。
3. 监控 TPR / FPR 平衡情况
- 观察 ROC 曲线,确认模型是否偏向某一类。
✅ 五、实际推荐组合策略(适用于神经网络)
假设你当前模型是一个标准的二分类深度学习模型:
# Step 1: 加入类别权重
pos_weight = torch.tensor([N_neg / N_pos])
loss_fn = nn.BCEWithLogitsLoss(pos_weight=pos_weight)
# Step 2: 监控 AUC
from sklearn.metrics import roc_auc_score
auc = roc_auc_score(y_true, y_pred_proba)
# Step 3: 调整阈值获得最佳分类点(可选)
from sklearn.metrics import roc_curve
fpr, tpr, thresholds = roc_curve(y_true, y_pred_proba)
best_thresh = thresholds[np.argmax(tpr - fpr)]