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

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?