Lenskit 中的交叉验证
Cross-validation in Lenskit
我正在尝试了解 lenskit 中的交叉验证究竟是如何执行的。在 documentation 中,它表示默认情况下数据按用户分区。这是否意味着,在每个折叠中,测试集中 none 的用户已用于训练?这是通过 "holdout" 选项实现的吗?如果是这样,此选项是否会破坏基于用户的分区并产生每个用户都出现在训练和测试集中的折叠?
现在,我的评估代码如下所示:
dataset crossfold("data") {
source csvfile(sourceFile) {
delimiter "\t"
domain {
minimum 0.0
maximum 10.0
precision 0.1
}
}
// order RandomOrder
holdoutFraction 0.1
}
我注释掉了 "order" 选项,因为在使用它时,lenskit eval
会抛出错误。
干杯!!!
无论 holdout
、holdoutFraction
或 retain
选项如何,每个用户都出现在训练集和测试集中。
然而,对于每个测试用户(当使用 5 个分区时,20% 的用户),他们的部分评分(测试评分)被保留并放在测试集。他们的其余评分与其他用户的所有评分一起放入训练集中。
这模拟了推荐系统的常见情况:您有一些用户,他们的某些历史记录已为人所知并且可以用于模型训练,您正在尝试推荐或预测他们未来的行为。
holdout
、holdoutFraction
和 retain
选项是决定将多少评分放入测试集中的不同方式。如果你说holdout 5
,那么每个测试用户的5个评分放在测试集中,其余的用于训练。如果你说 holdoutFraction 0.2
,那么 20% 用于测试,80% 用于训练。如果你说retain 5
,那么5个用于训练,其余的用于测试。
我正在尝试了解 lenskit 中的交叉验证究竟是如何执行的。在 documentation 中,它表示默认情况下数据按用户分区。这是否意味着,在每个折叠中,测试集中 none 的用户已用于训练?这是通过 "holdout" 选项实现的吗?如果是这样,此选项是否会破坏基于用户的分区并产生每个用户都出现在训练和测试集中的折叠?
现在,我的评估代码如下所示:
dataset crossfold("data") {
source csvfile(sourceFile) {
delimiter "\t"
domain {
minimum 0.0
maximum 10.0
precision 0.1
}
}
// order RandomOrder
holdoutFraction 0.1
}
我注释掉了 "order" 选项,因为在使用它时,lenskit eval
会抛出错误。
干杯!!!
无论 holdout
、holdoutFraction
或 retain
选项如何,每个用户都出现在训练集和测试集中。
然而,对于每个测试用户(当使用 5 个分区时,20% 的用户),他们的部分评分(测试评分)被保留并放在测试集。他们的其余评分与其他用户的所有评分一起放入训练集中。
这模拟了推荐系统的常见情况:您有一些用户,他们的某些历史记录已为人所知并且可以用于模型训练,您正在尝试推荐或预测他们未来的行为。
holdout
、holdoutFraction
和 retain
选项是决定将多少评分放入测试集中的不同方式。如果你说holdout 5
,那么每个测试用户的5个评分放在测试集中,其余的用于训练。如果你说 holdoutFraction 0.2
,那么 20% 用于测试,80% 用于训练。如果你说retain 5
,那么5个用于训练,其余的用于测试。