xgboost+Focal Loss
Focal Loss的主要思想就是改变损失函数。可以参考Focal Loss理解 - 三年一梦 - 博客园
xgboost如果想应用focal loss可以使用自定义损失函数来实现。
首先介绍一个比较好用的求导的python包 sympy。用这个包来求导,可以比较轻松求出一阶导和二阶导。
from sympy import *
import numpy as np
# y指的是true label
# p指的是预测出来的概率值(是经过sigmoid转换之后的)
# a指的是local foss的参数
# b指的是用来处理非平衡的参数
y,p,a,b=symbols('y p a b')
loss=b*(-y*log(p)*(1-p)**a)-(1-y)*log(1-p)*p**a #同时考虑了focal loss参数和处理非平衡参数的损失函数
grad=diff(loss,p)*p*(1-p) #求一阶导
print('grad:')
print(grad)
hess=diff(grad,p)*p*(1-p) #求二阶导
print('hess:')
print(hess)
###输出###
grad:
p*(1 - p)*(a*b*y*(1 - p)**a*log(p)/(1 - p) - a*p**a*(1 - y)*log(1 - p)/p - b*y*(1 - p)**a/p + p**a*(1 - y)/(1 - p))
hess:
p*(1 - p)*(p*(1 - p)*(-a**2*b*y*(1 - p)**a*log(p)/(1 - p)**2 - a**2*p**a*(1 - y)*log(1 - p)/p**2 &#