Введение в анализ правил ассоциации

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. Значение этих параметров несложно догадаться по самим именам. Попробовав разные значения для ваших конкретных наборов данных, вы получите нужные правила ассоциации, которые помогут вам изучить корреляцию между точками данных в ваших собственных наборах данных.