Введение в анализ правил ассоциации
Apriori — это алгоритм извлечения часто встречающихся наборов элементов с приложениями для изучения ассоциативных правил. Далее он идентифицирует часто встречающиеся отдельные элементы в базе данных и расширяет их до все больших и больших наборов элементов, пока эти наборы элементов появляются в базе данных достаточно часто. Например, мы можем использовать этот алгоритм для анализа наборов товаров, часто приобретаемых покупателями в магазине, путем вычисления правил ассоциации. Такой анализ помогает выявить общие тенденции в базе данных покупок.
Основное предположение априорной теоремы состоит в том, что любое подмножество часто встречающегося набора должно быть частым. Например, если транзакция содержит {молоко, сыр, хлеб}, она также должна содержать {хлеб, сыр}. Результатом априорного алгоритма является генерация правил ассоциации. Мы используем запись о продаже в продуктовом магазине в качестве набора данных для объяснения и реализации априорного алгоритма. Запись о продаже содержит множество транзакций, каждая из которых включает продажу нескольких товаров, таких как молоко, яйца и т. д. Чтобы построить правила ассоциации между товарами во всех транзакциях, априорный алгоритм сначала вычисляет 3 важных фактора: поддержка товара А, достоверность между товарами. A и B, и поднимите из A в B.
Поддержка(А) определяется как процент товара А среди всех продаж. Его можно рассчитать, разделив количество транзакций, содержащих элемент A, на общее количество транзакций, т. Е. Поддержка (A) = количество транзакций, содержащих A / общее количество транзакций. Поддержку товара А можно понимать как вероятность того, что любой покупатель купит товар А.
Уверенность (A->B) измеряет отношение транзакций, содержащих как A, так и B, к количеству транзакций, содержащих хотя бы A. Другими словами, уверенность говорит о том, насколько уверенно можно было бы увидеть элемент B в транзакциях, содержащих элемент A. Математически это можно выразить как Conf(A-›B) = Support{A,B}/Support{A}.
Lift(A,B) — это вероятность покупки B при продаже A. Его можно рассчитать по формуле Lift(A,B) = Support{A, B} / (Support{A} * Support{B}). Если A и B не коррелированы, т. е. вероятность покупки A не зависит от вероятности покупки B, то Lift (A, B) = 1. Это легко объяснить. Предположим, что вероятность того, что любой клиент купит A, равна 1/5, а вероятность покупки B равна 1/3, тогда любые транзакции, содержащие как A, так и B, должны составлять 1/5 * 1/3 = 1/15, поскольку две вероятности равны независимые случайные события. Итак, по формуле можно вычислить, что Подъем(А->В) = (1/15) / ((1/5)*(1/3)) = 1. Если Жизнь(А,В) больше чем 1, мы говорим, что существует положительная связь между А и В, т. е. более вероятно, что А и В появятся в одних и тех же транзакциях. Если подъем меньше 1, мы называем A и B отрицательно связанными, т. Е. Менее вероятно (чем случайным) появление A и B в одной и той же транзакции.
Реализовать априорный алгоритм в Python
Мы используем запись о продажах продуктового магазина в качестве примера для иллюстрации априорного алгоритма. Существуют разные априорные пакеты даже в одном только Python. В следующем примере мы используем пакет mlxtend (читается как Machine Learning eXTEND). Запись о продажах содержит 10 транзакций в следующем виде:
Bread,Wine,Eggs,Meat,Cheese,Pencil,Diaper Bread,Cheese,Meat,Diaper,Wine,Milk,Pencil Cheese,Meat,Eggs,Milk,Wine Cheese,Meat,Eggs,Milk,Wine Meat,Pencil,Wine Eggs,Bread,Wine,Pencil,Milk,Diaper,Bagel Wine,Pencil,Eggs,Cheese Bagel,Bread,Milk,Pencil,Diaper Bread,Diaper,Cheese,Milk,Wine,Eggs Bagel,Wine,Diaper,Meat,Pencil,Eggs,Cheese
Пользователи могут сохранить приведенную выше запись о продажах как розничный.csv и импортировать в Python, используя приведенный ниже код:
import csv with open('./retail.csv', newline='') as f: reader = csv.reader(f) dataset = list(reader)
Подготовка входных данных является важным шагом во всем рабочем процессе анализа данных и машинного обучения. Есть разные способы сделать это. Здесь мы сначала используем метод TransactionEncoder из модуля mlxtend.preprocessing для предварительной обработки набора данных, а затем преобразуем его в формат кадра данных pandas, который является популярным форматом для большинства задач машинного обучения.
import pandas as pd from mlxtend.preprocessing import TransactionEncoder model = TransactionEncoder() proc_data = model.fit(dataset).transform(dataset) df = pd.DataFrame(proc_data, columns=proc_data.columns_)
Мы можем распечатать обработанный кадр данных df, чтобы визуализировать его.
bagel bread cheese diaper eggs meat milk pencil wine 0 False True True True True True False True True 1 False True True True False True True True True 2 False False True False True True True False True 3 False False True False True True True False True 4 False False False False False True False True True 5 True True False True True False True True True 6 False False True False True False False True True 7 True True False True False False True True False 8 False True True True True False True False True 9 True False True True True True False True True
Теперь мы можем начать вычислять априорные правила, используя априорный метод из пакета mlxtend.
from mlxtend.frequent_patterns import apriori frequent_itemsets = apriori(df, min_support=0.6)
В априорном методе много параметров. Самый распространенный параметр — min_support. Мы используем в коде значение 0,6, что означает, что нам нужны только правила, содержащие часто встречающиеся элементы с поддержкой не ниже 0,6. Мы распечатываем все 12 наборов часто встречающихся элементов (т. е. наборов часто встречающихся элементов), вычисленных априорным алгоритмом.
support itemsets 0 0.7 (cheese) 1 0.6 (diaper) 2 0.7 (eggs) 3 0.6 (meat) 4 0.6 (milk) 5 0.7 (pencil) 6 0.9 (wine) 7 0.6 (eggs, cheese) 8 0.7 (wine, cheese) 9 0.7 (wine, eggs) 10 0.6 (wine, meat) 11 0.6 (pencil, wine) 12 0.6 (wine, eggs, cheese)
Теперь мы вычислили правила ассоциации, чтобы мы могли выполнять различные анализы и фильтрацию. Например, если мы хотим изучить корреляции между различными элементами, мы можем отфильтровать приведенные выше правила ассоциации и найти часто встречающиеся наборы элементов с длиной 2 или больше. Мы можем использовать следующий код для выполнения этой процедуры фильтрации.
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x: len(x)) print(frequent_itemsets[ (frequent_itemsets['length']>=2) ])
В выходных данных отображаются только те наборы элементов, в которых есть как минимум два элемента в одной транзакции.
support itemsets length 7 0.6 (eggs, cheese) 2 8 0.7 (cheese, wine) 2 9 0.7 (eggs, wine) 2 10 0.6 (meat, wine) 2 11 0.6 (pencil, wine) 2 12 0.6 (cheese, eggs, wine) 3
Мы также можем найти поддержку для конкретной пары наборов элементов следующим образом:
print(frequent_itemsets[ (frequent_itemsets['itemsets']=={'cheese', 'wine'}) ])
Результат показан следующим образом:
support itemsets length 8 0.7 (wine, cheese) 2
Пользователи могут играть с различными параметрами в априорном алгоритме, чтобы фильтровать и вычислять нужные правила ассоциации. Параметры включают min_support, min_confidence, min_lift, min_length и max_length. Значение этих параметров несложно догадаться по самим именам. Попробовав разные значения для ваших конкретных наборов данных, вы получите нужные правила ассоциации, которые помогут вам изучить корреляцию между точками данных в ваших собственных наборах данных.