Результаты совместной фильтрации Apache Spark ALS. Они не имеют смысла

Я хотел опробовать Spark для совместной фильтрации с использованием MLlib, как описано в этом руководстве: https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html Алгоритм основан на статье« Совместная фильтрация для наборов данных неявной обратной связи », выполняющей матричную факторизацию.

Все работает с использованием набора данных Movielens из 10 миллионов. Набор данных разделен на 80% обучение, 10% тест и 10% проверку.

  • Базовый уровень RMSE: 1.060505464225402
  • RMSE (поезд) = 0,7697248827452756
  • RMSE (проверка) = 0,8057135933012889 для модели, обученной с рангом = 24, лямбда = 0,1 и итерациями = 10.
  • Лучшая модель улучшает базовый уровень на 23,94%.

Это значения, аналогичные значениям в учебнике, но с другими параметрами обучения.

Я несколько раз пробовал запустить алгоритм и всегда получал бессмысленные для меня рекомендации. Даже оценивая только детские фильмы, я получаю следующие результаты:

Для рейтингов:

  • личный рейтинг: История игрушек (1995) рейтинг: 4.0
  • личный рейтинг: Книга джунглей, рейтинг (1994): 5.0
  • личный рейтинг: Король Лев, Рейтинг (1994): 5.0
  • личный рейтинг: Мэри Поппинс (1964) рейтинг: 4.0
  • личный рейтинг: Алиса в стране чудес (1951) рейтинг: 5.0

Полученные результаты:

