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

来源:互联网 发布:lua源码 编辑:程序博客网 时间:2024/05/17 13:43

上一篇建立了一个简单的推荐引擎,现在就来评估下

代码如下:

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()的调用会强调每次选择相同的随机值。这仅仅是为了获得可重复的结果而被用在这样的示例或者单元测试中。不要在实际代码中这样用。


0 0
原创粉丝点击