H2:AR Assotsiatsioonireeglid Vt. Assotsiatsioonireegleid ja Apriori algoritmi: {URL("Assoc/apriori.txt")} Vt. episoodireegleid: {URL("Assoc/episodes.pdf")} * Assotsiatsioonireeglid (association rules) (kõigepealt leitakse sagedased hulgad ja nende pealt reeglid) Vaatleme näiteks suure toidupoe müügiprotsessi. Siin on meil tegemist suure hulga erinevate kaubaartiklitega. Samuti on siin kliendid, kes kaubavalikust üht-teist enda ostukorvi panevad, ning seejärel kassas ostu sooritavad. See fakt kajastub toidupoe andmebaasis nn ostukorvina. Siit koguneb toidupoele väärtuslik infovaramu näiteks turundusosakonnale, kelle ülesandeks on korraldada erinevaid kampaaniaid.
Ostukorvide pealt on võimalik leida seoseid erinevate kaupade ühte ostukorvi sattumiste kohta. Üheks selliseks on sageli erialastes artiklites käsitletav tähelepanek, et sageli ostetakse koos õlut ning beebimähkmeid {cite('thomas00incremental')}. Sellisel juhul võib vaadelda implikatsiooni {tex(' {beer}\Rightarrow {diapers}')} kui assotsiatsioonireeglit üle õlut ning mähkmeid sisaldavate ostukorvide. Assotsiatsioonireeglite analüüsi ülesandeks on leida analoogilisi seoseid andmestust --- kui ostukorvis sisalduvad teatud kaubad, millised kaubad veel samas ostukorvis tõenäoliselt esinevad? H3:1 Seoste tüübid:
Vastavaid reegleid võib tulla suhteliselt palju, üldjoontes võib need jagada järgmisse nelja gruppi {cite('ibmdatamining')}:
Algoritmiline pool on vaid nende reeglite tuvastamine, reeglite kvaliteedi ning praktilisuse otsustamine jääb paraku ikkagi inimese otsustada. Suureks probleemiks on siin reeglite suur hulk, näiteks mõne tuhande kaubaartikliga poes võib olla miljardeid reegleid {cite('borgelt-induction')}. Kuna sellise hulga reeglite kontroll on väga töömahukas on vaja efektiivseid algoritme. Efektiivsus tähendab siin kontrollitavate reeglite arvu piiramist, jättes võimaluse korral siiski huvitavad reeglid alles. Assotsiatsioonireeglite kaevandamise juured on jaekaubanduse ostude analüüsil {cite('agrawal93mining')} ning seetõttu vastavate seoste leidmist andmestust nimetatakse sageli ostukorviaanalüüsiks{def("",'market-basket analysis')}. Samas ei ole see piiratud ainult ostukorvide analüüsiga. Palju huvitavamaid ning ärilisest seisukohast paremini rakendatavaid tulemusi võib saada ka ostukorvide andmestu uurimisel koos klientide demograafiliste andmetega. See võib uurija viia tulemuseni, et 25--30 aastane universaalkerega autoga abielus meesterahvas ostab suure tõenäosusega koos õllega ka lapsemähkmeid. Samuti ei pruugi ühe ostukorvi mõttes tegu korraga ostetud kaupadega vaid võib vaadelda ka ühe kliendi oste mingi kindla perioodi jooksul, näiteks veebiraamatupoe või plaadipoe ostud {cite('agrawal93mining')}. Kuigi assotsiatsioonireegli all käesoleva ülevaate mõttes peame silmas lihtsalt hulkadevahelist seost, on loodud meetodeid ka järjestusega assotsiatsioonireeglite leidmiseks {cite('agrawal95mining,agrawal93efficient,srikant96mining')}. Sellist tüüpi assotsiatsioonireegleid esineb näiteks geenisekventsiandmebaaside {cite('chirn96pattern,yang02mining')} ja veebikohtade külastuste analüüsis {cite('berkhin01interactive,cooley97web,mobasher96web,mortazavi-asl-discovering')} H3:5 Negatiivsed seosed
Üks huvitav valdkond on negatiivsete assotsiatsioonide leidmine. Näiteks üks selline reegel võiks kõlada järgnevalt: "<75% abielus meestest kes ostavad õlut ei osta pakipiima">. Sedasorti probleeme lahendavaid algoritme on juba ka loodud ning autori väiteil on nad küllalt efektiivsed {cite('savasere98mining')}. * Tugi ja usaldusväärsus (support and confidence) (et jääksid alles ainult head reeglid ja et otsimisruum oleks väiksem) Olgu {tex('I = \{I_1, I_2, ..., I_m\}')} hulk binaarseid tunnuseid, ehk kaupu {cite('agrawal93mining')}. Olgu {tex('T')} ostude andmebaas, kus igat ostu {tex('t')} kirjeldab kahendvektor, milles {tex('t[k]=1')} kui ostukorvis sisaldus kaup {tex('I_k')}, ning {tex('t[k]=0')} kui ei olnud. Iga ostu kohta on andmebaasis {tex('T')} üks korteež. Olgu {tex('X \subseteq I')}. Ütleme, et ost {tex('t')} rahuldab {tex('X')} kui iga ostu {tex('I_k')} jaoks hulgas {tex('X')} nii, et {tex('t[k]=1')}. H3:7 Definitsioonid
Assotsiatsioonireegli all peame edaspidi silmas implikatsiooni kujul {tex('X \Rightarrow I_j')}, kus {tex('X \subset I')} ning {tex('I_j \in I \wedge I_j \not \in X')}. Reegel {tex('X \Rightarrow I_j')} on täidetud baasil {tex('T')} usaldusteguriga {def("",'confidence')} {tex('0 \leq c \leq 1')} kui vähemalt {tex('c\%')} ostudest baasis {tex('T')}, mis sisaldavad hulka {tex('X')}, sisaldavad ka {tex('I_j')}. Edaspidi tähistame vastavat olukorda kujul {tex('X \Rightarrow I_j \mid c')}, et reeglil {tex('X \Rightarrow I_j')} on usaldustegur {tex('c')}. Ütleme, et reegli {tex('X \Rightarrow I_j')} tugi {def("",'support')} baasil {tex('T')} on {tex('s')} kui {tex('s\%')} ostudest baasis {tex('T')} rahuldab {tex('X \cup I_j')}. Hulga {tex('a')} tuge võime väljendada ka kujul {tex('support(a)')}. Sageli vaadeldakse {tex('I_j')} asemel ka hulka {tex('I^\star')} nii, et {tex('I^\star \subseteq I')}. Kui usaldustegur mõõdab reegli tugevust siis tuge võib vaadelda kui olulisust statistilises mõttes {cite('agrawal93mining,fiore-visualizing,brin97beyond')}.
Ülesanne on leida kõik assotsiatsioonireeglid, millel on tugi suurem kui eelnevalt seatud minimaalne tugi (edaspidi i:minsup) ning usaldustegur suurem kui eelnevalt seatud minimaalne usaldustegur (edaspidi i:minconf). On võimalik seada ka mitmeid täiendavaid kitsendusi soovitud assotsiatsioonireeglitele {cite('agrawal93mining')}: H3:9 Kitsendusi
Antud probleemi esituse korral võib assotsiatsioonireeglite leidmise protsessi jagada kaheks {cite('agrawal93mining,agrawal94fast')}:
Apriori
Sisend T -- ostude baas
minsup -- kaupadehulga suuruse kriteerium
Väljund suured kaupadehulgad
\STATE {tex('L_1 = \{ suured 1-kaupadehulgad \}')}
\FOR {tex('k=2; L_{k-1}\not =\emptyset;\ k ')}
\STATE {tex('C_k= AprioriGen (L_{k-1})')}
\FORALL {tex('tehingud\ t \in T')}
\STATE {tex('C_t = AprioriSubset(C_k,t) ')}
\FORALL kandidaathulgad {tex('\ c \in C_t')}
\STATE c.count = c.count+1
\ENDFOR
\ENDFOR
\STATE {tex('L_k=\{c \in C_k \mid c.count \ge minsup\}')}
\ENDFOR
\STATE {tex('=\bigcup_k L_k')}
H3:e Eeldused
* Apriori eeldus
Tavaliselt kasutavad suurte kaupadehulkade leidmise algoritmid andmestu
{tex('T')} korduvat läbivaatust. Esimese läbivaatusega leitakse üksikute
kaupade tugi ning otsustatakse, millised neist on toele seatud
kitsenduste mõttes suured. Iga algoritmi samm kasutab eelmisel sammul
leitud suuri kaupadehulki leidmaks võimalikke kandidaathulki. Seejärel
leitakse andmestu {tex('T')} läbivaatusega toed neile kandidaathulkadele ning
toele seatud kitsendust rahuldavad hulgad loetakse suurteks, ning seega
järgmise sammu lähteandmeteks. Protsessi korratakse kuni rohkem suuri
kaupadehulki ei leita.
Probleemiks on siin andmestu läbivaatamiseks kulutatav ressursside maht
ning samuti kandidaathulkade suur arv. Üheks lahenduseks on siin
vähemoluliste kandidaathulkade võimalikult varajane kõrvalejätmine ning
andmestu läbivaatuste arvu minimeerimine.
Eelpoolkirjeldatud skeemi järgib küllalt laialdaselt levinud algoritmide
pere Apriori {cite('agrawal94fast')}. Sellele algoritmide perele on
iseloomulik uute kandidaathulkade koostamine vaid eelmiselt sammult
saadud suuri kaupadehulki kasutades. Seda teha lubab teadmine, et iga
suure kaupadehulga alamhulk peab samuti olema suur. Seetõttu võime
koostada uusi {tex('k')} elemendilisi kandidaathulki {tex('k-1')} elemendilistest
suurtest kaupadehulkadest. Neist omakorda võib välja jätta need hulgad
mille ükskõik milline alamhulk pole toele seatud kitsenduste mõttes
suur. Nii tehes on tulemuseks märksa väiksem arv kandidaathulki, andes
nii ajalises kui ka mäluvajaduse mõttes palju paremaid tulemusi.
H3:hh Kandidaadid
Edaspidi nimetame kaupade arvu hulgas tema suuruseks ning suurusega {tex('k')}
kaupadehulka {tex('k')}-kaupadehulgaks. Kaupu hulgas hoitakse
leksikograafilises järjestuses. Notatsiooni {tex('c[1] \cdot c[2] \cdot ...
\cdot c[k]')} kasutame kujutamaks {tex('k')}-kaupadehulka {tex('c')} mis koosneb
kaupadest {tex('c[1],c[2],...,c[k]')}, kus {tex('c[1]
AprioriGenPrune
Sisend {tex('C_k')}: {tex('k')}-kaupadehulgad
Väljund: {tex('C_k')}: harvendatud {tex('k')}-kaupadehulgad
\FORALL {tex('kaupadehulgad\ c \in C_k')}
\FORALL {tex('c\ (k-1)-alamhulgad\ s')}
\IF {tex('s \not\in L_{k-1}')}
\STATE {tex('C_k=C_k - c')}
\ENDIF
\ENDFOR
\ENDFOR
Funktsiooni AprioriGen harvendamissamm
H3:m Näide
Näiteks olgu {tex('L_3')} meil {tex('\{\{a b c\},\{a b d\},\{a c d\},\{a c e\},\{b c d\}\}')}.
Pärast liitmissammu on {tex('C_4')} sees kaupadehulgad {tex('\{a b c d\}')} ja {tex('\{a c d e\}')}.
Harvendamissammu käigus eemaldatakse kaupadehulk {tex('\{a c d e\}')} sest tema
alamhulk {tex('\{a d e\}')} ei sisaldu hulgas {tex('L_3')}. Seega jääb {tex('C_4')} sisse alles
ainult {tex('\{a b c d\}')}.
Funktsiooni AprioriSubset ülesandeks on leida kõik kaupadehulgad mis
sisalduvad nii {tex('C_k')} kui ka hetkel loendamissammu poolt käsitletavas
ostus {tex('t')}.
* Loendamine (hash tree abiga)
Kõigi elementide kombinatsioonide esinemiste loendamine üle terve andmestu
on küllalt suuremahuline töö. Seetõttu on oluline vähendada andmestu
läbivaatuste arvu. Christian Borgelt ja Rudolf Kruse on välja pakkunud
algoritmi Apriori kiire implementatsiooni {cite('borgelt-induction')},
mis põhineb prefiksipuu kasutamise abil kandidaathulkade
genereerimisest loobumises {cite('han00mining')}.
H3:o Ostukorvide loendamine
Leidmaks sagedasi kaupadehulki tuleb üle lugeda kõik ostukorvid kus nad esinevad. Kirjeldatava implementatsiooni ideeks on kaupadehulkade loendurite esitus erilise prefiksipuuna (vt joonis \ref{prefiksipuu}) mis mitte ainult ei hoia kokku mälu vaid lubab ka efektiivselt töödelda ostukorve ning hiljem esitada reegleid. Iga {tex('n_S')} kujutab endast loendurit kaupadehulga {tex('S')} jaoks. Servade lipikud juurtipust mõne lehttipuni tähistavad ühisosa neile loenduritele mis antud tipus paiknevad. Kujutatud puu pole balansseeritud kuna leksikograafilise järjestuse nõude tõttu loeme {tex('n_{abc}')} samaks mis {tex('n_{bca}')} ning seetõttu vajatakse vaid üht neist loenduritest. H3:p Hulkade genereerimine {img("prefiksipuu.eps")} Täielik kaupadehulkade puu kaupade {tex('a')}, {tex('b')}, {tex('c')}, {tex('d')} ja {tex('e')} jaoks
Apriori algoritmi esimese sammuna luuakse eelpoolkirjeldatud puu tase taseme haaval. Esimese baasi läbivaatusega luuakse {tex('1')}-kaupadehulgad, teise läbivaatusega {tex('2')}-hulgad jne. Puu selline ehitusviis lubab meil järjest välja jätta neid tippe mille tugi ei vastanud eelnevalt toele seatud kitsendustele --- tänu apriori eeldusele on meil teada, milline puu haru sisaldab endas sagedasi kaupadehulki ja milline kindlasti mitte.
Puu tippudes olevate loendurite hoidmiseks on algselt välja pakutud kolm võimalust:
On näha, et esimene viis loendurite säilitamiseks on kõige mälunõudlikum aga ka kõige kiirem. Samuti saab tippude jaoks valida, millist struktuuri loendurite säilitamiseks kasutada. Kui suhteliselt suur osa võimalikest kaupadehulkadest on suured siis on mõtet kasutada esimest meetodit. Tühikute arvu saab vähendada ka kaupadele sobivate märgiste valimisega, näiteks järjestades nad esinemissageduste järgi.
Ostude andmestu {tex('T')} töötlemine, ehk sagedaste hulkade loendamine, on eelpool kirjeldatud puu korral suhteliselt lihtne. Eeldades, et kaubad on konkreetses ostus leksikograafiliselt järjestatud, võib puu lihtsalt rekursiivselt läbi käia ning vastavalt igas tipus olevat loendurit suurendada või uusi tippe luua:
Kirjeldatud skeemi suure kaupadehulga alamhulkade leidmiseks saab sügavuti rekursiooniga kiirendada. Näiteks hulga {tex('ABCD')} korral vaatleme kõigepealt hulka {tex('ABC')}, seejärel {tex('AB')} etc. Kui suure kaupadehulga {tex('l')} mingist alamhulgas {tex('a')} ei tule reeglit (toele seatud kitsenduste mõttes), siis võib öelda, et ka {tex('l')} alamhulki ei maksa enam reeglite leidmisel arvestada. Näiteks kui reegel {tex('ABC \Rightarrow D')} ei ole eelnevalt seatud usaldusteguri kitsenduste mõttes oluline, siis ei ole vaja ka kontrollida enam reeglit {tex('AB \Rightarrow CD')}. Nii ei lähe ükski reegel kaotsi, sest iga {tex('a')} alamhulga {tex('\bar{a}')} tugi peab olema vähemalt sama suur kui hulgal {tex('a')}. Seetõttu ei saa ka {tex('\bar{a} \Rightarrow (l-\bar{a})')} usaldustegur olla suurem kui {tex('a \Rightarrow (l-a)')} usaldustegur. Seega, kui {tex('a')} kasutamisel ei teki reeglit kõigi {tex('l')} elementidega kus {tex('a')} oleks reegli paremal poolel, ei tee seda ka {tex('\bar{a}')}. Selle idee võtab kokku algoritm joonisel \ref{vana-rules}. H3:aa Algoritm c
\FORALL suured kaupadehulgad {tex('l_k,k \ge 2')}
\STATE call GenRules({tex('l_k,l_k')})
\ENDFOR
GenRules
Sisend: {tex('l_k')} : suur {tex('k')}-kaupadehulk
{tex('a_m')} : suur {tex('m')}-kaupadehulk
\STATE {tex('A=\{(m-1)-kaupadehulgad\ a_{m-1} \mid a_{m-1} \subset a_m\}')}
\FORALL {tex('a_{m-1} \in A')}
\STATE {tex('conf=support(l_k)/support(a_{m-1})')}
\IF {tex('conf \ge minconf')}
\STATE väljasta reegel {tex('a_{m-1} \rightarrow (l_k-a_{m-1})')}, usaldusteguriga {tex('conf')} ja toega {tex('support(l_k)')}
\IF {tex('m-1 > 1')}
\STATE call GenRules({tex('l_k,a_{m-1}')})
\ENDIF
\ENDIF
\ENDFOR
Assotsiatsioonireeglite genereerimise algoritm
H3:ab Erijuhtumid
* Järjendid (sequences, sequential ar)
* Episoodid (episodes)
Episoodide leidmisel defineeritakse sündmus paarina {tex('(A, t)')}, kus
{tex('A')} on sündmuse tüüp ja {tex('t')} aeg. Mingid logisse kogunenud
sündmused moodustavad sündmuste jada. Sündmuste jada iseloomustavad tema
algusaeg {tex('T_s')} ja lõppaeg {tex('T^s')}. Seejuures kõikide
sündmuste jadasse kuuluvate sündmuste toimumisaeg peab jääma vahemikku
{tex('[T_s, T^s)')}. Sündmuste jadaga analoogiliselt defineeritakse aken
{tex('[T_w, T^w)')}, kui mingi osa kogu sündmuste jadast. Seejuures on
nõutav, et aken ja sündmuste jada vähemalt osaliselt kattuksid, st
{tex('T_s
episoodi {tex('e')} sisaldavate pikkusega {tex('win')} akende arv jadas
fr = -----------------------------------------------------------------------------
kõikide pikkusega {tex('win')} akende arv
H3:bg Parallel
On olemas algoritmid sündmuste jadas kõigi piisavalt
suure sagedusega paralleelsete ja järjestikuste episoodide leidmiseks.
Suvaliste episoodide sageduste leidmine taandatakse enamasti vastava
paralleelse episoodi leidmisele ning igas aknas, kus too paralleelne
episood esines, kontrollitakse ka sündmuste järjestust.
Eelpoolmainitud probleemi lahenduseks on välja pakutud algoritm sagedaste
episoodide leidmiseks {cite('toivonen96frequent')}, millele siin töös
viidatakse kui algoritmile Haba.
See algoritm leiab sagedasi episoode sammhaaval.
Esimese sammuna leitakse sagedased sündmused, ehk ühest sündmusest koosnevad
sagedased episoodid. Seejärel genereeritakse võimalikud ühe sündmuse võrra
pikemad kandidaatepisoodid, ning andmestu pealt leitakse, millised neist on
sagedased. See protsess kasutab ära fakti, et sagedase episoodi alamepisood
peab samuti olema sagedane.
H3:rak Rakendusi
Assotsiatsioonireeglite kaevandamise rakendusvaldkondi on palju rohkem
kui jaekaubandus ning veebilehtede külastatavuse analüüs. USA
relvajõududes kasutatav automaatne raketitõrjesüsteem Patriot, mis
leidis laialdast kasutust Lahesõjas, kasutab assotsiatsioonireeglitel
põhinevat otsustussüsteemi {cite('peter-dm')}. Automaatrežiimil suudab see
süsteem saamaegselt jälgida sadu lendavaid objekte ning otsustab
teatud reeglite põhjal punktiarvestust pidades millist neist objektidest
alla tulistada. Näiteks lennumasin, mis tuleb läbi eeldefineeritud
"