我目前正在尝试寻找一个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=rmsle
,这是可行的。
我可以使用两个标准指标,如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)
这里没有出现错误,但当我想使用更多自定义指标时,我会得到一个错误。
如果有人能在这里提供一些帮助,那将是非常棒的。非常感谢。
回答:
最后,我只是用以下方法完成了:
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)}