Klasyfikacja i regresja Wstęp do środowiska Weka 19 listopada 2015 Opis pliku z zadaniami Wszystkie zadania na zajęciach będą przekazywane w postaci plików pdf sformatowanych podobnie do tego dokumentu. Zadania będą różnego rodzaju. Za każdym razem będą one odpowiednio oznaczone: Zadania do wykonania na zajęciach oznaczone są symbolem nie są one punktowane, ale należy je wykonać w czasie zajęć. Punktowane zadania do wykonania na zajęciach oznaczone są symbolem należy je wykonać na zajęciach i zaprezentować prowadzącemu. Zadania do wykonania w domu oznaczone są symbolem są one punktowane, należy je dostarczyć w sposób podany przez prowadzącego i w wyznaczonym terminie (zwykle do dwóch dni przed kolejnymi zajęciami). 1
1 Naiwny klasyfikator bayesowski bonus 5p. Treść Zapoznaj się z poniższym zbiorem danych: dreszcze katar ból głowy gorączka grypa? tak nie średni tak nie tak tak nie nie tak tak nie duży tak tak nie tak średni tak tak nie nie nie nie nie nie tak duży tak tak nie tak duży nie nie tak tak średni tak tak Nowy pacjent pojawił się z następującymi objawami: dreszcze katar ból głowy gorączka grypa? nie tak nie tak? Jaką odpowiedź udzieli naiwny klasyfikator Bayesa dla nowego pacjenta? Przedstaw formalny zapis modelu naiwnego Bayesa dla tego zadania. Rozpisz prawdopodobieństwa warunkowe oraz regułę decyzyjną. Rozwiązanie Prawdopodobieństwa warunkowe dla grypa=tak: P (grypa = tak) = 0.625 P (dreszcze = tak grypa = tak) = 0.6 P (dreszcze = nie grypa = tak) = 0.4 P (katar = tak grypa = tak) = 0.8 P (katar = nie grypa = tak) = 0.2 P (bolgowy = sredni grypa = tak) = 0.4 P (bolgowy = nie grypa = tak) = 0.2 P (bolgowy = duzy grypa = tak) = 0.4 P (goraczka = tak grypa = tak) = 0.8 P (goraczka = nie grypa = tak) = 0.2 Prawdopodobieństwa warunkowe dla grypa=nie: P (grypa = nie) = 0.375 P (dreszcze = tak grypa = nie) = 0.333 2
P (dreszcze = nie grypa = nie) = 0.666 P (katar = tak grypa = nie) = 0.333 P (katar = nie grypa = nie) = 0.666 P (bolgowy = sredni grypa = nie) = 0.333 P (bolgowy = nie grypa = nie) = 0.333 P (bolgowy = duzy grypa = nie) = 0.333 P (goraczka = tak grypa = nie) = 0.333 P (goraczka = nie grypa = nie) = 0.666 Decyzja: P (grypa = tak dreszcze = tak katar = nie bolglowy = sredni goraczka = tak) 0, 7216 P (grypa = nie...) = 1 0, 7216 = 0, 2784 0.7216 > 0.2784 zatem odpowiedź brzmi TAK. 3
2 Format pliku wejściowego ARFF Treść Zapoznaj się z formatem pliku ARFF (ang. Attribute-Relation File Format): Format standardowy: % tresc komentarza @ relation nazwa_ zbioru @ attribute atrybut_ numeryczny numeric @ attribute atrybut_ nominalny { wartosc_1, wartosc_2, wartosc_3 }... @ attribute jakis_ atrybut_ n typ_ atrybutu @data wartosc_ atrybutu_ 1, wartosc_ atrybutu_ 2,..., wartosc_ atrybutu_ n wartosc_ atrybutu_ 1, wartosc_ atrybutu_ 2,..., wartosc_ atrybutu_ n... wartosc_ atrybutu_ 1, wartosc_ atrybutu_ 2,..., wartosc_ atrybutu_ n Format rzadki danych: { nr_ atrybutu wartosc, 3 Y, 4 " class A " } Wartości brakujące są oznaczane przez?. Rozwiązanie Zilustruj na swoim komputerze i krótko omów ten przykład. 4
3 Weka GUI Treść Wykonaj poniższe kroki w celu zapoznania się z interfejsem graficznym środowiska Weka: 1. Zapoznaj się ze stroną główną projektu Weka: http://www.cs.waikato.ac.nz/ml/weka/ 2. Pobierz i rozpakuj oprogramowanie Weka (w wersji 3.6.10): http://sourceforge.net/projects/weka/files/ 3. Uruchom interfejs graficzny Weka z pliku weka.jar, np. za pomocą polecenia konsoli: java -Xmx1G -jar weka.jar 4. W oknie Weka GUI Chooser wybierz Explorer i zapoznaj się z eksploratorem plików ARFF. 5
5. Otwórz plik grypa-train.arff i zapoznaj się z danymi. 6. Aby na wczytanych danych uruchomić eksperyment klasyfikacji, należy kliknąć zakładkę Classify. 7. Wybierz klasyfikator klikając przycisk Choose. W drzewku klasyfikatorów odszukaj i wybierz NaiveBayes. 8. Ustaw zbiór testowy grypa-test.arff. 9. Aby po wykonanych obliczeniach zobaczyć predykcje dla poszczególnych przykładów testowych kliknij More options i zaznacz Output predictions. 10. Uruchom eksperyment klikając Start. 11. W polu Classifier output odszukaj tabelę Predictions on test data. Przeanalizuj odpowiedź klasyfikatora. W jakim stopniu predykcja jest poprawna? Rozwiązanie Wykonać ćwiczenie razem ze studentami wykonując poszczególne kroki na swoim komputerze. 6
4 Weka API - wprowadzenie Treść Uruchom Eclipse (lub inne środowisko) i zaimportuj projekt weka-api-intro. Zapoznaj się z szablonem implementacji klasyfikatora. Poniżej znajduje się krótki opis najważniejszych elementów środowiska Weka Podstawowe klasy potrzebne do tworzenia własnych algorytmów uczących: Instances - klasa reprezentująca dane. Classifier - klasa abstrakcyjna klasyfikatora. Evaluation - klasa odpowiedzialna za przeprowadzenie testów i oceny klasyfikatora. Filter - klasa odpowiedzialna za przekształcenia zbioru danych, np., normalizację, usunięcie lub uzupełnienie wartości pustych, przekształcenie tekstu do danych wektorowych. Klasa Classifier posiada 3 podstawowe metody: buildclassifier realizuje proces uczenia z danych przekazanych jako parametr. distributionforinstance realizuje predykcję dla zadanego przykładu testowego. Zwraca tablicę z rozkładem prawdopodobieństwa dla klas, classifyinstance zwraca numer klasy dla zadanego przykładu testowego. Numer ten musi zostać dalej przekształcony w nazwę klasy. Metoda ta zazwyczaj korzysta z metody distributionforinstance. Podstawowe operacja w środowisku Weka: Wczytywanie danych w pliku: FileReader reader = new FileReader ( filename ); instances = new Instances ( reader ); instances. setclassindex ( instances. numattributes () - 1); Sczytanie liczby przykładów i atrybutów: int n = instances. numinstances (); int p = instances. numattributes (); Sczytanie wartości pierwszego przykładu na 4 atrybucie i zmniejszenie tej wartości o 1: 7
Instance instance = instances. instance (0) ; int value = instance. value (3) ; instance. setvalue (3, value - 1); Wartości klasy i indeks atrybutu decyzyjnego: int classvalue = instance. classvalue () ; int classindex = instances. classindex () ; Stworzenie zbioru danych: int numofattributes = 3; int numofinstances = 2; FastVector attributes = new FastVector ( numofattributes ); attributes. addelement ( new Attribute ("A1 ") ); attributes. addelement ( new Attribute ("A2 ") ); FastVector classes = new FastVector (2) ; classes. addelement (" neg "); classes. addelement (" pos "); attributes. addelement ( new Attribute ( ''class ", classes )); Instances instances = new Instances (" test - monotone ", attrs, numofinstances ) ; double [] dneg = {0, 1, 0}; Instance instanceneg = new Instance (1, dneg ); double [] dpos = {1, 2, 1}; Instance instancepos = new Instance (1, dpos ); instances. add ( instanceneg ); instances. add ( instancepos ); Dodawanie i usuwanie atrybutów: instances. deleteattributeat (1) ; instances. insertattributeat ( new Attribute (" last "),\\ instances. numattributes ()); Dodawanie i usuwanie przykładów: instances. delete (4) ; instances. add ( new Instance (1, new double [ instances. numattributes () ]) ; Sortowanie zbioru danych: instances. sort ( instances. classindex ()) ; Przetasowanie zbioru danych: instances. randomize (); Przepróbkowanie zbioru uczącego: instances. resample ( new Random (1) ) ; 8
Sklonowanie zbioru danych: Instances cloneofinstances = new Instances ( instances ); Uczenie klasyfikatora: Classifier classifier = new J48 (); classifier. buildclassifier ( instances ); Predykcja wartości i rozkładu prawdopodobieństwa: int predicted = classifier. classifyinstance ( instance ); double [] distribution = classifier. distributionforinstance ( instance ); Testowanie klasyfikatorów za pomocą 10-krotnej walidacji krzyżowej: int nfolds = 10; Evaluation evaluation = new Evaluation ( instances ); evaluation. crossvalidatemodel ( classifier, instances, nfolds, new Random ()) ; Wybór losowego podzbioru testowego: int numfolds = 3; int trainsize = instances. numinstances () /2; int testsize = instances. numinstances () - trainsize ; instances. randomize ( new Random ()); Instances training = new Instances ( instances, 0, trainsize ); Instances testing = new Instances ( instances, trainsize, testsize ) ; Filtrowanie danych - usunięcie brakujących danych: ReplaceMissingValues replace = new ReplaceMissingValues (); replace. setinputformat ( instances ) ; instances = Filter. usefilter ( instances, replace ) ; replace. input ( instance ) ; instance = replace. output (); Filtrowanie danych - selekcja danych: AttributeSelection selection = new AttributeSelection (); selection. setevaluator ( new InfoGainAttributeEval ()) ; selection. setsearch ( new Ranker ()) ; selection. SelectAttributes ( instances ) ; Instances reduced = selection. reducedimensionality ( instances ); int [] selected = selection. selectedattributes () ; 9