mahout入门之评估查准率与查全率

查全率与查准率的定义如下:R(查全率)=(检出的相关文献数量/检索系统中相关文献总量)x100%,,P(查准率)=(检出的相关文献数量/检出的文献总量)x100%                                                                            

  例如:在一次检索中,共检出文献100篇,经过专家判定,其中与提问相关的文献为60篇,其余的40篇为误检文献,那么按照上述公式,本次检索的查准率P就等于(60/100)×100%即60%。假如检索系统中还有90篇相关文献,由于各种原因而未被检出(漏检),那么按照上述公式,本次检索的查全率就等于(60/60+90)×100%即40%。


我们从中也能发现一些问题,就是查准率和查全率的测试的有效性完全依赖于怎样定义“好的推荐”,即上面举例中说的“经过专家判定”。

一般思维是偏好值高的物品(超过一定阀值)为好的推荐,其他则不是。

系统会为每个用户都取一个阀值,这个阀值的计算公式为:用户阀值=用户的平均偏好值+标准方差

标准方差就是方差的平方根:一组数据中的每一个数与这组数据的平均数的差的平方的和再除以数据的个数,取平方根既是。
下面是评估代码实现:
package com.besttone.mahout.demo.recommender;

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 TestIRStatsEvaluator {

	/**
	 * @param args
	 * @throws IOException
	 * @throws TasteException
	 */
	public static void main(String[] args) throws IOException, TasteException {
		// TODO Auto-generated method stub
		RandomUtils.useTestSeed();//保证每次运行时训练数据和测试数据选取的都一样,保证每次评估结果都一样
		DataModel dataModel = new FileDataModel(new File(
				MyFirstRecommender.class.getResource("intro.txt").getPath()));
		//创建评估器
		RecommenderIRStatsEvaluator evaluator = new GenericRecommenderIRStatsEvaluator();
		//构建推荐引擎
		RecommenderBuilder recommenderBuilder = new RecommenderBuilder() {

			public Recommender buildRecommender(DataModel dataModel)
					throws TasteException {
				// TODO Auto-generated method stub
				UserSimilarity similarity = new PearsonCorrelationSimilarity(
						dataModel);
				UserNeighborhood neighborhood = new NearestNUserNeighborhood(2,
						similarity, dataModel);

				return new GenericUserBasedRecommender(dataModel, neighborhood,
						similarity);
			}
		};
		int at = 2;// 评估推荐两个ITEM时的查准率和查全率
		//开始评估查准率和查全率
		IRStatistics statistics = evaluator.evaluate(recommenderBuilder, null,
				dataModel, null, at,
				GenericRecommenderIRStatsEvaluator.CHOOSE_THRESHOLD, 1.0);

		System.out.println("precision at " + at + " 查准率:"
				+ statistics.getPrecision());
		System.out
				.println("recall at " + at + " 查全率:" + statistics.getRecall());

	}
}


你可能感兴趣的:(mahout入门之评估查准率与查全率)