2.2 创建一个推荐器
 
Mahout in Action(2012)翻译第二章_Mahout
 
2.3 构造一个推荐系统
推荐引擎室一个工具,一种回答问题的方法,“对一个用户而言,什么是最好的推荐呢?”在研究答案以前,最好是要先调查下问题。究竟什么才是真正的一个好的推荐引擎?当一个推荐引擎产出时我们怎么才能知道?本章之后的内容主要挖掘怎样构建一个推荐器,因为这在研究特定的推荐系统时会相当有用。

 
可能的最好的推荐器会是一种通灵物,他可以奇迹般清楚地知道对于每一个可能的物品你喜欢到什么程度,在你还没看到它们或者是还没表露出对它们的任何偏好。可以准确地预测你所有的偏好的一个推荐器会展示出所有的商品,它们将按你将来的或者已经存在的偏好来排序。以上所说的就是可能的最好的推荐器了。

 
事实上,大多数的推荐引擎运行起来只是尝试做这些事情,它们通过估计一些或者所有其他的商品评分等级。因此,一种计算出推荐器的推荐的方法是计算它所估计的产品偏好的质量——即通过算出估计偏好与实际偏好的匹配情况。

 
2.3.1 训练数据和评分
但是,那些实际偏好并不存在。没有人确定知道在将来你会不会喜欢某个新的产品(包括你自己)。在推荐引擎的上下文中,这可以采用分离真实数据集中的一部分并作为测试数据集来模拟实现。计算时这部分测试用的偏好数据并不作为训练数据给到推荐器。相反,训练出来的推荐器要被用来评估对缺失的测试数据集的偏好,且评估结果要与真实值进行比较。

 
以上的做法就可以很容易地生成对一个特定推荐器的分数。例如,可以计算推荐器的评估值和真实偏好之间的差平均。利用类似这类的分数,越低越好,因为这就意味着评估结果与真实偏好越接近。一个0.0的分数就意味着完美的估计——评估值与真实值相同。

 
有时会采用差值的均方根(root-mean-square)来衡量真实值和估计值之间的差距。均方根的公式都知道了,不贴了。

 
2.3.2 运行RecommenderEvaluator
代码下利用RecommenderEvaluator计算推荐分数,贴代码:
Mahout in Action(2012)翻译第二章_Mahout_02
没有Recommender对象传入evaluate方法,因为在evaluate方法中会用新创建的训练数据模型对象DataModel,调用者需要提供一个可以构建Recommender对象的Object——一个RecommenderEvaluator对象。

 
2.3.3 结果评估
程序输入推荐系统的最终分数。结果肯定是1.0,因为RandomUtils.useTestSeed()会强制使用相同的随机取值。AverageAbsoluteDifferenceRecommenderEvaluator类决定了最后的分数的意义,在这里它表示推荐器的推荐结果偏离真实偏好的平均值是1.0。若要使用均方根,使用RMSRecommenderEvaluator .

null参数表示的是一个DataModelBuilder实例,它控制着怎样由训练数据集转化为训练的DataModel对象。一般默认的就ok。如果要在你的程序中定制DataModel的实现,那么可能需要使用它。

1.0参数表示的是使用100%的输入数据进行计算,如果是在一个可能巨大数据集的情况下,可以在要更快地得到推荐结果(不是那么准确)时调整数数值(例如,0.1)。

2.4 计算precision和recall
我们也可以从更宽泛的角度看待推荐问题:为了要生成推荐结果,并不严格要求估计偏好值。在许多案例中,从好到差展示出一个推荐列表已经足够了,而并不需要包含估计的偏好值。而在其他的一些例子中,精确顺序的结果列表并不怎么要紧——得到一个好的推荐结果集就是好的。

这种更一般的视角,我们也可以采用经典信息获取度量来计算推荐:precision以及recall。这两个准则也被应用在例如搜索引擎(从很多可能的结果中返回与一个查询匹配的最好结果集)等度量中。
 
Mahout in Action(2012)翻译第二章_数据挖掘_03
Precision表示top结果中与查询相关的比例,在给定相关的定义下。
Recall表示top结果中的与查询相关的结果在所有相关结果中的占比。
把查询换成推荐就应用到了推荐系统中了。

 
2.4.1 运行RecommenderIRStatsEvaluator

 
 
Mahout in Action(2012)翻译第二章_数据挖掘_04
threshold = μ + s 作为默认的衡量推荐好坏标准

以105为例,讲解整个推荐过程,以及StatsEvaluator如何选择自认为是good的推荐的。

2.4.2 precision和recall存在的问题

precision和recall在推荐系统的使用是否有效依赖于对好的推荐的定义。
例子1: 从用户已经做过偏好的项目中选择进行推荐
例子2: 当偏好值是布尔类型时更复杂,推荐器只能随机地从喜欢的项目中选几个作为推荐了
需要知道测试的局限性

2.5 实例讲解:计算GroupLens数据集