R で Recommenderlab を使用して、新しいユーザーにクラフト ビールの提案を提供するレコメンデーション システムを構築しています。
ただし、モデルを実行すると、トレーニング データセットの大部分でユーザーごとに同じ予測を受け取るか、出力として「character(0)」を受け取ります。各ユーザーに関連付けられていて、重複していない予測を受け取るにはどうすればよいですか?
私が使用しているデータセットはこちらにあります: https://www.kaggle.com/rdoume/beerreviews/version/1
データ フレームを直接マトリックスに変換してから、realRatingMatrix に変換しようとしました。
推奨事項を受け取るには、データ フレームをマトリックスに変換する前に、data.table ライブラリの 'dcast' 関数を使用する必要があります。
また、マトリックスから最初の列を削除して、ユーザー ID を削除しようとしました。
注意すべきことの 1 つは、データがサンプリングされるときに、「レビュー担当者」が空白である行がいくつかある可能性があることですが、評価とビール ID はそこにあります。
library(dplyr)
library(tidyverse)
library(recommenderlab)
library(reshape2)
library(data.table)
beer <- read.csv('beer.csv', stringsAsFactors = FALSE)
#Take sample of data(1000)
beer_sample <- sample_n(beer, 1000)
#Select relevant columns & rename
beer_ratings <- select(beer_sample, reviewer = review_profilename, beerId = beer_beerid, rating = review_overall)
#Add unique id for reviewers
beer_ratings$userId <- group_indices_(beer_ratings, .dots = 'reviewer')
#Create ratings matrix
rating_matrix <- dcast(beer_ratings, userId ~ beerId, value.var = 'rating')
rating_matrix <- as.matrix(rating_matrix)
rating_matrix <- as(rating_matrix, 'realRatingMatrix')
#UBCF Model
recommender_model <- Recommender(rating_matrix, method = 'UBCF', param=list(method='Cosine',nn=10))
#Predict top 5 beers for first 10 users
recom <- predict(recommender_model, rating_matrix[1:10], n=5)
#Return top recommendations as a list
recom_list<- as(recom,'list')
recom_list
上記のコードは次のようになります。
[[1]]
[1] "48542" "2042" "6" "10" "19"
[[2]]
[1] "10277" "2042" "6" "10" "19"
[[3]]
[1] "10277" "48542" "6" "10" "19"
[[4]]
[1] "10277" "48542" "2042" "6" "10"
[[5]]
[1] "10277" "48542" "2042" "6" "10"
[[6]]
[1] "10277" "48542" "2042" "6" "10"
データ フレームをマトリックスに変換してから、最初にテーブルにキャストせずに realRatingMatrix に変換すると、次のようなユーザーの推奨事項が得られます。
`886093`
`character(0)`
最初に 'dcast' 関数を使用してから、データ フレームをマトリックスに変換し、最初の列を削除してから、realRatingMatrix に変換すると、ほぼすべてのユーザーに対して同じ予測が返されます。
[[1]]
[1] "6" "7" "10" "12" "19"
[[2]]
[1] "6" "7" "10" "12" "19"
[[3]]
[1] "6" "7" "10" "12" "19"
どんな助けでも大歓迎です。