Рекомендуемые фильмы:

  1. Жизнь Охару, The (Saikaku ichidai onna) (1952)
  2. Еще (1998)
  3. Кто там поет? (он же Who Sings Over There) (Ко то тамо пева) (1980)
  4. Воскресенье и Кибела (Dimanches de Ville d'Avray, Les) (1962)
  5. Голубой свет, The (Das Blaue Licht) (1932)
  6. Времена Харви Милка (1984)
  7. Пожалуйста, проголосуйте за меня (2007)
  8. Человек, который сажал деревья, The (Homme qui plantait des arbres, L ') (1987)
  9. Искупление Шоушенка, The (1994)
  10. Только вчера (Omohide poro poro) (1991)

Что, за исключением Only Yesterday, не имеет никакого смысла.

Если есть кто-то, кто знает, как интерпретировать эти результаты или получить лучшие, я был бы очень признателен, если бы вы поделились своими знаниями.

С наилучшими пожеланиями

РЕДАКТИРОВАТЬ:

Как и было предложено, я обучил другую модель с большим количеством факторов:

  • Базовая ошибка: 1.0587417035872992
  • RMSE (поезд) = 0,7679883378412548
  • RMSE (проверка) = 0,8070339258049574 для модели, обученной с рангом = 100, лямбда = 0,1 и numIter = 10.

И разные личные рейтинги:

  • персональный рейтинг: Звёздные войны: Эпизод VI - Возвращение джедая (1983) рейтинг: 5.0
  • личный рейтинг: Миссия невыполнима (1996) рейтинг: 4.0
  • Персональный рейтинг: Крепкий орешек: С местью (1995). Рейтинг: 4.0.
  • личный рейтинг: Batman Forever (1995) рейтинг: 5.0
  • личный рейтинг: Люди в черном (1997) рейтинг: 4.0
  • персональный рейтинг: Терминатор 2: Судный день (1991) рейтинг: 4.0
  • личный рейтинг: Top Gun (1986) рейтинг: 4.0
  • персональный рейтинг: Звёздные войны: Эпизод V - Империя наносит ответный удар (1980) рейтинг: 3,0
  • личный рейтинг: Чужой (1979) рейтинг: 4.0

Рекомендуемые фильмы:

Рекомендуемые фильмы:

  1. Кармен (1983)
  2. Тихий свет (Stellet licht) (2007)
  3. Иисус (1979)
  4. Жизнь Охару, The (Saikaku ichidai onna) (1952)
  5. Сердце Америки (2003)
  6. Ибо так мне говорит Библия (2007)
  7. Еще (1998)
  8. Легенда о Ли Бауэри (2002)
  9. Похороны, Осошики (1984)
  10. Длинные выстрелы (2008)

Ни одного полезного результата.

EDIT2: с использованием метода неявной обратной связи я получаю гораздо лучшие результаты! Для тех же боевиков, что и выше, рекомендации следующие:

Рекомендуемые фильмы:

  1. Звездные войны: Эпизод IV - Новая надежда (также известный как Звездные войны) (1977)
  2. Терминатор, The (1984)
  3. В поисках утраченного ковчега (Индиана Джонс и в поисках утраченного ковчега) (1981)
  4. Крепкий орешек (1988)
  5. Крестный отец (1972)
  6. Пришельцы (1986)
  7. Рок, The (1996)
  8. День Независимости (он же ID4) (1996)
  9. Звездный путь II: Гнев Хана (1982)
  10. Золотой глаз (1995)

Это больше, чем я ожидал! Вопрос в том, почему явная версия так себе плохая


person MachineLearner    schedule 06.10.2014    source источник


Ответы (4)


Обратите внимание, что код, который вы выполняете, не использует неявную обратную связь и не совсем тот алгоритм, на который вы ссылаетесь. Просто убедитесь, что вы не используете ALS.trainImplicit. Вам может понадобиться другой, лямбда и ранг. RMSE 0,88 - это нормально для этого набора данных; Мне непонятно, являются ли значения в примере оптимальными или просто теми, которые были получены в игрушечном тесте. Вы все еще используете другое значение. Может просто пока не оптимально.

Это может быть даже что-то вроде ошибок в реализации ALS, исправленных с тех пор. Если можете, попробуйте сравнить с другой реализацией ALS.

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

person Sean Owen    schedule 06.10.2014
comment
Спасибо за ваш ответ! Я дважды проверил и использую ALS.train (). Я полагаю, что для использования неявного метода мне также пришлось бы преобразовать рейтинги во что-то другое. Точные значения из учебника дают мне ошибку теста 3.668816258825066, поэтому я немного поигрался, пока она не исчезла. Я использую Spark-версию 1.1.0, попробую и другую версию. Ваш намек на то, что люди на самом деле оценивают эти фильмы, имел для меня большой смысл, я проверю некоторые другие рейтинги. (Кстати: есть ли здесь способ сделать разрыв строки?) - person MachineLearner; 07.10.2014
comment
Я попробовал другие личные рейтинги, и результаты снова сумасшедшие. Я обновлю исходный пост. - person MachineLearner; 07.10.2014
comment
Возможно, я сильно ошибаюсь, но я проверял исходный код ALS.scala и источник MovieLensALS.scala. В этом примере рейтинги явно установлены на 1 или 0 в зависимости от исходной оценки. В ALS.scala у нас есть достоверность val = 1 + alpha * abs (rs (i)), что, насколько я понимаю, rs (i) является рейтингом (0/1), но в исходной статье мы используем исходный рейтинг / обратная связь (0-5) здесь для расчета достоверности и 1/0 только в векторе r. Это должно быть так? - person MachineLearner; 07.10.2014
comment
rs (i) - это «сила», а не 0 или 1. - person Sean Owen; 07.10.2014
comment
Спасибо за объяснение. Я еще раз посмотрел и нашел свою ошибку, мы установили обучающий набор на правильные значения .. и изменили набор тестов на 0/1. Когда я впервые прочитал исходник, по какой-то причине я принял набор тестов за обучающий набор. Надо было присмотреться. Неявный метод творит чудеса. Возможно ли, что явный метод так сильно терпит неудачу, даже если мы даем ему явные оценки? Кстати, просмотрев код на Github, я обнаружил, что вы соавтор. Большое спасибо за этот проект, он очень помог! - person MachineLearner; 07.10.2014
comment
Вы имеете в виду, что он дает более низкое среднеквадратичное отклонение или дает лучшие результаты? RMSE не имеет смысла для этого алгоритма. Я лишь небольшой участник Spark MLlib, но много раз работал над реализациями ALS. - person Sean Owen; 07.10.2014
comment
Я имею в виду, что неявная версия дает лучшие результаты. Результаты, которые вы ожидаете увидеть (я обновил вопрос выводом). Явная версия продолжает давать бессмысленные результаты. Я отдаю предпочтение боевикам, получаю драмы и религиозные фильмы. Скрытая версия приносит мне боевики. Я попытался установить оценки между 2,5 и -2,5, если они заданы, и 0,0 в противном случае, так что отсутствующий рейтинг 0,0 интерпретируется как не хорошо, а не плохо, но я получаю точно такие же (плохие) результаты. - person MachineLearner; 08.10.2014
comment
Я также создаю рекомендатель и хотел бы увидеть, как вы включили неявную обратную связь. Могли бы опубликовать фрагмент кода или, возможно, какой-то псевдокод? - person Skylion; 17.04.2016

Совместная фильтрация просто дает вам предметы, которые действительно нравятся людям, имеющим тот же вкус, что и вы. Если вы оцениваете только детские фильмы, это не значит, что вам будут рекомендованы только детские фильмы. Это просто означает, что люди, которые оценили "Историю игрушек", "Книгу джунглей", "Короля льва" и т. Д., Как и вам, понравились Life of Oharu, More, Who's Singin 'Over There? И т. Д. У вас есть хорошая анимация в википедии. страница: CF

Я не читал ссылку, которую вы дали, но одну вещь, которую вы можете изменить, - это показатель сходства, который вы используете, если хотите сохранить совместную фильтрацию.

Если вам нужна рекомендация, основанная на вашем вкусе, вы можете попробовать модель латентных факторов, такую ​​как матричная факторизация. Здесь скрытый фактор может обнаружить, что фильм можно описать как характеристики, описывающие характеристики оцениваемых объектов. Может быть, фильм комический, детский, ужастик и т. Д. (Кстати, вы никогда не знаете, каков скрытый фактор). И если вы оцениваете только детские фильмы, вы можете получить в качестве рекомендации другие детские фильмы.

Надеюсь, это поможет.

person ThiS    schedule 06.10.2014
comment
Вот что странно в этом. Алгоритм основан на матричной факторизации из статьи «Совместная фильтрация для наборов данных неявной обратной связи». Итак, как вы сказали, я жду еще нескольких полезных рекомендаций. - person MachineLearner; 06.10.2014
comment
Затем увеличьте количество скрытых факторов и попробуйте вначале оценить больше фильмов. В противном случае нет ничего плохого в том, что вы получите. Вы используете только элементы и идентификатор пользователя, поэтому рекомендация каким-то образом ограничена. Другие методы могут использовать дополнительную информацию и улучшить рекомендации (например, используя жанр фильма или дату его выхода). Я полагаю, вы достигли предела матричной факторизации, и вы действительно ничего не можете изменить (кроме увеличения количества скрытых факторов и рейтинга большего количества фильмов). - person ThiS; 06.10.2014
comment
Спасибо, завтра попробую увеличить множители. Странно то, что в учебнике, который я опубликовал выше (ссылка), они получают гораздо лучшие результаты с тем же набором данных, библиотекой и параметрами. - person MachineLearner; 06.10.2014

Во-вторых, что сказал Влад, попробуйте корреляцию или Жаккара. Т.е. не обращайте внимания на рейтинги и просто посмотрите на двоичный код "находятся ли эти два фильма вместе в списке предпочтений пользователя или нет". Это изменило правила игры для меня, когда я создавал свой первый рекомендатель: http://tdunning.blogspot.com/2008/03/surprise-and-coincidence.html

Удачи

person Nicki Six    schedule 06.10.2014
comment
Спасибо, попробую. - person MachineLearner; 07.10.2014

Я пробовал использовать тот же набор данных и, следуя этому руководству по Spark, получил такие же (субъективно плохие) результаты.

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

Если вам действительно не нужна факторизация (которая, тем не менее, имеет много преимуществ), я бы предложил использовать другой метод рекомендаций.

person Charles O    schedule 06.10.2014
comment
Это интересно. Спасибо, что поделился! Сейчас попробую обычные рекомендации по предметам. Но я определенно хочу, чтобы метод факторизации работал. Вопрос в том, где что-то пошло не так. Нужно ли больше входных данных, больше личных оценок? О, и не могли бы вы рассказать о некоторых преимуществах, о которых вы упомянули? :) - person MachineLearner; 07.10.2014
comment
В учебнике Spark может быть несколько параметров, которые нужно настроить: 1) Рейтинги находятся в диапазоне от 1 до 5, попробуйте масштабировать их в [-1,1] так, чтобы 0 (без рейтинга) относился к средней оценке вместо очень плохая оценка. 2) Вы можете даже забыть о рейтингах и использовать вместо них неявные оценки (соответствует двоичной оценке: рассматривать только фильмы с рейтингом ›3). О преимуществах использования матричной факторизации подразумевает наличие низкоразмерного плотного пространства. Затем вы можете эффективно рекомендовать пользователей или элементы, а также можете исследовать пространство с небольшими размерами, чтобы найти элементы. - person Charles O; 07.10.2014
comment
Спасибо за ответ, сейчас я пытаюсь использовать неявные оценки. Будет обновляться с результатами. - person MachineLearner; 07.10.2014