lightgbm或xgboost中scale_pos_weight的机制

https://blog.csdn.net/qq_32103261/article/details/106664227

这篇博文通过实验加读源码的方式研究了scale_pos_weight参数的机制,很清晰。

首先scale_pos_weight是正样本的权重,一种通常的设置是

scale_pos_weight = 负样本数/正样本数,这个时候,比方说9000个负样本,1000个正样本,scale_pos_weight可以设置为9,这个时候就等价于9*1000个正样本,整个数据集就达到了完全平衡1比1。

另外lightgbm和xgboost都有sample_weight类似的参数,给每一条记录赋予不同的权重。

实验设计,四种方式比较其训练过程:

实验使用数据量80000,其中负样本60000,正样本20000,负样本是正样本数量的3倍

1、使用scale_pos_weight


2、使用sample weight,给每条记录赋权重,正样本3,负样本1,在DMatrix中设置

3、自定义损失函数,正样本的logloss是负样本的3倍,再求一阶导和二阶导

4、将正样本复制成原来的3倍,再和负样本拼起来组成新的训练集

4个方案都是固定进行100轮迭代,训练过程的AUC打印如下:

从上图中可以看出,每一轮迭代auc都相同,基本应该可以推测每个子学习器都是一样的。有没有可能排序一样,但是prob范围不一样?感觉应该不会。

下面还有源码层面的分析,进行佐证:
w是sample_weight,scale_pos_weight实质上改变的就是sample_weight,sample_weight又是怎么改变训练过程的?实际上就是改变了损失函数中不同类型样本的贡献,进而改变一阶导和二阶导

结论:xgboost中scale_pos_weight、sample_weight、简单复制正样本、改变损失函数得到的结果是一样的,scale_pos_weight和sample_weight本质上都是改变损失函数,等价于简单复制。
可以推测lightgbm和sklearn中的sample_weight也是类似的。

另外这里也有一些lightgbm的源码分析,我没看太明白,大致的意思应该是label_weight和sample_weight共同影响了一阶导和二阶导,那这就和上面的xgb的分析是一样的。

留言

熱門文章