Raw

Лекція 11. Пошук асоціативних правил. Алгоритми Apriori та Eclat

Огляд

У Лекції 9 та Лекції 10 ми розв’язували задачі кластеризації — це вже було навчання без учителя (англ. unsupervised learning): даним не приписано жодної цільової позначки, і метод сам шукає в них структуру. Пошук асоціативних правил належить до тієї самої родини, але шукає структуру іншого типу: не групи схожих об’єктів, а сталі спільні появи ознак — набори елементів, що систематично трапляються разом, і залежності «якщо є одне — імовірно, є й інше».

Класичний приклад — аналіз ринкового кошика (англ. market basket analysis): за чеками супермаркету знайти, які товари купують укупі. Правило «хто бере пелюшки, часто бере й пиво» — не прогноз для конкретного покупця (як у класифікації), а виявлена закономірність усієї бази транзакцій. У цій лекції ми означимо асоціативне правило, уведемо чотири міри інтересовності (підтримка, достовірність, підйом, переконливість), навчимося відбирати цікаві правила й розберемо два алгоритми пошуку частих наборів — Apriori (горизонтальний, з відсіванням кандидатів) та Eclat (вертикальний, на перетинах tid-множин).

Практичний бік. Підтримку, достовірність і підйом ви обчислюватимете «руками» й виконаєте Apriori вручну, а потім реалізуєте пошук правил програмою в Лабораторній роботі 11.

Наскрізний приклад лекції — маленька транзакційна база невеликого магазину: шість чеків над п’ятьма товарами.

Транзакція Товари (набір елементів)
t1t_1 Хліб, Молоко, Яйця
t2t_2 Хліб, Масло
t3t_3 Хліб, Молоко, Масло, Яйця
t4t_4 Молоко, Масло
t5t_5 Хліб, Молоко, Масло
t6t_6 Хліб, Молоко, Яйця, Кава

Тут N=6N = 6 транзакцій, а множина всіх товарів — I={Хліб,Молоко,Масло,Яйця,Кава}I = \{\text{Хліб}, \text{Молоко}, \text{Масло}, \text{Яйця}, \text{Кава}\}.

Транзакційна база наскрізного прикладу у вигляді бінарної матриці «чек × товар» з підтримкою кожного товару


11.1 Задача пошуку асоціативних правил

Означення (пошук асоціативних правил). Пошук асоціативних правил (англ. association rule mining) — це напрям машинного навчання, присвячений знаходженню в даних сталих залежностей у формі правил «якщо AA, то BB», де AA і BB — набори елементів (подій), що часто трапляються разом.

Три риси відрізняють цю задачу від класифікації (Лекції 68):

  • Немає виділеної цільової ознаки. Будь-який елемент може опинитися як у лівій, так і в правій частині правила; ми не передбачаємо один стовпець за іншими, а шукаємо всі помітні зв’язки одразу.
  • Результат — описовий, а не прогнозний. Правило описує закономірність наявних даних, а не виносить вирок про новий об’єкт.
  • Зв’язок — не причинність. «Якщо AA, то BB» означає лише, що поява AA супроводжується появою BB частіше за випадкову; це не твердження, що AA спричиняє BB.

11.2 Сфери застосування

Задача виникає всюди, де дані природно подаються як набори одночасних подій.

  • Аналіз ринкового кошика. Товари з одного чеку — для розкладки на полицях, рекомендацій («з цим товаром купують…») та акцій.
  • Медична діагностика. Симптоми, результати аналізів і діагнози, що стало супроводжують певне захворювання.
  • Аналіз веб-сторінок. Сторінки одного сеансу чи переходи за посиланнями — для навігації та перелінкування.
  • Біоінформатика. Гени, що спільно експресуються, чи мутації, що трапляються разом; асоціації генотипу й фенотипу.
  • Кібербезпека. Ознаки мережевих подій, що разом характеризують атаку, — для сигнатур систем виявлення вторгнень.

11.3 Транзакційна база даних

Означення (транзакційна база). Транзакційна (операційна) база даних — це множина транзакцій D={t1,t2,,tN}D = \{t_1, t_2, \dots, t_N\} над скінченною множиною елементів (англ. items) II. Кожна транзакція tiIt_i \subseteq I — це набір елементів, що трапилися разом. Набором (англ. itemset) називають будь-яку підмножину XIX \subseteq I; набір із kk елементів — це kk-набір.

На відміну від таблиці «об’єкт ×\times ознаки» з попередніх лекцій, транзакції можуть мати різну довжину (у чеку буває один товар, а буває десять), а порядок елементів у транзакції несуттєвий.

Два способи задання

