【发布时间】:2021-03-22 16:38:16
【问题描述】:
我查看了所有快速入门教程并使用basic_retrieval 示例将其调整为我的数据集。
views_df 包含成对的 user_ids 和 content_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