比如说,商品的流行度可以是一个特征,因为对于某些流行的商品大家都抢着买,喜欢跟风买热门商品这一特性可以作为推荐的特征。我们可以按照销量排名然后归一化得到每个商品的流行度值,但是直接用这个连续值会有一些问题,比如说用户甲买了流行度分数为 0.75 0.5 0.2 0.1的四个商品,用户乙买了流行度为0.7的一个商品,他们两个怎么比?
如果还记得算法书上说的,定义几个桶buckets,把流行度分到这几个buckets里面,可以解决这个问题。比如定义三个桶:很流行1-0。95,较流行0.95-0.75,普通0.75-0.4。这样用户甲的特征就是[0,1,1]用户乙的特征就是[0,1,0],这样你的推荐模型就可以做一些对比他们俩的相似度或者其他推荐计算了。
顺道提一下就是,为什么在这里直接把0.4之后的丢掉了以及为什么取了三个buckets。这个要看具体问题里面具体特征的用处。
- 如果这个模型是学习训练出来的,可以用一些feature selection的办法自动去掉一些不需要的bucket。对于那些不是学习出来的模型比如是简单的相似性模型,按照实际推荐效果思考一下用户的行为特征,需要丢弃一些特征。我之前包含过0.4以下的部分但是实际测试的时候发现推荐结果会恶化,也就是说对于我们的问题,用户喜欢跟风买热门的,但是不喜欢一直买冷门的。
- 特征需要按照实际购买数据进行修正和理解。三个buckets是我们系统里效果最好的。
一个比较高级的例子是 Facebook 在他们的 Machine Learning meetup 上提到的推荐News feed的特征。每个用户对于其他用户的 news 的点赞和留言以及其他的动作都会得到一个评价值,这是一系列的连续值,直接拿来训练模型效果不好。他们的做法是做了一个简单的决策树,训练的输入是这些连续值,训练目标是看对于用户A是否应该显示用户B的 news 。这个决策树显然很粗糙,但是树的每个叶子节点可以成为一个特征,那么这些叶子节点就可以当作用户A的特征向量,拿来训练其他模型比如Logistic Regression,效果不错。
直接特征和间接特征
直接特征 Extacted Feature 就是比如商品的品牌,间接特征 Derived Feature 可以是从直接特征或者各种数据组合里计算推导出来的。
间接特征的一个例子还是品牌特征,拿女性服饰类举例。比如我太太很喜欢LOFT的衣服,但如果一个推荐引擎使劲给推荐LOFT牌的衣服,她也会很烦。所以品牌并不完全是一个直接特征,它可以有一些变化。比如从购买数据里面看到,购买了LOFT牌衣服的,有20%也购买了J Crew牌,15%也购买了Ann Taylor牌。所以 LOFT 这个特征应该变成一个向量 [LOFT:1, J_Crew:0.2, Ann_Taylor:0.15, … ]。实际效果上它提高了推荐的多样性,在多个测试函数中都有不错的提升。
间接特征另外一个高级一些的例子就是用户职业。绝大多数用户都不会填自己的职业等个人相关信息,主要是因为隐私或者就是因为麻烦。从用户的购买记录和浏览记录里面,我们可以定义几个预设的职业类型然后用户的职业预测到这几个类型里。比如用户买过一些转换插头和充电器还有旅行电脑包,所以他可能常外出旅行,所以以后推荐的商品可能是轻便携带;又比如用户买过母婴用品就知道该用户可能自己是妈妈或者家里有小孩。
关于间接特征我印象最深的是美国亚马逊上的性别特征。我有一次给我太太买了给女生修眉毛的剃刀,亚马逊的推荐内容就立刻从推荐相机鼠标键盘等男性特征较强的变成了推荐时尚杂志这种有女性特征的东西。
间接特征的提取可以用到很多机器学习的技术,比如根据商品的文本描述提取它的文本向量,以这些文本向量为特征训练多分类的分类器,可以把商品分类对应到各种用户职业特征上。它也可以利用人工标记的类型列表,比如时尚杂志的女性特征。它也可以利用一些统计规则,比如单反相机的购买记录里,男性的比例会高于女性,所以单反相机的性别特征向量可以是购买人数性别的比例值。
特征选择
这部分的工作就看起来比较高级一些,比较贴近机器学习的研究工作。一般来说是两个方法:基于领域知识的手工选择以及自动选择方法。
对于关联规则和统计规则的模型来说,手工选择的比重要大一些。比如我们已有了baseline的特征向量,现在加进去品牌偏好,给一定的权值,看评价函数输出的结果是否增强了推荐效果。对于学习的模型来说,可以通过模型自动选择每个特征的权值,按照和效果的关联来调整模型的参数。这里需要提醒的是,这个选择过程不是单增单减,很可能遇到两个特征组合A+B效果很好,A+C效果也很好,但是A+B+C效果就呵呵了。个人建议在关联和统计规则里面把最重要的几个特征放进去然后优化关于这几个特征的规则,把复杂的特征选择留给学习出来的模型。