Uczenie Maszynowe od podstaw – Decision Tree

Drzewa decyzyjne są jednym z najprzystępniejszych narzędzi w uczeniu maszynowym, pozwalającym nie tylko na skuteczną klasyfikację danych, ale także na przejrzyste wizualizowanie mechanizmów podejmowania decyzji przez algorytmy. W niniejszym wpisie pokażę, jak za pomocą Live Script w MATLABie można prześledzić proces budowy drzewa decyzyjnego – od wczytania zbioru danych Fisher's Iris, przez wizualizację kluczowych etapów (m.in. obliczanie entropii), aż po ocenę skuteczności modelu przy użyciu macierzy pomyłek.


Wczytanie i wizualizacja zbioru Fisher’s Iris

Na początek wyświetlimy tabelarycznie 10 losowo wybranych rekordów z klasycznego zbioru Fisher's Iris, który jest często wykorzystywany jako materiał dydaktyczny w nauce o uczeniu maszynowym. Każdy rekord zawiera cztery liczbowe parametry - wymiary działki kielicha (sepal) i płatka (petal), a także przypisany gatunek irysa. Cały zbiór składa się ze 150 próbek.

Nie zawsze analiza surowych danych liczbowych czy tekstowych wystarcza, by w pełni zrozumieć strukturę analizowanego zbioru. Dlatego w kolejnym etapie przedstawię schematyczną wizualizację przykładowego kwiatu, wraz z oznaczeniem jego kluczowych elementów.

 

Zwizualizujemy teraz kilku reprezentantów z każdej z trzech klas irysów: setosa, versicolor oraz virginica.

Dostrzegalne są pewne różnice w rozmiarach i proporcjach elementów składowych pomiędzy poszczególnymi gatunkami irysów. Sprawdźmy zatem, czy na podstawie wyświetlonych powyżej wizualizacji kwiatów, skutecznie rozpoznamy podany gatunek spośród trzech irysów (na dwóch przykładach).

Poniżej znajdują się odpowiedzi do powyższych zagadek.

Trenowanie drzewa decyzyjnego

W kolejnym kroku zbudujemy drzewo decyzyjne przy użyciu funkcji fitctree(). Oryginalny zbiór został podzielony na zbiór treningowy oraz testowy w proporcji 70:30. Po wytrenowaniu drzewa istnieje możliwość wykorzystania funkcji view() w celu wyświetlenia tekstowego opisu zbudowanego modelu.

Możemy także zwizualizować wytrenowane drzewo decyzyjne używając funkcji view() w trybie grafu.

Drzewo decyzyjne to hierarchiczny model, w którym każda próbka przechodzi przez kolejne węzły decyzyjne. W każdym z nich, na podstawie porównania wartości konkretnej cechy z ustalonym progiem, próbka jest kierowana do odpowiedniej gałęzi – lewej lub prawej. Proces trwa aż do osiągnięcia węzła końcowego (tzw. liścia), który przypisuje próbce ostateczną etykietę klasy.

Zanim przejdziemy do etapu sprawdzenia jakości klasyfikacji przez wytrenowany model, zagłębimy się w mechanizm optymalnego podziału danych w węzłach decyzyjnych.

Mechanizm optymalnego podziału danych

Jak wybierane są cechy oraz wartości progowe w węzłach decyzyjnych? Podczas uczenia drzewa decyzyjnego, każda możliwa kombinacja cechy i progu jest oceniana pod kątem skuteczności w dzieleniu danych na jednorodne grupy. Jedną z miar jakości wykorzystywanych w tym procesie jest entropia.

 

Entropia mierzy stopień nieuporządkowania lub niepewności w zbiorze danych i wyraża się wzorem:

Policzmy entropię dla przykładowego zbioru 100 próbek, w którym 70 należy do jednej klasy, a 30 do drugiej.

 

Sprawdźmy, jak zmienia się wartość entropii w zależności od liczebności próbek obu klas w zbiorze.

 

Z wykresu wynika, że największa wartość entropii występuje przy równym podziale próbek obu klas (odzwierciedlając najwyższy poziom nieuporządkowania), natomiast najmniejsza (równa 0) – gdy w zbiorze znajdują się próbki tylko jednej klasy.

 

Podział danych w węźle decyzyjnym

W procesie optymalizacji wyboru cech oraz wartości progowych, entropia jest obliczana zarówno dla danych przed podziałem, jak i dla zbiorów powstałych po zastosowaniu potencjalnego progu.

Różnica między tymi wartościami – czyli przyrost informacji – wskazuje, jak bardzo dany podział zwiększa jednorodność grup. Wybierany jest taki podział, który maksymalnie redukuje entropię, co skutkuje lepszym rozdzieleniem próbek na jednorodne klasy.

