Разделите mysql на несколько наборов для перекрестной проверки

Привет, я создал способ рекомендовать фильмы из набора данных Movielens. Проблема со мной в том, как разделить таблицу в базе данных на основе просмотренных пользователем фильмов на складки для применения перекрестной проверки. Этот пример подробно объясняет то, что я ищу. Предположим, кто-то посмотрел 12 фильмов, и я применю трехкратную перекрестную проверку, поэтому мне нужно иметь 1 набор в качестве теста и 3 набора в качестве обучения, где 12/3 = 4, что является количеством наборов. Чтобы оценить мой рекомендательный метод, мне нужно сравнить прогнозы тестового набора с другими наборами один за другим, поэтому мне нужно получить пользовательский фильм в 4 группах, не содержащих повторяющихся фильмов. Кто-нибудь знает, как получить данные следующего примера в наборы в базе данных mysql?

ID| User_ID|    Movie_ID|   Movie_Title|    Movie_Genre|    Rating|
107747| 3|  480|    Jurassic Park|  Adventure|  4|
107748| 3|  590|    Dances with Wolves| Drama, Western| 4|
107749| 3|  648|    Mission: Impossible|    Action| 3|
107750| 3|  1198|   Raiders of the Lost Ark|    Adventure|  5|
107751| 3|  1259|   Stand by Me|    Drama|  5|
107752| 3|  1266|   Unforgiven| Western|    5|
107753| 3|  1270|   Back to the Future| Sci-Fi| 3|
107754| 3|  1291|   Indiana Jones and the Last Crusade| Action| 4|
107755| 3|  1378|   Young Guns| Western|    5|
107756| 3|  1379|   Young Guns II|  Western|    4|
107757| 3|  1394|   Raising Arizona|    Comedy| 4|
107758| 3|  1431|   Beverly Hills Ninja|    Comedy| 3|

Итак, я пытаюсь получить эти 12 фильмов как 3 группы, где каждая группа содержит 4 фильма, где эти группы содержат уникальные фильмы, другими словами, фильм не должен существовать более чем в группе. Я использую Java для извлечения этих данных из базы данных. Любая помощь с этим приветствуется.


person easy    schedule 23.07.2015    source источник


Ответы (1)


Вы можете протестировать свой метод с помощью набора данных MovieLens 100k, в котором уже выполнены перекрестные складки. Посетите grouplens.org/datasets/movielens/ для записи и данных. Вы также можете загрузить LensKit, если хотите, чтобы фреймворк делал это за вас - тогда вы можете просто написать свой рекомендательный алгоритм на Java.

Изменить: на основе превосходного объяснения совместной фильтрации Майкла Экстранда (http://md.ekstrandom.net/research/pubs/cf-survey/cf-survey.pdf), вот метод, который вы можете использовать:

  1. Поскольку вам нужна трехкратная перекрестная проверка, вы пройдете по каждому пользователю по очереди и разделите его оценки (случайным образом или иным образом) на 3 части. Мы назовем их A, B и C.

  2. Теперь давайте попробуем решить для A. Итак, объедините все оценки пользователей B и C в обучающую выборку. Обучите свою модель на этом наборе данных BC.

  3. Для совместной фильтрации требуется модель (которую вы только что построили), история оценок пользователя и некоторая скрытая часть этой истории, которую мы попытаемся предсказать, чтобы измерить, насколько хорош наш алгоритм. Таким образом, для каждого пользователя по очереди у вас есть часть A, о которой ваша модель ничего не знает. Разделите эту часть на две: A1 и A2. Во-первых, используйте A1 как известную историю пользователей, вход в ваш метод. Если вы пытаетесь порекомендовать список Top-N, составьте этот список, а затем посмотрите, сколько из этих N элементов на самом деле присутствует в наборе A2. Если вы пытаетесь предсказать рейтинги, пройдите через набор A2 и спрогнозируйте все рейтинги элементов, затем «раскройте» реальные рейтинги и измерьте свою ошибку.

  4. Повторите, используя A2 в качестве известной истории пользователей.

  5. Повторите, но обучение на AC и тестирование на B1 и B2. Затем повторите обучение на AB и тестирование на C1 и C2. Запомните все свои результаты и усредните их вместе. Это ваше выступление.

Вернемся к пункту 1. Я думаю, что проще всего выбрать для пользователя все фильмы из базы данных и поместить их в коллекцию Java. Затем вы можете использовать Collections.shuffle () для перестановки списка, если вы хотите использовать для обучения случайный порядок, а не порядок, основанный на времени. Берите по одной трети списка за раз, в зависимости от его размера.

Я не понимаю вашего мнения о том, что фильмы существуют только в одной группе. У пользователя может быть только одна оценка для фильма (или, по крайней мере, вас почти всегда интересует только самая последняя оценка). Таким образом, разделение рейтингового списка пользователя по умолчанию не будет включать дубликаты из одного раздела в другой. Но если, например, сложить все части пользователя как вместе, конечно, у популярных фильмов будет много оценок.

person Dan Jarratt    schedule 23.07.2015
comment
Уважаемый @ Runner1928, большое спасибо за ответ. Я знал, что набор данных Movielens 100k имеет перекрестную складку, но проблема в том, что я использую набор данных Movielens1m, у которого нет готовой перекрестной складки, и мне нужно создавать свои собственные складки. Что касается вашего второго предложения, которым является LensKit, я уже построил всю свою работу и новые методы на Movielens, поэтому очень сложно перенести все в LensKit. Итак, знаете ли вы, как решить эту проблему с помощью mysql и разделенной таблицы на основе фильмов, просмотренных пользователем? Спасибо заранее. - person easy; 24.07.2015