Scikit learn XGBoost:根据默认指标提前停止,而不是自定义评估函数
我使用的是XGBoost 0.90。我希望使用Python训练XGBoost回归模型,使用内置的学习目标,并提前停止内置的评估指标。容易的。在我的案例中,目标是“reg:tweedie”,评估指标是“tweedie nloglik”。但是在每次迭代中,我也希望计算一个信息丰富的自定义度量,它不应该用于提前停止。但这是错误的 最后,我希望使用scikit learn GridSearchCV,训练一组模型,使其尽早停止,并具有内置的目标和指标,但最终选择在定制指标上表现最好的模型 在这个示例代码中,我使用了另一个内置目标和内置度量,但问题是相同的Scikit learn XGBoost:根据默认指标提前停止,而不是自定义评估函数,scikit-learn,xgboost,early-stopping,Scikit Learn,Xgboost,Early Stopping,我使用的是XGBoost 0.90。我希望使用Python训练XGBoost回归模型,使用内置的学习目标,并提前停止内置的评估指标。容易的。在我的案例中,目标是“reg:tweedie”,评估指标是“tweedie nloglik”。但是在每次迭代中,我也希望计算一个信息丰富的自定义度量,它不应该用于提前停止。但这是错误的 最后,我希望使用scikit learn GridSearchCV,训练一组模型,使其尽早停止,并具有内置的目标和指标,但最终选择在定制指标上表现最好的模型 在这个示例代码中
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)
输出是(如果我没有使用feval,它会在迭代3时停止):
我怎样才能得到这样的输出
[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
我可以用一个返回元组列表()的自定义求值函数来解决这个问题。但当我希望使用诸如“rmse”或“tweedie nloglik”之类的内置评估指标时,这能做到吗?我可以在自定义求值函数中调用它们吗?XGBoost中有一个内置的提前停止回调函数,在该函数中可以指定提前停止使用的数据集和度量。在您的情况下,您必须创建一个新的提前停止回调,如下所示:
early_stop = xgb.callback.EarlyStopping(rounds=3,
metric_name='rmse',
data_name='dtest')
然后在调用train时将其添加到回调列表中:
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,
callbacks=[early_stop])
有关更多信息,请参见文档的本页:
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,
callbacks=[early_stop])