我有一个特征预处理问题,对我来说太复杂了,无法解决。我想从其他 3 个中生成一个“交叉特征”,让我详细说明:
我的机器学习问题是向用户推荐商品。在我的示例中,有关于用户的特性和关于项目的特性。我试图预测用户是否会喜欢这个项目。我们使用张量流示例。
我的用户的一个特征是项目 ID 到用户对它们的“亲和力”的“映射”。让我们称之为“项目关联性映射” 关联性本身是由另一个进程计算的。由于在 Tensorflow 示例中没有映射类型,我们有 2 个特征:一个是项目 id 的有序列表,另一个是关联性的有序列表。它们是同步的。所以我的“item affinities map”实际上是由 to featuresitem_affinities_ids
和表示的item affinities
。是的,我使用项目相似性信息作为输入并尝试预测另一个项目相似性。但这些是不同的,输入是针对与我试图预测的产品用例不同的产品用例计算的。
我还有第三个特征,它是item_id
我试图计算新亲和力的项目的特征。
在幼稚的 numpy 中,我可以这样做:
item_name = np.array(["item-a"])
item_affinities_ids = np.array(["item-0", "item-a", "item-b"])
item_affinities = np.array([0.2, 0.3, 0.4])
indices = np.where(item_affinities_ids == item_name)
return item_affinities[indices]
现在,在现实生活中,事情会变得更加复杂:
- 我想要一个张量流实现(TFT 或本机 TF)。
- 我们使用 TF v.13
- “项目关联性地图”可能会丢失。所以这两个结果
item_affinities_ids
和item affinities
表示为SparseTensor
s。但是,如果一个存在,另一个也存在,并且它们保证是同步的(相同的大小,相同的顺序)。 - 我们对批量示例进行预测和训练,因此我的每个(稀疏)张量的第一个维度是 batch_size > 1。
item_id
可能不存在于“项目关联性地图”中。在这种情况下,我想要一个默认值(0.0)。
我正在寻找一个可以处理所有这些要求的 tensorflow 实现。到目前为止,我有:
# using constants for the demonstration. In real life it would be tensors.
item_name = tf.constant([["item-a"], ["item-3"]])
item_affinities_ids = tf.constant([["item-0", "item-a", "item-b"], ["item-2", "item-1", "item-3"]])
item_affinities = tf.constant([[0.2, 0.3, 0.4], [0.2, -0.9, 0.4]])
return tf.boolean_mask(item_affinities, tf.equal(item_affinities_ids, item_name))
但它不处理 SparseTensor 和 item_id 不在item_affinities
列表中的情况。我正在寻找任何人来帮助我。