mahout in action 2.3 推荐器考核

来源:互联网 发布:java类中有哪些元素 编辑:程序博客网 时间:2024/06/06 08:56
这是一个推荐引擎的工作,用来解释下面的问题:“对用户来说,怎么的推荐数据才是最好的”。在搞清楚这个的答案之前,我们首先应该解决这个问题。一个好的推荐数据精度指的是什么?我们需要知道产出一个怎么样的推荐器来产生他们?本节的下面部分将会探讨对一个推荐器的考核。因为它是一个工具,当我们开始思考特殊的推荐系统时,它将会是很有用的。

最优秀的推荐器,能够感知你的心灵。它以某种方式知道你可能很喜欢某个的项目,而这些项目你还没有看过或表达过任何喜好。一个优秀的推荐器可以预测所有的分值,并且根据未来的分值和已经打的分值进行排序,从而推荐出最有可以的项目

确实,大部分的推荐引擎也试图通过一些或所有其他的项目估计比率来工作。所以,考核一个推荐器的推荐能力的一种方法,就是考核它估计分值的质量:考核估计分值与实际分值的相似程度。

2.3.1 训练数据和打分

这些实际的分值虽然并不存在。当然没有人知道你在未来会如何喜欢一些新的项目(包括你自己)。通过把一小部分的真实数据集合置于一旁,把它们当作试验数据,这可以模仿一个推荐引擎。这些试验分值不存在于训练数据中,训练数据是为考核过的推荐引擎提供参考:它是除了试验数据的所有数据。相反,这个推荐器是为漏掉的试验数据估计分值,考核就是让它与真实值对比。

在这里,为推荐器生成一个“分值”是相当简单的。例如,在估计分值和实际分值中可以计算出平均差异。这种类型的得分,低一点的分值是比较好的,因为那意味着估算与真实值的差异是相当小的。0.0是完全匹配值,即在估计值和实际值之间没有一点不同。

有时差异的均方根是非常有用的: 在实际值和估计值之间差异值的平均值的平方根。这个值依然是越低越好。

 项目1项目2项目3真实值3.05.04.0估计值3.52.05.0差值0.53.01.0差值的平均值= (0.5 + 3.0 + 1.0) / 3 = 1.5均方根=√((0.52 + 3.02 + 1.02) / 3) = 1.8484
表2.1 平均差异和均平方根算法的一个演示

上面的表格显示了一组真实值和估计值之间的差异,以及它们如何形成的得分。最重要的是均方根可以除去那些尚有很大差距的估计值,如这里的项目2,这个结果还是很令人满意的。例如,被2点分开的估计值可能比两倍还多,这和被1点分开的估计值是一样的糟糕。因为这个简单的平均差异可能理解起来更直观,更容易,我们将会在下面的例子中使用它。

2.3.2运行RecommenderEvaluator

让我们再来看一下例子中的代码,评估一个简单的推荐器,这个推荐器是我们在较少的数据集合上创造的:

列表2.3配置运行一个推荐器的一个评估
Java代码  收藏代码
  1. RandomUtils.useTestSeed(); //A  
  2. DataModel model = new FileDataModel(new File("intro.csv"));  
  3. RecommenderEvaluator evaluator =  
  4. new AverageAbsoluteDifferenceRecommenderEvaluator();  
  5. RecommenderBuilder builder = new RecommenderBuilder() { //B  
  6. @Override  
  7. public Recommender buildRecommender(DataModel model)  
  8. throws TasteException {  
  9. UserSimilarity similarity = new PearsonCorrelationSimilarity(model);  
  10. UserNeighborhood neighborhood =  
  11. new NearestNUserNeighborhood(2, similarity, model);  
  12. return  
  13. new GenericUserBasedRecommender(model, neighborhood, similarity);  
  14. }  
  15. };  
  16. double score = evaluator.evaluate(  
  17. builder, null, model, 0.71.0); //C  
  18. System.out.println(score);  

A 只用在可重复结果的例子中
B 建立下面的推荐器
C 用百分之七十的数据来训练;余下的百分之三十来测试

大部分的action发生在evaluate()。在RecommenderEvaluator内部把数据分成一个训练和测试集合,建立一个新的训练模型(DataModel)和推荐器来试验,把它的估计值和实际的试验数据对比。

注意我们不会通过这种方法否定一个推荐器。这是因为,这个方法内部将需要围绕一个最新创造的训练模型(DataModel)来建立一个推荐器。所以我们必须提供一个对象,这个对象可以建立一个来自与数据模型(DataModel)的推荐器,既一个推荐器的构造者(recommenderbuilder).在这里我们进行了一个如同我们在第一节里努力进行的实施。

2.3.3 评估结果

程序执行后会在输出一个结果:分数,它可以表示这个推荐器是效果。这样你就可以简单的看结果: 1.0。虽然存在随机性,在evaluator内部选择使用的测试数据,但是这个结果应该是一致性。因为它都是调用RandomUtils.useTestSeed(),每一次生成的数据的随机性是一致的。这仅仅是在这种例子和单元测试中使用,来保证可重复的结果。所以请不要在你实际的代码中使用。

这里,这个值意味着什么,依赖于我们使用的实现AverageAbsoluteDifferenceRecommenderEvaluator。通常,结果1.0又意外着,推荐器估计一个值,这个值偏离实际值为1.0。

在1到5的范围内,1.0这个值不算大,但一些小数据从这里开始。你的结果可能与数据集合随机分解的不同,因此training和test的集合在每次运算中都可能不同。

这个技术可以适用于任何的Recommender和DataModel。用均方根分值,代替有RMSRecommenderEvaluator的实施的AverageAbsoluteDifferenceRecommenderEvaluator

对evaluate()的0参数也可以代替为DataModelBuilder的一个实例,这可以被用于控制training DataModel是如何从training数据创建起来的。通常这个默认值就是很好的;如果在部署上你正在使用DataModel的一个专门的实施,那这是不可能的。一个DataModelBuilder是你如何把它加入评估过程。

1.0参数在最终控制了在所有的输入数据中有多少被使用。这里是百分之百。这可以被用来生产一个quicker,如果少一点精确,只用一个潜在的巨大的数据集合的一小部分来评估。例如,0.1将意味着百分之十的数据被使用,而百分之九十的数据别忽视。当对一个recommender快速地试验小部分的改变,这是很有用的。
原创粉丝点击