第二期,Mahout in action 中文版-2.推荐器的介绍-2.3
本帖最后由 旧收音机 于 2015-5-30 22:41 编辑问题导读:
1、怎么去评估推荐器?
2、训练数据与打分怎么处理?
3、怎么运行RecommenderEvaluator?
4、怎么评估运行的结果?
static/image/hrline/4.gif
2.3 评估推荐器 推荐器是一个工具,它用来解决“如何为一个用户给出最好的推荐”这样的问题。在得出结果之前,最好先弄清楚问题。究竟怎样才是一个好的推荐结果?我们如何才能得出这样的结果?这一章剩下的部分将停下来探索推荐器的评估,因为这是用来了解特定推荐器的有力工具。 最理想的推荐器会像巫师一样某明奇妙的猜到你所喜欢的东西。它可能会知道你有多喜欢一个东西,甚至你都没有见过它或者从未表达过你是否喜欢它。一个推荐器能够精确的得出你对于每个项目的偏好指数,然后按照偏好指数排名罗列出来,这就是一个好的推荐。 确实,为一些或者全部的项目打分评级是推荐引擎常见做法。所以,评估推荐器的一种方案就是评估它所产生的偏好指数——也就是评估偏好指数与真实喜好程度的匹配程度。2.3.1 训练数据与打分 那些所谓的“真实喜好程度”其实并不存在。没有人会知道它具体的值(包括你)。其实我们可以通过把真实数据中的一小部分当作测试数据(Testing Data)来进行模拟,剩下的则是训练数据(Training Data)。除了用来训练的偏好指数,其余的偏好指数都用来预测这些被去掉的偏好指数。 如此,为推荐器打分就变得十分简单了。例如,我们可以计算所有预测值和真实值差值的平均值。如果把这个当作分数来看,那么肯定是越低越好。因为越低意味着差异越小,当然0是最完美的——预测和真实无任何差异。 有时,这些差值的均方根也被利用起来,当然这个值也是越低越好。详情见下表: 表2.1 均差和钧方差试图上表中显示了预测值和真实值的差异,以及这些差异如何转化为分数。均方差对出差错的项惩罚更加严厉,因为Item 2的存在。例如,Item 2的预测差了两个等级,那么均方差会去2的平方编程了4,而差了1则还是1。这样一下就差了2倍。由于简单的均差表达更为直接,在下一个例子中,我们还将使用它:2.3.2 运行RecommenderEvaluator清单2.3 推荐器评估程序的配置和运行RandomUtils.useTestSeed(); A
DataModel model = new FileDataModel(new File("intro.csv"));
RecommenderEvaluatorevaluator =
new AverageAbsoluteDifferenceRecommenderEvaluator();
RecommenderBuilderbuilder = new RecommenderBuilder() { B
@Override
public RecommenderbuildRecommender(DataModel model)
throws TasteException {
UserSimilarity similarity = new PearsonCorrelationSimilarity (model);
UserNeighborhood neighborhood =
new NearestNUserNeighborhood(2, similarity, model);
return
new GenericUserBasedRecommender(model, neighborhood, similarity);
}
};
double score = evaluator.evaluate(builder, null, model, 0.7, 1.0); C
System.out.println(score);A 使用例子中的可重复数据B 建立一个和上述一样的推荐器C 70%的数据作为训练集;30%的数据作为测试集 大多数的处理过程发生在evaluate()这个函数当中。RecommenderEvaluator负责将数据分为训练集和测试集,用训练集构建一个DataModel和Recommender用来进行测试活动,得到结果之后在于真实数据进行比较。 需要指出的是,这个方法中不会有Recommender。这是因为,这个方法需要根据训练集产生的DataModel构造一个Recommender,所以调用者需要提供一个能够利用DataModel产生Recommender的对象——RecommenderBuilder。他的构造方法和我们之前提到的方法一样。2.3.3 评估结果 这个程序打印出评估结果:用一个分数(数字)代表Recommender的性能如何。你会看到这个程序的结果为1.0。即使你多次的随机选取,结果依然如此,因为你所调用的RandomUtils.useTestSeed()函数每次产生的随机数序列是一样的。它仅仅被用在这样例子或者单元测试中,因为我们需要保证结果的可再现性。但是千万不要把它用在你实际的代码中。 这个值的意义如何取决于它被用到什么地方——AverageAbsoluteDifferenceRecommenderEvaluator。本次结果1.0代表测试结果平均和真实结果相差1.0。 在1到5这样的范围中,平均相差1不算很多,但是我们的数据太少了。如果每次都进行随机的切分(三七分),那么每次得到的结果可能都不相同。 这种评估技术可以用于任何的Recommender和DataModel。如果您想使用均方差进行评估,那么就将AverageAbsoluteDifferenceRecommenderEvaluator替换为RMSRecommenderEvaluator。 DataModelBuilder可以控制DataModel从训练集中的建立。它可以作为evaluate()的参数替换掉上述的null。不过通常默认的就可以了,但是如果你自己使用了特定的DataModel,那就不可以替换成DataModelBuilder了。DataModelBuilder相当于是把训练集数据注入到评估过程的一个接口。 最后一个参数1.0控制了你要使用多少数据,这里它代表100%。如果你降低这个参数,可以更快的构建一个的精度的评估过程。比如你调成0.1,那么就用了10%的数据。这对于快速测试推荐器的微小的变化是十分实用的。(翻译 By 花考拉)
关注分布式存储技术以及分布式计算方法
相关导读: 第一期,Mahout in action 中文版-2.推荐器的介绍-2.1~2.2 第二期,Mahout in action 中文版-2.推荐器的介绍-2.3 第三期,Mahout in action 中文版-2.推荐器的介绍-2.4~2.6 第四期,Mahout in action 中文版-3.推荐器的数据表达-3.1 第五期,Mahout in action 中文版-3.推荐器的数据表达-3.2 第六期,Mahout in action 中文版-3.推荐器的数据表达-3.3~3.4 第七期,Mahout in action 中文版-6.分布式推荐计算-6.1 第八期,Mahout in action 中文版-6.分布式推荐计算-6.2
第二篇更有意思了
页:
[1]