【发布时间】: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