深度学习笔记之五——tensorflow的多值离散值特征的embedding

Embedding

  embedding是取代onehot的比较好的一种方式,与NLP中的word embedding有所区别,我们这里的embedding,仅仅是因为该特征unique值过多,onehot产生的矩阵过宽,所以取而代之使用embedding来减少维度。

 

单值

  回到题目,对于一般情形下的离散特征,我称之为单值离散值特征,如下:

                                                                                  (数据来自movielens)

     这种状况下的embedding十分简单,如果是使用tensorflow的Esitmator来建模,可以直接使用tf.feature_column.embedding_column构建特征列直接将数据给它,它就给我们embedding好了。

    我最近却遇上了另外一种情况,在多值情况下,如何embedding?

 

多值

  所谓多值,就是一条数据会拥有该属性多个值,而非一个,不太明白可以看下图:

                                                                   深度学习笔记之五——tensorflow的多值离散值特征的embedding_第1张图片

  与上面的age形式一比较,顿时觉得有点儿懵,这怎么玩?目前我还不知道有什么专门的API可以直接处理这种情况,只能自己慢慢处理(数据量大就闹心了,没有个集群都处理不动)。

  下面是一段处理movielens这种情况的方法,属于input,返回相对应的mebeddings:

import tensorflow as tf 
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
import warnings
warnings.filterwarnings('ignore') 
import os

file_name_string="E:/my_create_resource/deeplearning/data/ml-latest-small/movies.csv"
filename_queue = tf.train.string_input_producer([file_name_string])
reader = tf.TextLineReader()
_,value = reader.read(filename_queue)
"""
value = [
  "1,ToyStory,Adventure|Animation|Children|Comedy|Fantasy",
"2,Toytory,Adventure|Animation|Children|Comedy|Fantasy" 
]
"""
### Warning:获得TAG_SET——因为官方数据readme里面说Children's(实际上是Children),浪费半个小时找格式错误
TAG_SET = ["Action","Adventure","Animation","Children","Comedy","Crime","Documentary","Drama",
"Fantasy","Film-Noir","Horror","Musical","Mystery","Romance","Sci-Fi","Thriller","War","Western"]

def sparse_from_csv(csv):
    ids, col2,col3 = tf.decode_csv(csv, [[-1], [""],[""]]) 
    #保证样本和标签一一对应 这里的batch_size是超参TODO
    ids_batch, col2_batch,col3_batch = tf.train.batch([ids, col2,col3], name='movies',batch_size=1, capacity=200, num_threads=2)    
    table = tf.contrib.lookup.index_table_from_tensor(
      mapping=TAG_SET, default_value=-1) ## 这里构造了个查找表 ##
    
    split_tags = tf.string_split(col3_batch, "|")
    
    return ids_batch,col2_batch,tf.SparseTensor(
      indices=split_tags.indices,
      values=table.lookup(split_tags.values), ## 这里给出了不同值通过表查到的index ##
      dense_shape=split_tags.dense_shape)

TAG_EMBEDDING_DIM = 3
## 生成TAG_SET这十八个类别的embedding值,之后使用
embedding_params = tf.Variable(tf.truncated_normal([len(TAG_SET), TAG_EMBEDDING_DIM]))

ids,names,tags = sparse_from_csv(value)
embedded_tags = tf.nn.embedding_lookup_sparse(embedding_params, sp_ids=tags, sp_weights=None)

# 查验变量
with tf.Session() as s:
    s.run([tf.global_variables_initializer(), tf.tables_initializer()])
    coord = tf.train.Coordinator()#创建一个协调器,管理线程
    threads = tf.train.start_queue_runners(coord=coord)#启动QueueRunner,此时文件名队列已经进队
    for i in range(2):
        print(s.run(embedded_tags))
    coord.request_stop()
    coord.join(threads)

 

 

 

https://github.com/tensorflow/tensorflow/issues/21455

你可能感兴趣的:(深度学习,ML实战)