mahout計算一個簡單的推薦程序的準確率和召回率

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.IRStatistics;
import org.apache.mahout.cf.taste.eval.RecommenderBuilder;
import org.apache.mahout.cf.taste.eval.RecommenderIRStatsEvaluator;
import org.apache.mahout.cf.taste.impl.eval.GenericRecommenderIRStatsEvaluator;
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 PreRecallEvaluation {
    public static void main(String[] args) throws IOException, TasteException
    {
        RandomUtils.useTestSeed();//確保每次結果一致
        DataModel model = new FileDataModel(new File("F:/mahout/mahout_test/intro.csv"));
        RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();
        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);
            }
            
        };
        /*
         * IRStatistics evaluate(RecommenderBuilder recommenderBuilder,
                      DataModelBuilder dataModelBuilder,
                      DataModel dataModel,
                      IDRescorer rescorer,
                      int at, Precision at 5 意思就是當推薦2個結果時的查準率
                      double relevanceThreshold,因爲上述推薦引擎計算的推薦結果都是一個分值,
                          那麼分值達到多少認爲用戶感興趣呢,就需要一個閾值,如果沒有指定值,框架會爲每個用戶取一個閾值,它等於該用戶的平均偏好值加上標準方差
                      double evaluationPercentage)
                      throws TasteException
         */
        IRStatistics stats = evaluator.evaluate(builder, null, model, null, 2, GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);
        System.out.println(stats.getPrecision());
        System.out.println(stats.getRecall());
    }

}

結果爲

0.75

1


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章