GenericRecommenderIRStatsEvaluator(默认情况下)不支持不同的test&训练数据集.但如果我们真的想要这个,我们可以编写自定义的Evaluator.为此,我们需要了解IRStatsEvaluator的内部.
对于每个用户,评估者尝试获取最相关的项目,即顶部(例如10个)项目.然后它将构建&为这个用户运行推荐器&在建议中占据首位.
A =一组最相关的项目= {1,2,3,4,5,6,7,8,9,10}
B =一组推荐项目= {1,2,11,12,13}
现在,精度是相关推荐项目的比例. (建议中有多少项是相关的)
即,精度=交点B /计数(B)= 2 ouf为5,即0.4
召回是推荐项目中包含的相关项目的比例.
即召回=交叉点B /计数(A)= 10中的2,即0.2
所以这里的逻辑是获得两组项目(最相关和最推荐). IRStatsEvaluator的默认实现将基于单个数据模型找到这两个集合.我们需要以下列方式对其进行自定义:
>应根据测试数据集计算相关项目
>应根据列车数据集计算推荐项目.
以下是计算relatedItems的位置.因此,而不是数据模型将测试数据模型传递给dataSplitter.getRelevantItemsIDs().
//GenericRecommenderIRStatsEvaluator
public IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
DataModelBuilder dataModelBuilder,
DataModel dataModel,
IDRescorer rescorer,
int at,
double relevanceThreshold,
double evaluationPercentage) throws TasteException {
.......
FastIDSet relevantItemIDs = dataSplitter.getRelevantItemsIDs(userID, at, theRelevanceThreshold, dataModel);
.......
}
//CustomizedRecommenderIRStatsEvaluator
public IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
DataModelBuilder dataModelBuilder,
DataModel trainDataModel,
DataModel testDataModel,
IDRescorer rescorer,
int at,
double relevanceThreshold,
double evaluationPercentage) throws TasteException {
.......
FastIDSet relevantItemIDs = dataSplitter.getRelevantItemsIDs(userID, at, theRelevanceThreshold, testDataModel);
.......
}
除了这些变化,保持其他所有内容.它会工作!!!