class 不平衡的交叉验证

Cross-validation with class imbalance

我正在尝试在二元分类设置中训练 XGBOOST,正例与负例的比例为 1:5。我的数据与癌症检测类似,即 FN 比 FP 昂贵得多。经过大量阅读,我仍然对以下内容感到困惑:

首先,我是否有必要通过过度采样来平衡 类?我的数据大小约为 160,000,其中许多条目的某些列包含 NaN。特别是关于 XGBOOST,我知道调整 scale_pos_weight 很常见,但文档 (https://xgboost.readthedocs.io/en/latest/tutorials/param_tuning.html) 指出这主要是为了整体 AUC 性能。我关心的主要指标是召回率,但也有一定程度的准确性。

其次,我应该在超参数调整中尝试最大化什么指标?

感谢您的帮助。

FNs are much more costly than FPs

您可以根据对假阴性和假阳性成本的一些估计来创建自己的 objective 函数。文档是here,这里是你可以得到启发的例子:

from sklearn.metrics import confusion_matrix

def your_objective(predt: np.ndarray, dtrain: xgb.DMatrix) -> Tuple[str, float]:
    y = (dtrain.get_label() > 0.5) * 1
    tn, fp, fn, tp = confusion_matrix(y, predt).ravel()

    your_gain = true_positive_cost * tp - false_positive_cost * fp
    max_gain = true_positive_cost * (fn + tp)

    result = your_gain / max_gain
    return 'your_objective', result

xgb.train(your_params,
          dtrain=dtrain,
          num_boost_round=10,
          obj='binary:hinge',
          feval=your_objective,
          evals=[(dtrain, 'dtrain'), (dtest, 'dtest')],
          evals_result=results)

你只需要定义true_positive_costfalse_positive_cost。 是的,请根据 dtrain.

中 类 的比率对 类 和 scale_pos_weight 进行调整