От IBM | Создание системы рекомендаций с помощью Apache Spark и Elasticsearch

машинное обучение искусственный интеллект

Прочитайте эту статью на других языках:English.

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

Этот шаблон кода продемонстрирует ключевые элементы создания такой системы с использованием Apache Spark и Elasticsearch.

Этот репозиторий содержит Jupyter Notebook, в котором показано, как использовать Spark для обучения модели рекомендаций совместной фильтрации с данными рейтинга, хранящимися в Elasticsearch, сохранять факторы модели в Elasticsearch, а затем использовать Elasticsearch для подачи рекомендаций в реальном времени из этой модели. Данные, которые вы будете использовать, взяты изMovieLens, и является общим эталонным набором данных в сообществе рекомендаций. Эти данные содержат MovieLens Набор оценок, предоставленных пользователями системы оценки фильмов для различных фильмов. Также содержит метаданные (название и категорию) для каждого фильма.

После завершения этого шаблона кода вы будете знать, как:

  • Принимать и индексировать данные о пользовательских событиях в Elasticsearch с помощью коннектора Elasticsearch Spark.
  • Загрузите данные о событиях в Spark DataFrames и используйте библиотеку машинного обучения Spark (MLlib) для обучения модели рекомендательной системы совместной фильтрации.
  • Экспорт обученной модели в Elasticsearch
  • Используя специальный плагин Elasticsearch, вычислитеПерсонализируйте пользователяиПохожие товарыРекомендации и комбинируйте рекомендации с поиском и фильтрацией контента.

架构图

Операционные процедуры

  1. Загрузите набор данных фильма в Spark.
  2. Очистите набор данных с помощью операций Spark DataFrame и загрузите его в Elasticsearch.
  3. Используя Spark MLlib, обучите модель рекомендаций по совместной фильтрации.
  4. Сохраните полученную модель в Elasticsearch.
  5. Сгенерируйте несколько примеров рекомендаций, используя запросы Elasticsearch и пользовательский плагин векторной оценки. использоватьMovie DatabaseAPI для отображения изображений постеров фильмов для предлагаемых фильмов.

Включенные компоненты

  • Apache Spark: Быстрая кластерная вычислительная система общего назначения с открытым исходным кодом.
  • Elasticsearch: Механизм поиска и анализа с открытым исходным кодом
  • Jupyter Notebook: веб-приложение с открытым исходным кодом, которое можно использовать для создания и обмена документами, содержащими живой код, уравнения, визуализации и интерпретируемый текст.

Избранная технология

  • наука о данных: систематический и научный подход к анализу структурированных и неструктурированных данных для извлечения знаний и идей.
  • искусственный интеллект: ИИ можно применять в различных областях решений для создания прорывных технологий.
  • Python: Python — это язык программирования, обеспечивающий более быструю работу и более эффективную интеграцию систем.

смотреть видео

шаг

Выполните следующие действия, чтобы создать необходимые службы и запустить блокнот локально.

  1. клонировать репозиторий
  2. Настройка эластичного поиска
  3. Загрузите коннектор Elasticsearch Spark.
  4. Скачать Apache Spark
  5. Скачать данные
  6. Запустить блокнот
  7. запустить блокнот

1. Клонируйте репозиторий

будетelasticsearch-spark-recommenderРепозиторий клонируется локально. В терминале выполните следующие команды:

$ git clone https://github.com/IBM/elasticsearch-spark-recommender.git
скопировать код

2. Настройте эластичный поиск

Этот шаблон кода в настоящее время зависит от Elasticsearch 5.3.0. перейти кстраница загрузки, загрузите соответствующий пакет для вашей системы.

Например, на Linux/Mac вы можете скачатьTAR-архиви распакуйте его с помощью следующей команды:

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.3.0.tar.gz
$ tar xfz elasticsearch-5.3.0.tar.gz
скопировать код

Измените каталог на только что разархивированную папку, используя следующую команду:

