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
4、将正样本复制成原来的3倍,再和负样本拼起来组成新的训练集
4个方案都是固定进行100轮迭代,训练过程的AUC打印如下:
从上图中可以看出,每一轮迭代auc都相同,基本应该可以推测每个子学习器都是一样的。有没有可能排序一样,但是prob范围不一样?感觉应该不会。
下面还有源码层面的分析,进行佐证:
w是sample_weight,scale_pos_weight实质上改变的就是sample_weight,sample_weight又是怎么改变训练过程的?实际上就是改变了损失函数中不同类型样本的贡献,进而改变一阶导和二阶导可以推测lightgbm和sklearn中的sample_weight也是类似的。
另外这里也有一些lightgbm的源码分析,我没看太明白,大致的意思应该是label_weight和sample_weight共同影响了一阶导和二阶导,那这就和上面的xgb的分析是一样的。
留言
張貼留言