Ту саму базу можна зберігати двома рівносильними способами — і вибір між ними визначає, який алгоритм зручніший.

Горизонтальний формат (транзакція \to набір елементів) — це саме таблиця з §Огляд: рядок — транзакція, у ньому перелічено її елементи. Так дані надходять природно (чек, сеанс, історія хвороби).

Вертикальний формат (елемент \to множина транзакцій) — для кожного елемента зберігають tid-множину (англ. tid-set, від transaction identifier) — множину номерів транзакцій, що його містять:

Елемент tid-множина
Хліб {1,2,3,5,6}\{1, 2, 3, 5, 6\}
Молоко {1,3,4,5,6}\{1, 3, 4, 5, 6\}
Масло {2,3,4,5}\{2, 3, 4, 5\}
Яйця {1,3,6}\{1, 3, 6\}
Кава {6}\{6\}

Вертикальний формат зручний тим, що підтримку набору (скільки транзакцій його містять) можна дістати як перетин tid-множин його елементів — на цьому й побудовано алгоритм Eclat (§11.8).


11.4 Асоціативне правило

Означення (асоціативне правило). Асоціативне правило — це вираз

XY,X \Rightarrow Y,

де X,YIX, Y \subseteq I — непорожні набори елементів, що не перетинаються (XY=X \cap Y = \varnothing). Набір XX називають умовою (антецедентом, англ. antecedent), а YYнаслідком (консеквентом, англ. consequent).

Читається правило як «транзакції, що містять XX, схильні містити й YY». Наприклад, {Молоко}{Яйця}\{\text{Молоко}\} \Rightarrow \{\text{Яйця}\} означає «до молока часто беруть яйця».

Саме собою правило нічого не варте, доки ми не виміряли, наскільки воно надійне й наскільки цікаве. Для цього слугують чотири числові міри.


11.5 Міри інтересовності

Підтримка

Означення (підтримка). Підтримка (англ. support) набору XX — це частка транзакцій, що містять XX:

supp(X)={tD:Xt}N.\operatorname{supp}(X) = \frac{|\{\, t \in D : X \subseteq t \,\}|}{N}.

Підтримка показує, наскільки поширений набір. Підтримкою правила XYX \Rightarrow Y називають підтримку об’єднання supp(XY)\operatorname{supp}(X \cup Y) — частку транзакцій, де є і XX, і YY.

Приклад 11.1 (підтримка наборів). У наскрізній базі (N=6N = 6):

supp({Хліб})=560.83,supp({Яйця})=36=0.5,supp({Кава})=160.17. \operatorname{supp}(\{\text{Хліб}\}) = \tfrac{5}{6} \approx 0.83, \qquad \operatorname{supp}(\{\text{Яйця}\}) = \tfrac{3}{6} = 0.5, \qquad \operatorname{supp}(\{\text{Кава}\}) = \tfrac{1}{6} \approx 0.17.

Молоко з яйцями трапляються разом у транзакціях t1,t3,t6t_1, t_3, t_6, тож supp({Молоко,Яйця})=36=0.5\operatorname{supp}(\{\text{Молоко}, \text{Яйця}\}) = \tfrac{3}{6} = 0.5. Це ж число — підтримка правила {Молоко}{Яйця}\{\text{Молоко}\} \Rightarrow \{\text{Яйця}\}.

Достовірність

Підтримка симетрична й не відрізняє «якщо AA, то BB» від «якщо BB, то AA». Напрямок правила вимірює достовірність.

Означення (достовірність). Достовірність (англ. confidence) правила XYX \Rightarrow Y

conf(XY)=supp(XY)supp(X).\operatorname{conf}(X \Rightarrow Y) = \frac{\operatorname{supp}(X \cup Y)}{\operatorname{supp}(X)}.

Це умовна частка: серед транзакцій, що містять XX, яка частина містить ще й YY. Достовірність — емпіричний аналог умовної ймовірності P(YX)P(Y \mid X).

Приклад 11.2 (достовірність). Для {Молоко}{Яйця}\{\text{Молоко}\} \Rightarrow \{\text{Яйця}\}:

conf=supp({Молоко,Яйця})supp({Молоко})=3/65/6=35=0.6. \operatorname{conf} = \frac{\operatorname{supp}(\{\text{Молоко}, \text{Яйця}\})}{\operatorname{supp}(\{\text{Молоко}\})} = \frac{3/6}{5/6} = \frac{3}{5} = 0.6.

Тобто 60%60\% покупців молока беруть і яйця. Натомість для зворотного напрямку {Яйця}{Молоко}\{\text{Яйця}\} \Rightarrow \{\text{Молоко}\}:

conf=3/63/6=1.0,\operatorname{conf} = \frac{3/6}{3/6} = 1.0,

бо всі три транзакції з яйцями містять молоко. Підтримка обох правил однакова (0.50.5), а достовірність — різна: достовірність напрямлена.

Типова помилка (висока достовірність без урахування поширеності наслідку). Достовірність 1.01.0 здається ідеальною, але сама собою може ввести в оману. Якщо наслідок YY і так є майже в кожній транзакції, то YY «підтвердиться» після будь-якого XX — правило достовірне, але беззмістовне. Саме цю ваду виправляє підйом.

Підйом

Означення (підйом). Підйом (англ. lift) правила XYX \Rightarrow Y — це відношення його достовірності до підтримки наслідку:

lift(XY)=conf(XY)supp(Y)=supp(XY)supp(X)supp(Y). \operatorname{lift}(X \Rightarrow Y) = \frac{\operatorname{conf}(X \Rightarrow Y)}{\operatorname{supp}(Y)} = \frac{\operatorname{supp}(X \cup Y)}{\operatorname{supp}(X)\,\operatorname{supp}(Y)}.

Підйом порівнює, наскільки частіше YY з’являється разом з XX, ніж якби XX і YY були незалежні. Три випадки:

  • lift>1\operatorname{lift} > 1позитивний зв’язок: XX і YY притягуються (поява XX підвищує шанс YY);
  • lift=1\operatorname{lift} = 1незалежність: XX нічого не каже про YY;
  • lift<1\operatorname{lift} < 1негативний зв’язок: XX і YY відштовхуються.

Із другої формули видно, що підйом симетричний: lift(XY)=lift(YX)\operatorname{lift}(X \Rightarrow Y) = \operatorname{lift}(Y \Rightarrow X) — на відміну від достовірності.

Приклад 11.3 (підйом). Для {Молоко}{Яйця}\{\text{Молоко}\} \Rightarrow \{\text{Яйця}\} (conf=0.6\operatorname{conf} = 0.6, supp({Яйця})=0.5\operatorname{supp}(\{\text{Яйця}\}) = 0.5):

lift=0.60.5=1.2>1,\operatorname{lift} = \frac{0.6}{0.5} = 1.2 > 1,

тобто молоко підвищує шанс яєць на 20%20\% — слабкий, але позитивний зв’язок. Порівняймо з {Хліб}{Молоко}\{\text{Хліб}\} \Rightarrow \{\text{Молоко}\}:

conf=4/65/6=45=0.8,lift=0.85/6=2425=0.96<1. \operatorname{conf} = \frac{4/6}{5/6} = \frac{4}{5} = 0.8, \qquad \operatorname{lift} = \frac{0.8}{5/6} = \frac{24}{25} = 0.96 < 1.

Достовірність висока (0.80.8), але підйом менший за одиницю: хліб і молоко з’являються разом навіть трохи рідше, ніж за незалежності, — просто обидва дуже поширені. Це саме та пастка, від якої застерігала виноска вище: висока достовірність без підйому оманлива.

Переконливість

Підйом симетричний і не бачить напрямку. Ще одна міра, переконливість, відновлює напрямок і зосереджується на тому, як часто правило помиляється.

Означення (переконливість). Переконливість (англ. conviction) правила XYX \Rightarrow Y

conv(XY)=1supp(Y)1conf(XY).\operatorname{conv}(X \Rightarrow Y) = \frac{1 - \operatorname{supp}(Y)}{1 - \operatorname{conf}(X \Rightarrow Y)}.

Чисельник 1supp(Y)1 - \operatorname{supp}(Y) — частка транзакцій без YY узагалі; знаменник 1conf1 - \operatorname{conf} — частка «порушень» правила (є XX, немає YY). Отже, переконливість — відношення очікуваної частоти порушень за незалежності до фактичної. Тлумачення:

  • conv>1\operatorname{conv} > 1 — правило змістовне: порушень менше, ніж було б випадково (що більше, то краще);
  • conv=1\operatorname{conv} = 1 — незалежність (XX і YY не пов’язані);
  • conv\operatorname{conv} \to \infty, коли conf1\operatorname{conf} \to 1 — правило ніколи не порушується.

Приклад 11.4 (переконливість). Для {Молоко}{Яйця}\{\text{Молоко}\} \Rightarrow \{\text{Яйця}\} (conf=0.6\operatorname{conf} = 0.6, supp({Яйця})=0.5\operatorname{supp}(\{\text{Яйця}\}) = 0.5):

conv=10.510.6=0.50.4=1.25>1\operatorname{conv} = \frac{1 - 0.5}{1 - 0.6} = \frac{0.5}{0.4} = 1.25 > 1