$ cd elasticsearch-5.3.0
скопировать код

Далее необходимо установитьПлагин векторной оценки Elasticsearch. Для этого вы можете запустить следующую команду (Elasticsearch скачает для вас файл плагина):

$ ./bin/elasticsearch-plugin install https://github.com/MLnick/elasticsearch-vector-scoring/releases/download/v5.3.0/elasticsearch-vector-scoring-5.3.0.zip
скопировать код

Затем запустите Elasticsearch (сделайте это в отдельном окне терминала, чтобы он продолжал работать):

$ ./bin/elasticsearch
скопировать код

Вы увидите несколько журналов запуска. чекelasticsearch-vector-scoring-pluginЗагружено успешно:

$ ./bin/elasticsearch
[2017-09-08T15:58:18,781][INFO ][o.e.n.Node               ] [] initializing ...
...
[2017-09-08T15:58:19,406][INFO ][o.e.p.PluginsService     ] [2Zs8kW3] loaded plugin [elasticsearch-vector-scoring]
[2017-09-08T15:58:20,676][INFO ][o.e.n.Node               ] initialized
...
скопировать код

Наконец, вам нужно будет установить клиент Elasticsearch Python. Для этого выполните следующую команду (вы должны выполнить эту команду в другом окне терминала, отличном от того, в котором работает Elasticsearch):

$ pip install elasticsearch
скопировать код

3. Загрузите коннектор Elasticsearch Spark.

Проект Elasticsearch HadoopОбеспечивает соединители между Elasticsearch и различными системами, совместимыми с Hadoop, включая Spark. Проект предоставляет для загрузки ZIP-файл, содержащий все эти соединители. Вам нужно поместить JAR-файл соединителя Spark в путь к классам при запуске блокнота PySpark. Чтобы настроить коннектор, выполните следующие действия:

1.скачать elasticsearch-hadoop-5.3.0.zipфайл, содержащий все коннекторы. Для этого запустите:

$ wget http://download.elastic.co/hadoop/elasticsearch-hadoop-5.3.0.zip
скопировать код

2. Выполните следующую команду, чтобы извлечь файл:

$ unzip elasticsearch-hadoop-5.3.0.zip
скопировать код

3. Имя JAR коннектора Sparkelasticsearch-spark-20_2.11-5.3.0.jar, он будет расположен в каталоге, в который вы распаковали указанный выше файл.distподпапка.

4. Загрузите Apache Spark

Этот шаблон кода должен работать с любой версией Spark 2.x, но рекомендуется начинать сстраница загрузкиЗагрузите последнюю версию Spark (в настоящее время 2.2.0). После загрузки файла выполните следующую команду, чтобы извлечь его:

$ tar xfz spark-2.2.0-bin-hadoop2.7.tgz
скопировать код

Обратите внимание, что если вы загружаете другую версию, соответствующие команды, используемые выше и в других местах в этом шаблоне кода, должны быть соответствующим образом скорректированы.

下载 Apache Spark

Вам также необходимо установитьNumpy, чтобы использовать библиотеку машинного обучения SparkMLlib. Если Numpy не установлен, выполните следующую команду:

$ pip install numpy
скопировать код

5. Загрузите данные

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

Запустите следующие команды из базового каталога репозитория шаблонов кода:

$ cd data
$ wget http://files.grouplens.org/datasets/movielens/ml-latest-small.zip
$ unzip ml-latest-small.zip
скопировать код

6. Запустите ноутбук

Ноутбук должен работать с Python 2.7 или 3.x (проверено на 2.7.11 и 3.6.1).

Чтобы запустить этот блокнот, вам необходимо запустить сеанс PySpark в блокноте Jupyter. Если Jupyter не установлен, вы можете установить его, запустив:

$ pip install jupyter
скопировать код

При запуске Блокнота не забудьте включить путь к классам изШаг 3JAR-файл коннектора Elasticsearch Spark.

