УДК 004.832.38

Построение рекомендательной системы подбора места для посещения на основе оценок пользователя

Курьян Илья Сергеевич – студент Сибирского государственного индустриального университета.

Негина Дарья Вячеславовна – студент Сибирского государственного индустриального университета.

Костырева Софья Андреевна – студент Сибирского государственного индустриального университета.

Аннотация: В данной статье раскрывается процесс создания рекомендательной системы подбора места для посещения на основе оценок пользователя. В используемом наборе данных оценки пользователя выставляются от 0 до 5, при этом 0 соответствует тому, что пользователь не посетил еще ни одно место, соответствующее категории. Целью статьи является обобщить накопленную информацию о создании рекомендательных систем и описать процесс создания на конкретном примере. Результатом работы стал разведочный анализ выбранного набора данных, очистка данных, а также описание алгоритма создания рекомендательной системы.

Ключевые слова: нейронные сети, машинное обучение, экспертная система, python, программирование, аналитика, data-science.

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

1

Рисунок 1. Инициализация библиотек.

Следующим шагом необходимо воспользоваться строчкой кода, которая преобразует значения в столбцах Cols объекта df в числовой формат, используя метод pd.to_numeric(). В качестве параметра функции необходимо передать «errors='coerce'», он означает, что если какое-либо значение не может быть преобразовано в числовой формат, то оно будет заменено на NaN (Not a Number). Таким образом, эта строка кода позволяет обработать значения в столбцах Cols объекта df, чтобы они могли быть использованы для проведения числовых вычислений, а также исключает возможные ошибки, связанные с наличием неправильных значений в данных. Реализованная строчка кода выглядит так как показано на рисунке 2.

2

Рисунок 2. Очистка набора данных от неподходящих значений.

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

3

Рисунок 3. Вывод функции info().

Теперь когда в наборе данных отсутствуют значения неподходящие типу данных float64, необходимо избавиться от пропущенных значений, заменив их на средние значения по столбцам. Сделать это можно с помощью метода mean(). Метод df.mean() вычисляет среднее значение по каждому столбцу объекта DataFrame df, затем метод df.fillna() заполняет все пропущенные значения в df этими средними значениями. Данная функция записывается так как показано на рисунке 4.

4

Рисунок 4. Функция замены пустых строк на средние значения.

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

5

Рисунок 5. Проверка на наличие в наборе данных отсутствующих значений.

Проведя подготовку и очистку набора данных необходимо провести разведочный анализ. Разведочный анализ (англ. exploratory data analysis, EDA) – это метод и процесс исследования данных, который используется для описательного анализа и понимания основных характеристик набора данных [1]. Он позволяет проводить первичный анализ данных и определять какие методы и модели могут быть применены для решения задач анализа данных. Основная цель разведочного анализа – это выявление закономерностей, шаблонов и тенденций в данных, а также выявление аномалий, выбросов и пропущенных значений. Для достижения этой цели используются различные методы визуализации и описательной статистики, такие как гистограммы, диаграммы рассеяния, «ящики с усами», корреляционные матрицы и другие. Разведочный анализ также позволяет определить, какие признаки в данных наиболее значимы для решения поставленной задачи. Это может быть полезно при выборе подходящих алгоритмов машинного обучения или методов анализа данных для решения задачи.

Начать разведочный анализ необходимо с проверки статистических характеристик всех числовых столбцов в объекте DataFrame df, используя метод describe().

Статистические характеристики включают:

  • Количество наблюдений (count);
  • Среднее значение (mean);
  • Стандартное отклонение (std);
  • Минимальное значение (min);
  • Квартили (25%, 50%, 75%);
  • Максимальное значение (max).

Метод describe() позволяет быстро получить общее представление о распределении значений в числовых столбцах объекта DataFrame df, а также выявить потенциальные аномалии и выбросы. Если в объекте DataFrame df есть нечисловые столбцы, они будут исключены из вывода метода describe(). Результат работы метода describe() представлен на рисунке 6.

6

Рисунок 6. Статистические характеристики набора данных.

Для дальнейшего анализа необходимо воспользоваться «ящиком с усами». «Ящик с усами» (boxplot) – это графическое представление данных [2], которое используется для отображения распределения данных через пять числовых характеристик: минимум, первый квартиль (Q1), медиана, третий квартиль (Q3) и максимум. Ящик на графике представляет интерквартильный размах, то есть расстояние между первым (Q1) и третьим (Q3) квартилями. Линия внутри ящика обозначает медиану. «Усы» на графике (вертикальные линии) представляют минимальное и максимальное значения данных, которые не являются выбросами. Выбросы на графике (точки) представляют данные, которые находятся за пределами усов и могут быть необычными или экстремальными значениями. В данной работе для реализации «ящика с усами» используется библиотека «Plotly», а конкретно модуль «iplot». Реализация «ящика с усами» показана на рисунке 7.

