Politechnika Łódzka
Wydział Fizyki Technicznej, Informatyki i Matematyki Stosowanej
Kierunek: Matematyka
Specjalność: Analiza Danych w Biznesie i Logistyce
Projekt z przedmiotu
Techniki Analizy Danych
Poprawność klasyfikacji danych w oparciu o różne drzewa decyzyjne
Anna Ociepa
Łukasz Cichoszewski
Łódź, styczeń 2014
Spis treści:
1. Wprowadzenie
2. Wybrane rodzaje drzew decyzyjnych
3. Tworzenie projektu w Weka KnowledgeFlow
4. Projekt w programie NetBeans w języku Java
Wprowadzenie
Celem naszego projektu jest porównanie czterech drzew decyzyjnych:
J48
LMT
NBTree
RandomForest
Dokonamy tego wykorzystując środowisko Weka KnowledgeFlow oraz program NetBeans, w którym zaprezentujemy kod napisany w języku Java.
W naszym projekcie użyjemy danych, które dotyczą cech różnych odmian papryk. (Tutaj trochę informacji na ten temat, tzn. skąd pochodzą dane, z jakich lat, jakie są atrybuty, który będzie klasowy, ile jest obserwacji, co z nimi będziemy robić, jak dzielimy na zbiór testowy i uczący)
Dane te znajdują się w pliku „papryka - pomiary.arff”.
Wybrane rodzaje drzew decyzyjnych
Zaczniemy od krótkich informacji na temat klasyfikatorów, z których będziemy korzystać.
J48 - Klasa służąca do generowania drzewa decyzyjnego przy użyciu algorytmu C 4.5, z opcją „pruned” lub „unpruned”.
“Pruning” (cięcie) to technika, która redukuje rozmiar drzewa decyzyjnego, poprzez usuwanie sekcji drzewa, które są mało istotne przy klasyfikacji instancji. Kolejnym celem „cięcia” jest zmniejszona złożoność końcowego klasyfikatora oraz zwiększona dokładność predykcyjna poprzez redukcję przeuczenia i usunięcie części klasyfikatora, które mogą być oparte na szumnych lub błędnych danych.
Algorytm C 4.5 dzieli pierwotny zestaw danych względem każdej ze zmiennych. W ten sposób powstaje tyle wariantów podziału, ile w zestawie jest zmiennych objaśniających. Dla każdego podziału liczona jest wartość metryki information gain (zysk informacyjny), która zdefiniowana jest jako przyrost entropii (funkcja przyrostu informacji) uzyskanych podzbiorów w stosunku do zbioru pierwotnego w każdym z podzbiorów. Zmienna o najwyższym współczynniku information gain staje się pierwszym węzłem drzewa. Następnie dla wszystkich podzbiorów powtarza się tę operację aż do wyczerpania wszystkich instancji.
LMT (Logistic Model Tree) – Drzewo, które w każdym liściu wylicza funkcję regresji logistycznej.
NBTree - Drzewo decyzyjne, które tworzy w liściach klasyfikatory bayesowskie.
RandomForest - Las losowy złożony z określonej ilości drzew decyzyjnych, których węzły generowane są na podstawie losowo dobranego zestawu atrybutów.
Tworzenie projektu w Weka KnowledgeFlow
W tej części zajmiemy się utworzeniem projektu w środowisku Weka KnowledgeFlow. W tym celu wykonujemy następujące kroki:
Wczytanie danych z pliku
Z folderu DataSources wybieramy i umieszczamy w przestrzeni roboczej ArffLoader, dzięki czemu będziemy mogli korzystać z pliku o rozszerzeniu .arff . Następnie wczytujemy nasze dane, które znajdują się w pliku „papryka - pomiary.arff”. Aby obejrzeć graficzne przestawienie danych, z folderu Visualization wybieramy DataVisualizer i przesyłamy dataSet z ArffLoader do DataVisualizer.
Wybór atrybutu klasowego
Aby wybrać atrybut klasowy dla naszych danych, z folderu Visualization wybieramy ClassAssigner. Dalej przesyłamy dataSet z ArffLoader do ClassAssigner. Ustawiamy ostatni atrybut jako klasowy, zatem w polu classColumn wpisujemy „last”.
Podział danych na zbiór testowy i uczący
Zrobimy to poprzez podział procentowy. Z folderu Evaluation wybieramy TrainTestSplitMaker. Przesyłamy dataSet z CrossAssigner do TrainTestSplitMaker, a następnie w ustawieniach TrainTestSplitMaker w polu trainPercent wpisujemy jaki procent danych ma być zbiorem uczącym, w naszym przypadku 80.0.
Aby zobaczyć w jaki sposób dane zostały podzielone za pomocą TrainTestSplitMaker trzeba z folderu Visualization wybrać dwukrotnie TextViewer do jednego przesłać trainingSet, a do drugiego testSet.
Wybór klasyfikatorów
Sklasyfikujemy teraz dane za pomocą czterech różnych klasyfikatorów (wymienionych wcześniej drzew decyzyjnych):
J48
LMT
NBTree
RandomForest
Z folderu Classifiers wybieramy podfolder trees, a następnie kolejne drzewa. Z TrainTestSplitMaker przesyłamy trainingSet i testSet do każdego z nich.
Ocena klasyfikacji
Aby ocenić poprawność klasyfikacji dla każdego z klasyfikatorów, z folderu Evaluation wybieramy ClassifierPerrformanceEvaluator i z każdego drzewa decyzyjnego przesyłamy do niego batchClasifier.
Wyświetlanie wyniku ewaluacji
Aby wyświetlić efekty klasyfikacji w formie tekstowej z folderu Visualization musimy wybrać TextViewer i przesłać do niego text z ClassifierPerrformanceEvaluator
Aby wyświetlić efekty klasyfikacji w formie graficznej z folderu Visualization musimy wybrać ModelPerformanceChart i przesłać do niego thresholdData z ClassifierPerrformanceEvaluator.
Ostateczny projekt wygląda następująco:
Podsumowanie i porównanie otrzymanych wyników
Aby uruchomić schemat wystarczy kliknąć strzałkę (Run this flow) w lewym górnym rogu. Możemy teraz zobaczyć wyniki ewaluacji.
Klikając prawym przyciskiem myszy na TextViewer wybieramy Show results. Dla każdego z drzew wyświetlają nam się wyniki:
Popatrzmy teraz na macierz Confusion Matrix. W wierszach znajdują się wartości prognozowane, w kolumnach zaś empiryczne. Na uwagę zasługują wartości elementów na głównej przekątnej, które znacznie przewyższają wartości pozostałych komórek, oznaczających poprawnie sklasyfikowane instancje, co przemawia na rzecz dużej trafności drzewa decyzyjnego.
Spójrzmy teraz na porównanie ilości poprawnie i niepoprawnie sklasyfikowanych instancji dla każdego drzewa decyzyjnego:
J48 | LMT | NBTree | RandomForest | |
---|---|---|---|---|
Correctly Classified Instances |
327 81.75 % | 335 83.75 % | 320 80 % | 351 87.75 % |
Incorrectly Classified Instances |
73 18.25 % | 65 16.25 % | 80 20 % | 49 12.25 % |
Odczytując wyniki z powyższej tabeli możemy wnioskować, że najlepsze jest użycie drzewa RandomForest, gdyż w przypadku tego klasyfikatora otrzymujemy największą ilość poprawnie sklasyfikowanych instancji.
Graficzne przedstawienie wyników
Możemy również obejrzeć graficzne przedstawienie powyższych wyników. W tym celu musimy kliknąć prawym przyciskiem myszy na ModelPerformanceChart i wybrać Show chart. Wyświetla nam się:
Dobrą jakość wygenerowanego drzewa potwierdza krzywa ROC (Receiver Operating Characteristic).Warto zwrócić uwagę na jej pożądany wygląd – wyraźna wklęsłość, która świadczy o dużej trafności klasyfikacji dla każdego z klasyfikatorów.
Projekt w programie NetBeans w języku Java
Teraz wykorzystamy program NetBeans i napiszemy kod w języku Java odpowiadający wykonanemu w programie Weka schematowi.
Rozpoczniemy od stworzenia nowego projektu o nazwie Projekt.java i wgraniu biblioteki weka.jar.
Napisany kod ma postać:
Możemy zauważyć, że otrzymane wyniki są takie same jak w części, gdzie tworzyliśmy projekt w programie Weka.