— правило змістовніше за випадкове. А для {Яйця}{Хліб}\{\text{Яйця}\} \Rightarrow \{\text{Хліб}\} маємо conf=1.0\operatorname{conf} = 1.0, тож знаменник обертається на нуль і conv\operatorname{conv} \to \infty: у нашій базі це правило не має жодного винятку.

Зведемо всі чотири міри для трьох правил (усі числа перевірено обчисленням):

Правило supp\operatorname{supp} conf\operatorname{conf} lift\operatorname{lift} conv\operatorname{conv}
{Молоко}{Яйця}\{\text{Молоко}\} \Rightarrow \{\text{Яйця}\} 0.50.5 0.60.6 1.21.2 1.251.25
{Хліб}{Молоко}\{\text{Хліб}\} \Rightarrow \{\text{Молоко}\} 0.670.67 0.80.8 0.960.96 0.830.83
{Яйця}{Хліб}\{\text{Яйця}\} \Rightarrow \{\text{Хліб}\} 0.50.5 1.01.0 1.21.2 \infty

Перетин tid-множин Молока та Яєць із обчисленням підтримки, достовірності й підйому для правила Молоко ⇒ Яйця


11.6 Відбір цікавих правил

Правил, які можна виписати з бази, надзвичайно багато (для I|I| елементів — експоненційно). Переважна більшість — випадковий шум або тривіальності. Тому задають два пороги й лишають правила, що долають обидва.

Означення (цікаве правило). Задано мінімальну підтримку smins_{\min} і мінімальну достовірність cminc_{\min}. Правило XYX \Rightarrow Y вважають цікавим, якщо

supp(XY)sminіconf(XY)cmin.\operatorname{supp}(X \cup Y) \ge s_{\min} \quad \text{і} \quad \operatorname{conf}(X \Rightarrow Y) \ge c_{\min}.

Поріг підтримки відсіює рідкісні набори (випадкові збіги, статистично ненадійні); поріг достовірності відсіює ненадійні напрямки. Підйом і переконливість застосовують додатково — уже до правил, що пройшли обидва пороги, — щоб упорядкувати їх за силою зв’язку й прибрати оманливо-достовірні (з lift1\operatorname{lift} \le 1).

Стовпчикова діаграма підйому кількох правил відносно межі lift = 1: зелені притягуються, помаранчеві відштовхуються

Пошук цікавих правил природно розпадається на два кроки:

  1. Знайти всі часті набори — набори з suppsmin\operatorname{supp} \ge s_{\min}. Це обчислювально важка частина; їй присвячено Apriori та Eclat.
  2. Згенерувати правила з кожного частого набору: набір ZZ розбивають на XX і Y=ZXY = Z \setminus X усіма способами й лишають ті, де confcmin\operatorname{conf} \ge c_{\min}. Цей крок дешевий, бо всі потрібні підтримки вже пораховано на кроці 1.

Граф правил

Набір відібраних правил зручно подати графом: вершини — елементи (або набори), орієнтоване ребро XYX \to Y означає правило XYX \Rightarrow Y, а його товщину чи колір пов’язують із мірою (підтримкою, достовірністю, підйомом). Так стають видимими центральні товари (багато вихідних ребер), взаємні пари й ізольовані елементи. Такий граф цікавих правил — стандартний спосіб подати результат аналізу замовникові.

Граф асоціативних правил наскрізної бази: вершини-товари, орієнтовані ребра, товщина й колір за підйомом


11.7 Алгоритм Apriori

Перебирати всі 2I2^{|I|} наборів неможливо. Apriori різко скорочує перебір, спираючись на одну структурну властивість частоти.

Властивість Apriori (антимонотонність). Усі підмножини частого набору — часті; рівносильно, будь-яка надмножина нечастого набору — нечаста.

Обґрунтування. Якщо XYX \subseteq Y, то кожна транзакція, що містить YY, містить і XX, тож supp(X)supp(Y)\operatorname{supp}(X) \ge \operatorname{supp}(Y). Отже, коли supp(Y)smin\operatorname{supp}(Y) \ge s_{\min}, то й supp(X)smin\operatorname{supp}(X) \ge s_{\min}. \blacksquare

Практичний наслідок: щойно набір виявився нечастим, усі його надмножини можна відкинути не рахуючи — саме це економить роботу.

Кроки алгоритму

Apriori(транзакції D, мінімальна підтримка s_min):
  L1 <- усі 1-набори з підтримкою >= s_min          # часті 1-набори
  k  <- 2
  доки L(k-1) не порожня:
    Ck <- apriori_gen(L(k-1))                        # кандидати k-наборів
    для кожної транзакції t із D:                    # один прохід по базі
       для кожного кандидата c ⊆ t:  лічильник[c]++
    Lk <- { c ∈ Ck : лічильник[c]/N >= s_min }       # часті k-набори
    k  <- k + 1
  повернути об'єднання всіх Lk

