Python xgb.cv 使用多个评估指标

Python xgb.cv use multiple evalation metrics

我目前正在尝试寻找 XGBoost 模型的最佳参数。 找到最佳参数后,我想使用多个自定义评估指标通过交叉验证评估模型。

假设我想使用以下两个指标: (我想使用不同的指标,但文档中提供了第一个指标,我只想了解如何使用两个指标)

def rmsle(predt: np.ndarray, dtrain: xgb.DMatrix) -> Tuple[str, float]:
    ''' Root mean squared log error metric.'''
    y = dtrain.get_label()
    predt[predt < -1] = -1 + 1e-6
    elements = np.power(np.log1p(y) - np.log1p(predt), 2)
    return 'PyRMSLE', float(np.sqrt(np.sum(elements) / len(y)))

def rmsle2(predt: np.ndarray, dtrain: xgb.DMatrix) -> Tuple[str, float]:
    ''' Root mean squared log error metric.'''
    y = dtrain.get_label()
    predt[predt < -1] = -1 + 1e-6
    elements = np.power(np.log1p(y) - np.log1p(predt), 2)
    return 'PyRMSLE', float(2*np.sqrt(np.sum(elements) / len(y)))

现在我使用下面的代码来计算模型:

cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds=cv,
    feval={rmsle,rmsle2}, early_stopping_rounds=early_stopping_rounds)

不幸的是,这不起作用。 如果我只使用 feval 指标 feval=rmsle,就可以了。

我可以使用两个 'standard metrics',比如 RMSE 或 MAE:

 cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds=cv,
        metrics={'mae','rmse'}, early_stopping_rounds=early_stopping_rounds) 

这里没有出现错误,但是当我想使用更多的自定义指标时,出现错误。

如果有人能在这里为我提供帮助,那就太好了。 非常感谢。

根据 documentation, feval argument is an evaluation function that is used to score your model and there should be just one of those in your .cv method. However, you can evaluate your CV by using metrics as you already did, but according to this,您的字典似乎缺少键值对。尝试将其定义如下:

 cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds=cv,
        metrics={'first_score': rmsle, 'second_score': rmsle2}, early_stopping_rounds=early_stopping_rounds) 

最后我用了:

cross_validate(xgb1, X, y, scoring=scorer, cv=KFold(n_splits=cv_folds, random_state=seed, shuffle=True), verbose = 0)

scorer = {'MAE': make_scorer(MAE, greater_is_better=False),
         'MAPE': make_scorer(MAPE, greater_is_better=False),
         'MdAE': make_scorer(MdAE, greater_is_better=False),
         'MdAPE': make_scorer(MdAPE, greater_is_better=False),
         'In_10': make_scorer(In_10, greater_is_better=True),
         'In_20': make_scorer(In_20, greater_is_better=True)}