您的位置:首页 > 其它

mahout评估一个简单的推荐程序

2014-11-17 15:33 302 查看
上一篇建立了一个简单的推荐引擎,现在就来评估下

代码如下:

package test.mahout.recommendation;

import java.io.File;

import java.io.IOException;

import org.apache.mahout.cf.taste.common.TasteException;

import org.apache.mahout.cf.taste.eval.RecommenderBuilder;

import org.apache.mahout.cf.taste.eval.RecommenderEvaluator;

import org.apache.mahout.cf.taste.impl.eval.AverageAbsoluteDifferenceRecommenderEvaluator;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;

import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;

import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;

import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;

import org.apache.mahout.cf.taste.model.DataModel;

import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;

import org.apache.mahout.cf.taste.recommender.Recommender;

import org.apache.mahout.cf.taste.similarity.UserSimilarity;

import org.apache.mahout.common.RandomUtils;

public class EvaluateRecommeder {

public static void main(String[] args) throws IOException, TasteException

{

RandomUtils.useTestSeed();//生成可重复的结果

DataModel model = new FileDataModel(new File("F:/mahout/mahout_test/intro.csv"));

RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();//利用平均差值进行评估

//RecommenderEvaluator evaluator = new RMSRecommenderEvaluator();//均方根

RecommenderBuilder builder = new RecommenderBuilder(){//构建待评估的推荐程序

@Override

public Recommender buildRecommender(DataModel model)

throws TasteException {

// TODO Auto-generated method stub

UserSimilarity similarity = new PearsonCorrelationSimilarity(model);

UserNeighborhood neighborhood = new NearestNUserNeighborhood(2, similarity, model);

return new GenericUserBasedRecommender(model, neighborhood, similarity);

}

};

/*double evaluate(RecommenderBuilder recommenderBuilder,

DataModelBuilder dataModelBuilder,如果为空,就用默认的datamodel,除非使用了特殊的datamodel实现,需要插入到评估过程中的datamodelbuilder

DataModel dataModel,测试的数据集

double trainingPercentage,每一个用户用来做训练推荐的百分比

double evaluationPercentage用来训练推荐的用户的百分比,可用于仅通过庞大数据集总的很小一部分数据来生成一个精度较低但更快的评估,希望快速测试recommender中的小更改时很有用)

throws TasteException

*/

//提供builder,recommender是由builder对datamodel根据百分比训练出来的

double score = evaluator.evaluate(builder, null, model, 0.7, 1.0);

System.out.println(score);

}

}

运行出来的结果如下:

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.model.file.FileDataModel <init>

信息: Creating FileDataModel for file F:\mahout\mahout_test\intro.csv

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.model.file.FileDataModel processFile

信息: Reading file info...

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.model.file.FileDataModel processFile

信息: Read lines: 21

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.model.GenericDataModel <init>

信息: Processed 5 users

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator evaluate

信息: Beginning evaluation using 0.7 of FileDataModel[dataFile:F:\mahout\mahout_test\intro.csv]

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.model.GenericDataModel <init>

信息: Processed 5 users

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator getEvaluation

信息: Beginning evaluation of 4 users

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator execute

信息: Starting timing of 4 tasks in 2 threads

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.eval.StatsCallable call

信息: Average time per recommendation: 0ms

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.eval.StatsCallable call

信息: Approximate memory used: 2MB / 16MB

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.eval.StatsCallable call

信息: Unable to recommend in 9 cases

NaN

十一月 17, 2014 3:20:42 下午 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator evaluate

信息: Evaluation result: NaN

输出为NaN,由日志可知,有9个案例都无法进行推荐。

原因可能是选取的训练比例不合理。

故增大训练比例的值,改为0.8 仍是NaN,

改为0.9 结果输出:

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.model.file.FileDataModel <init>

信息: Creating FileDataModel for file F:\mahout\mahout_test\intro.csv

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.model.file.FileDataModel processFile

信息: Reading file info...

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.model.file.FileDataModel processFile

信息: Read lines: 21

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.model.GenericDataModel <init>

信息: Processed 5 users

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator evaluate

信息: Beginning evaluation using 0.9 of FileDataModel[dataFile:F:\mahout\mahout_test\intro.csv]

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.model.GenericDataModel <init>

信息: Processed 5 users

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator getEvaluation

信息: Beginning evaluation of 3 users

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator execute

信息: Starting timing of 3 tasks in 2 threads

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.eval.StatsCallable call

信息: Average time per recommendation: 5ms

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.eval.StatsCallable call

信息: Approximate memory used: 2MB / 16MB

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.eval.StatsCallable call

信息: Unable to recommend in 2 cases

十一月 17, 2014 3:37:05 下午 org.apache.mahout.cf.taste.impl.eval.AbstractDifferenceRecommenderEvaluator evaluate

信息: Evaluation result: 1.0

1.0

即使evaluator在选择测试数据时引入许多随机量,结果仍然是相同的,因为RandomUtils.useTestSeed()的调用会强调每次选择相同的随机值。这仅仅是为了获得可重复的结果而被用在这样的示例或者单元测试中。不要在实际代码中这样用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: