【问题标题】:Cross-validation with class imbalance类不平衡的交叉验证
【发布时间】:2021-10-08 03:21:46
【问题描述】:

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: python xgboost imbalanced-data


    【解决方案1】:

    FN 比 FP 贵很多

    您可以根据对误报和误报成本的一些估计来创建自己的目标函数。文档是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 执行类的调整。

    【讨论】:

      猜你喜欢
      • 2018-07-26
      • 2019-06-04
      • 2015-12-13
      • 2018-11-15
      • 2021-03-03
      • 1970-01-01
      • 2013-01-15
      • 2019-08-21
      • 2020-09-30
      相关资源
      最近更新 更多