【问题标题】:Usage of FactorizedTopK in TensorFlow Recommenders在 TensorFlow Recommenders 中使用 FactorizedTopK
【发布时间】:2021-03-22 16:38:16
【问题描述】:

我查看了所有快速入门教程并使用basic_retrieval 示例将其调整为我的数据集。 views_df 包含成对的 user_idscontent_ids,表示用户查看内容的时间。

数据集和结果

数据集相当小(63 个用户对 187 个内容的 1026 个视图)但代码似乎可以工作,我的结果如下:

火车:

factorized_top_k/top_1_categorical_accuracy:0.0012 factorized_top_k/top_5_categorical_accuracy:0.0816 factorized_top_k/top_10_categorical_accuracy:0.2046 factorized_top_k/top_50_categorical_accuracy:0.7430 factorized_top_k/top_100_categorical_accuracy:0.8965 损失:494.7287

测试:

factorized_top_k/top_1_categorical_accuracy: 0.0 factorized_top_k/top_5_categorical_accuracy:0.0243 factorized_top_k/top_10_categorical_accuracy:0.0585 factorized_top_k/top_50_categorical_accuracy:0.3804 factorized_top_k/top_100_categorical_accuracy:0.6146 损失:31.29269790649414,

问题

我不确定我是否从我的数据集中正确地创建了查询嵌入和候选嵌入,用于计算 FactorizedTopK 指标。 一般来说,我也很难理解 FactorizedTopK 指标的计算。我看了source code,但不明白它是如何计算的。

主要参数是查询和候选嵌入对:query_embeddings 的第一行表示用户从第一行候选嵌入中选择候选的查询。该任务将尝试最大化这些查询、候选对的亲和力,同时最小化查询与批处理中属于其他查询的候选之间的亲和力。

它从哪里获取基本事实? 查询和候选嵌入不只是所有用户和内容的列表吗? 列表的顺序是否重要? 有人可以用更简单的术语解释 FactorizedTopK 指标的计算吗?

提前致谢

代码

import os
import pprint
import tempfile
from typing import Dict, Text
import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds
import tensorflow_recommenders as tfrs
import pandas as pd
import matplotlib.pyplot as plt

# Variables
seed = 42
test_percentage = 20
train_percentage = 100-test_percentage
embedding_dimension = 32 # 64 ?
metrics_batchsize = 16
train_batchsize = 128
test_batchsize = 64
learning_rate = 0.1 # 0.5 ?
epochs = 3
index_batchsize = 100

views_df = pd.read_csv('filepath')

views_df = views_df[['user_id','content_id']]
users_df = views_df['user_id'].unique()
contents_df = views_df['content_id'].unique()

views_ds = tf.data.Dataset.from_tensor_slices(dict(views_df))
contents_ds = tf.data.Dataset.from_tensor_slices(contents_df)

view_size = len(views_df)
train_size = round(view_size/100*train_percentage)
test_size = view_size-train_size

tf.random.set_seed(seed)

views_ds_shuffled = views_ds.shuffle(len(views_df), seed=seed, reshuffle_each_iteration=False)

train = views_ds_shuffled.take(train_size)
test = views_ds_shuffled.skip(train_size).take(test_size)

user_model = tf.keras.Sequential([
  tf.keras.layers.experimental.preprocessing.IntegerLookup(vocabulary=users_df, mask_value=None),
  tf.keras.layers.Embedding(input_dim=len(users_df) + 1, output_dim=embedding_dimension)
])

content_model = tf.keras.Sequential([
  tf.keras.layers.experimental.preprocessing.IntegerLookup(vocabulary=contents_df, mask_value=None),
  tf.keras.layers.Embedding(input_dim=len(contents_df) + 1, output_dim=embedding_dimension)
])

candidates=contents_ds.batch(metrics_batchsize).map(content_model)

metrics = tfrs.metrics.FactorizedTopK(
  candidates=candidates
)

task = tfrs.tasks.Retrieval(
  metrics=metrics
)

class ContentModel(tfrs.Model):

  def __init__(self, user_model, content_model):
    super().__init__()
    self.content_model: tf.keras.Model = content_model
    self.user_model: tf.keras.Model = user_model
    self.task: tf.keras.layers.Layer = task

  def compute_loss(self, features: Dict[Text, tf.Tensor], training=False) -> tf.Tensor:
    content_embeddings = self.content_model(features["content_id"])
    user_embeddings = self.user_model(features["user_id"])

    return self.task(user_embeddings, content_embeddings)

model = ContentModel(user_model, content_model)
model.compile(optimizer=tf.keras.optimizers.Adagrad(learning_rate=learning_rate))

cached_train = train.shuffle(view_size).batch(train_batchsize).cache()
cached_test = test.batch(test_batchsize).cache()

model.fit(cached_train, epochs=epochs)

model.evaluate(cached_test, return_dict=True)

index = tfrs.layers.factorized_top_k.BruteForce(model.user_model)
index.index(contents_ds.batch(index_batchsize).map(model.content_model), contents_ds)

user_id = 2
_, contents = index(tf.constant([user_id]))
print(f"Recommendations for user {user_id}: {contents}")

【问题讨论】:

    标签: tensorflow recommendation-engine recommender-systems


    【解决方案1】:

    您必须只为数据集提供正面标签。 例如,购买数据可能是您对每个用户的正面样本。 TensorFlow 批量负采样计算训练模型。

    【讨论】:

      猜你喜欢
      • 2021-06-26
      • 2021-12-29
      • 2021-11-05
      • 2017-07-22
      • 1970-01-01
      • 2021-10-02
      • 2017-12-12
      • 2018-10-16
      • 2018-11-29
      相关资源
      最近更新 更多