Реализация матрицы затрат в мультиклассе XGBoost
Я пытаюсь реализовать матрицу затрат в примере, представленном ytsaig (xgboost dev) здесь:
https://gist.github.com/ytsaig/a596feec53d2a024ac69f5ae5a83d8f7
Итак, я знаю конкретную стоимость каждой конкретной ошибки в классификации для моей проблемы, я могу построить функцию стоимости, но у меня есть проблемы с ее производными.
Что я пробовал
Я попытался перебрать каждую метку и поэлементно умножить каждый градиент на соответствующую ему строку в матрице затрат, и сделал что-то похожее с гессианом. Я думал, что это сработает, потому что мы просто масштабируем каждое предсказание, но безуспешно.
def softmaxobj(preds, dtrain):
"""Softmax objective.
Args:
preds: (N, K) array, N = #data, K = #classes.
dtrain: DMatrix object with training data.
Returns:
grad: N*K array with gradient values.
hess: N*K array with second-order gradient values.
"""
# Label is a vector of class indices for each input example
labels = dtrain.get_label()
# When objective=softprob, preds has shape (N, K)
labels = OneHotEncoder(sparse=False).fit_transform(labels.reshape(-1, 1))
#### Custom stuff starts here! ####
grad = np.array([])
hess = np.array([])
for i in range(len(labels):
l = labels[i]
p = preds[i]
# Gradiant and Hessian for this datapoint
g = p - l
h = 2.0 * p * (1.0 - p)
if np.array_equal(l, np.array([1, 0, 0])):
grad = np.append(grad, np.multiply(g, np.array([1.5, 0, 1.5])))
hess = np.append(hess, np.multiply(h, np.array([1.5, 0, 1.5])))
if np.array_equal(l, np.array([0, 1, 0])):
grad = np.append(grad, np.multiply(g, np.array([-2, 0, 4])))
hess = np.append(hess, np.multiply(h, np.array([-2, 0, 4])))
if np.array_equal(l, np.array([0, 0, 1])):
grad = np.append(grad, np.multiply(g, np.array([4, 0, 2])))
hess = np.append(hess, np.multiply(h, np.array([4, 0, 2])))
# Return as 1-d vectors
return grad.flatten(), hess.flatten()
Любая помощь с благодарностью,
JR