Tensorflow-Recommenders のチュートリアルをやってみた


Tensorflow-Recommenders のチュートリアル はデータセットを tensorflow_datasets から用意していますが、csv から用意しても処理が回るか試してみたのでまとめます。

なお、データセットは MovieLens の ml-latest-small を使っています。

おおむねTensorflow-Recommenders のチュートリアルどおりなので、修正箇所のみ記載します。

詳細なコードはこちら

データセットの作成

Pandas で CSV を読み込んで前処理してやります。

カラム名は別に変えなくても良いのですが、チュートリアルと合わせています。

ratings = pd.read_csv("ml-latest-small/ratings.csv")
movies = pd.read_csv("ml-latest-small/movies.csv")

# 前処理
ratings = pd.merge(ratings, movies, on="movieId", how="left")[["title", "userId"]]
ratings.columns = ["movie_title", "user_id"]
ratings["user_id"] = ratings["user_id"].astype(str)

movies = movies[["title"]]
movies.columns = ["movie_title"]

tf.data.Dataset.from_tensor_slices を使って Tensorflow-Recommenders 向けに型変換します。

ratings = tf.data.Dataset.from_tensor_slices(ratings.to_dict(orient='list'))
movies = tf.data.Dataset.from_tensor_slices(movies.to_dict(orient='list'))

https://www.tensorflow.org/tutorials/load_data/pandas_dataframe?hl=ja

チュートリアルと同様、型変換後のデータセットも中身を確認することができます。

for element in ratings.take(1).as_numpy_iterator():
  pprint.pprint(element)

for element in movies.take(1).as_numpy_iterator():
  pprint.pprint(element)

{'movie_title': b'Toy Story (1995)', 'user_id': b'1'}

{'movie_title': b'Toy Story (1995)'}

チュートリアルと違い、movies の中身が辞書型になっていますので、下記のように value を読み込むよう微修正します。

# 修正前
movies.batch(xxx)

# 修正後
movies.batch(xxx).map(lambda x: x["movie_title"])

TensorBoardの追加

%load_ext tensorboard

# (略)

%tensorboard --logdir logs/fit

EPOCHS_NUM = 10

log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)

model.fit(
        cached_train, 
        epochs=EPOCHS_NUM,
        callbacks=[tensorboard_callback],
    )

推論

()  
print(f"Recommendations for user 42: {titles[0, :3]}")

推論部分には変更点はありませんが、以下のようにレコメンド結果を出力することができました。

出力:
Recommendations for user 42: [b'Reindeer Games (2000)' b'Money Pit, The (1986)'
b'Friday the 13th Part 3: 3D (1982)']

以上になります、最後までお読みいただきありがとうございました。

参考サイト

https://qiita.com/k-watanb/items/986e31e16a97ae08af3d

https://note.nkmk.me/python-pandas-to-dict/