Введение в ARM с последующим примером кодирования

Создайте систему рекомендаций на Python

Используйте ассоциативный анализ правил, чтобы распутать закономерности

Что такое Association Rule Mining (ARM)?

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

Как это работает?

Как следует из названия, мы пытаемся найти такие правила, как {Milk} -> {Bread} или {Screwdriver, Screws} -> {Butter}, на основе истории транзакций. Левая часть (LHS) называется антецедентом, а правая часть (RHS) называется консеквентом . Правило подразумевает совпадение, а не причинно-следственную связь.

Как измерить интересность?

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

№1: {Молоко, Хлеб, Конфеты}
№2: {Молоко, Масло}
№3: {Хлеб, Конфеты}
№4: {Молоко, Хлеб}
№5: {Молоко, Хлеб}

и мы пытаемся измерить интересность этого правилаX -> Y, где X и Y - это наборы элементов.

  • Поддержка: это количество появлений объединенного набора элементов (X U Y), деленное на общее количество транзакций в базе данных. Он показывает, насколько вирусным этот набор элементов в базе данных.
    Supp({Milk} -> {Bread}) = Supp({Milk, Bread}) = 3/5 = 0.6
  • Достоверность: измеряется делением количества появлений набора элементов объединения на количество появлений LHS. Другими словами, это поддержка набора элементов union, разделенная на поддержку набора LHS. Он измеряет , как часто правило оказывалось верным.
    Conf({Milk} -> {Bread})= Supp({Milk, Bread})/Supp({Milk} = 0.6/0.8 = 0.75
  • Рост: он измеряется путем деления поддержки объединенного набора элементов на умножение индивидуальной поддержки X и Y. Он измеряет , насколько эти два набора зависят друг от друга. Значение подъемной силы, равное 1, указывает на независимость, значение подъемной силы ›1 дает степень того, насколько они сосуществуют вместе, а значение подъемной силы Lift({Milk} -> {Bread})
    = Supp({Milk, Bread})/ ( Supp({Milk}) * Supp({Bread}) )
    = 0.6/(0.8 * 0.8) = 0.9375
  • Кредитное плечо: оно измеряется так же, как подъем, но вместо деления на два отдельных умноженных значения поддержки вычитает их произведение из поддержки их союзного множества. Индикация такая же, как и для подъема, но указывается относительно нуля, а не единицы.
    Leverage({Milk} -> {Bread})
    = Supp({Milk, Bread} — ( Supp({Milk} * Supp({Bread}) )
    = 0.6 — (0.8 * 0.8) = -0.04
  • Убежденность: она измеряется путем деления отсутствия RHS 1-Supp(Y) на то, как часто правило оказывалось ложным
    1-Conf(X->Y). Он определяет, насколько часто правило будет давать ложный прогноз.
    Conv({Milk} -> {Bread})
    = (1-Supp({Bread})) / (1-Conf(X->Y))
    = 0.8 / 0.75 = 1.066

Каковы возможные варианты его использования?

  • Вы можете распутывать закономерности, совпадения и поведенческие паттерны.
  • Рекомендуйте товары своим клиентам. Например:
    Фильмы на основе истории их просмотра.
    Продукты на основе истории их заказов.
    Работа на основе их навыков и опыта.
  • Возможность придумывать новые способы категоризации предметов.

Как все это сделать?

К счастью, есть алгоритмы, которые пробуют все комбинации наборов элементов для правил от вашего имени. Они стараются сделать это максимально оптимально, выбирая минимальный порог поддержки или количество предметов. Алгоритм априори является примером алгоритма, который выполняет ARM. Есть и другие алгоритмы, которые это делают (алгоритм FP-роста, OPUS Search), но мы собираемся использовать Apriori для нашей демонстрации. Подробнее об этом можно узнать здесь.

Пример использования набора данных фильма!

В этом примере будет использоваться набор данных фильмов, оцененных разными пользователями по шкале от 1 до 5, из которых 5 - самые положительные. Цель, которую мы пытаемся достичь, - рекомендовать людям фильмы на основе того, что им понравилось. Мы собираемся выполнить индивидуальный майнинг (один элемент на LHS и один элемент на RHS).

Требования:

  • Таблицы набора данных; скачать отсюда.
    Один файл содержит общие данные о фильмах.
    Другой файл содержит рейтинговые данные о фильмах.
  • Среда Python с:
    pandas==1.0.1
    mlxtend==0.17.1
    Может работать с другими версиями этих пакетов.

Кодирование:

Первый шаг - импортировать панд и загрузить обе таблицы. Затем мы собираемся создать соответствие между movieId и title. Сопоставление сделает майнинг более эффективным, поскольку мы заменяем строку числами.

Вот так выглядит каждая таблица:

Теперь, как и раньше, мы хотим создавать транзакции (наборы предметов). Раньше мы покупали товары вместе, как одну транзакцию. В этом примере одна транзакция - это набор фильмов, понравившихся одному и тому же пользователю, поэтому каждая транзакция в этом случае будет представлять одного пользователя. Кроме того, поскольку мы хотим получать фильмы, которые им понравились, но не все, что они смотрели, мы будем оставлять фильмы с рейтингом 4 или 5.

Последний шаг нашей предварительной обработки - преобразование транзакций в двоичное представление (что-то вроде однократного кодирования). Если элемент присутствует в транзакции, то он помечается 1, в противном случае - 0. Для этого мы используем TransactionEncoder из mlextend.preprocessing:

Наконец, мы собираемся использовать алгоритм apriori для оптимального поиска значений поддержки для наборов элементов и association_rules для вычисления интересных правил. Вы можете увеличить min_support, чтобы получить более надежные результаты. Вы можете увеличить max_len, чтобы в каждом наборе было более 1 элемента. Кроме того, вы можете изменить metric и min_threshold этой метрики на все, что, по вашему мнению, соответствует вашим потребностям.

rules - это фрейм данных, мы можем отсортировать его по нашему metric (в данном случае lift) и отобразить 10 лучших результатов.

Как видите, наши результаты (которые можно скорректировать) показывают, что вы можете порекомендовать «Лжец-лжец» человеку, которому понравился «Крепкий орешек 2» и наоборот. Это базовый вариант, и его можно улучшить в дальнейшем, углубившись в метрики, пороговые значения и убедившись, что все не случайно.

Вот и все, ребята!