Mining über RDBMSe von Christian Widmer Wie gut lässt sich Mining mit SQL realisieren? Müssen neue Konstrukte zur Verfügung gestellt werden, wenn ja welche? Vortragsüberblick Association Rules Apriori Algorithmus Implementationsalternativen Alternativen in SQL-92 Alternativen in SQL-OR Schlussfolgerungen Association Rules Syntax: X Y z.B. {Bier} {Chips} Salopp: Wer Bier kauft, kauft auch Chips. (X, Y sind Mengen von Items, und X Y = ) Anforderung an eine Regel Minimum Support (Relevanz) Minimum Confidence (Vertrauen) 2% der Kunden kaufen Bier und Chips. 40% der Kunden, die Bier kaufen, kaufen auch Chips. Apriori Algorithmus Begriffe, die für den Algorithmus wichtig sind Frequent Itemset Itemmengen, deren Relevanz grösser ist als Minimum Support. Candidate Itemset Ist eine potentielle Kandidatenmenge für ein Frequent Itemset. Candidate Itemset Frequent Itemset Vorgehen des Algorithmus 1) Finde alle Frequent Itemsets durch Iteration von a) und b) a) Generiere Candidate Itemsets b) Bestimme die Relevanz (Support Counting) 2) Finde alle gültigen Regeln Bemerkungen 1) Jede Teilmenge eines Frequent Itemset ist auch ein Frequent Itemset. 2) Itemsets müssen geordnet sein (Implementationsanforderung) Apriori Algorithmus Frequent Itemsets mit Support = 50 % Frequent Itemset F1 {Käse} {Milch} {Butter} {Brot} TID Alder Durrer Moser Specht Transaktionen Items {Käse, Butter, Honig} {Milch, Butter, Brot} {Käse, Milch, Butter, Brot} {Milch, Brot} Candidate Itemset C2 Support {Käse, Mich} 1 {Käse, Butter} 2 {Käse, Brot} 1 {Milch, Butter} 2 {Mich, Brot} 3 {Butter, Brot} 2 Frequent Itemset F2 {Käse, Butter} {Milch, Butter} {Milch, Brot} {Butter, Brot} Candidate Itemset C3 Support {Milch, Butter, Brot} 2 Frequent Itemset F3 {Milch, Butter, Brot} Apriori Algorithmus Generieren der Kandidatenmenge: Beispiel Gegeben F3 = {{1,2,3},{1,2,4},{1,3,4},{1,3,5},{2,3,4}} Gesucht Eine möglichst kleines Candidate Itemset C4 C*4 = {{1,2,3,4},{1,3,4,5}} Kandidatenmenge) C4 = {{1,2,3,4}} nach Prune Step) (provisorische (Kandidatenmenge Generiere aus jeweils 2 Elementen (Generatoren) aus F3 einen Kandidaten. INSERT INTO C*4 I1.item1, I1.item2, I1.item3, I2.item3 FROM F3 I1, F3 I2, WHERE I1.item1 = I2.item1 AND I1.item2 = I2.item2 AND I1.item3 < I2.item3 Implementationsarten Cursor Interface viel Kontextwechsel zwischen DBMS und Applikation Stored Procedure keine Kontextwechsel zwischen DBMS und Applikation Cache Mine Daten werden einmal von der Datenbank gelesen und in einem Binärfile gespeichert (sehr effizient). User Defined Function (UDF) keine Kontextwechsel zwischen DBMS und Applikation aufwendig und gefährlich (programmiert in K Way Join (SQL 92) Support Counting Gegeben Transaktionstabelle T mit Tupeln (tid, item) Candidate Itemset Ck Gesucht Frequent Itemset Fk Vorgehen 1. k-facher JOIN von T mit sich selbst (Input: T / Output: T*) (unnesting) 2. JOIN von T mit Ck und Aggregation (Input: T* / Output: Fk) Beispiel für k = 3 INSERT INTO F3 SELECT item1, item2 COUNT(*) FROM C3, T t1, T t2 K Way Join: Support Counting TID 100 Itemset 1, 1 100 100 100 100 100 100 100 100 200 200 200 200 200 200 200 200 200 1, 2 1, 3 2, 1 2, 2 2, 3 3, 1 3, 2 3, 3 1, 1 1, 2 1, 4 2, 1 2, 2 2, 4 4, 1 4, 2 4, 4 HAVING COUNT(*) > :minsup GROUP BY item1, item 2 Itemset Support 100 1, 2 200 1, 2 C3.item 1 = t 1.item C3.item 2 = t 2.item C2 t1.tid = t 2.tid T t1 C2 = {1, 2} T t2 TID Itemset 100 100 100 200 200 200 1 2 3 1 2 4 Subquery Based (SQL-92) Support Counting Idee Ausnutzen der Eigenschaft, dass Items in einem Candidate Itemset gemeinsame Präfixe haben. (Items sind in kanonischer Reihenfolge sortiert) Vorgehensweise Verwenden einer rekursive Subquery Aggregation der finalen Subquery k findet das Frequent Itemset Eigenschaft der Subquery Subquery der Rekursionstiefe v findet alle TIDs, welche die ersten v Items vom Candidate Itemset enthält. Beispiel: Subquery Q3 SELECT FROM WHERE AND item1, item2, item3, tid T t3, (Subquery Q2) AS r2 (SELECT DISTINCT item1, item2, item3 FROM Ck) AS d3 r2.item1 = d3.item1 AND r2.item2 = d3.item2 r2.tid = t3.tid AND t3.item = d3.item3 Subquery Base: Q3 (j =3) 100 200 100 300 200 400 Q3 {1, 2, 3} {1, 2, 3} {1, 2, 5} {1, 2, 5} {1, 3, 6} {1, 3, 6} item1, item 2, item 3 , tid t3.item 1 = d 1.item 3 t3.tid = r 1.tid T t3 r1.item 1 = d 1.item 1 r2.item 2 = d 1.item 2 d2 r2 Subquery Q 2 Q2 item-set {1, 2} {1, 2} {1, 2} {1, 3} {1, 3} {1, 3} tid 100 200 300 100 200 400 SELECT DISTINCT item1, item 2 C3 {1, 2, 3} {1, 2, 5} {1, 3, 6} Transactions TID item 100 1 100 2 100 3 100 5 200 1 200 2 200 3 200 6 300 1 300 2 300 4 300 5 400 1 400 3 400 4 400 6 Support Counting Resultate SQL-92 Subquery beste SQL-92 Implementation K-Way Join in vielen Fällen vergleichbar mit Subquery viel schlechter wenn SQL-92 gesamthaft schlecht abschneidet Bemerkung Gesamthaft gesehen ist leider keine SQL-92 Implementation brauchbar. Einige SQL-OR Konzepte aus IBM DB2, die verwendet werden Table Function Virtuelle Tabelle, welche zu einer UDF gehört. Diese UDF generiert die Tabelle “on the fly“. (verwandt mit Views aus SQL-92) BLOB’s Zur Verwaltung grosser Objekte im DBMS Wir werden sie zur Parameterübergabe zwischen Table Functions benützen Gather Join (SQL-OR) Support Counting Dieses Verfahren entspricht dem k-Way Join in SQL-92. Algorithmus Bringe die Transaktionstabelle T mit der Table Function Gather in die flache Form T*(TID, item-list) Bilde mit der Table Function Comb-k für jedes Tupel von T* alle möglichen Teilmengen von T* der Grösse k. JOIN von Comb-k mit Ck und Aggregation liefern Fk Bemerkungen Gather und Comb-k werden bei der Implementierung in einer Table Function zusammengefasst. Gather Join (SQL-OR) Support Counting Beispiel für k = 3 und Support = 50% T TID item 100 1 100 2 100 3 100 4 200 1 200 2 200 3 300 1 300 4 300 6 400 1 400 4 400 5 Gather TID item-list 100 {1, 2, 3, 4} 200 {1, 2, 3} 300 {1, 4, 6} 400 {1, 4, 5} Comb-k item-set JOIN {1, 2, 3} {1, 2, 4} {1, 3, 4} {2, 3, 4} {1, 2, 3} {1, 4, 6} {1, 4, 5} C*3 {1, 2, 3} {1, 2, 3} {1, 2, 4} GROUP BY COUNT C3 = {{1,2,3}, {1,2,4}} F3 {1, 2, 3} Gather Count (SQL-OR) Support Counting Variation von Gather Join (Spezielle Optimierung für 2. Durchgang) Idee GROUP BY wird in die Table Function GatherComb eingebettet, und es werden direkt die Frequent Itemsets zurückgegeben. Effiziente Implementation 2-dim Array (für jedes Item von C2 eine Dimension) Candidate Itemsets sind in kanonischer Reihenfolge geordnet Ein Candidate Itemset kann in linearer Zeit einem Punkt im 2-dim-Array zugeordnet werden. Problematik Funktioniert nur effizient für 2. Durchgang, für alle anderen Gather Count (SQL-OR) Support Counting Item Set: {2, 3} 1 2 3 1 2 3 Counter wird inkrementiert item-set {1, 2} {2, 3} {1, 3} ... Vertical (SQL-OR) Support Counting Algorithmus Bringe die Transaktionstabelle T mit der Table Function Gather in vertikale Form T*(item, tid-list). Sortiere jene (item, tid-list) Tupel aus, welche die Minimum Support Bedingung erfüllen T* (TidTable). Für jedes Item aus Ck suche die entsprechenden tid-lists aus T*. Bestimme die Schnittmenge aller gesammelten tid-lists. Ist die Grösse der Schnittmenge grösser als Minimum Support, so haben wir ein Frequent Itemset gefunden. Subquery Optimierung Ausnutzen der Eigenschaft, dass tid-lists gemeinsame Präfixe haben. Rekursive Subquery (äquivalent zum Subquery Verfahren mit SQL-92) Vertical (SQL-OR) Support Counting TID 1 2 4 1 4 2 3 3 item a a a b b c c d Gather Count item a b c d tid-list Support {1, 2, 4} 3 {1, 4} 2 {2, 3} 2 {3} 1 item-set tid-list support {a, b} {1, 4} 2 {a, c} {2} 1 {b, c} {} 0 intersect, count C2 = {{a, b}, {a, c}, {b, c}} item-set tid-list {a, b} {{1, 2, 4}, {1, 4}} {a, c} {{1, 2, 4}, {2, 3}} {b, c} {{1, 4}, {2, 3}} Performanzvergleich der SQL-OR Varianten Gesamtperformanz Vertical Mit Abstand am schnellsten Transformation vertikale Form ist am zeitaufwendigsten (Mammutanteil) Gather Join / Gather Count Sind langsamer als Vertical Untereinander liegen sie etwa gleich auf. Performanzvergleich der SQL-OR Varianten Durchgang 2 Vertical Das Transformieren der Transaktionstabelle kann hier schlechte Resultate produzieren. Gather Join Ist für kleine Support Werte meistens besser als Vertical. Gather Count Für grosse, durchschnittliche Anzahl Items pro Transaktion ist es die einzig gute Lösung. Durchgänge > 3 Schlussfolgerungen Durch etwas mehr Unterstützung vom DBMS könnte Mining effizienter und einfacher implementiert Mengenoperationen werden. Bilden aller möglichen Teilmengen Schnittmengen berechnen Probleme entstehen auch dadurch, dass in Subqueries kein GROUP BY gemacht werden kann und keine Aggregation in rekursiven Queries erlaubt ist. User Defined Aggregates (UDA) Damit lassen sich die Subquery Probleme lösen Bestandteil von SQL-3 Wird noch selten unterstützt User Defined Aggregate UDA, die sogar Zwischenresultate abliefern können, sind noch einiges mächtiger, was in anderen Mining-Varianten von grossem AGGREGATE FUNCTION Nutzen sein kann. mvavg(value INTEGER) RETURNS (rvalue INTEGER) INITIALIZE (VALUES(value, 1)) ITERATE (SELECT sum + value, count+1 FROM state) PRODUCE (SELECT sum / count FROM state WHERE count MOD 100 = 0) TERMINATE (SELECT sum / count FROM state) Literatur Integrating Association Rule Mining with Relational Database Systems: Alternatives and Implications Sunita Sarawagi, Shiby Thomas, Rakesh Agrawal User Defined Aggregates in Object-Relational Systems Haixun Wang, Carlo Zaniolo Objektverwaltung höherer Ordnung (OHO) SS 99 Prof. Dr. Ing. H.-J. Schek, Dr. Klemens Böhm und das OHO-Team Datenbanksysteme II Universität Leipzig, Prof. Dr. E. Rahm Wie gut skalieren die Verfahren Parameter der Testdaten Datensätze aus real existierenden Datenbanken Anzahl Records in Millionen Anzahl Transaktionen in Millionen Anzahl Items in Tausenden Durchschnittliche Anzahl Items pro Transaktion Datensatz A 2.5 6.6 0.57 0.21 85 15.8 4.4 31 Datensatz C