推荐系统遇上深度学习四多值离散特征的解决方案
原文发布于微信公众号 - 小小挖掘机(wAIsjwj)
原文发表时间:2018.04.21 23:27
1、背景
在本系列第三篇文章中,在处理DeepFM数据时,由于每一个离散特征只有一个取值,因此我们在处理的过程中,将原始数据处理成了两个文件,一个记录特征的索引,一个记录了特征的值,而每一列,则代表一个离散特征。
但假如,我们某一个离散特征有多个取值呢?举个例子来说,每个人喜欢的NBA球队,有的人可能喜欢火箭和湖人,有的人可能只喜欢勇士,也有的人喜欢骑士、绿军、猛龙等一大堆。对于这种特征,我们本文将其称为多值离散特征。
根据DeepFM的思想,我们需要将每一个field的特征转换为定长的embedding,即使有多个取值,也是要变换成定长的embedding。
那么,一种思路来了,比如一个用户喜欢两个球队,这个field的特征可能是[1,1,0,0,0,0,0…..0],那么我们使用两次embedding lookup,再取个平均不就好了嘛。
嗯,这的确也许可能是一种思路吧,在tensorflow中,其实有一个函数能够实现我们上述的思路,那就是tf.nn.embedding_lookup_sparse。别着急,我们一步一步来实现多值离散特征的embedding处理过程。
2、解决方案
输入数据
假设我们有三条数据,每条数据代表一个user所喜欢的nba球员,比如有登哥,炮哥,杜老四,慕斯等等:
csv = [
"1,harden|james|curry",
"2,wrestbrook|harden|durant",
"3,|paul|towns",
]
我们建立一个所有球员的集合:
TAG_SET = ["harden", "james", "curry", "durant", "paul","towns","wrestbrook"]
数据处理
这里我们需要一个得到一个SparseTensor,即多为稀疏矩阵的一种表示方式,我们只记录非0值所在的位置和值。
比如说,下面就是我们对上面数据处理过后的一个SparseTensor,indices是数组中非0元素的下标,values跟indices一一对应,表示该下标位置的值,最后一个表示的是数组的大小。
处理得到SparseTensor的完整代码如下:
def sparse_from_csv(csv):
ids, post_tags_str = tf.decode_csv(csv, [[-1], [""]])
table = tf.contrib.lookup.index_table_from_tensor(
mapping=TAG_SET, default_value=-1) ## 这里构造了个查找表 ##
split_tags = tf.string_split(post_tags_str, "|")
return tf.SparseTensor(
indices=split_tags.indices,
values=table.lookup(split_tags.values), ## 这里给出了不同值通过表查到的index ##
dense_shape=split_tags.dense_shape)
定义embedding变量
定义我们的embedding的大小为3:
TAG_EMBEDDING_DIM = 3
embedding_params = tf.Variable(tf.truncated_normal([len(TAG_SET), TAG_EMBEDDING_DIM]))
得到embedding值
将我们刚才得到的SparseTensor,传入到tf.nn.embedding_lookup_sparse中,我们就可以得到多值离散特征的embedding值。
tags = sparse_from_csv(csv)
embedded_tags = tf.nn.embedding_lookup_sparse(embedding_params, sp_ids=tags, sp_weights=None)
sp_ids就是我们刚刚得到的SparseTensor,而sp_weights=None代表的每一个取值的权重,如果是None的话,所有权重都是1,也就是相当于取了平均。如果不是None的话,我们需要同样传入一个SparseTensor,代表不同球员的喜欢权重。大家感兴趣可以自己去尝试。
测试输出
最后我们来看看得到的效果:
with tf.Session() as s:
s.run([tf.global_variables_initializer(), tf.tables_initializer()])
print(s.run([embedded_tags]))
这只是一种解决方案,大
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E9%81%87%E4%B8%8A%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%9B%9B%E5%A4%9A%E5%80%BC%E7%A6%BB%E6%95%A3%E7%89%B9%E5%BE%81%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com