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()的调用会强调每次选择相同的随机值。这仅仅是为了获得可重复的结果而被用在这样的示例或者单元测试中。不要在实际代码中这样用。
代码如下:
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()的调用会强调每次选择相同的随机值。这仅仅是为了获得可重复的结果而被用在这样的示例或者单元测试中。不要在实际代码中这样用。
相关文章推荐
- 一个简单的基于用户的mahout推荐程序
- mahout计算一个简单的推荐程序的准确率和召回率
- 一个非常简单完整的聊天室演示程序,推荐初学者下载
- 推荐一个用C#代码生成JavsScript的简单程序集
- 一个显示日期的简单小程序,主要是学习静态变量的用法
- 【Rebol 学习笔记】第一篇:编写一个简单的 CGI 程序
- 蛙蛙推荐: 用web服务传递Dataset的一个简单例子
- 一个在程序中实现plugin机制的简单例子
- 一个简单的解密程序
- Java做一个最简单的通话程序
- 一个简单的文件管理程序
- 我写的一个简单的聊天程序(bcb)
- 【推荐实例】一个典型的多线程的程序
- 不使用ATL向导,创建一个简单的ATL对话框程序.
- 『Visual C++ MFC 简明教程』----第二部分:一个简单的MFC程序
- 一个简单的加密解密程序
- Java做一个最简单的Socket通话程序
- 使用timer控件创建一个简单的报警程序
- 一个简单木马程序的编写
- 一个简单的投票程序