apriori_gen(L(k-1)):                                 # генерація кандидатів
  # з'єднання: два (k-1)-набори зі спільними першими (k-2) елементами
  Ck <- { p ∪ q : p,q ∈ L(k-1), різняться лише останнім елементом }
  # відсів: викинути кандидата, якщо якась його (k-1)-підмножина ∉ L(k-1)
  для кожного c ∈ Ck:
     якщо існує (k-1)-підмножина s ⊂ c така, що s ∉ L(k-1):
        викинути c
  повернути Ck

Ключова ідея — генерація кандидатів у два підкроки: з’єднання будує потенційні kk-набори з частих (k1)(k{-}1)-наборів, а відсів заздалегідь викидає тих кандидатів, чия якась (k1)(k{-}1)-підмножина нечаста (за властивістю Apriori вони не можуть бути частими). Лише те, що пережило відсів, коштує проходу по базі для підрахунку підтримки.

Приклад 11.5 (Apriori вручну)

Візьмемо наскрізну базу й поріг smin=0.5s_{\min} = 0.5, тобто набір частий, коли він є принаймні у 33 з 66 транзакцій (лічильник 3\ge 3).

Крок 1 — часті 1-набори. Порахуємо підтримку кожного елемента:

1-набір Лічильник Підтримка Часті?
{Хліб}\{\text{Хліб}\} 5 0.830.83 так
{Молоко}\{\text{Молоко}\} 5 0.830.83 так
{Масло}\{\text{Масло}\} 4 0.670.67 так
{Яйця}\{\text{Яйця}\} 3 0.500.50 так
{Кава}\{\text{Кава}\} 1 0.170.17 ні

Кава відпадає (і більше ніколи не з’явиться в жодному кандидаті — властивість Apriori). Лишаються чотири часті 1-набори.

Крок 2 — кандидати й часті 2-набори. З’єднання чотирьох частих 1-наборів дає (42)=6\binom{4}{2} = 6 кандидатів; усі їхні 1-підмножини часті, тож відсів нікого не викидає. Рахуємо підтримку:

2-набір Лічильник Підтримка Часті?
{Хліб,Молоко}\{\text{Хліб}, \text{Молоко}\} 4 0.670.67 так
{Хліб,Масло}\{\text{Хліб}, \text{Масло}\} 3 0.500.50 так
{Хліб,Яйця}\{\text{Хліб}, \text{Яйця}\} 3 0.500.50 так
{Молоко,Масло}\{\text{Молоко}, \text{Масло}\} 3 0.500.50 так
{Молоко,Яйця}\{\text{Молоко}, \text{Яйця}\} 3 0.500.50 так
{Масло,Яйця}\{\text{Масло}, \text{Яйця}\} 1 0.170.17 ні

Часті всі, крім {Масло,Яйця}\{\text{Масло}, \text{Яйця}\} (вони разом лише в t3t_3).

Крок 3 — кандидати й часті 3-набори. Тепер працює відсів. З’єднавши часті 2-набори, дістаємо чотири потенційні 3-набори; перевіримо їхні 2-підмножини:

Кандидат 2-підмножини Рішення відсіву
{Хліб,Молоко,Масло}\{\text{Хліб}, \text{Молоко}, \text{Масло}\} усі три часті лишити, рахувати
{Хліб,Молоко,Яйця}\{\text{Хліб}, \text{Молоко}, \text{Яйця}\} усі три часті лишити, рахувати
{Хліб,Масло,Яйця}\{\text{Хліб}, \text{Масло}, \text{Яйця}\} містить {Масло,Яйця}\{\text{Масло}, \text{Яйця}\} — нечасту відсіяти
{Молоко,Масло,Яйця}\{\text{Молоко}, \text{Масло}, \text{Яйця}\} містить {Масло,Яйця}\{\text{Масло}, \text{Яйця}\} — нечасту відсіяти

Два кандидати відсіяно без підрахунку — у цьому й економія. Рахуємо лише два, що лишилися:

supp({Хліб,Молоко,Масло})=260.33 (нечастий),supp({Хліб,Молоко,Яйця})=36=0.5 (частий). \operatorname{supp}(\{\text{Хліб}, \text{Молоко}, \text{Масло}\}) = \tfrac{2}{6} \approx 0.33 \ (\text{нечастий}), \quad \operatorname{supp}(\{\text{Хліб}, \text{Молоко}, \text{Яйця}\}) = \tfrac{3}{6} = 0.5 \ (\text{частий}).

