Создание пользовательской целевой функции для XGBoost.XGBRegressor - PullRequest
1 голос
/ 10 января 2020

Так что я относительно новичок в игре ML / AI в python, и в настоящее время я работаю над проблемой, связанной с реализацией пользовательской целевой функции для XGBoost.

Мои знания по дифференциальным уравнениям довольно ржавый, поэтому я создал пользовательскую функцию obj с градиентом и гессианом, которая моделирует среднеквадратичную функцию ошибки, которая запускается как целевая функция по умолчанию в XGBRegressor, чтобы убедиться, что я делаю все это правильно. Проблема в том, что результаты модели (выходные данные об ошибках близки, но по большей части не идентичны (и в некоторых моментах отключены). Я не знаю, что я делаю неправильно или как это возможно, если я Я правильно все вычисляю. Если бы вы все могли взглянуть на это, возможно, дать представление о том, где я неправ, это было бы здорово!

Исходный код без пользовательской функции:

    import xgboost as xgb

    reg = xgb.XGBRegressor(n_estimators=150, 
                   max_depth=2,
                   objective ="reg:squarederror", 
                   n_jobs=-1)

    reg.fit(X_train, y_train)

    y_pred_test = reg.predict(X_test)

и моя пользовательская целевая функция для MSE выглядит следующим образом:

    def gradient_se(y_true, y_pred):
        #Compute the gradient squared error.
        return (-2 * y_true) + (2 * y_pred)

    def hessian_se(y_true, y_pred):
        #Compute the hessian for squared error
        return 0*(y_true + y_pred) + 2

   def custom_se(y_true, y_pred):
        #squared error objective. A simplified version of MSE used as
        #objective function.

        grad = gradient_se(y_true, y_pred)
        hess = hessian_se(y_true, y_pred)
        return grad, hess

ссылка на документацию здесь

Спасибо!

1 Ответ

1 голос
/ 11 января 2020

Согласно документации , библиотека передает прогнозируемые значения (y_pred в вашем случае) и значения истинной земли (y_true в вашем случае) в этом порядке.

Вы передаете значения y_true и y_pred в обратном порядке в вашей функции custom_se(y_true, y_pred) обеим функциям gradient_se и hessian_se. Для гессиана это не имеет значения, поскольку гессиан должен возвращать 2 для всех x значений, и вы сделали это правильно.

Для функции gradient_se вы неверно обозначаете y_true и y_pred.

Правильная реализация выглядит следующим образом:

    def gradient_se(y_pred, y_true):
        #Compute the gradient squared error.
        return 2*(y_pred - y_true)

    def hessian_se(y_pred, y_true):
        #Compute the hessian for squared error
        return 0*y_true + 2

   def custom_se(y_pred, y_true):
        #squared error objective. A simplified version of MSE used as
        #objective function.

        grad = gradient_se(y_pred, y_true)
        hess = hessian_se(y_pred, y_true)
        return grad, hess
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...