Pandas, Анализ данных

Коллаборативная фильтрация на основе соседства с помощью языка Python

Время прочтения: 3 мин.

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

Существует несколько схем коллаборативной фильтрации:

  1. Вычисляют тех, кто разделяет оценочные суждения выбранного человека. Используют оценки максимально похоже мыслящих людей, найденных на первом шаге (для построения прогноза).
  2. Сначала строят матрицу, определяющую отношения между парами предметов, для нахождения похожих. Используя построенную матрицу и информацию о человеке – строят прогноз.

(К сведению, второй способ был изобретен Amazon)

Также существует 3 основных типа коллаборативной фильтрации:

  1. Основанный на соседстве (подбор группы похожих людей)
  2. Основанный на модели (использует методы машинного обучения)
  3. Гибридный (объединяет первый и второй тип)

А теперь попробуем практически реализовать 1 тип на языке Python.

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

Рисунок 1 – Пример датасета для построения рекомендаций.

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

import pandas as pd

Вторым шагом мы загружаем в DataFrame наш DataSet (у меня он с именем test), также мы устанавливаем в качестве индекса нашу колонку с именем «Объект» и создаем новый DataFrame для рекомендаций.

recomendations=pd.DataFrame()
df=pd.read_excel('test.xlsx')
df=df.astype(str)
df=df.set_index('Объект').T
df.to_excel('DataSet.xlsx')
df=pd.read_excel('DataSet.xlsx',index_col=0)
recList=list()

Третьим шагом мы перебираем все строки нашего DataFrame и для каждой находим один (можно и больше, если изменить переменную “k”) максимально похожий объект (также удаляем этот объект, чтобы исключить случай, что максимально похожий — будет он сам) и записываем его в рекомендации.

for row in df:  
    print(row)
    k = 0 # Количество похожих объектов
    corrMatr=df.corrwith(df[row])
    corrMatr=pd.DataFrame(corrMatr)
    tempMatr=corrMatr
    tempMatr=tempMatr.drop([row],axis=0)
    while k != 1:
        name = tempMatr.idxmax().item()
        value = tempMatr[0][tempMatr.idxmax().item()]
        recList.append([row,name,value])
        tempMatr=tempMatr.drop([tempMatr.idxmax().item()],axis=0)
        k += 1
recomendations=recomendations.append(recList, ignore_index=True)
recomendations.to_excel('result.xlsx')

В выходном файле, для примера, я вывел 3 колонки (рисунок 2):

  • Выбранный объект
  • Похожий объект
  • Коэффициент схожести
Рисунок 2 – Файл result.xlsx

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

Советуем почитать