Отже, єдиний частий 3-набір — {Хліб,Молоко,Яйця}\{\text{Хліб}, \text{Молоко}, \text{Яйця}\}. З’єднати його нема з чим — часті 4-набори відсутні, алгоритм зупиняється.

Ґратка наборів елементів наскрізної бази з позначенням частих, нечастих і відсіяних Apriori вузлів; штрихування — надмножини нечастого набору Масло-Яйця

Рівнева генерація кандидатів Apriori від 1-наборів до 3-наборів із лічильниками та відсіванням за антимонотонністю

Генерація правил (Приклад 11.6)

Візьмемо частий 3-набір Z={Хліб,Молоко,Яйця}Z = \{\text{Хліб}, \text{Молоко}, \text{Яйця}\} (supp=0.5\operatorname{supp} = 0.5) і порог cmin=0.7c_{\min} = 0.7. Розіб’ємо ZZ на умову й наслідок усіма способами й порахуємо достовірність conf=supp(Z)/supp(X)\operatorname{conf} = \operatorname{supp}(Z) / \operatorname{supp}(X):

Правило XYX \Rightarrow Y supp(X)\operatorname{supp}(X) conf\operatorname{conf} cmin\ge c_{\min}? lift\operatorname{lift}
{Хліб,Молоко}{Яйця}\{\text{Хліб}, \text{Молоко}\} \Rightarrow \{\text{Яйця}\} 4/64/6 0.750.75 так 1.51.5
{Хліб,Яйця}{Молоко}\{\text{Хліб}, \text{Яйця}\} \Rightarrow \{\text{Молоко}\} 3/63/6 1.01.0 так 1.21.2
{Молоко,Яйця}{Хліб}\{\text{Молоко}, \text{Яйця}\} \Rightarrow \{\text{Хліб}\} 3/63/6 1.01.0 так 1.21.2
{Яйця}{Хліб,Молоко}\{\text{Яйця}\} \Rightarrow \{\text{Хліб}, \text{Молоко}\} 3/63/6 1.01.0 так 1.51.5
{Хліб}{Молоко,Яйця}\{\text{Хліб}\} \Rightarrow \{\text{Молоко}, \text{Яйця}\} 5/65/6 0.60.6 ні 1.21.2
{Молоко}{Хліб,Яйця}\{\text{Молоко}\} \Rightarrow \{\text{Хліб}, \text{Яйця}\} 5/65/6 0.60.6 ні 1.21.2

Чотири правила проходять поріг достовірності; усі мають lift>1\operatorname{lift} > 1 — зв’язки справжні. Найсильніше (за підйомом 1.51.5) — {Хліб,Молоко}{Яйця}\{\text{Хліб}, \text{Молоко}\} \Rightarrow \{\text{Яйця}\}: додавши до кошика хліб і молоко, покупець у 1.51.5 раза частіше бере яйця.

Типова помилка (плутати пороги підтримки й достовірності). Підтримку перевіряють для набору (крок 1, спільна для всіх правил цього набору), а достовірність — для напрямку (крок 2, різна для кожного розбиття). Занизький smins_{\min} породжує лавину випадкових наборів; зависокий — втрачає рідкісні, але цінні правила. Це компроміс, який підбирають під конкретну задачу.


11.8 Алгоритм Eclat

Apriori працює з горизонтальним форматом і на кожному рівні робить окремий прохід по всій базі, щоб порахувати підтримку кандидатів. Eclat (Equivalence Class Transformation) працює з вертикальним форматом і уникає повторних проходів: підтримку він дістає перетином tid-множин.

Ключова ідея Eclat. Для будь-яких наборів

tid(XY)=tid(X)tid(Y),supp(XY)=tid(X)tid(Y)N. \operatorname{tid}(X \cup Y) = \operatorname{tid}(X) \cap \operatorname{tid}(Y), \qquad \operatorname{supp}(X \cup Y) = \frac{|\operatorname{tid}(X) \cap \operatorname{tid}(Y)|}{N}.

Підтримку набору дає потужність перетину tid-множин його частин — без звертання до вихідних транзакцій.

Eclat будує префіксне дерево наборів: корінь — порожній набір, кожен вузол додає до батьківського набору один елемент, а його tid-множину дістають перетином tid-множини батька з tid-множиною нового елемента. Гілки з нечастим набором не розгалужують (та сама властивість Apriori: надмножина нечастого — нечаста).

