Понимание недооцененного алгоритма машинного обучения + моделирование (с графическим интерфейсом) с использованием Python

Итак, на этот раз мы погружаемся в мир интеллектуального анализа данных, давайте начнем с небольшого, но информативного определения;

Что такое интеллектуальный анализ данных ?!

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

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

Но прежде чем идти дальше, нам нужно познакомиться с некоторыми специальными словарями по интеллектуальному анализу данных:

  • k-Itemsets: набор элементов - это просто набор элементов, k относится к его порядку / длине, что означает количество элементов, содержащихся в наборе элементов.
  • Транзакция: это фиксированные данные, которые могут относиться к купленным товарам в магазине. Обратите внимание, что алгоритм Apriori работает с наборами данных, содержащими тысячи или даже миллионы транзакций.
  • Правило ассоциации: предшествующее → последовательное отношение между двумя наборами элементов:

Подразумевает наличие набора элементов Y (консеквент) в рассматриваемой транзакции с учетом набора элементов X (антецедент).

  • Поддержка: популярность / частота использования набора элементов, рассчитываемая следующим образом:

  • Уверенность (X → Y): показывает, насколько правило достоверно / истинно, другими словами, вероятность наличия в транзакции следующего набора элементов, рассчитанная следующим образом:

Правило называется строгим правилом, если его достоверность равна 1.

  • Рост (X → Y): показатель эффективности, указывает на качество правила ассоциации:

  • MinSup: указанная пользователем переменная , обозначающая минимальный порог поддержки для наборов элементов.
  • MinConf: определяемая пользователем переменная, которая обозначает минимальный порог достоверности для правил.
  • Частый набор элементов: поддержка которого равна или выше выбранного минимального значения.
  • Редкий набор элементов: поддержка которого меньше выбранного минимального значения.

Итак ... как работает Априори?

Начиная с исторической точки зрения, алгоритм был впервые предложен компьютерными учеными Агравалом и Шрикантом в 1994 году, он выглядит следующим образом:

  • Создает возможные комбинации наборов k элементов (начинается с k = 1)
  • Рассчитывает поддержку по каждому набору элементов
  • Устраняет редко встречающиеся наборы элементов
  • Увеличивает k и повторяет процесс

Теперь, как сгенерировать эти наборы элементов? !!

Для наборов элементов длиной k = 2 необходимо учитывать все возможные комбинации двух элементов (перестановка не требуется). Для k ›2 сначала должны быть выполнены два условия:

  • Комбинированный набор элементов должен состоять из двух частых элементов длины k-1, назовем их подмножествами.
  • Оба подмножества должны иметь одинаковый префикс длины k-2.

Если подумать, эти шаги просто расширят ранее найденные частые наборы элементов, это называется подходом «снизу вверх». Это также доказывает, что алгоритм Apriori соблюдает свойство монотонности:

Все подмножества часто встречающегося набора элементов также должны быть частыми.

А также свойство антимонотонность:

Все супернаборы нечастого набора элементов также должны быть нечастыми.

Хорошо, но подождите, это кажется бесконечным !!

Нет, к счастью, это не бесконечно, алгоритм останавливается в определенном порядке k, если:

  • Все сгенерированные наборы элементов длины k являются нечастыми
  • Не найдено общего префикса длины k-2, что делает невозможным создание новых наборов элементов длины k

Конечно ... это не ракетостроение! но как насчет примера, чтобы прояснить это?

Вот небольшая таблица транзакций в двоичном формате. Значение элемента равно 1, если оно присутствует в рассматриваемой транзакции, в противном случае - 0.

Отлично ... Пришло время заняться поиском ассоциативных правил!

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

Если бы набор из 3 элементов {Миндаль-Сахар-Молоко} из предыдущего примера был частым набором элементов, то сгенерированные правила выглядели бы так:

Обзор моей априорной симуляции !! Использование Python

Набор данных

Имеет формат csv (значения, разделенные запятыми), содержащий 7501 транзакцию купленных товаров в супермаркете. Реструктуризация набора данных с помощью класса кодировщика транзакций из библиотеки mlxtend значительно упростила использование и управление. Полученная структура занимает площадь 871,8 КБ с 119 столбцами, индексированными соответственно по названию продукта от Миндаль до Цуккини.

Вот обзор таблицы транзакций до и после:

Реализация алгоритма

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

Выполнение заняло 177 секунд, что казалось оптимизированным и эффективным благодаря способности Pandas и NumPy выполнять быстрые поэлементные операции. Все найденные правила ассоциации были сохранены в файле Html для дальнейшего использования.

А как насчет экскурсии в супермаркет? Использование Dash by Plotly

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

Не стесняйтесь проверить мой исходный код здесь.