5

我开始使用 python xgboostbackage。有没有办法在每个训练时期获得训练和验证错误?我在文档中找不到

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

[09:17:37] src/tree/updater_prune.cc:74:树修剪结束,1 个根,124 个额外节点,0 个修剪节点,max_depth=6

[0] eval-rmse:0.407474 train-rmse:0.346349 [09:17:37] src/tree/updater_prune.cc:74: 树修剪结束,1 个根,116 个额外节点,0 个修剪节点,max_depth=6

1 eval-rmse:0.410902 train-rmse:0.339925 [09:17:38] src/tree/updater_prune.cc:74: 树修剪结束,1 个根,124 个额外节点,0 个修剪节点,max_depth=6

[2] eval-rmse:0.413563 train-rmse:0.335941 [09:17:38] src/tree/updater_prune.cc:74: 树修剪结束,1 个根,126 个额外节点,0 个修剪节点,max_depth=6

[3] eval-rmse:0.418412 train-rmse:0.333071 [09:17:38] src/tree/updater_prune.cc:74: 树修剪结束,1 个根,114 个额外节点,0 个修剪节点,max_depth=6

但是,我需要在代码中进一步传递这些eval-rmsetrain-rmse或者至少绘制这些曲线。

4

2 回答 2

14

保存中间结果的一种方法是将evals_result参数传递给xgb.train方法。

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

  1. 创建一个空字典

    progress = dict()

  2. 创建一个监视列表,(我猜你已经有了它,因为你正在打印 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',....]}}
于 2016-02-04T19:52:14.303 回答
1

@MaxPY,这是对您对 Sudeep Juvekar 上述回答的评论的回复:进度字典的键设置为您作为第二个参数传递给监视列表的任何字符串。例如,

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

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

于 2017-08-27T18:16:39.677 回答