Eclat(префікс P, список пар <набір, tidset>, s_min):
  для кожного елемента i зі списку:
     вивести  P ∪ i.набір  з підтримкою |i.tidset| / N     # частий набір
     нащадки <- порожній список
     для кожного j зі списку, що йде після i:
        T <- i.tidset ∩ j.tidset                            # перетин tid-множин
        якщо |T| / N >= s_min:
           додати  < i.набір ∪ j.набір, T >  до нащадки
     якщо нащадки не порожні:
        Eclat(P ∪ i.набір, нащадки, s_min)                  # заглиблення в дерево

Приклад 11.7 (Eclat вручну)

Той самий поріг smin=0.5s_{\min} = 0.5 (лічильник 3\ge 3). Часті 1-набори з їхніми tid-множинами (Кава відпала, tid=1|\operatorname{tid}| = 1):

tid(Хліб)={1,2,3,5,6}, tid(Молоко)={1,3,4,5,6}, tid(Масло)={2,3,4,5}, tid(Яйця)={1,3,6}. \operatorname{tid}(\text{Хліб}) = \{1,2,3,5,6\}, \ \operatorname{tid}(\text{Молоко}) = \{1,3,4,5,6\}, \ \operatorname{tid}(\text{Масло}) = \{2,3,4,5\}, \ \operatorname{tid}(\text{Яйця}) = \{1,3,6\}.

Гілка «Хліб». Перетинаємо tid-множину хліба з наступними:

tid(Хліб)tid(Молоко)={1,3,5,6} (=43),\operatorname{tid}(\text{Хліб}) \cap \operatorname{tid}(\text{Молоко}) = \{1,3,5,6\} \ (|\cdot| = 4 \ge 3),

tid(Хліб)tid(Масло)={2,3,5} (3),tid(Хліб)tid(Яйця)={1,3,6} (3). \operatorname{tid}(\text{Хліб}) \cap \operatorname{tid}(\text{Масло}) = \{2,3,5\} \ (3), \qquad \operatorname{tid}(\text{Хліб}) \cap \operatorname{tid}(\text{Яйця}) = \{1,3,6\} \ (3).

Усі три 2-набори з хлібом часті. Заглиблюємось у під-гілку {Хліб,Молоко}\{\text{Хліб}, \text{Молоко}\} з tid-множиною {1,3,5,6}\{1,3,5,6\} і перетинаємо її з рештою під-гілок цього вузла:

{1,3,5,6}tid(Яйця)={1,3,6} (33)  {Хліб,Молоко,Яйця} частий.\{1,3,5,6\} \cap \operatorname{tid}(\text{Яйця}) = \{1,3,6\} \ (3 \ge 3) \ \Rightarrow\ \{\text{Хліб}, \text{Молоко}, \text{Яйця}\} \ \text{частий}.

Це той самий частий 3-набір, що його знайшов Apriori, — але дістали ми його перетином множин, а не проходом по базі. Гілка «Масло» одразу дає tid(Масло)tid(Яйця)={3}\operatorname{tid}(\text{Масло}) \cap \operatorname{tid}(\text{Яйця}) = \{3\} (потужність 1<31 < 3) — нечастий 2-набір, який не розгалужують.

Префіксне дерево Eclat наскрізної бази з tid-множинами у вузлах та обчисленням підтримки через їх перетин

Apriori проти Eclat. Обидва знаходять ті самі часті набори; різниця — у способі рахувати підтримку. Apriori (горизонтальний, «завширшки») робить прохід по базі на кожному рівні — простий і ощадливий за пам’яттю. Eclat (вертикальний, «завглибшки») зводить підрахунок до перетинів tid-множин — швидший, коли ці множини малі, але тримає їх у пам’яті. На щільних базах tid-множини великі, і Eclat програє за пам’яттю; на розріджених — виграє за швидкістю.


Застосування в аналітиці даних

  • Рекомендаційні системи й розкладка. Правила «з XX беруть YY» — основа підказок «з цим товаром купують…», кросселінгу, розкладки на полицях і «якорів» акцій; підйом відсіває тривіальні пари поширених товарів.
  • Виявлення аномалій і атак. У кібербезпеці правила над ознаками подій дають сигнатури; порушення сталого правила — привід для тривоги.
  • Медичні та біологічні асоціації. Спільні симптоми/діагнози чи гени, що експресуються разом; підйом і переконливість відрізняють справжній зв’язок від збігу через поширеність.
  • Скорочення простору пошуку. Властивість Apriori — загальний прийом «якщо частина не підходить, ціле теж ні» — застосовний і поза асоціативними правилами (пошук частих підграфів, послідовностей).

