Как я могу реализовать сглаживание меток в легких гбм?
Сглаживание меток упорядочивает модель на основе softmax с k выходными значениями, заменяя жесткие цели классификации 0 и 1 целевыми значениями eps / k и 1 - (k - 1) / k * eps соответственно.
При глубоком обучении сглаживание меток всегда обеспечивает лучшую производительность модели классификации.
Я пытался пометить сглаживание с помощью настройки целевой функции.
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
Но результат хуже, чем исходная классификационная функция (просто используйте params {'target': 'multiclass'} в lightgbm).
И если я установлю use_eps = False в моей пользовательской функции. У этого также есть различная работа с оригинальной функцией классификации. Может быть, есть некоторые ошибки в расчете града и гесс?
Работает ли сглаживание меток в легких гбм? или у меня ошибка в вычислении градуса и гесса в целевой функции.
Спасибо!