xgboost 数据不平衡处理方式

在对不平衡数据进行训练时,通常会考虑一下怎么处理不平衡数据能使训练出来的结果较好。能想到的比较基础的方法是过采样和下采样来缓解数据中的正负样本比。

在用xgboost训练二分类模型时,除了直接使用过采样和下采样,xgboost接口还提供一些处理不平衡数据的方法,有scale_pos_weight参数的设置,还有给样本赋予一定的权重。接下来让我们仔细看一下吧~

1、参数scale_pos_weight:

官方的解释是这样的,scale_pos_weight可以设置为数据中负样本数量/正样本数量

2、设置样本的权重,在DMatrix里边可以设置

 

 

 

关于scale_pos_weight ,在xgboost里边的源码是:

if (label == 1.0f) {
            w *= scale_pos_weight;
          }

  

从源代码也可以看出,scale_pos_weight其实就是改变样本weight,也就是和在DMatrix里边设置每个样本的weight是一样的。

在DMatrix里边设置每个样本的weight 是 怎样改变训练过程的呢,其实是改变训练的损失函数,源代码里的代码如下,可以看到对不同的样本赋予不同的权重实际上是影响了该样本在训练过程中贡献的损失,进而改变了一阶导和二阶导。

_out_gpair[_idx] = GradientPair(Loss::FirstOrderGradient(p, label) * w,
                   Loss::SecondOrderGradient(p, label) * w);

  

 

结论:

xgboost中scale_pos_weight、对样本进行weight设置 和 简单复制正样本得到的结果是一样的,本质上都是改变了训练的损失函数。

通过自定义设置损失函数可得到验证。实际上基本思想都是通过过采样的方法处理不平衡数据。

 

https://blog.csdn.net/qq_32103261/article/details/106664227?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-5-106664227.nonecase&utm_term=xgboost%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E6%A0%B7%E6%9C%AC%E4%B8%8D%E5%B9%B3%E8%A1%A1%E9%97%AE%E9%A2%98&spm=1000.2123.3001.4430

 

posted @ 2020-10-15 11:23  静悟生慧  阅读(4181)  评论(0编辑  收藏  举报