Hurtownie danych i data mining - Grupa dra Piotra Lipińskiego II UWr 2009/2010 Adam Grycner, Mateusz Łyczek, Marta Ziobro Reguły asocjacyjne na giełdzie
1 Problem 1.1 Opis problemu - intuicyjnie Będziemy szukali reguł asocjacyjnych postaci: Przykładowa reguła: Jeśli ceny akcji firmy A wzrosły jednego dnia, akcje firmy B staniały drugiego, zatem ceny akcji firmy C i D wzrosną dnia piątego. Znając confidence takiego wzorca będziemy wiedzieć z jakim prawdopodobieństwem możemy się spodziewać wzrostu cen akcji firmy C i D, gdy akcje firmy A i B spełnią dany scenariusz. 2 FITI W celu znalezienia zbiorów częstych, a następnie reguł asocjacyjnych, użyliśmy algorytm F IT I (First Intra Then Inter). 2.1 Podstawowe pojęcia Baza, z której korzystaliśmy ma następującą strukturę. Pojedyncza transakcja ma postać (d, A 0, A 1, A 2,...), gdzie d - atrybut wymiarowości (w naszym przypadku nr dnia). A 0, A 1,... są przedmiotami (w naszym przypadku są to pary - (nazwa spółki, wzrost/spadek)). Zbiorami wśród intratransakcji są zbiory przedmiotów znalezione w transakcjach. Dokładnie tak samo, jak w klasycznym problemie szukania reguł asocjacyjnych. Oknem czasowym jest przedział czasowy w jakim będziemy rozpatrywać zależności między przedmiotami. Jeżeli okno czasowe jest równe np. 4, to będą interesować nas związki między spółkami nie różniącymi się więcej niż 4 dni. Zbiorami wśród intertransakcji są ciągi o długości rozmiaru okna czasowego, które na każdej pozycji zawierają jakiś zbiór wśórd intratransakcji. Przykład W naszym przypadku zbiorem wśród intratransakcji może być zbiór {(IN DU, 1), (Y HOO, 1), (ASP, 1) (nazwa, wzrost/spadek). Zbiorem wśród intertransakcji może być ({(INDU, 1), (Y HOO, 1), (ASP, 1), {(GOG, 1), (P P, 1), (Y HOO, 1), {(INDU, 1), (P P, 1), (Y HOO, 1)) dla okna czasowego równego 3. 1
3 Opis algorytmu FITI W tym rozdziale postaramy się zaprezentować działanie algorytmu FITI. Algorytm ten służy do wyszukiwania częstych intertransakcji. FITI składa się z trzech części: 1. Część 1: Wyszukiwanie i zapisywanie do bazy częstych zbiorów wśród intratransakcji 2. Część 2: Przekształcanie bazy danych 3. Część 3: Wyszukiwanie częstych zbiorów wśród intertransakcji 3.1 Część 1: Wyszukiwanie i zapisywanie do bazy częstych zbiorów wśród intratransakcji W tej części algorytm FITI wyszukuje częste zbiory w intratransakcjach przy pomocy algorytmu APRIORI. Następnie znalezione częste zbiory są zapisywane w specjalnej strukturze o nazwie Frequent-Itemsets Linked Table (w dalszej części raportu będziemy ją nazywać w skrócie FILT). FILT składa się z dwóch części. Pierwszą jest tablica haszująca przechowująca częste zbiory (z intratransakcji ). Drugą są węzły połączone różnymi połączeniami. Przykładowa struktura została zaprezentowana na rysunku 1. Z następujących czterech rodzajów połączeń składa się FITI: 1. Lookup links Każdemu częstemu zbiorowi (z intratransakcji ) przyporządkowujemy unikalny nr ID. 2. Generator and Extension Links Generator links - połączenia między węzłem reprezentującym częsty k-zbiór, a dwoma (k-1)-zbiorami, z których ten k-zbiór powstał w algorytmie APRIORI Extension link - połączenie między częstym (k-1)-zbiorem, a częstym k-zbiorem, który został stworzony m.in. z tego częstego (k-1)-zbioru 3. Subset Links Połączenia między częstym k-zbiorem F, a częstymi (k-1)-zbiorami, które są podzbiorami zbiory F. 4. Descendant Links Połączenia między częstym k-zbiorem reprezentowanym przez ciąg F = {e 1, e 2,..., e k, a wszystkimi częstymi (k+1)-zbiorami reprezentowanymi przez ciągi F = {e 1, e 2,..., e k, x (gdzie x to dowolny element). 2
Rysunek 1: Struktura FILT 3.2 Część 2: Przekształcanie bazy danych W dalszej części raport będziemy korzystać z przykładowych danych widocznych na rysunku 2. Po stworzeniu struktury FILT opisanej w poprzednim podrozdziale algorytm FITI przekształca bazę danych w zbiór tabel o nazwie encoded Frequent-Itemset Tables (w dalszej części raportu nazwane jako tablice FIT). Algorytm FITI w tej części stworzy max k tablic FIT ({F 1, F 2,..., F maxk ), gdzie max k, to rozmiar największego, pod względem liczby elementów, zbioru częstego z intratransakcji. Zbiór ten znaleźliśmy w części 1 algorytmu FITI. Każda tablica FIT F k będzie się składać z wierszy postaci {d i, IDset i, gdzie d i, to wartość atrybutu wymiarowości (w naszym przypadku będzie to nr dnia). IDset i, to lista id częstych k-zbiorów (z intratransakcji ) znalezionych w transakcji (w naszym przypadku, 3
Rysunek 2: Baza danych z czterema transakcjami to np. lista id zbiorów częstych firm, które zyskały na wartości dnia d i ). Przykład takich tablic FIT można zobaczyć na rysunku 3. Rysunek 3: Tablice FIT Przykład Korzystam z bazy danych widocznej na rysunku 2. Nasz minsup wynosi 50%. Wyodrębnione zbiory częste są widoczne na rysunku 1. W takim przypadku max k wynosi 3 (rozmiar największego zbioru częstego - {a, b, c). Tworzymy trzy tablice FIT (widoczne na rysunku 3). Wypełniamy je identyfikatorami k-zbiorów częstych widocznych na rysunku 1 występujących w kolejnych transakcjach ( k = 1, 2, 3). Algorytm przekształcający bazę FILT w tablice FIT wygląda następująco: void Tranform() { while (!feof(t) ) { read next transaction T_i ; write d_i to all F_j ; Subset(T_i ; 1; 1; 0) 4
void Subset(T_i, index, k, and NodeID) { if (k == 1) { for each item e_j in T_i { search ITEMTABLE for ID of {e_j; if (found) { let nowid be ID found; write nowid to F_1 ; for each item e_m, m > j in T_i { search childs of nowid for an itemset I that contains e_m ; if (found) { let nextnode be the ID of I; Subset(T_i, m + 1, k + 1, nextnode); return; else { write NodeID to F_k ; for each item e_m, m >= index in T_i { search childs of NodeID for an itemset I that contains e_m ; if (found) { let nextnode be the ID of I; Subset(T_i, m + 1, k + 1, nextnode); return; 3.3 Część 3: Wyszukiwanie częstych zbiorów wśród intertransakcji Następnie, po przekształceniu bazy, algorytm przechodzi do trzeciej fazy - wyszukiwania częstych zbiorów wśród intertransakcji. Zbiór częsty dla intertransakcji będzie reprezentowany przez specjalny nr ID. Numer ten jest zdefiniowany w następujący sposób: Definicja nr ID zbioru z intertransakcji Niech F będzie zbiorem z intertransakcji. Niech A i = {e j 1 j u, e j (i) F, gdzie 0 i (w 1). (intuicyjnie - A i, to zbiór z intratransakcji z 5
i-tego dnia, czyli zbiór spółek, które w zbiorze F występują i-tego dnia). Nr ID zbioru F, to I = {I 0, I 1,..I w 1, gdzie I i to ID zbioru A i (możemy go znaleźć w strukturze FILT - patrz rysunek 1), jeśli A i > 0. W.p.p I i jest równe 0. Przykład Niech F = {a(0), a(1), b(1), c(3) będzie zbiorem z intertransakcji oraz niech rozmiar okna czasowego będzie równy cztery. W tym przypadku nr ID zbiory F jest równy I = {1, 5, 0, 3 zgodnie z danymi z tablicy FILT widocznej na rysunku 1. Algorytm w fazie trzeciej korzysta z własności, a której korzysta algorytm AP RIORI. Korzystając ze znalezionych k-zbiorów (k 2) częstych wśród intertransakcji, budujemy kandydatów na (k+1)-zbiory częste wśród intertransakcji. Oprócz tego korzystamy z własności, że zbiór wśród intertransakcji może być częsty tylko wtedy, gdy składa się ze zbiorów częstych wśród intratransakcji. Jeżeli kandydat na (k+1)-zbiór częsty posiada jakąś intratransakcję (w naszym przypadku np. w i-tym dniu znajdują się zbiór spółek, który nie jest częsty), która nie jest częsta, to wtedy ten kandydat zostaje usunięty. Algorytm w części trzeciej składa się z czterech pod-części. Oto jak wygląda szkielet algorytmu: Wygeneruj 2-zbiory częste wśród "intertransakcji", L_2; k = 3; while (L_(k-1)!= zbiór_pusty) { Wygeneruj kandydatów na k-zbiory częste wśród intertransakcji, C_k; Wylicz supporty kandydatów ze zbioru C_k; L_k = {c support(c) >= minsup oraz c należy do C_k; k += 1; W następnych czterech pod-podrozdziałach zostaną opisane cztery części tej fazy algorytmu. 1. Warstwa wejściowa 2. Generowanie 2-zbiorów częstych wśród intertransakcji 3. Generowanie k-zbiorów częstych wśród intertransakcji (k > 2) 4. Funkcja zliczająca (liczenie supportów kandydatów) 3.3.1 Warstwa wejściowa Warstwa wejściowa zapewnia widok przesuwającego się okna czasowego po bazie transakcji oraz pomogą zoptymalizować wyszukiwanie kandydatów na zbiory częste wśród intratransakcji na dwa sposoby 6
1. Ogranicza dostęp do tablicy F IT Warstwa wejściowa chroni nas przed sytuacją przeglądania wszystkich tablic F IT. Jeżeli szukamy kandydatów na 2-zbiory częste, to wystarczy nam dostęp tylko do tablicy F 1. 2. Pobiera dane z bazy Warstwa wejściowa odpowiada za pobieranie kolejnego rekordu z bazy oraz usuwanie już niepotrzebnych nam rekordów. Jeżeli ustawiliśmy rozmiar okna czasowego na x, to warstwa wejściowa przy pobieraniu kolejnego rekordu z bazy będzie jednocześnie usuwać informację z pamięci RAM o rekordzie sprzed (x+1) dni. 3.3.2 Generowanie 2-zbiorów częstych wśród intertransakcji Przy budowie 2-zbiorów częstych wśród intertransakcji będziemy korzystać z 1-zbiorów częstych wśród intertransakcji, które są jednocześnie 1-zbiorami częstymi wśród intertransakcji oraz z 2-zbiorów częstych wśród intertransakcji. Ogólna idea jest następująca. Niech w jest równe rozmiarowi okna czasowego. Naszymi 2-zbiorami częstymi wśród intertransakcji będą zbiory o nr ID równym I = {I 0, 0, 0,.., gdzie I 0, to ID częstego 2- zbioru wśród intratransakcji, który został znaleziony w pierwszej części algorytmu (patrz rysunek 1 ). Naszymi 2-zbiorami częstymi wśród intertransakcji będą także zbiory o nr ID równym I = {I 0, 0,..., 0, I j, 0,..., 0 (1 j < w; I 0, I j - 1-zbiory częste wśród intratransakcji ), które mają odpowiedni support. Zbiory o ID I = {I 0, 0,... łatwo znaleźć (już zostały znalezione przez algorytm AP RIORI). Zbiory o ID I = {I 0, 0,..., 0, I j, 0,..., 0 będziemy szukać z wykorzystaniem tablicy haszującej. Aby znaleźć wszystkie 2-zbiorów częstych wśród intertransakcjińależy sprawdzić wszystkie trójki postaci (I 0.I j, j), gdzie I 0, I j są 1-zbiorami częstymi wśród intratransakcji, a j to pozycja w oknie czasowym zbioru I j. Wszystkich takich trójek jest w N 2 1 (N 1 - liczba wszystkich częstych 1-zbiorów wśród intratransakcji). Informację o tym, czy dana trójka generuje częsty 2-zbiór wśród intertransakcji będziemy zapisywać w tablicy haszującej z funkcją haszującą B = ((I 0 w + j) N 1 + I j ) mod rozmiart ablicy. 3.3.3 Generowanie k-zbiorów częstych wśród intertransakcji (k > 2) Proces tworzenia k-zbiorów częstych wśród intertransakcji jest podobny, jak proces tworzenia zbiorów częstych w algorytmie AP RIORI. Najpierw łączymy ze sobą (k-1)-zbiory w celu utworzenia k-zbiorów. Następnie sprawdzamy, czy wszystkie podzbiory tego kandydata są częste (jeżeli nie, to usuwamy danego kandydata). Na sam koniec sprawdzamy częstość występowania danego kandydata w zbiorze transakcji korzystając z tablic F IT. Algorytm F IT I korzysta z dwóch sposobów łączenia dwóch (k-1)-zbiorów: intratransactions join cross-transactions join 7
Intratransactions join Niech I = {I 0, I 1,..., I w 1 oraz J = {J 0, J 1,..., J w 1 będą zbiorami częstymi wśród intertransakcji. Intratransactions join na zbiorach I, J może być wykonana wtedy i tylko wtedy, gdy 1. Istnieje takie p, że I p, J p są k-zbiorami częstymi wśród intratransakcji, a K p powstałe w wyniku połączenia I p oraz J p jest k-zbiorem. 2. q;q p I q = J q Wynikiem połączenia I oraz J jest K = {K 0,..., K p,..., K w 1, gdzie K q = I q = J q dla p q Przykład Korzystamy z nr ID zbiorów wśród intratransakcji widocznych na rysunku 1. Niech I = {1, 0, 5, 0, 2 oraz J = {1, 0, 6, 0, 2. Oba warunki potrzebne do wykonania Intratransactions join są spełnione (p = 2). W wyniku połączenia zbiorów o ID 5 (a,b) i 6 (a,c) otrzymujemy zbiór o ID 8 (a,b,c). W ostateczności w wyniku połączenia I oraz J otrzymujemy K = {1, 0, 8, 0, 2. Cross-transactions join Niech I = {I 0, I 1,..., I w 1 oraz J = {J 0, J 1,..., J w 1 będą zbiorami częstymi wśród intertransakcji. Cross-transactions join na zbiorach I, J może być wykonana wtedy i tylko wtedy, gdy 1. Istnieje takie p, że I p 0 i J p = 0 2. Istnieje takie q, q p, że I q = 0 i J q 0 3. r;r p;r q I r = J r 4. p i q są ostatnimi niezerowymi pozycjami w I oraz J 5. Na każdej pozycji w I, J występuje albo zbiór pusty wśród intratransakcji, albo 1-zbiór częsty wśród intratransakcji W wyniku połączenia I, J otrzymujemy zbiór K = {K 0,...K p,...k q,...k w 1, gdzie K p = I p, K q = J q i K r = I r = J r dla każdego r, r p, r q. Przykład Korzystamy z nr ID zbiorów wśród intratransakcji widocznych na rysunku 1. Niech I = {1, 0, 2, 1, 0 oraz J = {1, 0, 2, 0, 4. Warunki 1. i 2. są spełnione (p = 3, q = 4). Warunek 3. też jest spełniony bo I 0 = J 0, I 1 = J 1, I 2 = J 2. Warunek 4. jest spełniony, bo I 4 jest równe 0, więc p jest ostatnią niezerową pozycją w I, a q jest ostatnią niezerową pozycją w J, bo jest równe 4 (jest ostatnią pozycją). 8
Warunek 4. jest spełniony, bo I i J składają się tylko z 1-zbiorów częstych ({a, {b, {e). W wyniku połączenia I i J otrzymujemy zbiór K = {1, 0, 2, 1, 4. Warunki 4. oraz 5. są potrzebne po to, aby nie otrzymywać kilkakrotnie tych samych kandydatów (w wyniku Cross-transactions join lub Intratransactions join). Przy generowaniu k-zbiorów częstych wśród intertransakcjialgorytm F IT I korzysta z pewnej własności operacji Intratransactions join i Cross-transactions join. Jeżeli dwa zbiory I i J mogą zostać połączone za pomocą Intratransactions join lub Cross-transactions join, to po ustawieniu na 0 ID zbiorów uczestniczących w łączeniu otrzymujemy zbiory równe. Przykład I = {1, 0, 5, 0, 1, J = {1, 0, 6, 0, 1 I i J mogą zostać połączone za pomocą Intratransactions join (p = 2). Jeżeli ustawimy ID zbiorów na pozycji p na zero to otrzymujemy dwa równe zbiory M = {1, 0, 0, 0, 1 I = {1, 0, 2, 1, 0, J = {1, 0, 2, 0, 4 I i J mogą zostać połączone za pomocą Cross-transactions join (p = 3, q = 4). Jeżeli ustawimy ID zbiorów na pozycjach p oraz q na zero to otrzymujemy dwa równe zbiory M = {1, 0, 2, 0, 0 Powyższą własność wykorzystamy w następujący sposób: wskaźniki na znalezione w poprzedniej iteracji (k-1)-zbiory częste wśród intertransakcji będziemy zapisywać w tablicy haszującej. (k-1)-zbiór częsty będzie haszowany kilka razy, raz dla każdej pozycji ustawionej na zero ( I = {0, I 1,..., I w 1, I = {I 0, 0,..., I w 1,..., I = {I 0, I 1,..., 0). W celu uniknięcia duplikatów, wersje (k-1)zbiorów, w których pozycja już wcześniej była ustawiona na 0 nie będą haszowane. Do haszowania będziemy używać funkcji h(i) = w 1 p=0 I p T I w p mod Hsize, gdzie T I - liczba wszystkich zbiorów częstych wśród intratransakcji, a Hsize - rozmiar tablicy haszującej. Po zahaszowaniu zbiorów częstych, próbujemy łączyć zbiory, które trafiły do jednego kubełka. Na sam koniec, po uzyskaniu wszystkich kandydatów, usuwamy kandydatów, w których istnieje podzbiór nie będący zbiorem częstym. 3.3.4 Funkcja zliczająca (liczenie supportów kandydatów) Zupełnie na sam koniec algorytm F IT I liczy supporty kandydatów na zbiory częste. Każdy kandydat na k-zbiór częsty wśród intertransakcji jest wstawiany do specjalnego drzewa 9
haszującego. Drzew ma głębokość w, na poziomie d mamy informację o pierwszych d pozycjach w zbiorze wśród intertransakcji. W liściach mamy zapisane wskaźniki na kandydatów na zbiory częste. Po wstawieniu wszystkich kandydatów, algorytm przegląda tablice F IT (patrz rys. 3) i na tej podstawie zwiększa licznik wystąpień kandydatów na zbiory częste. Na koniec po policzeniu częstości wystąpień, usuwani są kandydaci, których częstość wystąpień jest mniejsza niż minsupport. 4 Wyniki Obliczenia przeprowadziliśmy dla 25 spółek amerykańskiej giełdy z 7 sektorów rynku, na danych o ich notowaniach z 687 dni, czyli prawie dwóch lat. Szukaliśmy reguł, których support > 0.1 oraz z oknem czasowym rozmiaru 5. 4.1 Przykładowe reguły Poniżej znajdują się przykładowe reguły znalezione przez nasz program. Są to reguły postaci A(d 1 ) C(d 2 ), gdzie A i C to zbiory wydarzeń, czyli par (spolka, akcja), akcja określa, czy akcje danej spółki spadły, wzrosły, czy się nie zmieniły. Natomiast d 1 oraz d 2 mówią o jaki dzień w kolejności chodzi. Na przykład reguła: oznacza, że (HKN, ), (SYNM, )(0) (ADEP, )(1) jeśli jednego dnia akcje firmy HKN spadną, a także akcje firmy SYNM spadną, to następnego dnia akcje firmy ADEP również spadną. 1. (SYNM, )(0) (ADEP, )(1) - support = 0.21 2. (HKN, )(0) (ADEP, )(1) - support = 0.20 3. (ADEP, )(0) (WSO, )(1) - support = 0.18 4. (ADEP, )(0) (ATW, )(1) - support = 0.17 5. (STE, )(0) (CVTI, )(1) - support = 0.16 6. (SYNM, )(0) (HKN, )(2) - support = 0.15 7. (STE, )(0) (ADEP, )(4) - support = 0.15 8. (PVA, )(0) (TESO, )(1) - support = 0.13 9. (STE, )(0) (SYNM, )(4) - support = 0.12 10. (HKN, ), (SYNM, )(0) (ADEP, )(1) - support = 0.12 10
Przyjrzyjmy się trochę podanym wyżej regułom. Reguły nr 1. i 2., mówią nam, że spółki SYNM i HKN wpływają na spółkę ADEP. Obie pierwsze należą do firm zajmujących się produkcją olejów i paliw, natomiast ADEP - produkcją różnorakich maszyn. Można więc przypuszczać, że właśnie dlatego, spadek akcji jednej ze spółek SYNM bądź HKN powoduje spadek akcji spółki ADEP dnia następnego. Dwie następne reguły pokazują nam, jak zachowanie akcji spółki ADEP wpływa na dwie inne: WSO i ATW. Pierwsza z nich należy do branży elektronicznej, zajmując się hurtową sprzedażą elektronicznych urządzeń, druga natomiast trudni się wydobywanie roby i znajdowaniem nowych jej złóż. Zatem spadek akcji firmy ADEP (produkującej maszyny) oznacza wzrost w następnym dniu akcji spółki WSO. Jest prawdopodobnie dlatego, że w danym momencie spadek zainteresowania maszynami powoduje wzrost zainteresowania urządzeniami elektronicznymi. Natomiast spadek akcji ADEP powoduje też spadek akcji ATW, bo ATW może wykorzystywać do wydobycia maszyny produkowane przez firmę ADEP. Opis spółek SYNM Basic Materials Oil & Gas Refining & Marketing ADEP Industrial Goods Diversified Machinery HKN Basic Materials Independent Oil & Gas WSO Services Electronics Wholesale ATW Basic Materials Oil & Gas Drilling & Exploration STE Healthcare Medical Appliances & Equipment CVTI Services Trucking PVA Basic Materials Independent Oil & Gas TESO Basic Materials Oil & Gas Equipment & Services Literatura [1] Anthony K.H. Tung, Hongjun L, Jiawei Han, and Ling Feng, Efficient Mining of Intertransaction Association Rules 11