Pull to refresh

Comments 10

На мой взгляд, у вас там две главные ошибки, почему все так плохо:

  1. Вход SVD у вас 3хX мерный - UserID,MovieID,Rating. А должен быть NxM-мерной матрицей, где N-общее число фильмов, M-количество пользователей

  2. SVD здесь не годится, поскольку у вас матрица разреженная, и большую часть фильмов большая часть пользователей не смотрела. По теории тут вроде нужно использовать что-то типа взвешанного NMF (https://github.com/asn32/weighted-nmf), чтобы не учитывать при факторизации те оценки, которых нет, да и рейтинги у вас неотрицательные, то-есть SVD как-то совсем не при чем. Что будет делать SVD - искать линейные комбинации номеров пользователей и номеров фильмов для регрессии на оценки? Это выглядит не очень. Размерность матрицы должна быть равна количеству фильмов, в общем, и нужно взвешивание с неотрицательным разложением, тогда что-то заработает, и он будет искать веса с которым суммировать рейтинги похожих пользователей. Вроде по теории как-то так.

    С нейронкой поинтереснее, но к concatenate по смыслу лучше добавить механизм внимания, должно получше работать - внимание подберет эмбеддинги похожие у пользователей и фильмов (как в мультимодальных моделях), и по идее даст лучшее профилирование, и заодно позволит оценить, сколько вам нужно данных и какой должна быть размерность эмбеддинга, чтобы более-менее эффективно обучить схему.

Вход SVD у вас 3хX мерный - UserID,MovieID,Rating. А должен быть NxM-мерной матрицей, где N-общее число фильмов, M-количество пользователей

я немного переупростил в статье. там строится такая матрица:
reader = Reader(rating_scale=(1, 10))
data = Dataset.load_from_df(rating_df[['userId', 'movieId', 'rating']], reader)
trainset, testset = train_test_split(data, test_size=.15)
trainset = data.build_full_trainset()
testset = list(zip(rating_df2.userId.values, rating_df2.movieId.values, rating_df2.rating.values))

SVD здесь не годится, поскольку у вас матрица разреженная, и большую часть фильмов большая часть пользователей не смотрела.

The famous SVD algorithm, as popularized by Simon Funk during the Netflix Prize. SVD алгоритм использовался для предсказаний оценок фильмов в Netflix Prize.

С нейронкой поинтереснее

в чем смысл использования внимания когда тут всего 2 входа? тренировка эмбеддингов сама по себе должна выявить похожие фильмы и похожих пользователей. ну и конечно размерности эмбеддингов я менял как и размерности слоев. и результат стремится к вышеуказанной асимптоте.

похожесть результатов обоих алгоритмов говорит как раз о том что ошибок как раз нет

The famous SVD algorithm, as popularized by Simon Funk during the Netflix Prize. SVD алгоритм использовался для предсказаний оценок фильмов в Netflix Prize.

Ну, в 2006 году не было активных исследований графовых нейронных сетей, которые и сводятся к большим матрицам смежности, и не было рекомендаций Pinterest. Работы Лесковца появились в 2017.

Это не отменяет неверность утверждения о неприменимости SVD к подобной задаче.
да я видел статьи с графовыми нейронными сетями. но не пробовал. сомневаюсь что результат будет существенно лучше.
рекомендации Pinterest (изображений) и рекомендации кино принципиально различны. они скорее похожи на рекомендацию музыки. а это по описанной мной в статье причине - совсем другая история.

сравнил результаты моих экспериментов с имеющимися в сети результами использования графовых сетей. для этого изменил мой пример на RMSE и оценка 0-5. в результате RMSE ошибка получилась 0.55

в статье "Inductive matrix completion based on graph neural networks" достигли RMSE 0.83

впрочем их датасет состоял из 1M оценок, а у меня из 15М

и опять же простое усреднение на моем датасете дает 0.66

если я ошибаюсь то где?

Честно - не знаю, возможно вы действительно правы, и ваш метод эффективен. Особенно с нейронкой, как я уже говорил - он мне понравился - просто и эффективно.

Но всегда сети сравниваются на одинаковых обучающих и тестовых датасетах и одинаковых метриках. Метрики вы уравняли, но насколько мне известно, 15М датасет дает не меньшую точность, чем 1М, просто за счет большего объема обучающего датасета. Поэтому я-бы обучил ваше решение на том, на котором тренировали Чанг и Чен и сравнил результаты. Насколько мне известно, именно этого требуют журналы для публикации решений.

нашел. перешел с mean к RMSE неправильно.
на их датасете 1M у NN получается RMSE 0.90 и 0.98 в случае простого усреднения.
в сравнении с их лучшим результатом 0.83. и все же их результат не радикально лучше усреднения.
на моем датасете у NN получается RMSE 0.69 и 0.82 в случае простого усреднения. что лишний раз говорит о важности хороших данных.

я запустил код из той статьи (их репозиторий) на датасете 1M и получил результат RMSE 0.90. те тот же что и у меня демонстрирует метод NN. в их статье указан 0.86 возможно дело в том что я поменял один параметр иначе велетал из 16Г памяти.

попробуй прикрутить тэги. что чаще смотрит, какие тэги оценил выше среднего...

на Letterboxd есть адекватно проставленные жанры. и я их прикручивал. и режиссеров прикручивал. к NN алгоритму. и это улучшает результат на 1%.

Sign up to leave a comment.

Articles