Реализация матрицы затрат в мультиклассе 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

0 ответов

Другие вопросы по тегам