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

推荐系统遇上深度学习系列:

推荐系统遇上深度学习(一)--FM模型理论和实践

推荐系统遇上深度学习(二)--FFM模型理论和实践

推荐系统遇上深度学习(三)--DeepFM模型理论和实践

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]))

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

推荐阅读:强化学习系列

实战深度强化学习DQN-理论和实践

DQN三大改进(一)-Double DQN

DQN三大改进(二)-Prioritised replay

DQN三大改进(三)-Dueling Network

深度强化学习-Policy Gradient基本实现

深度强化学习-Actor-Critic算法原理和实现

深度强化学习-DDPG算法原理和实现

对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析

原文发布于微信公众号 - 小小挖掘机(wAIsjwj)

原文发表时间:2018-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT综合技术分享

大数据算法汇总

转载36大数据(36dsj.com):36大数据»大数据等最核心的关键技术:32个算法

6571
来自专栏小小挖掘机

DQN三大改进(一)-Double DQN

Double-DQN原文:https://arxiv.org/pdf/1509.06461v3.pdf 代码地址:https://github.com/prin...

8788
来自专栏大数据挖掘DT机器学习

机器学习入门和学习系统的设计

作者 RaySaint http://underthehood.blog.51cto.com/2531780/577854 机器学习的定义 《机器学习》By ...

33711
来自专栏PPV课数据科学社区

用 TensorFlow 做个聊天机器人

本文结构: 聊天机器人的架构简图 用 TensorFlow 实现 Chatbot 的模型 如何准备 chatbot 的训练数据 Chatbot 源码解读 1. ...

3223
来自专栏机器学习、深度学习

人群运动--Scene-Independent Group Profiling in Crowd

Scene-Independent Group Profiling in Crowd CVPR2014 http://www.ee.cuhk.edu.hk/...

2309
来自专栏大数据挖掘DT机器学习

用keras对国产剧评论文本的情感进行预测

RNN即循环神经网络,其主要用途是处理和预测序列数据。在CNN中,神经网络层间采用全连接的方式连接,但层内节点之间却无连接。RNN为了处理序列数据,层内节点的输...

4435
来自专栏专知

【干货】理解特征工程Part 1——连续数值数据(附代码)

7871
来自专栏钱塘大数据

大数据最核心的关键技术:32个算法

奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutsch...

4159
来自专栏算法channel

铁粉巨献:某独角兽公司数据挖掘工程师岗位 2000字面试总结

感谢铁粉:地球球长,奉献出自己的面试经验,面经总结的非常认真、详细、用心。这是球长同学第二次无私地奉献他的面经了,上一篇面经 ( @all: 新浪 机器学习算...

1010
来自专栏深度学习自然语言处理

【论文笔记】中文词向量论文综述(二)

一、Improve Chinese Word Embeddings by Exploiting Internal Structure

1153

扫码关注云+社区

领取腾讯云代金券