如何在light gbm中实现标签平滑?
标签平滑通过分别用eps / k和1-(k-1)/ k * eps的目标替换硬0和1分类目标,基于具有k个输出值的softmax对模型进行正则化。 在深度学习中,标签平滑总是使分类模型具有更好的性能。 我试图通过自定义目标函数来标记平滑。
class smooth_label_loss(object):
def __init__(self, eps=0.01,nof_class = 4,use_eps=True):
self.eps = eps
self.nof_class = nof_class
self.use_eps= use_eps
def _get_aligned_label(self,y_true):
eps = self.eps
nof_class=self.nof_class
y_align = []
for short_labl in y_true:
short_labl=int(short_labl)
onehot_label= np.eye(nof_class)[short_labl]
if self.use_eps:
labl = onehot_label*(1-eps) + (1-onehot_label)*eps/nof_class
else:
labl = onehot_label
y_align.append(labl)
return np.array(y_align)
def __call__(self, y_pred,dtrain):
y_true=dtrain.get_label()
y_align = self._get_aligned_label(y_true)
y_flat=y_align[:,0]
for ii in range(1, self.nof_class):
y_flat=np.concatenate([y_flat,y_align[:,ii]])
prob = 1.0 / (1.0 + np.exp(-y_pred))
#prob=pred_align
grad = prob - y_flat
hess = prob * (1.0 - prob)
return grad, hess
但是结果要比原始分类函数差(仅在lightgbm中使用params {'objective':'multiclass'})。 如果我在自定义函数中设置了use_eps = False。与原始分类功能也有不同的表现。在计算毕业和犹豫时可能会出现一些错误?
标签平滑在光gbm中工作吗?或在计算grad时出现错误,而在目标函数中却没有结果。
谢谢!