Spróbujemy teraz ręcznie dobrać cechę oraz wartość progu tak, aby maksymalizować przyrost informacji. Górny wykres przedstawia rozkład wartości trzech klas dla wybranej cechy, natomiast poziome wykresy paskowe prezentują liczebność próbek w poszczególnych węzłach.

Osiągnięty w nagraniu przyrost informacji równy 0.50 można go zwiększyć do 0.92 – zachęcam do samodzielnych eksperymentów w tym zadaniu.

 
Testowanie dokładności

Znając podstawy działania algorytmu Decision Tree, możemy przejść do oceny jego dokładności – zarówno na zbiorze treningowym, jak i testowym.

Dokładność modelu dla obu zbiorów wynosi powyżej 90%. Zgodnie z intuicją, dokładność dla zbioru treningowego jest większa od dokładności dla zbioru testowego. Przyjrzyjmy się macierzy pomyłek dla zbioru testowego, aby określić, które klasy były najczęściej mylone przez algorytm.

Z macierzy pomyłek wynika, że trzy kwiaty z klasy versicolor zostały zaklasyfikowane jako virginica, natomiast jeden kwiat z klasy virginica został zaklasyfikowany jako versicolor. Wszystkie kwiaty z klasy setosa zostały sklasyfikowane poprawnie.

Poniżej zostały wyświetlone wszystkie błędnie sklasyfikowane kwiaty.

Analizując zaprezentowane pomyłki oraz wcześniejsze wizualizacje kwiatów ze wszystkich trzech klas, można zauważyć, że błędnie sklasyfikowane kwiaty klasy versicolor wyróżniają się znacznie większymi rozmiarami w porównaniu z błędnie przypisanym reprezentantem gatunku virginica.

Alternatywna wizualizacja drzewa decyzyjnego

Na zakończenie przeanalizujmy wizualizację ilustrującą przepływ próbek przez kolejne węzły drzewa, rozpatrując cztery scenariusze: zbiór testowy, zbiór treningowy, oba zbiory jednocześnie oraz model wytrenowany na pełnej bazie danych (bez podziału na zbiory treningowy i testowy).

Możemy zauważyć, że drzewo decyzyjne wytrenowane na całym zbiorze posiada więcej węzłów (jest bardziej rozbudowane) względem wersji trenowanej na danych podzielonych na zbiór treningowy oraz testowy. W drugim przypadku model jest budowany na mniejszej próbce danych, co często skutkuje uproszczoną strukturą drzewa. Dodatkowo, w takiej konfiguracji mogą być stosowane mechanizmy przycinania, mające na celu zapobieganie nadmiernemu dopasowaniu (overfitting), co również wpływa na redukcję liczby węzłów.


Podsumowanie

Prezentowany w tym wpisie Live Script jest dostępny tutaj. Istnieje możliwość uruchomienia udostępnionych plików w MATLAB Online, do czego zachęcam – jest to bardzo wygodny sposób uruchamiania MATLABowych skryptów.

Poniżej prezentuję przykład wywołania funkcji fitctree(), dla której (wersja z Live Script):

·        meas – macierz danych wejściowych, zawierająca numeryczne cechy (np. wymiary działki kielicha i płatka),

·        species – wektor etykiet, określający do jakiej klasy należy każdy rekord (gatunek irysa),

·        "PredictorNames", ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"] – para nazwa-wartość, która przypisuje czytelne nazwy poszczególnym kolumnom macierzy meas, co ułatwia interpretację wyników modelu.

ctree_all = fitctree(meas, species, "PredictorNames", ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]);

Podobnie jak w poprzednim wpisie dotyczącym podstaw SVM i funkcji fitcsvm, w przypadku drzew decyzyjnych również istnieje alternatywa dla ręcznego wywoływania funkcji fitctree – aplikacja Classification Learner, która automatyzuje wiele etapów pracy z klasyfikatorami, ułatwia obsługę danych oraz wizualizację wyników. Szczegóły dotyczące aplikacji, przykłady jej wykorzystania oraz nagranie wprowadzające dostępne są tutaj oraz tutaj.

 

Na koniec warto wspomnieć, że drzewa decyzyjne stanowią fundament modelu Random Forest (las losowy), który łączy wyniki wielu drzew decyzyjnych w celu poprawy ogólnej dokładności i stabilności modelu. Każde drzewo w lesie jest trenowane na losowym podzbiorze danych z losowym wyborem cech, co zwiększa różnorodność modeli i redukuje ryzyko nadmiernego dopasowania. Ostateczna decyzja lasu losowego jest wynikiem agregacji (np. głosowania większościowego) wyników poszczególnych drzew. Dzięki temu lasy losowe są bardziej odporne na szum w danych i mają lepszą zdolność generalizacji w porównaniu do pojedynczych drzew decyzyjnych.


Autor: Michał Hałoń 

 

Treść