【问题标题】:R mlr - Creating learning curve from subset of training data and whole test data (not whole training data)?R mlr - 从训练数据的子集和整个测试数据(不是整个训练数据)创建学习曲线?
【发布时间】:2017-04-07 12:07:06
【问题描述】:

假设我正在创建这样的学习曲线(代码中可能存在小错误,这只是一个示例)。我想要的是一条经典的学习曲线,您可以在其中扩大训练集,保持验证/测试集的大小相同。

learningCurve <- generateLearningCurveData("regr.glmnet",
                                           bh.task,
                                           makeResampleDesc(method = "cv", iters = 5, predict = "both"),
                                           seq(0.1, 1, by = 0.1),
                                           list(setAggregation(auc, train.mean), setAggregation(auc, test.mean))
)

上述代码的问题在于,学习器确实是在一小部分训练数据上进行了训练,但auc.train.mean 度量是在整个训练集上评估的。这导致不是我想要的学习曲线。我希望通过此度量来评估用于学习的训练集部分的性能,如下所示:

http://www.astroml.org/sklearn_tutorial/practical.html#learning-curves

我相信这句话说明了一切:

请注意,当我们在一小部分训练数据上进行训练时,会使用该子集而不是完整的训练集来计算训练误差。

如何做到这一点?

【问题讨论】:

  • train.mean 应该为您提供您正在寻找的训练数据的性能,请参阅mlr-org.github.io/mlr-tutorial/devel/html/learning_curve/…。你得到的数字没有意义吗?
  • 是的,我已经看过那个页面并且我正在广泛使用它。我并不是说结果没有意义——它们确实是,但它们不是我想要的。问题是,当您在 10% 的训练数据上训练数据时,train.mean 仍然测量 100% 的训练数据的性能(我检查过)。结果是“训练错误”曲线和“测试错误”曲线都随着样本的增加而下降,在经典的“学习曲线”中,训练错误最常增加,就像我提供的 scikit 的链接一样。不确定这是否清楚。
  • 我对代码的解读是它按照您的描述发生。你有没有直接比较 mlr 和 scikit-learn 表明情况并非如此?
  • 评论太长了。如果可以,请检查这两个代码。结果可以说是相似的,但我相信这一点是显而易见的。 Mlr 训练整个训练数据,而 scikit 训练训练数据的子集(这是我想要实现的)。 Mlr codeScikit code
  • 谢谢,有帮助。我现在没有时间研究这个,但我已经打开了一个问题:github.com/mlr-org/mlr/issues/1357

标签: r machine-learning mlr


【解决方案1】:

这个问题的修复在this pull request,应该很快就会合并。

修复到位后,我得到了 cmets 中完整示例的以下学习曲线:

【讨论】:

    【解决方案2】:

    作为未来读者的参考,这将得到修复,这里是 github 问题

    https://github.com/mlr-org/mlr/issues/1357

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2019-07-03
      • 2017-12-12
      • 2017-06-25
      • 2019-06-16
      • 1970-01-01
      • 2017-02-20
      • 2015-12-21
      • 2022-08-08
      相关资源
      最近更新 更多