在xgboost中访问训练和评估误差

7

我开始使用 python 的 xgboost 包。是否有一种获取每个训练周期的训练和验证错误的方法? 我在 文档 中找不到这种方法。

已经训练了一个简单的模型并得出了输出:

[09:17:37] src/tree/updater_prune.cc:74: tree pruning end, 1 根节点, 124 个额外节点,0 个修剪节点,最大深度为6

[0] eval-rmse:0.407474 train-rmse:0.346349 [09:17:37] src/tree/updater_prune.cc:74: tree pruning end, 1 根节点,116 个额外 节点,0 个修剪节点,最大深度为6

1 eval-rmse:0.410902 train-rmse:0.339925 [09:17:38] src/tree/updater_prune.cc:74: tree pruning end, 1 根节点,124 个额外 节点,0 个修剪节点,最大深度为6

[2] eval-rmse:0.413563 train-rmse:0.335941 [09:17:38] src/tree/updater_prune.cc:74: tree pruning end, 1 根节点,126 个额外 节点,0 个修剪节点,最大深度为6

[3] eval-rmse:0.418412 train-rmse:0.333071 [09:17:38] src/tree/updater_prune.cc:74: tree pruning end, 1 根节点,114 个额外 节点,0 个修剪节点,最大深度为6

然而,我需要在代码中传递这些 eval-rmsetrain-rmse,或者至少绘制这些曲线。

2个回答

17

通过将 evals_result 参数传递给 xgb.train 方法,您可以保存中间结果。

假设您已经以 XGB 格式创建了一个 train 和一个eval 矩阵,并为 XGBoost 初始化了一些参数 params(在我的案例中,params = {'max_depth':2, 'eta':1, 'silent':1, 'objective':'binary:logistic' })。

  1. 创建一个空字典

    progress = dict()

  2. 创建一个 watchlist(我猜你已经有它了,因为你正在打印 train-rmse)

    watchlist = [(train,'train-rmse'), (eval, 'eval-rmse')]

  3. 将它们传递给 xgb.train

    bst = xgb.train(param, train, 10, watchlist, evals_result=progress)

迭代结束时,progress 字典将包含所需的训练/验证错误。

> print progress
{'train-rmse': {'error': ['0.50000', ....]}, 'eval-rmse': { 'error': ['0.5000',....]}}

谢谢,非常清晰和有帮助!但是在我使用的版本中,进度字典有不同的键。 - MaxPY

2

@MaxPY,这是对您在上面Sudeep Juvekar的回答中发表评论的回复:您进展字典的键设置为您传递给watchlist作为第二个参数的任何字符串。例如,

watchlist  = [(train,'train-rmse-demo'), (eval, 'eval-rmse-demo')]

将字典键设置为train-rmse-demoeval-rmse-demo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接