Tworzenie reguł asocjacyjnych – podstawy
Przygotowanie studentów
Studenci powinni być przygotowani z następujących zagadnień
–
reguły asocjacyjne
–
interpretacja reguł asocjacyjnych
–
miary reguł asocjacyjnych
–
wyszukiwanie reguł asocjacyjnych
–
zastosowanie reguł asocjacyjnych
–
zbiory częste (large itemsets)
Do wykonania ćwiczenia konieczna jest podstawowa umiejętność programowania w języku Java.
Instrukcja dla studentów
Rozdziały „Budowa prostego modelu” oraz „Wykorzystanie reguł asocjacyjnych” opisują szczegóły
budowy oraz wykorzystania modelu reguł asocjacyjnych przy pomocy biblioteki Xelopes. Do wykonania
ćwiczenia należy wykorzystać dostarczony przez prowadzącego szkielet projektu aplikacji oraz szkielety
odpowiednich klas.
Wszystkie pliki źródłowe wykorzystywane podczas ćwiczenia zapisane są w podkatalogu src katalogu
zawierającego projekt. Szkielety kolejnych klas znajdują się w pakiecie:
pl.edu.prz.kia.eksploracja.
Aby uruchomić kod właściwej klasy należy we właściwościach projektu ustawić ją jako klasę główną
(Main Class). Aby to zrobić należy na liście projektów kliknąć prawym klawiszem na nazwie
projektu, wybrać: Properties > Run, następnie obok Main Class kliknąć Browse i wybrać z
listy właściwą klasę.
Poniżej znajdują się kolejne zadania które należy wykonać w ramach ćwiczenia.
I. Budowa modelu reguł asocjacyjnych
1. Na podstawie opisu w rozdziale „Budowa prostego modelu” oraz szkieletu klasy
AssociationRulesBuild utwórz aplikację służącą do budowania prostego modelu reguł
asocjacyjnych na podstawie danych z pliku: data/arff/transact.arff.
2. Modyfikując parametry support i confidence zaobserwuj zmiany ilości generowanych reguł
asocjacyjnych.
3. Obejrzyj zawartość pliku danych data/arff/transact.arff oraz pliku wynikowego
data/pmml/AssociationRulesModel.xml
4. Zmodyfikuj aplikację tak, żeby reguły asocjacyjne zawierały nazwy produktów a nie ich
identyfikatory (numery).
Eksploracja danych – laboratorium
1
II. Wykorzystanie modelu reguł asocjacyjnych
1. Na podstawie opisu w rozdziale „Wykorzystanie reguł asocjacyjnych” oraz szkieletu klasy
AssociationRulesApplySimple napisz prostą aplikację pozwalającą uzyskać
rekomendację na podstawie zbudowanego wcześniej modelu
2. Przetestuj napisaną aplikację dla zbudowanego wcześniej modelu oraz różnych danych
wejściowych.
3. Wygeneruj kilka różnych modeli danych przy pomocy aplikacji napisanej w wcześniej i przetestuj
na nich napisaną aplikację dla różnych danych wejściowych.
Budowa prostego modelu
Pierwszy model reguł asocjacyjnych należy zbudować dla danych zawartych w pliku:
data/arff/transact.arff. Plik ten zawiera dane na temat zawartości „koszyka zakupów” dla
kilku transakcji przeprowadzonych w supermarkecie. Każdy rekord zawiera informacje na temat jednego
produktu zakupionego podczas którejś z opisywanych transakcji. Informacje zawarte w pliku to:
●
transactId – identyfikator transakcji opisywanej przez dany rekord
●
itemId – identyfikator (numer) produktu
●
itemName – nazwa (tekstowa) produktu
●
itemPrice – cena produktu (nie będzie wykorzystywana w tym przykładzie)
Poniżej znajduje się opis kolejnych kroków jakie należy wykonać, w celu zbudowania modelu reguł
asocjacyjnych przy pomocy biblioteki Xelopes.
1. Otwarcie pliku z danymi
Plik data/arff/transact.arff zapisany jest w formacie ARFF, do jego wczytania
wykorzystujemy klasę: MiningArffStream.
// Open data source and get metadata:
MiningInputStream inputData = new MiningArffStream( "data/arff/transact.arff" );
Po wczytaniu pliku pobieramy obiekt opisujący meta dane wczytanego pliku, czyli informacje o tym jakie
dane zawierają wczytane rekordy (np. nazwy pól pobranych z bazy SQL). Informacja ta jest konieczna
do skonfigurowania algorytmu budowania modelu.
MiningDataSpecification metaData = inputData.getMetaData();
2. Pobranie atrybutów transakcji
Algorytm tworzenia modelu reguł asocjacyjnych musi otrzymać jako parametry informację o atrybutach
opisujących:
●
identyfikator transakcji
●
identyfikator produktu
Te dwa atrybuty pobieramy z obiektu metaData na podstawie ich nazw. Przykład:
// Identyfikator produktu
CategoricalAttribute categoryItemId =
(CategoricalAttribute)metaData.getMiningAttribute( "itemId" );
// identyfikator transakcji
Eksploracja danych – laboratorium
2
CategoricalAttribute categoryTransactId =
(CategoricalAttribute)metaData.getMiningAttribute( "transactId" );
3. Konfiguracja algorytmu
Teraz możliwe jest utworzenie konfiguracji algorytmu, którego użyjemy do budowy modelu reguł
asocjacyjnych. Tworzymy obiekt miningSettings klasy AssociationRulesSettings i
podajemy mu informację na temat meta danych.
AssociationRulesSettings miningSettings = new AssociationRulesSettings();
miningSettings.setDataSpecification( metaData );
Analogicznie podajemy też informacje na temat tego które pole w każdym rekordzie odpowiada
identyfikatorowi transakcji, a które identyfikatorowi produktu. Wykorzystujemy do tego utworzone
wcześniej obiekty klasy CategoricalAttribute.
miningSettings.setItemId( categoryItemId );
miningSettings.setTransactionId( categoryTransactId );
Następnie za pomocą metod:
●
miningSettings.setMinimumSupport()
●
miningSettings.setMinimumConfidence()
pobierających parametry typu double należy skonfigurować minimalną wartość parametrów support i
confidence dla reguł które mają pojawić się w modelu.
Po ustawieniu wszystkich wymaganych parametrów należy zweryfikować ustawienia wywołując metodę:
miningSettings.verifySettings();
4. Utworzenie obiektu algorytmu
Informacje potrzebne do utworzenia nowego obiektu algorytmu budowania modelu reguł asocjacyjnych
pobieramy z pliku algorithms.xml. Plik ten opisuje algorytmy, ich domyślne parametry oraz
implementujące je klasy. Informacje te wczytujemy do obiektu klasy:
MiningAlgorithmSpecification. W pierwszym przykładzie użyjemy algorytmu
AprioriSimple.
MiningAlgorithmSpecification miningAlgorithmSpecification =
MiningAlgorithmSpecification.getMiningAlgorithmSpecification( "AprioriSimple" );
if( miningAlgorithmSpecification == null )
throw new MiningException( "Can't find application AprioriSimple." );
Informacje na temat ustawionych parametrów specyficznych dla wybranego algorytmu możemy
wyświetlić:
GeneralUtils.displayMiningAlgSpecParameters(miningAlgorithmSpecification);
Parametry te możemy zmienić za pomocą metory
miningAlgorithmSpecification.setMAPValue(nazwaParametru,wartoścParametru);
Obydwa parametry metody są typu string. Dla algorytmu AprioriSimple możemy ustawić parametry:
minimumItemSize i maximumItemSize definiujące minimalny i maksymalny rozmiar zbiorów
częstych (ang. large itemsets).
Na podstawie wczytanej specyfikacji tworzymy obiekt algorytmu:
String className = miningAlgorithmSpecification.getClassname();
Eksploracja danych – laboratorium
3
if( className == null )
throw new MiningException( "classname attribute expected." );
// Create algorithm object with default values:
AssociationRulesAlgorithm algorithm = (AssociationRulesAlgorithm)
initAlgorithm(className);
Metoda initAlgorithm jest zaimplementowana w klasie AssociationRulesBuildBasics po
której dziedziczy implementowana przez nas klasa. Metoda ta zwyczajnie tworzy nowy obiekt na na
podstawie nazwy klasy oraz obsługuje mogące się pojawić wyjątki.
5. Konfiguracja algorytmu
Wszystkie wykonane wcześniej ustawienia podajemy nowo utworzonemu algorytmowi i weryfikujemy
całość:
algorithm.setMiningInputStream( inputData );
algorithm.setMiningSettings( miningSettings );
algorithm.setMiningAlgorithmSpecification( miningAlgorithmSpecification );
algorithm.verify();
6. Budowa modelu
Aby utworzyć nowy model reguł asocjacyjnych należy na jego obiekcie wywołać metodę
buildModel(). Zwracającą obiekt klasy MiningModel zawierający znalezione reguły asocjacyjne.
Po utworzeniu modelu możemy też pobrać czas jaki zajęło jego budowanie.
MiningModel model = algorithm.buildModel();
System.out.println("calculation time [s]: " +
algorithm.getTimeSpentToBuildModel());
7. Wyniki
Otrzymane reguły asocjacyjne oraz odnalezione zbiory częste można wyświetlić za pomocą metody
zaimplementowanej w klasie z której dziedziczy implementowany przykład:
showRules( (AssociationRulesMiningModel) model );
Wyniki te można też zapisać do pliku pmml, aby możliwe było późniejsze wykorzystanie
wygenerowanego modelu w innych aplikacjach, na przykład generujących rekomendację (ang.
recommendation engine).
FileWriter writer = new FileWriter("data/pmml/AssociationRulesModel.xml");
model.writePmml(writer);
Wykorzystanie reguł asocjacyjnych
Model reguł asocjacyjnych zbudowany na podstawie pewnych danych treningowych można potem
wielokrotnie wykorzystywać. Jednym z możliwych zastosowań jest tzw. recommendation engine
pozwalający na wykorzystanie modelu w celu uzyskania rekomendacji na podstawie pewnych przesłanek.
Biblioteka Xelopes pozwala w prosty sposób zaimplementować taką funkcjonalność. Poniżej znajduje się
opis pozwalający napisać prostą aplikację podającą rekomendację na podstawie zbudowanego wcześniej
modelu oraz podanych przesłanek.
Eksploracja danych – laboratorium
4
1. Wczytanie modelu z pliku
Najpierw tworzymy nowy obiekt modelu reguł asocjacyjnych, a następnie wczytujemy z pliku pmml
utworzony wcześniej model.
MiningModel model = new AssociationRulesMiningModel();
FileReader reader = new FileReader("data/pmml/AssociationRulesModel.xml");
model.readPmml(reader);
2. Odczytanie ustawień
Kolejnym krokiem jest odczytanie ustawień modelu zawartych w obiekcie klasy
AssociationRulesSettings oraz pobranie atrybuty będącego identyfikatorem produktu (z
koszyka zakupów).
AssociationRulesSettings miningSettings =
(AssociationRulesSettings) model.getMiningSettings();
CategoricalAttribute categoryItemId =
(CategoricalAttribute) miningSettings.getItemId();
3. Przygotowanie modelu
Przed wykorzystaniem modelu do otrzymania rekomendacji konieczne jest odpowiednie uporządkowanie
jego reguł asocjacyjnych za pomocą metody buildRecommendations().
((AssociationRulesMiningModel) model).buildRecommendations();
4. Przygotowanie danych wejściowych
Kolejnym krokiem jest przygotowanie danych wejściowych (przesłanek) na podstawie których chcemy
uzyskać rekomendację.
Najpierw tworzymy nowy zbiór elementów (produktów):
ItemSet is = new ItemSet();
Następnie dodajemy do niego identyfikatory produktów, w tym przypadku będą to produkty o
identyfikatorach 2 i 3:
is.addItem( (int) categoryItemId.getKey( new Category("2") ));
is.addItem( (int) categoryItemId.getKey( new Category("3") ));
5. Uzyskanie rekomendacji
Aby uzyskać rekomendację dla wybranego zbioru produktów należy zastosować model asocjacyjny do
utworzonego zbioru danych. Służy do tego metoda applyModel() zwracająca zbiór reguł składający
się z jednej reguły najlepiej (pod względem parametrów support i confidence) pasującej do rozważanego
zbioru danych wejściowych (przesłanek), lub null jeśli takiej reguły nie znaleziono.
RuleSet rs = (RuleSet) ((AssociationRulesMiningModel) model).applyModel(is);
6. Wyniki
Jeśli zmienna rs nie jest równa null, to znaczy że otrzymaliśmy rekomendację i możemy ją wyświetlić.
Można to wykonać przy pomocy poniższego kodu wyświetlającego poszczególne parametry uzyskanej
Eksploracja danych – laboratorium
5
rekomendacji.
System.out.println("Przesłanka : " + rs.getPremise().toString());
System.out.println("Konkluzja : " + rs.getConclusion().toString());
System.out.println("Support : " + rs.getSupport());
System.out.println("Confidence : " + rs.getConfidence());
Można też wykorzystać metodę itemSetToString() zaimplementowaną już w używanej klasie aby
zamienić na tekst przesłankę oraz konkluzję otrzymanej reguły i wyświetlić je w innym formacie:
String prem = itemSetToString(rs.getPremise(), categoryItemId);
String conc = itemSetToString(rs.getConclusion(), categoryItemId);
System.out.println("\nRekomendacja jako String : ");
System.out.println(prem+" => "+conc);
Jeśli otrzymaliśmy regułę postaci:
2, 3 => 5
To oznacza, że do koszyka zakupów zawierającego już produkty 2 i 3 produkt 5 trafi z
prawdopodobieństwem określonym parametrem confidence tej reguły.
Eksploracja danych – laboratorium
6