代码之家  ›  专栏  ›  技术社区  ›  Roelant

在tensorflow/keras中嵌入分类特征的有效方法?

  •  1
  • Roelant  · 技术社区  · 5 年前

    有没有办法有效地嵌入很多分类功能?我正在做一个推荐系统,一些用户和物品的功能是分类的。最近的博客文章建议嵌入这些,而不是使用一种热编码(参见 here here )

    然而,目前我编写的嵌入层如下所示:

    item_input = Input((1,), name='item_id')
    user_input = Input((1,), name='user_id')
    
    item_embedding_layer = Embedding(num_items, latent_dim_items, name='item_embeddings', input_length=1)
    user_embedding_layer = Embedding(num_users, latent_dim_users, name='user_embeddings', input_length=1)
    
    item_emb = Flatten(name='item_flat')(item_embedding_layer(item_input))
    user_emb = Flatten(name='pos_neg_user_flat')(user_embedding_layer(user_input))
    
    all_embed = Concatenate()([item_emb, user_emb])
    

    如果我现在添加分类,我必须创建一个新的 Embedding 每一层。这很快就会变得一团糟。例如,我有一个数据框架,其中包含我认为应该转化为许多嵌入的项特性 category: embedding

    {'item_category_level_1': {'n_uniques': 10, 'n_latent': 4} 
     'item_category_level_2': {'n_uniques': 50, 'n_latent': 10}}
    

    一种方法是在循环中创建层,但这似乎不是一种真正漂亮的方法。尤其是因为我一直在为每个输入定义不同的输入元素。然后,我的数据生成器需要返回一个非常长的列表。

    也可以使用更高的级别组合嵌入 input_shape ,但每个输入的潜在_维度是相等的。这也不是我想要的。

    我觉得我应该能够创建一个自定义层 EmbedAndConcat 但我不确定这是最好的方式。关于如何做到这一点,有什么想法吗?

    0 回复  |  直到 5 年前