在 gbm 的 LamdbaMART 实现中的验证集上获得 0 偏差
Posted
技术标签:
【中文标题】在 gbm 的 LamdbaMART 实现中的验证集上获得 0 偏差【英文标题】:Getting 0 deviance on validation set in gbm's LamdbaMART implementation 【发布时间】:2015-11-16 17:19:42 【问题描述】:我正在尝试训练 LambdaMART 模型来执行成对排序的对象列表。我的训练数据集包含 50,000 个 112 维的特征向量。每个特征都由一个非负整数编码。
目标值是一个正整数(不连续)。给定两个新实例 X 和 Y,我希望我的模型能够预测 X 的目标值是否大于 Y。
由于这不是一个信息检索应用程序,因此查询的概念是无关紧要的。所有 50,000 个实例都属于同一个“查询”。
似乎当我运行我的模型时,即使设置为使用 70%/30% 训练验证拆分,我的验证集偏差为 0,如果我尝试 gbm.perf 函数会引发异常用OOB方法寻找最优树数。
总的来说,我很困惑这个包对所有这些无用的命名参数做了什么。我想知道的只是指定一个测试验证集,然后在树大小范围内最小化验证错误。不应该太多,但是这个包让我很难知道我需要设置哪些旋钮......以至于我要自己实现它,这样我就有了一些透明度并知道它在做什么。
对不起,我可以使用一些帮助来让这个包返回有意义的验证结果。
【问题讨论】:
这个问题似乎是题外话,因为它是关于统计的,而不是真正的特定编程问题。也许最好在Cross Validated 上问这个问题 @Jaap 问题与统计无关,OP 询问特定编程语言中特定实现的使用情况 @lejlot OP 正在讨论如何正确获取模型的参数。除了它似乎更多地是关于统计数据之外,这个问题还缺少reproducible example,而且正如目前所说的,它看起来更像是一个教程请求。 我不是说这是一个好问题,只是说这不是关于统计的,他清楚地知道该怎么做,唯一的问题是R api @Jaap:lejlot 是正确的,我在整理 api 时遇到问题。我知道我想做什么,如果我感到受虐,我可以自己编写这个算法,但我想使用这个包来方便。根据过去的经验,CrossValidated 的人会将这样的帖子发送到 Stack Overflow。 【参考方案1】:我认为 LambdaMart 不适合您的用例。该算法假设数据由 组 组成,每个组包含多个项目;目标是一组项目的整体安排的函数。因此,为了将数据拆分为训练集和验证集,属于同一组的所有项一起分配给前者或后者。在 GBM 中,组的构成由 group
参数指定,该参数是列名列表。同意这些列的所有实例都属于同一个组。
在您的场景中,您有一个单个大“组”,其中包含训练集中的所有项目;因此,它不能分成训练集和验证集。我看到了两个选项:
-
直接在目标值(“高斯”
distribution
参数)上训练最小二乘模型。
(更好但更复杂)如果训练后模型的预期用途是预测,给定 pair 项,第一个是否应该优先于第二个,您可以重新格式化相应的数据:第一项的 112 个特征列,第二项的 112 个特征列,加上一个二进制目标,即 1 iff 项 1 在原始数据集中具有更高的目标。然后,在此基础上训练一个逻辑模型 (distribution
"bernoulli")。
【讨论】:
以上是关于在 gbm 的 LamdbaMART 实现中的验证集上获得 0 偏差的主要内容,如果未能解决你的问题,请参考以下文章