Сравнивая SVD и простую совместную фильтрацию в python

Я попытался создать механизм рекомендаций по совместной фильтрации, но у меня слишком много данных для его работы. мои данные выглядят так: user_id Счет игры 754321 1 0,6 4564123 1 0,5

Счет от 0 до 1, и у меня около 150 000 пользователей.

Итак, я решил попробовать SVD, который должен улучшить RMSE и работать с большими наборами данных. но по какой-то причине после реализации алгоритма СКО значительно ухудшилась. в регулярной совместной фильтрации я получаю RMSE 0,26, но в SVD я получаю RMSE 0,4

мой код:

from sklearn.model_selection import train_test_split
from sparsesvd import sparsesvd

data_train, data_test = train_test_split(data_to_use, test_size=0.3, random_state=12345)
trainpivot = data_train.pivot_table(index=['user_id'], columns=['Game'], values='Score', aggfunc=lambda x: sum(x), fill_value=0)

R = trainpivot.as_matrix()
user_ratings_mean = np.mean(R, axis = 1)
R_demeaned = csc_matrix(R - user_ratings_mean.reshape(-1, 1))

U, sigma, Vt = sparsesvd(R_demeaned, 1)
sigma = np.diag(sigma)

all_user_predicted_ratings = np.dot(np.dot(np.transpose(U), sigma), Vt)
preds_df = pd.DataFrame(all_user_predicted_ratings, columns = 
trainpivot.columns, index=trainpivot.index)

Melted = pd.melt(preds_df.reset_index(), id_vars=['user_id'])
Melted.columns = ['user_id', 'Game', 'PredictedScore']

Tested = pd.merge(Melted, data_test, on=['user_id', 'Game'], how='inner')

print (np.sqrt(mean_squared_error(Tested['Score'].values, Tested['PredictedScore'].values)))

Что я делаю неправильно?

0 ответов

Другие вопросы по тегам