focal loss lightgbm

1、focal loss:



α是类别权重,决定正负样本的权重比例,类似于sample_weight,当取0.5的时候,相当于关闭此功能。
γ是难度权重,γ = 0的时候相当于关闭此功能,这个参数是加大了难判断样本点的损失权重,比如对于一个正例,假设γ = 2,当prob = 0.9的时候,难度权重是0.01,当prob = 0.5时,难度权重是0.25,后者相较于前者是25倍,这样就促使算法把prob = 0.5向更大的方向移动,更专注于学习难分的样本。

2、focal loss在lightgbm和xgboost上都需要通过客制化损失函数来实现,lightgbm中focal loss的实现,我尝试了两套代码
这是第一套,比较简洁,自定义损失函数,需要写出评价函数用于计算loss,需要写一个函数返回一阶导和二阶导,这里作者采用的是form scipy import derivative去计算一阶导和二阶导,这里作者把y = 0和y = 1的损失函数表示写在了一个式子里面,就像log loss那样。然后lgb在进行cv和train的时候,要填两个参数fobj和feval,fobj至少输入y_pred和dtrain,返回一阶导和二阶导,feval至少输入y_pred和dtrain,返回整个样本的loss
这是第二套,这个看起来比较完善,自己实现了一阶导和二阶导(类似换元的方法),要计算initial score(初始预测值p的logOdds),最后model.predict(X_test)也要加上训练集的initial score,再做sigmoid。根据参考链接中的说法,LGB自定义损失函数,存在几个细节
但是第二套代码去掉init_score部分,用相同超参,和第一套代码进行CV比较,每一折validation的值仍然存在差异,虽然差异较小,不知道是不是哪里随机数的关系,这里暂时没有时间深究了。还有一个疑问是如果用valid set的训练方式,在构建valid的lgb.Dataset时,采用的y_val的最优值的,不是y_train的?

两套代码比对起来,第二套应该是更适合应用.






留言

熱門文章