52 Assoziationsregeln Assoziationsregeln erfassen starke usammenhänge zwischen dem Auftreten einer Artikelmenge A und einer Artikelmenge B in Transaktionen A B Nur solche Assoziationsregeln sollen gefunden werden, die häufig genug beobachtet wurden (support) eine hohe Vorhersagekraft haben (confidence) überraschend oder unerwartet sind (lift) 43
Support einer Assoziationsregel Betrachten wir eine Assoziationsregel A B mit Artikelmengen A und B, so ist ihr Support definiert als sup(a B) =sup(a fi B,D) sup({bier} {Cola}) =3 sup({bier, Cola} {Kaese}) =1 D = (1, {Bier, Cola}), (2, {Wurst, Chips, Birnen}), (3, {Bier, Cola}), (4, {Kaese, Bier, Cola}), (6, {Brot, Wurst, Kaese}), (7, {Brot, Wurst, Birnen}), (8, {Birnen, Brot}), 44
Konfidenz einer Assoziationsregel Betrachten wir eine Assoziationsregel A B mit Artikelmengen A und B, so ist ihre Konfidenz (confidence) definiert als conf (A B) = sup(a fi B,D) sup(a, D) conf ({Bier} {Cola}) = 3 3 conf ({Bier, Cola} {Kaese}) = 1 3 D = (1, {Bier, Cola}), (2, {Wurst, Chips, Birnen}), (3, {Bier, Cola}), (4, {Kaese, Bier, Cola}), (6, {Brot, Wurst, Kaese}), (7, {Brot, Wurst, Birnen}), (8, {Birnen, Brot}), 45
Lift einer Assoziationsregel Assoziationsregeln mit hoher Konfidenz können irreführend und nicht unbedingt informativ sein Beispiel: Transaktionsdatenbank enthält 1,000 Transaktionen 500 davon enthalten Chips; 100 enthalten Cola; 45 beides conf ({Cola} {Chips}) =045 dies ist wenig überraschend, da Chips in 50% der Transaktionen vorkommt 46
Lift einer Assoziationsregel Lift einer Assoziationsregel ist definiert als lift(a B) = sup(a fi B) sup(a) sup(b) und misst wie informativ die Assoziationsregel ist 47
Bestimmen von Assoziationsregeln Man möchte nun für eine Transaktionsdatenbank D alle Assoziationsregeln A B bestimmen, so dass gilt sup(a B) Ø minsup, dh man sucht Assoziationsregeln, die häufiger als der Parameter minsup beobachtet wurden conf (A B) Ø minconf, dh nur Assoziationsregeln mit Konfidenz höher als Parameter minconf zu bestimmen Vorgehensweise: 1 Bestimme häufige Artikelmengen C mit sup(c) Ø minsup 2 Leite aus häufigen Artikelmengen Assoziationsregeln ab 48
Ableiten von Assoziationsregeln Assoziationsregeln lassen sich aus den gefundenen häufigen Artikelmengen wie folgt ableiten betrachte jede häufige Artikelmenge X für jede echte Teilmenge X, überprüfe die Konfidenz der Assoziationsregel => (X \ ), dh berechne den Wert sup(x, D) / sup(, D), und behalte die Assoziationsregel, wenn der Wert größer gleich minconf ist Jede so aus einer häufigen Artikelmengen X generierte Assoziationsregel ist ebenfalls häufig, dh es gilt sup( => (X \ )) minsup 49
Ableiten von Assoziationsregeln 1 // Menge gefundener Assoziationsregeln 2 AR = ÿ; 3 4 // Betrachte hä ufige Artikelmengen 5 for (X œ F : X Ø 2) { 6 7 // Betrachte echte Teilmengen 8 for( µ X ) { 9 10 // Bestimme Konfidenz der Regel => ( \ X) 11 c = sup(x, D)/sup(,D); 12 13 // Konfidenz größer gleich minconf? 14 if (c >= minconf ) { 15 AR = AR fi { (X \ ) } 16 } 17 } 18 } 19 20 return AR; 50
Beispiel Ableiten von Assoziationsregeln Die folgende Transaktionsdatenbank sei gegeben (1, {A, B, C}), (2, {B,C}), (3, {A, C}), (4, {A, D}), D = (5, {C, D}), (6, {A, C, D}), (7, {A, C, D}), (8, {A, B, D}), (9, {A, B}), (10, {B,C,E}) es sollen Assoziationsregeln für minsup = 2 und minconf = 06 bestimmt werden 51
Beispiel Ableiten von Assoziationsregeln Folgende häufige Artikelmengen wurden bestimmt F = {A} : 7, {B} : 5, {C} : 7, {D} : 5, {A, B} : 3, {A, C} : 5, {A, D} : 4, {B,C} : 3, {C, D} : 3 {A, C, D} : 2 Daraus lassen sich die folgenden Assoziationsregeln mit Konfidenz größer gleich minconf = 06 ableiten {B} {A} : 3/5 {A} {C} : 5/7 {C} {A} : 5/7 {D} {A} : 4/5 {B} {C} : 3/5 {D} {C} : 3/5 {C, D} {A} : 2/3 52
Assoziationsregeln in Python import pandas as pd from mlxtendpreprocessing import OnehotTransactions from mlxtendfrequent_patterns import apriori # Filmbewertungen einlesen ml1m = pdread_csv('/data/ml-1m/ml-1mcsv', sep=',') # Leere Liste mit Transaktionen transactions = [] users = set(ml1mcolumns) usersremove('title') # Bestimme für jeden Benutzer die Menge seiner bewerteten Filme for user in users: rated = [] for movie in range(0, 3706): if ml1m[user][movie] > 0: ratedappend(ml1m['title'][movie]) transactionsappend(rated) # Transaktionsdatenbank geeignet kodieren oht = OnehotTransactions() oht_ary = ohtfit(transactions)transform(transactions) # Häufige Artikelmengen bestimmen df = pddataframe(oht_ary, columns=ohtcolumns_) frequent_itemsets = apriori(df, min_support=02, use_colnames=true) frequent_itemsets 53
Assoziationsregeln in Python # Assoziationsregeln bestimmen rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=08) rules Vollständiges Jupyter-Notebook unter: http://swlhtwsaarde//2017-vl-ds-kap5-assoziationsanalysehtml http://swlhtwsaarde//2017-vl-ds-kap5-assoziationsanalyseipynb 54
Assoziationsregeln mit Generalisierungen Artikel lassen sich häufig in Kategorien einteilen, beispielsweise Produkte (zb Chips) in Produktkategorien (zb Snacks) Lebensmittel Artikel können in einer Taxonomie eingeordnet sein und es kann mehrere Ebenen allgemeinerer Produktkategorien geben Chips Snacks Flips Assoziationsregeln mit Generalisierungen zb {Cola, Bier} {Snacks} {Thinkpad X1 } {Drucker} 55
Assoziationsregeln mit Generalisierungen Assoziationsregeln mit Generalisierungen lassen sich mit bekannten Verfahren wie A-Priori oder FP-Growth bestimmen, sofern die Transaktionsdatenbank vorab erweitert wird u einem Artikel x i seien cat(x i ) seine Produktkategorien; wir definieren eine erweiterte Transaktionsdatenbank als I D Õ = (t, X Õ ) (t, X) œ D X Õ = X fi J cat(x) xœx 56
Assoziationsregeln mit Generalisierungen Beispiel: {Cola, Flips, Chips} wird zu {Cola, Flips, Chips, Snacks, Drinks, Lebensmittel} Lebensmittel Snacks Drinks Chips Flips Cola 57
53 Sequenzen In vielen Anwendungen spielt die Reihenfolge, in der Elemente (zb Artikel) auftreten, eine Rolle zb Filme in Online-Videothek werden von Kunden geschaut URLs innerhalb einer Website von Besuchern aufgerufen Wörter in natürlichsprachlichen Texten organische Basen (A, T, G, C) in einer DNA ustände (zb Fehler) in einem System Man kann häufig auftretende Sequenzen in solchen Daten identifizieren, um beispielsweise wiederum Assoziationsregeln zu bestimmen 58
Sequenzen Mögliche Anwendungen solcher Assoziationsregeln sind Produktempfehlungen (zb Online-Videothek) Unterstützung des Benutzers bei der Texteingabe (zb auf Smartphone oder in Suchmaschinen) Vorhersage des nächsten ustands eines Systems 59
Alphabet, Sequenz, Teilsequenz Betrachte ein Alphabet Σ von Symbolen (zb eichen) und Σ * bezeichne die Menge aller Folgen über diesem Alphabet es sei s eine Sequenz über dem Alphabet Σ s = n ist die Länge der Sequenz s s[i:j] ist eine Teilsequenz von s s[1:i] ist eine Präfix der Länge i von s s[i:n] ist eine Suffix der Länge (n i + 1) von s Betrachte Alphabet Σ = {a, b, c} und s = <a b b a c>, dann s = 5, s[2:4] = <b b a>, s[1:3] = <a b b> und s[4:n] = <a c> 60
Alphabet, Sequenz, Teilsequenz Sequenz r heißt Teilsequenz von s, r s, wenn es eine Abbildung :[1, r ] æ [1, s ] gibt, so dass gilt 1 Æ i Æ r : r[i] =s[ (i)] 1 Æ i, j Æ r : i<j (i) < (j) Beispiel: r = <a b a c> ist Teilsequenz von s = <a b a a b c> r = <a a b c> ist keine Teilsequenz von s = <a b a a c c> Sequenzdatenbank D Σ * ist eine Menge von Folgen 61
Support Support einer Sequenz r ist definiert als sup(r, D) = {s œ D : r s} Anti-Monotonie des Supports auch für Sequenzen, dh: r s sup(r) Ø sup(s) Verfahren zum Bestimmen häufiger Sequenzen nutzen diese Eigenschaft aus, um in einer gegebenen Sequenzdatenbank D alle Sequenzen zu finden, die Support von mindestens minsup haben 62
GSP GSP ist wie A-Priori eine Algorithmus, der auf einer Generierung und Ausputzen von Kandidaten beruht i-te Iteration betrachtet Sequenzen der Länge i jede Iteration besteht aus zwei Phasen Generierung von Kandidaten-Sequenzen der Länge i aus häufigen Sequenzen der Länge (i-1) Ausputzen (pruning) der Kandidaten-Sequenzen mittels Durchlaufs durch die Sequenzdatenbank; nur jene mit Support größer gleich minsup bleiben erhalten 63
GSP 1 // Hä ufige Sequenzen aus einem Symbol bestimmen 2 F 1 = {ÈiÍ : i œ sup(èií,d) Ø minsup}; 3 4 // Artikelmengen steigender Kardinalität betrachten 5 int k = 2; 6 while(f k 1 = ÿ) { 7 8 // Generiere Kandidaten - Sequenzen der Lä nge k 9 C k = {r + s[k 1] : r œ F k 1 s œ F k 1 r[1 : k 2] = s[1 : k 2]}; 10 11 // Ausputzen der Kandidaten - Sequenzen 12 F k = {r œ C k : sup(r, D) Ø minsup}; 13 14 k = k + 1; 15 } 16 17 return F = t k 1 i=1 F i 64
Beispiel GSP Die folgende Sequenzdatenbank sei gegeben Èa abí ÈbcdÍ Èb abí ÈcaÍ D = Èd aí ÈbdaÍ Èb cbí ÈbaÍ Èc cí ÈaceÍ und es sollen häufige Sequenzen für minsup = 2 bestimmt werden F 1 = {ÈaÍ, ÈbÍ, ÈcÍ, ÈdÍ} 65
Beispiel GSP Erste Iteration (k=2) ; ÈaaÍ, Èa bí, Èa cí, Èa dí, Èb aí, Èb bí, Èb cí, Èb dí, C 2 = Èc aí, Èc bí, Èc cí, Èc dí, Èd aí, Èd bí, Èd cí, Èd dí F 2 = ) ÈabÍ, Èb aí, Èb bí, Èb cí, Èb dí, Èd aí * < weite Iteration (k=3) C 3 = Èa bbí, Èb aaí, Èb abí, Èb ací, Èb adí, Èb baí, Èb bbí, Èb bcí, Èb bdí, Èb caí, Èb cbí, Èb ccí, Èb cdí, Èb daí, Èb dbí, Èb dcí, Èb ddí, Èd aaí F 3 = ÿ 66
67 GSP GSP kann als Breitensuche (breadth-first search) auf dem Präfixbaum aller Sequenzen interpretiert werden F 1 F 2 ÿ a a b c d e b a b c d e c a b c d e d a b c d e e a b c d e
Horizontale vs vertikale Speicherung GSP beruht auf einer horizontalen Speicherung der Sequenzdatenbank, dh wir können eine Sequenz nur vollständig, zb anhand einer ID, lesen um Ermitteln des Supports der Kandidaten-Sequenzen wird die gesamte Sequenz-Datenbank durchlaufen Bei vertikaler Speicherung der Sequenzdatenbank wird für jedes Symbol des Alphabets eine Liste seiner Vorkommen, bestehend aus ID und Positionen, in den Sequenzen gespeichert 68
Horizontale vs vertikale Speicherung Horizontale Speicherung: (1, Èa abí) (2, Èb cdí) (3, Èb abí) (4, Èc aí) (5, Èd aí) (6, Èb daí) (7, Èb cbí) (8, Èb aí) (9, Èc cí) (10, Èa ceí) Vertikale Speicherung: a æè(1, [1, 2]), (3, [2]), (4, [2]), (5, [2]), (6, [3]), (8, [2]), (10, [1])Í b æè(1, [3]), (2, [1]), (3, [1, 3]), (6, [1]), (7, [1, 3]), (8, [1])Í c æè(2, [2]), (4, [1]), (7, [2]), (9, [1, 2]), (10, [2])Í d æè(2, [3]), (5, [1]), (6, [2])Í e æè(10, [3])Í 69
SPADE SPADE verwendet vertikale Speicherung und nutzt diese aus, um den Support von Kandidaten-Sequenzen effizienter durch geschicktes Schneiden ihrer Listen zu bestimmen Beispiel: Bestimme den Support der Sequenz <a b> durch Schneiden der Listen von a und b a æè(1, [1, 2]), (3, [2]), (4, [2]), (5, [2]), (6, [3]), (8, [2]), (10, [1])Í b æè(1, [3]), (2, [1]), (3, [1, 3]), (6, [1]), (7, [1, 3]), (8, [1])Í Èa bíæè(1, [3]), (3, [3])Í 70
SPADE Wollen wir den Support einer Kandidaten-Sequenz r + s[k-1] der Länge k bestimmen, so schneiden wir die Listen der häufigen Sequenzen r und s der Länge (k-1) wie folgt: behalte Einträge mit gleicher ID, dh Sequenz muss r und s als Teilsequenzen beinhalten und behalte alle Positionen aus dem Eintrag von s, so dass es eine kleinere Position im Eintrag von r gibt 71
SPADE Die ahl der Einträge in der resultierenden Liste entspricht dem Support der Sequenz r + s[k-1] Die Positionen innerhalb eines Eintrags geben an, wo ein Vorkommen von in der Sequenz r + s[k-1] mit der gegebenen ID endet Beispiel: r = Èx yíæè(1, [2, 11]), (2, [6]), (3, [1]), (5, [5, 11])Í s = Èx zíæè(1, [4, 12]), (2, [5]), (4, [6]), (5, [4, 14])Í r + s[2] = Èx yzíæè(1, [4, 12]), (5, [14])Í 72
73 SPADE SPADE kann als Tiefensuche (depth first search) auf dem Präfixbaum aller Sequenzen interpretiert werden Breitensuche (breadth first search) kann ebenfalls mit Hilfe der vertikalen Speicherung und Schneiden der Listen implementiert werden ÿ a a b c d e b a b c d e c a b c d e d a b c d e e a b c d e F 1 F 2
SPADE 1 void spade(p, minsup, F, k) { 2 for(r a œ P ) { 3 // Füge die Sequenz r a zu hä ufigen Sequenzen hinzu 4 F = F fi {(r a, sup(r a )} 5 6 // Bestimme hä ufige Sequenzen der Lä nge k +1 mit Prä fix r a 7 P a = ÿ 8 9 for(r b œ P ) { 10 // Bestimme Kandidaten - Sequenz 11 r ab = r a + r b [k] 12 13 // Schneide Listen 14 L(r ab )=L(r a ) fl L(r b ) 15 16 // Behalte Kandidaten - Sequenz, falls diese hä ufig ist 17 if( L(r ab ) Ø minsup) { 18 P a = P a fi {(r ab, L(r ab ))} 19 } 20 } 21 22 // Rekursiver Aufruf, falls es hä ufige Sequenzen der Lä nge k +1 mit Präfix r a gibt 23 if(p a = ÿ) { 24 spade(p a, minsup, F, k +1) 25 } 26 } 27 } 28 // Initialer Aufruf auf allen Sequenzen der Lä nge 1 bestehend aus hä ufigen Artikeln 29 P = {(s, L(s)) s œ L(s) Ø minsup} 30 spade(p, minsup, ÿ, 1) 74
PrefixSpan PrefixSpan als Verfahren zum Finden häufiger Sequenzen setzt wie FP-Growth auf Musterwachstum und generiert keine Kandidaten, die überprüft werden müssen PrefixSpan betrachtet für bekannte häufige Sequenz r die Projektion D r der Sequenzdatenbank für das Präfix r, welche für jede ursprüngliche Sequenz nur noch das Suffix nach dem ersten Auftreten von r enthält Beispiel: Betrachte häufige Sequenz r = <a b> D = I Èa cbdí Èc abddí ÈababaÍ ÈaabcdÍ J D ab = I ÈdÍ Èd dí ÈabaÍ ÈcdÍ J 75
PrefixSpan PrefixSpan findet in Projektion D r alle häufigen Symbole und betrachtet für jedes häufige Symbol s rekursiv die Projektion der Sequenzdatenbank D r+s Projektion der Sequenzdatenbank kann effizient durch Verwalten von Indizes, ohne Kopieren der Sequenzen implementiert werden für jede Sequenz muss ein Index gespeichert werden, der angibt, welches Suffix der Sequenz in der Projektion noch zu betrachten ist 76
PrefixSpan 1 // Menge hä ufiger Sequenzen 2 F = ÿ 3 4 // Rekursives Bestimmen hä ufiger Sequenzen 5 void prefixspan(d r, r, minsup) { 6 7 // Bestimme hä ufige Symbole in Projektion 8 S = {s œ : sup(s, D r ) Ø minsup} 9 10 for(s œ S) { 11 // Hä ufige Sequenz r+s merken 12 F = F fi {r + s}; 13 14 // Projektion auf r+s 15 D r+s = ÿ; 16 for (t œ D r ) { 17 // Projektion von Sequenz t auf Symbol s -- Suffix nach erstem Vorkommen von s 18 t Õ = t s ; 19 if (t Õ = ÈÍ) { 20 D r+s = D r+s fi {t Õ }; 21 } 22 } 23 24 // Rekursion 25 if (D r+s = ÿ) prefixspan(d r+s, r + s, minsup); 26 } 27 } 28 29 // Initialer Aufruf 30 prefixspan(d, ÈÍ, minsup); 77
Beispiel PrefixSpan Die folgende Sequenzdatenbank sei gegeben Èa abí ÈbcdÍ Èb abí ÈcaÍ D = Èd aí ÈbdaÍ Èb cbí ÈbaÍ Èc cí ÈaceÍ und es sollen häufige Sequenzen für minsup = 2 bestimmt werden 78
Beispiel PrefixSpan Èa abí ÈbcdÍ Èb abí ÈcaÍ D ÈÍ = Èd aí ÈbdaÍ Èb cbí Èc cí ÈbaÍ ÈaceÍ Èa bí D ÈaÍ = ÈbÍ D Èa bí = Èc eí F = F fi {ÈaÍ} F = F fi {Èa bí} 79
Beispiel PrefixSpan Èa abí ÈbcdÍ Èb abí ÈcaÍ D ÈÍ = Èd aí ÈbdaÍ Èb cbí Èc cí ÈbaÍ ÈaceÍ Èc dí Èa bí ÈbÍ D ÈbÍ = Èd aí D ÈbaÍ = Èc bí ÈaÍ F = F fi {ÈbÍ} F = F fi {Èb aí} 80
Beispiel PrefixSpan Èa abí ÈbcdÍ Èb abí ÈcaÍ D ÈÍ = Èd aí ÈbdaÍ Èb cbí Èc cí ÈbaÍ ÈaceÍ Èc dí Èa bí D ÈbÍ = Èd aí D Èb bí = Èc bí ÈaÍ F = F fi {ÈbÍ} F = F fi {Èb bí} 81
Beispiel PrefixSpan Èa abí ÈbcdÍ Èb abí ÈcaÍ D ÈÍ = Èd aí ÈbdaÍ Èb cbí Èc cí ÈbaÍ ÈaceÍ Èa bí Èc dí ÈdÍ D ÈbÍ = Èc bí Èd aí ÈaÍ D Èb cí = ÈbÍ F = F fi {ÈbÍ} F = F fi {Èb cí} 82
Beispiel PrefixSpan Èa abí ÈbcdÍ Èb abí ÈcaÍ D ÈÍ = Èd aí ÈbdaÍ Èb cbí Èc cí ÈbaÍ ÈaceÍ Èc dí Èa bí D ÈbÍ = Èd aí D Èb dí = ÈaÍ Èc bí ÈaÍ F = F fi {ÈbÍ} F = F fi {Èb dí} 83
Beispiel PrefixSpan Èa abí ÈbcdÍ Èb abí ÈcaÍ D ÈÍ = Èd aí ÈbdaÍ Èb cbí Èc cí ÈbaÍ ÈaceÍ ÈdÍ ÈaÍ D ÈcÍ = ÈbÍ ÈcÍ ÈeÍ F = F fi {ÈcÍ} 84
Beispiel PrefixSpan Èa abí ÈbcdÍ Èb abí ÈcaÍ D ÈÍ = Èd aí ÈbdaÍ Èb cbí Èc cí ÈbaÍ ÈaceÍ D ÈdÍ = ÈaÍ ÈaÍ D Èd aí = F = F fi {ÈdÍ} F = F fi {Èd aí} 85
usammenfassung Bestimmen von Assoziationsregeln mit Konfidenz höher als minconf aus häufigen Artikelmengen Assoziationsregeln mit hoher Konfidenz nicht unbedingt informativ; Lift als alternatives Maß identifiziert überraschende Assoziationsregeln GSP und SPADE als Verfahren zum Finden häufiger Sequenzen, der auf den gleichen Ideen wie A-Priori basiert PrefixSpan verwendet die Idee des Musterwachstums und kommt ohne Generierung von Kandidaten aus 86
Literatur [1] M J aki und W Meira Jr: Data Mining and Analysis, Cambridge University Press, 2014 (Kapitel 10 und 12) 87