如何在 Lenskit 3.0 中将分数高于 x 的项目添加到 goodItems 中以获取精度指标?
How do I add items with a score above x to goodItems for precision metric in Lenskit 3.0?
我想添加精度指标并仅使用项目
评分高于 4.0 为 'goodItems'
在 Lenskit 2 中,这可以通过以下方式完成:
metric precision {
listSize 10
candidates ItemSelectors.addNRandom(ItemSelectors.testItems(), 100)
exclude ItemSelectors.trainingItems()
goodItems ItemSelectors.testRatingMatches(Matchers.greaterThanOrEqualTo(4.0d))
}
现在我正尝试在 Lenskit 3 中使用 gradle 做同样的事情,但很明显
metric('pr') {
goodItems 'ItemSelectors.testRatingMatches(Matchers.greaterThanOrEqualTo(4.0d))'
}
不起作用,因为 Lenskit 3.0 中没有 ItemSelectors class。
我怎样才能 link 具有适当项目的 goodItems 并丢弃低评级项目以获得正确的精度值?
这个 goodItems
应该有效:
user.testHistory.findAll({ it instanceof org.lenskit.data.ratings.Rating && it.value >= 4 })*.itemId.toSet()
正如 Ekstrand 先生所说,您可以通过将以下行添加到 gradle 构建文件来 select 好的项目。
goodItems 'user.testHistory.findAll({ it instanceof org.lenskit.data.ratings.Rating && it.value >= 4 })*.itemId'
然而,这个returns一个对象,在Itemselector.class中,有一个解析恰好是Set,但是这不起作用,因为返回的对象是ArrayList类型。如果我是正确的,这意味着对象需要在转换为集合之前转换为 ArrayList,我通过复制 Itemselect 或 class 并替换:
来做到这一点
Set<Long> set = (Set<Long>) script.run();
作者:
Set<Long> set = new HashSet<Long>((ArrayList<Long>)script.run());
这 returns 是我测试集中的正确项目,评分高于 4.0
我想添加精度指标并仅使用项目 评分高于 4.0 为 'goodItems'
在 Lenskit 2 中,这可以通过以下方式完成:
metric precision {
listSize 10
candidates ItemSelectors.addNRandom(ItemSelectors.testItems(), 100)
exclude ItemSelectors.trainingItems()
goodItems ItemSelectors.testRatingMatches(Matchers.greaterThanOrEqualTo(4.0d))
}
现在我正尝试在 Lenskit 3 中使用 gradle 做同样的事情,但很明显
metric('pr') {
goodItems 'ItemSelectors.testRatingMatches(Matchers.greaterThanOrEqualTo(4.0d))'
}
不起作用,因为 Lenskit 3.0 中没有 ItemSelectors class。 我怎样才能 link 具有适当项目的 goodItems 并丢弃低评级项目以获得正确的精度值?
这个 goodItems
应该有效:
user.testHistory.findAll({ it instanceof org.lenskit.data.ratings.Rating && it.value >= 4 })*.itemId.toSet()
正如 Ekstrand 先生所说,您可以通过将以下行添加到 gradle 构建文件来 select 好的项目。
goodItems 'user.testHistory.findAll({ it instanceof org.lenskit.data.ratings.Rating && it.value >= 4 })*.itemId'
然而,这个returns一个对象,在Itemselector.class中,有一个解析恰好是Set,但是这不起作用,因为返回的对象是ArrayList类型。如果我是正确的,这意味着对象需要在转换为集合之前转换为 ArrayList,我通过复制 Itemselect 或 class 并替换:
来做到这一点Set<Long> set = (Set<Long>) script.run();
作者:
Set<Long> set = new HashSet<Long>((ArrayList<Long>)script.run());
这 returns 是我测试集中的正确项目,评分高于 4.0