こんにちは
『推薦システム実践入門』を写経していて本の通り動かない部分があったため、メモとして残します。
今回は5章のIMFでimplicitを使う部分
各ライブラリのバージョン
numpy:1.21.6 implicit:0.5.2 scipy:1.7.3
リンク
本題
本のコード
# モデルの初期化 model = implicit.als.AlternatingLeastSquares( factors=factors, iterations=n_epochs, calculate_training_loss=True, random_state=1 ) # 学習 model.fit(movielens_matrix) # 推薦 recommendations = model.recommend_all(movielens_matrix.T) >>> Precision@K=0.026, Recall@K=0.080
出典:風間正弘、飯塚洸二郎、松村優也著『推薦システム実践入門』(オライリー・ジャパン、ISBN978-4-87311-966-3)
自分の環境で動かすと
recommendations = model.recommend_all(movielens_matrix.T)
の所でuser_items needs to be a CSR sparse matrix
というエラーが出ます。
ただ、エラーの言うように.tocsr()しても治らない。コレについてはfitとrecommendで片方だけ.Tしていることが原因っぽいです。
どちらに合わせるかというところですが、implicitの実装を見てみると、"A sparse CSR matrix of shape (number_of_users, number_of_items)."と記載があるため下記のように.T.tocsr()
することで本の通りの出力になった。
# 学習 model.fit(movielens_matrix.T.tocsr()) # 推薦 recommendations = model.recommend_all(movielens_matrix.T.tocsr()) >>> Precision@K=0.026, Recall@K=0.080
lil_matrixを用意して値を入れていく段階で行方向をユーザーにするように変更するほうがスマートとは思います。
また躓いたら追記します。
それでは。