Выполните следующую команду, чтобы запустить сервер PySpark Notebook локально.Чтобы правильно выполнить эту команду, вам нужно запуститьшаг 1Запустите записную книжку из базового каталога репозитория клонированных шаблонов кода.. Если вы не в этом каталоге, сначала пройдитеcdкоманду в этот каталог.

PYSPARK_DRIVER_PYTHON="jupyter" PYSPARK_DRIVER_PYTHON_OPTS="notebook" ../spark-2.2.0-bin-hadoop2.7/bin/pyspark --driver-memory 4g --driver-class-path ../../elasticsearch-hadoop-5.3.0/dist/elasticsearch-spark-20_2.11-5.3.0.jar
скопировать код

Откроется окно браузера с содержимым папки Code Pattern. нажмитеnotebooksподпапку и нажмитеelasticsearch-spark-recommender.ipynbфайл для запуска ноутбука.

启动 Notebook

По желанию:

Чтобы отобразить изображения в рекомендуемых демонстрациях, вам необходимо посетитьThe Movie Database API. Пожалуйста, следуйтеинструкцииПолучите API-ключ. Вам также потребуется установить клиент Python с помощью следующей команды:

$ pip install tmdbsimple
скопировать код

Демонстрацию можно запустить без доступа к этому API, но изображение отображаться не будет (поэтому выглядит некрасиво!).

7. Запустите ноутбук

При выполнении Блокнота на самом деле происходит то, что каждая единица кода в Блокноте выполняется в порядке сверху вниз.

Вы можете выбрать каждую кодовую единицу и добавить маркер в левом поле перед кодовой единицей. Формат тегаIn [x]:. В зависимости от состояния ноутбукаxВозможно:

  • Пустой, указывающий на то, что модуль никогда не выполнялся.
  • Число, представляющее относительный порядок выполнения шагов этого кода.
  • Один*, указывая на то, что модуль в настоящее время выполняется.

Ячейки кода в Блокноте могут быть выполнены несколькими способами:

  • Одна единица за раз.
    • Выберите ячейку и нажмите на панели инструментовPlayкнопка. Вы также можете нажатьShift+Enterдля выполнения блока и перехода к следующему блоку.
  • Пакетный режим, выполняемый последовательно.
    • CellСтрока меню содержит несколько опций. Например, вы можете выбратьRun AllЗапустите все ячейки в Блокноте или, при желании,Run All Below, который начнется с первой ячейки под текущей выбранной ячейкой и продолжится со всеми последующими ячейками.

Пример вывода

data/examplesПример вывода в папке показывает полный вывод после запуска Notebook. допустимыйздесьПроверьте это.

Примечание:Чтобы увидеть код и уменьшенную ячейку без вывода, вы можете найти его наПросмотр оригинальной записной книжки в средстве просмотра Github.

Исправление проблем

  • Ошибка:java.lang.ClassNotFoundException: Failed to find data source: es.

Если вы видите эту ошибку при попытке записи данных из Spark в Elasticsearch в блокноте, это означает, что Spark не нашел коннектор Elasticsearch Spark в пути к классам при запуске блокнота (elasticsearch-spark-20_2.11-5.3.0.jar).

Решение: начать сначалаШаг 6команда в ,Обязательно запустите его из базового каталога репозитория шаблонов кода..

Если это не сработает, попробуйте использовать полный путь к JAR-файлу при запуске Блокнота, например:PYSPARK_DRIVER_PYTHON="jupyter" PYSPARK_DRIVER_PYTHON_OPTS="notebook" ../spark-2.2.0-bin-hadoop2.7/bin/pyspark --driver-memory 4g --driver-class-path /FULL_PATH/elasticsearch-hadoop-5.3.0/dist/elasticsearch-spark-20_2.11-5.3.0.jarвFULL_PATHдаты распаковываешьelasticsearch-hadoopZIP-файлПолный (не относительный) путь к используемому каталогу.

  • Ошибка:org.elasticsearch.hadoop.EsHadoopIllegalStateException: SaveMode is set to ErrorIfExists and index demo/ratings exists and contains data.Consider changing the SaveMode

