如何在light gbm中编写带有标签平滑功能的自定义目标函数?

时间:2019-04-02 06:05:59

标签: lightgbm objective-function

如何在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时出现错误,而在目标函数中却没有结果。

谢谢!

0 个答案:

没有答案