推荐系统遇上深度学习(四)-多值离散特征的embedding解决方案

1、背景

在本系列第三篇文章中,在处理DeepFM数据时,由于每一个离散特征只有一个取值,因此我们在处理的过程中,将原始数据处理成了两个文件,一个记录特征的索引,一个记录了特征的值,而每一列,则代表一个离散特征。

但假如,我们某一个离散特征有多个取值呢?举个例子来说,每个人喜欢的NBA球队,有的人可能喜欢火箭和湖人,有的人可能只喜欢勇士,也有的人喜欢骑士、绿军、猛龙等一大堆。对于这种特征,我们本文将其称为多值离散特征。

根据DeepFM的思想,我们需要将每一个field的特征转换为定长的embedding,即使有多个取值,也是要变换成定长的embedding。

那么,一种思路来了,比如一个用户喜欢两个球队,这个field的特征可能是[1,1,0,0,0,0,0.....0],那么我们使用两次embedding lookup,再取个平均不就好了嘛。

2、解决方案

输入数据

假设我们有三条数据,每条数据代表一个user所喜欢的nba球员,比如有登哥,炮哥,杜老四,慕斯等等:

我们建立一个所有球员的集合:

数据处理

这里我们需要一个得到一个SparseTensor,即多为稀疏矩阵的一种表示方式,我们只记录非0值所在的位置和值。

比如说,下面就是我们对上面数据处理过后的一个SparseTensor,indices是数组中非0元素的下标,values跟indices一一对应,表示该下标位置的值,最后一个表示的是数组的大小。

处理得到SparseTensor的完整代码如下:

定义embedding变量

定义我们的embedding的大小为3:

得到embedding值

sp_ids就是我们刚刚得到的SparseTensor,而sp_weights=None代表的每一个取值的权重,如果是None的话,所有权重都是1,也就是相当于取了平均。如果不是None的话,我们需要同样传入一个SparseTensor,代表不同球员的喜欢权重。大家感兴趣可以自己去尝试。

测试输出

最后我们来看看得到的效果:

这只是一种解决方案,大家可以去探索更多的方法哟。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180421G1IHXM00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券