Если вы видите эту ошибку при попытке записать данные из Spark в Elasticsearch в блокноте, это означает, что вы записали данные в соответствующий индекс (например, записываете данные оценки вratingsпоказатель).

Решение: попытайтесь продолжить обработку записной книжки со следующей ячейки. Вы также можете сначала удалить все индексы и повторно запустить команду Elasticsearch, чтобы создать карту индексов (см.Шаг 2. Загрузите данные в Elasticsearch.).

  • Ошибка:ConnectionRefusedError: [Errno 61] Connection refused

Вы можете увидеть эту ошибку при попытке подключения к Elasticsearch в Notebook. Вероятно, это означает, что ваш экземпляр Elasticsearch не запущен.

Решение: в новом окне терминала пройдитеcdКоманда для перехода в каталог, где установлен Elasticsearch, запустите./bin/elasticsearchдля запуска Elasticsearch.

  • Ошибка:Py4JJavaError: An error occurred while calling o130.save. : org.elasticsearch.hadoop.rest.EsHadoopNoNodesLeftException: Connection error (check network and/or proxy settings)- all nodes failed; tried [[127.0.0.1:9200]]

Вы можете увидеть эту ошибку при попытке прочитать данные из Elasticsearch в Spark (или записать данные из Spark в Elasticsearch) в записной книжке. Вероятно, это означает, что ваш экземпляр Elasticsearch не запущен.

Решение: в новом окне терминала пройдитеcdКоманда для перехода в каталог, где установлен Elasticsearch, запустите./bin/elasticsearchдля запуска Elasticsearch.

  • Ошибка:ImportError: No module named elasticsearch

Если вы получаете эту ошибку, это означает, что клиент Elasticsearch Python не установлен или может быть недоступен вPYTHONPATHнайти на.

Решение: попробуйте использовать$ pip install elasticsearchУстановите клиент (если он работает в виртуальной среде Python, такой как Conda или Virtualenv), или используйте$ sudo pip install elasticsearch. Если это не сработает, вы можете добавить папку site-packages в свой путь Python (например, на Mac:export PYTHONPATH=/Library/Python/2.7/site-packagesдля Python 2.7). Другой пример для Linux см.Вопрос о стеке.Примечание:То же самое общее решение работает для любых других ошибок импорта модулей, с которыми вы можете столкнуться.

  • Ошибка:HTTPError: 401 Client Error: Unauthorized for url: https://api.themoviedb.org/3/movie/1893?api_key=...

Если вы видите эту ошибку в своем ноутбуке при тестировании доступа к TMDb API или создании рекомендаций, это означает, что вы установилиtmdbsimpleПакет Python без установки ключа API.

Решение: следуйтеШаг 6инструкции в конце, чтобы настроить свою учетную запись TMDb и получить ключ API. Затем скопируйте этот ключ вШаг 1. Подготовьте данныеВ блоке «Ноутбук» после завершенияtmdb.API_KEY = 'YOUR_API_KEY'линия (скороYOR_API_KEYс правильным ключом). После этого шага выполните этот модуль, чтобы проверить свой доступ к TMDb API. Доступ.

Ссылка на сайт

узнать больше информации

  • Шаблон кода анализа данных: Нравится этот шаблон кода? Узнайте о других нашихШаблон кода анализа данных
  • Плейлист AI и шаблон кода данных: Избранное содержит все наши видео с шаблонами кода.плейлист
  • Data Science Experience: через IBMData Science ExperienceОвладение искусством науки о данных
  • Искра в облаке IBM: Нужен кластер Spark? через нашСпарк-сервис, чтобы создать до 30 исполнителей Spark в IBM Cloud.

лицензия

Apache 2.0