Я использую пользовательскую функцию оценки в многомерной модели 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?