Понимание недооцененного алгоритма машинного обучения + моделирование (с графическим интерфейсом) с использованием 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
Наконец, мне пришлось использовать ранее сохраненные правила, чтобы предлагать продукты на основе того, что содержится в моей корзине. Вот краткий предварительный просмотр:
Не стесняйтесь проверить мой исходный код здесь.