天天看點

推薦系統之Mahout學習(五)

推薦系統的評估

使用平均絕對值差和均方根來進行評估。

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.eval.RMSRecommenderEvaluator;
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;

import java.io.File;

public class EvaluatorIntro {
    private EvaluatorIntro(){
    }
   	 	 //因為使用重複的随機資料來進行測試去看兩個名額的結果,保證每次随機都一樣,隻用于測試,在開發生産中不使用
        RandomUtils.useTestSeed();
	   
        DataModel model = new FileDataModel(new File("/root/data/*.base"));
        //建立評估器利用平均絕對值差(MAE:mean average error)來評分
        RecommenderEvaluator evaluator = new AverageAbsoluteDifferenceRecommenderEvaluator();
        //建立評估器利用均方根(RMS:root mean square資料的平方的平均值的平方根)來評分
        RecommenderEvaluator recommenderEvaluator = new RMSRecommenderEvaluator();
        //RecommenderBuilder是一個輔助類,幫助我們實作根據資料模型實作推薦系統的評估
        RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {
            @Override
            public Recommender buildRecommender(DataModel model) throws TasteException {
                UserSimilarity similarity = new PearsonCorrelationSimilarity(model);//相似度計算方式
                UserNeighborhood neighborhood = new NearestNUserNeighborhood(100,similarity,model);
                return new GenericUserBasedRecommender(model,neighborhood,similarity);
            }
        };
        double maeScore = evaluator.evaluate(recommenderBuilder,null,model,0.7,1.0);
        double rmsScore = recommenderEvaluator.evaluate(recommenderBuilder,null,model,0.7,1.0);
//這個方法解釋:evaluate(RecommenderBuilder recommenderBuilder,DataModelBuilder dataModelBuilder, DataModel dataModel, double trainingPercentage, double evaluationPercentage)Evaluates the quality of a Recommender's recommendations.
//如果資料比較複雜就用dataModelBuilder,正常的資料就用DataModel把dataModelBuilder參數為null,參數0.7表示是訓練70%的資料,測試30%的資料,1.0是指使用資料的比例。
        System.out.println(maeScore );//輸出這個模型的打分,分數越接近0表示這個模型越好
        System.out.println(rmsScore );//分數越接近0表示這個模型越好
    }
}
           

輸出結果:

推薦系統之Mahout學習(五)

可以更換不同的相似度計算方法來測試一下。

舉兩個例子如使用:UncenteredCosineSimilarity(弦距離相似度)

輸出結果:

推薦系統之Mahout學習(五)

如:CityBlockSimilarity(曼哈頓距離相似度)

輸出結果:

推薦系統之Mahout學習(五)

均方根公式:平方的平均值的平方根

推薦系統之Mahout學習(五)

平均絕對值差公式:

推薦系統之Mahout學習(五)

繼續閱讀