Підсумок

  • Пошук асоціативних правил — навчання без учителя, що шукає сталі спільні появи у формі «якщо XX, то YY»; це зв’язок, а не причинність.
  • Дані — транзакційна база над елементами II; її задають горизонтально (транзакція \to набір) або вертикально (елемент \to tid-множина).
  • Асоціативне правило XYX \Rightarrow Y будують для наборів, що не перетинаються (XY=X \cap Y = \varnothing).
  • Чотири міри: підтримка supp(X)={t:Xt}/N\operatorname{supp}(X) = |\{t : X \subseteq t\}| / N (поширеність); достовірність conf=supp(XY)/supp(X)\operatorname{conf} = \operatorname{supp}(X \cup Y)/\operatorname{supp}(X) (надійність напрямку); підйом lift=conf/supp(Y)\operatorname{lift} = \operatorname{conf}/\operatorname{supp}(Y) (сила зв’язку, симетрична; >1>1 — притягання); переконливість conv=(1supp(Y))/(1conf)\operatorname{conv} = (1 - \operatorname{supp}(Y))/(1 - \operatorname{conf}) (частота порушень; \to \infty при conf=1\operatorname{conf} = 1).
  • Цікаві правила долають пороги smins_{\min} і cminc_{\min}; підйом і переконливість упорядковують їх і прибирають оманливо-достовірні.
  • Apriori спирається на антимонотонність (надмножина нечастого — нечаста): будує кандидатів з’єднанням частих (k1)(k{-}1)-наборів, відсіває тих, у кого є нечаста підмножина, і лише решту рахує проходом по базі. У наскрізному прикладі (smin=0.5s_{\min} = 0.5) єдиний частий 3-набір — {Хліб,Молоко,Яйця}\{\text{Хліб}, \text{Молоко}, \text{Яйця}\}.
  • Eclat дає ті самі набори, але рахує підтримку перетином tid-множин у префіксному дереві завглибшки; вигідний на розріджених базах.

Вправи

Для розігріву

  1. За наскрізною базою обчисліть supp({Масло})\operatorname{supp}(\{\text{Масло}\}) і supp({Хліб,Масло})\operatorname{supp}(\{\text{Хліб}, \text{Масло}\}), а тоді достовірність правила {Масло}{Хліб}\{\text{Масло}\} \Rightarrow \{\text{Хліб}\}.
  2. Поясніть різницю між достовірністю й підйомом. Чому правило з достовірністю 0.80.8 може мати підйом менший за 11? Наведіть приклад із лекції.
  3. Сформулюйте властивість Apriori двома рівносильними способами (через підмножини частого набору й через надмножини нечастого) і поясніть, як вона економить перебір.

Стандартні

  1. Для правила {Масло}{Молоко}\{\text{Масло}\} \Rightarrow \{\text{Молоко}\} обчисліть усі чотири міри (підтримку, достовірність, підйом, переконливість). Порівняйте підйом і переконливість із правилом {Молоко}{Яйця}\{\text{Молоко}\} \Rightarrow \{\text{Яйця}\} з Прикладу 11.4: яке правило змістовніше?
  2. Виконайте Apriori на наскрізній базі з порогом smin=13s_{\min} = \tfrac{1}{3} (лічильник 2\ge 2). Які нові часті 2- і 3-набори з’являться порівняно з Прикладом 11.5? Чи стане частим {Хліб,Молоко,Масло}\{\text{Хліб}, \text{Молоко}, \text{Масло}\}?
  3. Побудуйте tid-множини й методом Eclat перевірте, що {Молоко,Масло}\{\text{Молоко}, \text{Масло}\} частий за smin=0.5s_{\min} = 0.5, а {Молоко,Масло,Яйця}\{\text{Молоко}, \text{Масло}, \text{Яйця}\} — ні, не рахуючи транзакцій безпосередньо.

Підвищеної складності

  1. Доведіть симетричність підйому: lift(XY)=lift(YX)\operatorname{lift}(X \Rightarrow Y) = \operatorname{lift}(Y \Rightarrow X) — виходячи з формули через підтримки. Чому достовірність цієї симетрії не має?
  2. Покажіть, що для правила з фіксованою умовою XX підйом і переконливість досягають максимуму одночасно з достовірністю. Що відбувається з переконливістю, коли conf1\operatorname{conf} \to 1, і як це тлумачити?
  3. Оцініть, скільки кандидатів довелося б порахувати «в лоб» (усі 2- і 3-набори над п’ятьма елементами) без відсіву, і скільки насправді порахував Apriori у Прикладі 11.5. У скільки разів відсів скоротив роботу на рівні 3-наборів? Запропонуйте також, як подати результат Прикладу 11.6 графом цікавих правил: які вершини й ребра, чим кодувати підтримку та підйом.

Lectures/DA-L11.md · 43.3 KB · updated 2026-08-05 09:54