Избавляемся от продуктов априори – использование ассоциативных правил для поиска комбинаций
Я очень люблю готовить, поэтому постоянно закупаюсь ингредиентами для различных блюд. Однако, в последний раз я закупил их слишком много, теперь срок их годности подходит к концу. Но не выкидывать же продукты в мусорную корзину? Конечно, я бы мог использовать их все разом, но вряд ли блюдо в таком случае получится вкусным. Или же приготовить множество вариаций совершенно разной еды, но я так много не съем и на готовку у меня времени в обрез. Потому было принято решение приготовить минимальное количество блюд, использовав все доступные ингредиенты.
Что рассматриваем?
Долгое время я копил записи рецептов с форумов. Был собран датафрейм: 8102 строк и 60 столбцов, где строки — это блюда и их рецепты, а столбцы – ингредиенты. Строки могут повторяться – это связано с тем, что рецепт какого-либо блюда часто упоминался среди пользователей, значит рецепт проверенный.
С помощью библиотеки pandas посмотрю на собранный датафрейм.
Датафрейм представляет собой бинарную матрицу, где 1 – наличие продукта в рецепте и 0 – его отсутствие.
На второй странице у меня находятся классификации продуктов, где ОП – обязательный продукт, ВП – вспомогательный продукт и ПП – приправы. Запишу их в отдельные датафреймы на будущее, для возможности выбора между ними. Сначала найду самые популярные, проверенные рецепты.
Как это сделать?
На самом деле можно посчитать «в лоб» и сравнить значения, но это слишком долго. Поэтому применю существующий инструмент, который позволяет выполнять поиск наиболее частых комбинаций, используя данные такого же формата – поиск ассоциативных правил или association rule mining.
Поиск ассоциативных правил — это метод выявления отношений между переменными, использующийся в data mining. Существует множество методов анализа. Алгоритм Apriori, который я использовал, является наиболее популярным, простым и понятным инструментом.
Данный алгоритм часто применяется в анализе продуктовой корзины, он же basket analysis. Строки рассматриваются как транзакции, а столбцы – как покупки. Смысл анализа продуктовой корзины заключается в поиске наиболее популярных транзакций, выявление вероятности покупки некоторого набора товаров и использование полученных результатов, например, в разработке рекомендательных алгоритмов.
Существует множество метрик алгоритма Apriori. Но так как мне интересна только частота, была использована только поддержка. Поддержка (Support) – соотношение количества полученных транзакций к общему количеству транзакций. Иными словами – как часто полученный набор товаров встречается во всем датасете.
О работе алгоритма, кратко:
1. Вычисляется поддержка для каждого элемента. Сразу исключаются те элементы, у которых поддержка меньше заданного минимума.
2. Итеративно вычисляется поддержка для наборов, постепенно увеличивая их размер.
3. С ростом размера набора метрика поддержки либо уменьшается, либо остается неизменной. Иными словами, набор будет популярным только тогда, когда его элементы (или подмножества) также будут популярны. Этот принцип позволяет сократить пространство поиска, не тратя время на перебор абсолютно всех возможных комбинаций. Например, если поддержка для комбинации МОЛОКО+СЕЛЕДКА ниже заданного минимума, из дальнейшего перебора исключаются абсолютно все рецепты, которые содержат эту комбинацию.
Вызову библиотеку с реализованным алгоритмом и применю его для всего датасета.
Понятно, что так как единичные продукты встречаются во многих рецептах, они будут появляться чаще всего и с большим показателем поддержки. 1375 блюд я не смогу приготовить, и контекст данных потерян в виду того, что рассматривался весь датасет, в том числе вспомогательные продукты и специи. Низкие показатели поддержки в наборах, где больше чем один продукт, обусловлены высокой дисперсией данных, поэтому явно группы выявить сложно.
Но от продуктов избавляться надо, поэтому попробую доработать алгоритм:
1. Алгоритм Apriori достаточно требовательный и его отработка может занять много времени. Поэтому есть смысл искать вариации продуктов по группам, для каждого блюда отдельно.
2. Разделю основные продукты, вспомогательные и приправы.
3. Сделаю возможность выбора уровня поддержки, минимального и максимального количества продуктов в рецепте.
Прочитаю на второй странице своего кулинарного сборника свои классификации продуктов, и запишу их в разные датафреймы для возможности их выбора.
Указываю группировку (возможно будут другие атрибуты, например, страна происхождения блюда) и выбор используемых продуктов.
Дальше напишу основной алгоритм. Разобью по группам относительно блюд и уже внутри каждой группы будет отработан алгоритм. Также вытащу имя этой группы, чтобы было удобно ориентироваться в результатах.
Получил уже намного меньше сочетаний, 91 комбинация. Однако в этом случае метрика поддержки показывает частоту внутри группы, а не всего датасета. Теперь проверю встречаемость этим комбинаций внутри всего датасета.
Напишу небольшой скрипт для перезаписи существующего датасета. Это нужно для того, чтобы проверить комбинации как подмассивы.
Затем важно преобразовать полученные наборы выше, так как Itemsets содержит в себе frozenset.
Соединяю список рецептов и процент попадания элементов в другие рецепты.
Я получил отличную таблицу с отобранными рецептами в количестве 90 штук и мои продукты спасены.
Итог
Алгоритм Apriori достаточно удобный инструмент, несмотря на то что он в действительности далеко не новый. Существует много других алгоритмов, в том числе и модификации Apriori для полного анализа продуктовой корзины. Но для типовых задач комбинаторики этот инструмент подходит отлично. Пример с продуктами лишь более просто и наглядно демонстрирует возможности применения этого инструмента. В действительности задачи на поиски комбинаций с полным покрытием встречаются и в повседневной работе любого IT специалиста. Конечно, можно было бы разработать тяжеловесный скрипт с использованием технологий искусственного интеллекта, но займемся этим в будущем. Ведь важно не забивать гвозди микроскопом, и уметь использовать подобные «допотопные» инструменты. Это поможет сэкономить ваше время и ресурсы.