很抱歉,如果这是一个noob问题,但我是MAHOUT的新手,我必须使用MovieLens数据集进行一些测试。我想知道是否可以用u1base.csv训练推荐者,并用u1test.csv测试推荐者以确定精确度和召回?
我发现关于评估的例子他们只是将数据搞砸了,但我想用u1base来训练和测试u1测试。
u1base.csv和u1test.csv具有相同的格式“UserId,Item,Rating”。
我的java代码:
File userPreferencesFile = new File("u1base.csv");
File userTeste = new File("u1test.csv");
RandomUtils.useTestSeed();
DataModel dataModel = new FileDataModel(userPreferencesFile);
DataModel testModel = new FileDataModel(userTeste);
RecommenderIRStatsEvaluator recommenderEvaluator = new GenericRecommenderIRStatsEvaluator();
RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
@Override
public Recommender buildRecommender(DataModel dataModel) throws TasteException {
UserSimilarity userSimilarity = new PearsonCorrelationSimilarity(dataModel);
UserNeighborhood userNeighborhood = new NearestNUserNeighborhood(10, userSimilarity, dataModel);
return new GenericUserBasedRecommender(dataModel, userNeighborhood, userSimilarity);
}
};
IRStatistics statistics =
recommenderEvaluator.evaluate(
recommenderBuilder, null, dataModel, null, 2, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);
System.out.format("The recommender precision is %f%n", statistics.getPrecision());
System.out.format("The recommender recall is %f%n", statistics.getRecall());
}
任何帮助将不胜感激
答案 0 :(得分:1)
GenericRecommenderIRStatsEvaluator (默认情况下)不支持不同的测试&训练数据集。但如果我们真的想要这个,我们可以编写自定义的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);
.......
}
除了这些变化之外,请保留其他所有内容。它会工作!!!