Сравнивая 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)))
Что я делаю неправильно?