如何解决Python xgb.cv 使用多个评估指标
我目前正在尝试寻找 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,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
,这行得通。
我可以使用两个“标准指标”,例如 RMSE 或 MAE:
cvresult = xgb.cv(xgb_param,metrics={'mae','rmse'},early_stopping_rounds=early_stopping_rounds)
这里没有出现错误,但是当我想使用更多自定义指标时,出现错误。
如果有人能在这里为我提供一些帮助,那就太棒了。 非常感谢。
解决方法
根据 documentation,feval 参数是一个评估函数,用于对您的模型进行评分,您的 .cv
方法中应该只有其中一个。但是,您可以像之前一样使用 metrics
来评估您的简历,但根据 this,您的 dict 看起来可能缺少键值对。尝试将其定义如下:
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,'MdAE': make_scorer(MdAE,'MdAPE': make_scorer(MdAPE,'In_10': make_scorer(In_10,greater_is_better=True),'In_20': make_scorer(In_20,greater_is_better=True)}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。