Я использую XGBoost 0.90. Я sh буду обучать регрессионные модели XGBoost, используя Python, используя встроенную цель обучения с ранней остановкой на встроенном метрике оценки c. Легко. В моем случае целью является «reg: tweed ie», а оценка metri c - «tweed ie -nloglik». Но на каждой итерации I также wi sh для вычисления информативного пользовательского показателя c, который не следует использовать для ранней остановки. Но это ошибочно.
В конце концов я sh буду использовать scikit-learn GridSearchCV, обучу множество моделей ранней остановке со встроенными целями и метриками, но в конце выбираю ту, которая лучше всего подходит для пользовательский метри c по сгибам.
В этом примере кода я использую другую встроенную цель и встроенный метри c, но проблема та же.
import numpy as np
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
def mymetric(pred, dmat):
y = dmat.get_label()
res = np.sqrt(np.sum((y - pred)**4)/len(y))
return 'mymetric', float(res)
np.random.seed(seed=2500)
x, y, weight = np.random.randn(4096, 16), np.random.randn(4096), np.random.random(4096)
train_x, test_x, train_y, test_y, train_weight, test_weight = train_test_split(x, y, weight,
train_size=0.7, random_state=32)
dtrain = xgb.DMatrix(train_x, label=train_y, weight=train_weight)
dtest = xgb.DMatrix(test_x, label=test_y, weight=test_weight)
results_learning = {}
bst = xgb.train(params={'objective': 'reg:squarederror',
'eval_metric': 'rmse',
'disable_default_eval_metric': 0},
num_boost_round=20, dtrain=dtrain, evals=[(dtrain, 'dtrain'), (dtest, 'dtest')],
evals_result=results_learning,
feval=mymetric,
early_stopping_rounds=3)
Вывод (он остановился бы на итерации 3, если бы я не использовал feval ):
[0] dtrain-rmse:1.02988 dtest-rmse:1.11216 dtrain-mymetric:1.85777 dtest-mymetric:2.15138
Multiple eval metrics have been passed: 'dtest-mymetric' will be used for early stopping.
Will train until dtest-mymetric hasn't improved in 3 rounds.
...
Stopping. Best iteration:
[4] dtrain-rmse:0.919674 dtest-rmse:1.08358 dtrain-mymetric:1.56446 dtest-mymetric:1.9885
Как я мог бы получить такой вывод?
[0] dtrain-rmse:1.02988 dtest-rmse:1.11216 dtrain-mymetric:1.85777 dtest-mymetric:2.15138
Multiple eval metrics have been passed: 'dtest-rmse' will be used for early stopping.
Will train until dtest-rmse hasn't improved in 3 rounds.
...
Stopping. Best iteration:
[3] dtrain-rmse:0.941712 dtest-rmse:1.0821 dtrain-mymetric:1.61367 dtest-mymetric:1.99428
Я мог бы решить эту проблему с помощью пользовательской функции оценки, возвращающей список кортежей (https://github.com/dmlc/xgboost/issues/1125). Но можно ли это сделать, когда я sh буду использовать встроенные метрики оценки, такие как 'rmse' или 'tweed ie -nloglik'? Могу ли я вызвать их внутри пользовательской функции оценки?