Можно ли использовать пользовательскую функцию eval с целевой функцией по умолчанию в многомерной модели xgboost? - PullRequest
0 голосов
/ 07 июля 2019

Я использую пользовательскую функцию оценки в многомерной модели xgboost.Я не уверен, правильно ли я использую feval

Я пытался feval=customeval1, и когда я использую другую пользовательскую функцию eval (customeval2, которая определенно неверна), я получаю тот же ответ.Поэтому я не уверен, что использование feval в коде является правильным.

Вот код, который я использовал:

# first custom eval function
def customeval1(preds, y_train):
    error=mahalanobis(x=preds,data=y_train) #y_train has two columns for two outcomes
    return 'customeval', error

# evaluation metric to model correlation between outcomes
def mahalanobis(x=None, data=None, cov=None):
    x_minus_mu = x - np.array(np.mean(data)) 
    if not cov:
        cov = np.cov(data.values.T)
    inv_covmat = sp.linalg.inv(cov)
    left_term = np.dot(x_minus_mu, inv_covmat)
    mahal = np.einsum('ij,ji->i', left_term,x_minus_mu.T)  #finding diagonal
    return np.mean(mahal)

multixg = MultiOutputRegressor(XGBRegressor(objective='reg:squarederror',booster='gbtree',
colsample_bytree = 1, nthread=8,learning_rate = 0.5,subsample=1,
disable_default_eval_metric=1, max_depth = 4, gamma=0, reg_lambda=0,
n_estimators=10, verbosity=2,feval=customeval1)) 

multixg.fit(X_train, y_train)

y_pred=multixg.predict(X_test1)
rmse1 = np.sqrt(mean_squared_error(y_test1.iloc[:,0], y_pred[:,0]))
rmse2 = np.sqrt(mean_squared_error(y_test1.iloc[:,1], y_pred[:,1]))
print(rmse1)
print(rmse2)

Ответ, который я получаю для rmse1 и rmse2 с использованием приведенного выше кода остается прежним, если я изменяю пользовательскую функцию eval на следующую:

# second custom eval function
def customeval2(preds, y_train):
    error=mahalanobis(x=preds,data=y_train) #y_train has two columns for two outcomes
    return 'customeval', 1

In customeval2 Я возвращаю постоянное значение 1 (что неверно), чтобы проверить,код выдает ошибку, когда я запускаю multixg.fit(X_train, y_train).Но я не получаю ошибку и в итоге получаю тот же ответ для rmse1 и rmse2, как и раньше.

Примечание : я использую цель по умолчанию reg:squarederror, но вместо значения по умолчанию rmse в качестве показателя оценки я использую среднее расстояние по махаланобису в качестве показателя оценки, поскольку ономожет моделировать корреляцию между результатами.

Правильно ли мое использование feval в многомерной модели xgboost?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...