7

Рисунок 7. Реализация «Ящика с усами».

Графическая реализация «ящика с усами» представлена на рисунке 8.

8

Рисунок 8. Графическая реализация «Ящика с усами».

Также «Ящик с усами» был реализован для отдельных выделенных групп данный процесс представлен на рисунке 9.

9

Рисунок 9. Графическая реализация «Ящика с усами».

Были выделены обобщающие группы, и для них был сформирован «Ящик с усами», он представлен на рисунке 10.

10

Рисунок 10. Графическая реализация «Ящика с усами» для обобщенных групп.

Анализируя данные графики, можно увидеть некоторое количество выбросов значений.

В данной работе в основе рекомендательной системы используется метод k-средних (k-means). Метод k-средних (k-means) – это один из наиболее распространенных методов кластерного анализа, который позволяет разбить набор данных на k кластеров.

Он основывается на минимизации суммы квадратов расстояний между каждой точкой данных и центром ее кластера.

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

Этот процесс повторяется до тех пор, пока точки данных не перестанут менять свою принадлежность к кластерам.

Конечный результат – это k кластеров, каждый со своим центроидом, и наборы точек данных, которые относятся к каждому кластеру.

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

Для того, чтобы реализовать алгоритм k-means для рекомендательной системы, необходимо воспользоваться библиотекой sklearn, а конкретнее модулем «neighbors», для этого необходимо выполнить ячейку с кодом представленным на рисунке 11.

11

Рисунок 11. Подключение библиотеки sklearn.neighbors.

Далее необходимо создать модель ближайших соседей, создание модели представлено на рисунке 12.

12

Рисунок 12. Создание модели ближайших соседей.

Этот код создает модель ближайших соседей (k-Nearest Neighbors) для матрицы признаков df_matrix на основе 5 ближайших соседей.

NearestNeighbors является классом в библиотеке scikit-learn, который позволяет искать ближайших соседей для каждого примера в заданном наборе данных на основе заданной метрики расстояния.

После создания модели можно использовать ее для поиска ближайших соседей. Для этого необходимо реализовать функцию, которая будет сравнивать две строки и возвращать список элементов, которые есть в одной строке, но отсутствуют в другой. Реализация данной функции представлена на рисунке 13.

13

Рисунок 13. Функция сравнения двух строк.

Аргументы функции:

  • index: индекс первой строки в DataFrame, которую мы хотим сравнить;
  • ind: индекс второй строки в DataFrame, с которой мы хотим сравнить первую строку.

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

Сама рекомендательная система описана в отдельной функции recommend_knn, реализация данной функции представлена на рисунке 14.

14

Рисунок 14. Функция, реализующая рекомендательную систему.

Функция recommend_knn принимает один параметр – index, и возвращает список рекомендуемых категорий для пользователя index. Она сначала использует обученную модель k-ближайших соседей, чтобы найти 10 ближайших соседей для пользователя index, а затем вызывает функцию compare_df, чтобы найти список категорий, которые пользователь index еще не оценил, но которые были оценены ближайшими соседями. Если список не пустой, функция возвращает его, иначе она переходит к следующему ближайшему соседу и повторяет процесс.

Рекомендательная система выводит информацию так как показано на рисунке 15.

15

Рисунок 15. Вывод рекомендации для пользователя с id = 9.

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

Список литературы

  1. Джейкоби, Дж. Современные методы исследования данных: от анализа до визуализации. – М.: Вильямс, 2019. – 4642.
  2. Гринвальд, Э. Диаграмма размаха: как использовать ее в анализе данных. [Электронный ресурс]. – Режим доступа: https://habr.com/ru/company/ods/blog/354738/, свободный – (дата обращения: 12.06.2023).
  3. Федоровский, А.Н. Архитектура рекомендательной системы, работающей на основе неявных пользовательских оценок / А.Н. Федоровский, В.К. Логачева // Труды 13й Всероссийской научной конференции «Электронные библиотеки: перспективные методы и технологии, электронные коллекции» – RCDL'2011, Воронеж, Россия, 2011.

Интересная статья? Поделись ей с другими: