Rozdz5 Drzewa

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 26

5.

Drzewa decyzyjne

5.1 Wprowadzenie

Drzewo decyzyjne jest to graficzna metoda wspomagania procesu decyzyjnego, na podstawie


analizy i porównywania wartości poszczególnych atrybutów wejściowych [6,14,82].
Zadaniem drzew decyzyjnych może być zarówno stworzenie planu, jak i rozwiązanie
problemu decyzyjnego.

W pierwszym etapie na podstawie przykładów tworzony jest model drzewiasty


podejmowania decyzji, który następnie jest używany do klasyfikacji. W procesie tworzenia
tego modelu następuje porównanie wartości określonego atrybutu z przyjętym progiem. W
wyniku tego porównania następuje podział zbioru na 2 rozdzielne podzbiory przekazywane
do odpowiedniego węzła niższego poziomu. Operacja jest powtarzana na zbiorach tak
utworzonych danych przy pomocy analizy i porównania wartości atrybutów aż do momentu,
gdy wszystkie przypadki są przypisane poprawnie do klasy reprezentowanej przez
odpowiedni liść drzewa.
W trybie odtwarzania (etap testowania) dla sklasyfikowania nieznanego obiektu
wartości jego atrybutów są porównywane z przyjętymi w procesie uczenia progami zgodnie z
informacją zawartą w utworzonym drzewie decyzyjnym. W tym procesie przechodzimy więc
ścieżkę w drzewie od wierzchołka do liścia oznaczającego klasę – w ten sposób określana jest
klasa, do której zostanie przydzielony obiekt.
W wyniku oceniana jest dokładność modelu klasyfikatora na zbiorze testowym,
niezależnym od treningowego. Dokładność modelu na tym zbiorze określona jest przez
procentową liczbę trafnych klasyfikacji, tzn. jaki procent przypadków testowych został
prawidłowo sklasyfikowany za pomocą modelu (porównanie etykiety klasy z etykietą
przypisaną przez model). Jeśli dokładność modelu została oceniona jako wystarczająca,
model można użyć do klasyfikacji przyszłych przypadków. W przeciwnym przypadku
następuje dalsze przetwarzanie modelu polegające zwykle na przycinaniu drzewa aż do
uzyskania akceptowalnych wyników testowania.
Metoda drzew decyzyjnych jest szczególnie przydatna w problemach decyzyjnych z
licznymi, rozgałęziającymi się wariantami oraz w przypadku podejmowania decyzji w
warunkach ryzyka oraz przy braku pewnych danych w bazie. Jej zaletą jest przejrzystość
podejmowania decyzji. Na każdym etapie podziału zbioru na 2 mniejsze widoczny jest
atrybut i wartość jego progu, według którego następuje rozdzielenie zbioru.

43
5.2 Struktura drzewa decyzyjnego

Wyróżniamy następujące elementy tworzące strukturę drzewa decyzyjnego [5,82]:

• wierzchołek (punkt górny drzewa reprezentujący pełny zbiór danych uczących) z


którego następują odgałęzienia,

• węzły poprzednika na wyższym poziomie o odgałęzieniach łączących węzły


następnika na niższym poziomie

• liście stanowiące końcową część drzewa, którym przypisane są odpowiednie klasy.

Jest to struktura drzewiasta, w której węzły wewnętrzne zawierają testy na wartościach


atrybutów. Z każdego węzła wewnętrznego wychodzi tyle gałęzi, ile jest możliwych wyników
testu w tym węźle. Liście zawierają decyzje o klasie obiektów. W ogólności drzewo
decyzyjne koduje program zawierający same instrukcje warunkowe, kończące się podjęciem
konkretnej decyzji klasyfikacyjnej. Przykład struktury prostego drzewa decyzyjnego przy
trzech atrybutach wejściowych: x1, x2 oraz x3 przedstawiony jest na rys. 5.1.

Rys. 5.1 Przykład prostego drzewa decyzyjnego o trzech zmiennych

W przedstawionym wyżej przykładzie na wierzchołku drzewa znajduje się węzeł decyzyjny


związany z atrybutem x1. Jest z nim skojarzony warunek decyzyjny x1<p1 lub x1>p1. Elementy
zbioru, obserwacje, dla których wartość atrybutu x1 jest mniejsza niż wartość progu są
przekierowane na lewo, a pozostałe na prawo. Dla każdej z gałęzi w odpowiednim węźle
niższego poziomu następuje powtórzenie procesu porównania wartości kolejnych atrybutów z
wartością progu przypisaną każdemu z tych węzłów (x2 mniejsze lub większe od p2 oraz x3
mniejsze lub większe od wartości progu p3). W ogólności porównanie wartości atrybutu na
każdym poziomie może dotyczyć powtórnie tej samej zmiennej (u nas x1, x2 lub x3).

44
Przy tworzeniu drzewa decyzyjnego przy N atrybutach wejściowych wchodzących w
skład wektora x wybiera się jeden, np. xi i przyjmuje wartość progu pi przy podziale zbioru
danych. Jeden podzbiór zawiera dane spełniające warunek xi<pi, a drugi xi>pi. Wybór progu
decyzyjnego powinien być tak dobrany, aby stworzyć obszary danych jak najbardziej
zbliżone do jednorodnych klasowo. W praktyce dobór atrybutu i jego progu następuje poprzez
minimalizację tzw. zanieczyszczeń klasowych w obu obszarach. Często stosowaną miarą jest
współczynnik Giniego (ang. Gini index) definiowany dla obszaru A w postaci [6,55,82]
M
I ( A) = 1 −  rk2 (5.1)
k =1

We wzorze tym M oznacza liczbę klas, a rk proporcję wystąpień k-tej klasy w obszarze A.
Innym wskaźnikiem rozkładu klas decyzyjnych jest miara entropijna, definiowana dla
pojedynczego obszaru A w postaci wzoru [6,55,82]
M
E ( A) = − r k log 2 rk (5.2)
k =1

Jeśli analizowany obszar zawiera jedynie dane należące do jednej klasy wówczas obie miary
zarówno Giniego jak i entropijna, są równe zeru.
W przypadku podziału zbioru A na dwa podzbiory: A1 i A2 łączna miara Giniego (lub
entropijna) odpowiadająca takiemu podziałowi jest sumą wagową miar obu podzbiorów, stąd
w procesie podziału wybierając wartość progu należy dążyć do minimalizacji przyjętej miary
dla obu podzbiorów łącznie. Sumowanie wagowe powinno uwzględniać populację obu
podzbiorów A1 oraz A2. Przykładowo, w przypadku miary Giniego pełna miara
zanieczyszczenia klasowego po podziale zbioru A na dwa podzbiory A1 oraz A2 określona jest
wówczas wzorem
nA1 n
I ( A) = I ( A1 ) + A2 I ( A2 ) (5.3)
nA nA
We wzorze tym nA1 i nA2 oznaczają liczbę elementów zawartych w podzbiorze odpowiednio
A1 i A2, natomiast n - całkowitą liczbę elementów w obu podzbiorach łącznie (n=nA1+nA2). W
podobny sposób zastępując miarę I(A) przez E(A) tworzy się sumacyjną miarę entropijną dla
obszaru podzielonego na dwa podobszary.

5.3 Algorytm tworzenia drzewa decyzyjnego

Algorytm tworzenia drzewa decyzyjnego można przedstawić w sposób następujący [55].

45
1. przyjmijmy zbiór danych uczących zawierający określoną liczbę m par uczących (x, d),
gdzie x oznacza wektor atrybutów wejściowych (zmiennych niezależnych xi, i= 1, 2,…,
N) a d etykietę klasy. Kolejne wektory x tworzą macierz X o wymiarach m N .
Uporządkujmy elementy każdej kolumny tej macierzy w porządku rosnącym, przy czym
pamiętana jest również macierz w porządku oryginalnym elementów. Dla każdej
uporządkowanej kolumny obliczane są średnie arytmetyczne dla dwu sąsiadujących
wartości elementów w kolumnie, tworzące potencjalne progi. Tworzą one macierz
potencjalnych progów P.
2. Wartość progowa testu dla każdej zmiennej wybierana jest z macierzy P jako wartość
odpowiadająca minimalnej wartości pełnej miary Giniego lub entropijnej obliczanej dla
aktualnego zbioru danych. W danym miejscu drzewa tworzony jest węzeł dla zmiennej
(kolumny) xi oferującej minimalną wartość przyjętej miary zanieczyszczenia klasowego z
odpowiadającym jej progiem spośród wszystkich możliwych wariantów podziału.
3. Po utworzeniu węzła decyzyjnego wszystkie przykłady danych w oryginalnym porządku
dzielone są na 2 podmacierze w zależności od wyników porównania wyselekcjonowanej
zmiennej xi z przyjętym progiem dla tej zmiennej.
4. Następne kroki są wykonywane z użyciem kolejnej (pojedynczej) podmacierzy danych.
Jeśli wszystkie przykłady danego podzbioru należą do jednej klasy następuje koniec
podziału dla tej ścieżki (liść drzewa z oznaczeniem danej klasy). Algorytm przemieszcza
się do najbliższej podmacierzy jeszcze nie posortowanej dla której powtarza się proces
podziału.
5. Jeśli w wyniku zastosowania pełnej procedury pewne przykłady nie mogą być rozdzielone
jednoznacznie do klas przy ograniczonej (akceptowalnej) długości drzewa decyzyjnego,
możliwe jest utworzenie liścia mieszanego zawierającego różne klasy. Zwykle takiemu
liściowi przypisuje się kategorię reprezentowaną przez klasę większościową.

Kryterium stopu algorytmu może zawierać wiele warunków. Na przykład konstrukcja drzewa
może ulec zatrzymaniu, gdy aktualny zbiór obiektów:
• jest pusty lub
• zawiera obiekty należące wyłącznie do jednej klasy decyzyjnej lub
• nie ulega podziałowi przez żaden test.
W algorytmie przedstawionym powyżej przyjęto atrybuty wejściowe w postaci wartości
numerycznych typu rzeczywistego. W przypadku, gdy zmienne te są typu kategorii
kodowanej binarnie w postaci jedynki (prawda) lub zera (fałsz) definicję progu przyjmuje się

46
w nieco zmodyfikowanej postaci, dzieląc zmienną na dwie kategorie względem jej wartości,
tworząc w ten sposób zbiór danych o atrybucie równym jedności i zbiór o atrybucie równym
zeru.
Algorytm przedstawiony powyżej dokonywał testów na pojedynczej zmiennej. Istnieją
również odmiany algorytmu operujące na każdym etapie wieloma zmiennymi na raz i
tworzące podziały przestrzeni wielowymiarowej (ang. multivariate tree). Tego typu
rozwiązanie stosowane jest na przykład w lesie losowym drzew decyzyjnych.
Jakość utworzonego drzewa można oceniać na różne sposoby.
• Ocena pod względem rozmiaru - im drzewo mniejsze tym lepsze pod względem
generalizacji; bierze się przy tym pod uwagę liczbę węzłów, wysokość drzewa, liczbę
liści.
• Dokładność klasyfikacji na zbiorze treningowym mierzoną stosunkiem prawidłowo
sklasyfikowanych obserwacji uczących do wszystkich obserwacji biorących udział w
uczeniu.
• Dokładność klasyfikacji na zbiorze testowym określaną identycznie jak wyżej, ale dla
zbioru nie uczestniczącego w uczeniu.
Kryterium jakości drzewa T można w ogólności zdefiniować wzorem
Q(T ) = a  rozmiar(T ) + b   (T ) (5.4)
gdzie a, b oznaczają przyjęte współczynniki wagowe. Rozmiar odzwierciedla liczbę węzłów,
liści i wysokość drzewa a ε - błąd klasyfikacji. Dla większości przypadków problem
poszukiwania drzewa optymalnego jest NP-trudnym1, co oznacza, że trudno jest znaleźć
drzewo optymalne w czasie wielomianowym. Wynika stąd potrzeba tworzenia algorytmów
heurystycznych.
Przycinanie drzewa ma za zadanie poprawić jego zdolność generalizacji, czyli
poprawić wyniki klasyfikacji na danych nie uczestniczących w uczeniu. Mniejsze drzewo
oznacza mniejszą dokładność dopasowania na zbiorze uczącym, co w ogólności skutkuje
zwykle lepszą dokładnością klasyfikacji zbioru testującego (nie uczestniczącego w uczeniu).
Stosuje się tutaj zasadę krótszego opisu, polegającą na zastąpieniu poddrzewa nowym liściem,
któremu przypisuje się większościową etykietę lub zastąpieniu danego poddrzewa mniejszym
poddrzewem. Zastąpienie poddrzewa nowym liściem jest zalecane, gdy nowy liść jest nie

1
Problem typu NP oznacza problem decyzyjny, dla którego rozwiązanie można zweryfikować w czasie
wielomianowym. W teorii złożoności obliczeniowej problem NP-trudny to taki problem obliczeniowy, którego
rozwiązanie jest co najmniej tak trudne jak rozwiązanie każdego problemu z klasy NP.

47
gorszy niż istniejące poddrzewo dla testowych obiektów nie należących do zbioru
treningowego (elementów tak zwanego zbioru przycinania).
Jako przykład rozpatrzmy zastosowanie drzewa decyzyjnego do klasyfikacji danych
dwuwymiarowych x=[x1, x2]T przedstawionych na rys. 5.2, należących do dwu klas. Klasę
pierwszą reprezentują punkty oznaczone symbolem ○, a klasę drugą symbolem x. Problem
jest reprezentowany przez 7 przykładów klasy pierwszej i 5 przykładów klasy drugiej. Jako
miarę rozkładu klas decyzyjnych przyjmiemy współczynnik Giniego określony dla jednego
M
obszaru A wzorem I ( A) = 1 −  rk2 (M – liczba klas, u nas M=2).
k =1

Rys. 5.2 Rozkład danych w przykładowym problemie decyzyjnym

Przy braku podziału obszaru danych indeks Giniego dla całego zbioru wynosi
2 2
5 7
I = 1 −   −   = 0.48
 12   12 
Dokonajmy podziału obszaru względem zmiennej x1 na poziomie p1=0.7 dzieląc go na część
lewą (x1<0.7) i prawą (x1>0.7). W części lewej znajduje się 6 reprezentantów klasy pierwszej
i trzej reprezentanci klasy drugiej (w sumie 9 danych), a w części prawej jeden reprezentant
klasy pierwszej i dwaj reprezentanci klasy drugiej (w sumie 3 dane). Indeks Giniego dla
części lewej (L) i prawej (P) tego obszaru danych wynosi
2 2
 6  3
I1 ( L) = 1 −   −   = 0.44
9 9

48
2 2
1  2
I 1 ( P) = 1 −   −   = 0.44
 3  3 
Pełna wartość miary Giniego dla pierwszego podziału danych określona jako suma wagowa
miar dla obu podobszarów wynosi
9 3
I1 =   I1 ( L) +   I1 ( P) = 0.44
 12   12 
i jest mniejsza od miary wyjściowej dla całego zbioru danych.
W drugim etapie podzielimy podobszar prawy według zmiennej x2 przyjmując próg
decyzji na poziomie p2=0.7. W wyniku otrzymuje się 2 obszary, oba jednorodne pod
względem zawartości klas. Odpowiednie wartości indeksu Giniego dla części górnej (G) i
dolnej (D) tego obszaru danych wynosi
2 2
1  0 
I 2 (G) = 1 −   −   = 0
1  1 
2 2
0 2
I 1 ( D) = 1 −   −   = 0
2 2
Pełna wartość miary Giniego dla podziału tego obszaru danych jest oczywiście równa zeru.
Oznacza to zakończenie tej części drzewa dwoma liśćmi, reprezentującymi przydział do klasy
pierwszej (podobszar górny) i drugiej (podobszar dolny).
W następnym etapie podzielimy podobszar lewy z pierwszego kroku według zmiennej
x2 przyjmując próg decyzji na poziomie p3=0.5. W wyniku otrzymuje się 2 podobszary: górny
i dolny. W części górnej znajduje się 5 reprezentantów klasy pierwszej i 1 reprezentant klasy
drugiej (w sumie 6 danych), a części dolnej 1 reprezentant klasy pierwszej i 2 reprezentantów
klasy drugiej (w sumie 3 dane). Odpowiednie wartości indeksu Giniego dla części górnej (G)
i dolnej (D) tego obszaru danych wynosi
2 2
 5 1
I 3 (G ) = 1 −   −   = 0.28
6 6
2 2
1  2
I 3 ( D) = 1 −   −   = 0.44
 3  3
Pełna wartość miary Giniego dla podziału tego obszaru danych jest równa
 5  3
I 3 =   I 3 (G) +   I 3 ( D) = 0.34
8 8
Podział podobszaru dolnego w następnym kroku następuje znowu względem zmiennej x2 o
progu p4=0.3, w pełni separując oba podobszary względem klas (łączny indeks Giniego I4=0).
Oznacza to powstanie 2 następnych liści drzewa kończących podział tego podobszaru.
49
Podział podobszaru górnego z kroku trzeciego następuje względem zmiennej x2 przy
progu p5=0.7. Podobszar dolny stał się jednorodny klasowo, natomiast podobszar górny
zawiera 2 dane klasy pierwszej przedzielone jedną daną z klasy drugiej. Odpowiednie miary
Giniego dla tych podobszarów wynoszą
2 2
 2 1
I 5 (G) = 1 −   −   = 0.44
 3 3
2 2
 3  0
I 5 ( D) = 1 −   −   = 0 → pełna zgodność klasowa podobszaru
 3  3
Pełna wartość miary Giniego dla podziału tego obszaru danych jest równa
 3  3
I5 =   I5 (G) +   I 5 ( D) = 0.22
6 6
Następny podział podobszaru górnego następuje względem zmiennej x1 przy progu p6=0.3
tworząc dwa podobszary: lewy i prawy. Odpowiednie wartości miar Giniego dla takiego
podziału wynoszą
2 2
1  0 
I 6 ( L) = 1 −   −   = 0 → pełna zgodność klasowa podobszaru
1  1 
2 2
1 1
I 6 ( P) = 1 −   −   = 0.5
2 2
Pełna wartość miary Giniego dla podziału tego obszaru danych jest równa
1 2
I 6 =   I 6 ( L) +   I 6 ( P) = 0.33
 3 3
W ostatnim etapie następuje podział podobszaru prawego względem zmiennej x1 przy progu
p7=0.5. W wyniku następuje pełne odseparowanie klas w obu podobszarach (wartość indeksu
Giniego I7=0). To oznacza pełny podział zbioru danych uczących i koniec procedury budowy
drzewa decyzyjnego. Na rys. 5.3 pokazano graficznie podział przestrzeni danych przez
drzewo decyzyjne zaimplementowany w algorytmie z zaznaczeniem wartości poszczególnych
progów. Indeksy progów oznaczają kolejność w jakiej dzielona była przestrzeń danych w
przykładzie.

50
Rys. 5.3 Podział przestrzeni danych zrealizowany przez drzewo decyzyjne

Pełna struktura powstałego drzewa decyzyjnego przedstawiona jest na rys. 5.4. Drzewo
zawiera 7 węzłów z zaznaczonymi progami i 8 liści określających klasę przydzieloną
wektorowi x podlegającemu rozpoznaniu. Poniżej każdego węzła zaznaczona jest zmienna,
dla której następuje porównanie wartości z progiem. Decyzja z prawej strony węzła dotyczy
znaku większości, a z lewej strony – znaku mniejszości. Każdy liść drzewa określa klasę
(klasa pierwsza -> Kl 1, lub klasa druga –> Kl 2) do której został przydzielony aktualny
wektor poddany klasyfikacji. Po zbudowaniu pełnej struktury drzewa można zastosować go
do wyznaczenia klasy przynależności dla danych testujących niebiorących udziału w jego
tworzeniu (uczeniu).

51
Rys. 5.4 Drzewo decyzyjne do przykładu

Przyjmijmy dla potrzeb testu dwa wektory wejściowe: x=[0.9 0.4]T oraz x=[0.55 0.8]T.
Kolejność określania klasy w przypadku wektora pierwszego jest następująca:
x1>0.7 → prawa gałąź drzewa → x2<0.7 → klasa 2
W przypadku wektora drugiego kolejność działań jest następująca
x1<0.7 → lewa gałąź → x2>0.5 → prawa gałąź → x2>0.7 → prawa gałąź → x1>0.3 → prawa
gałąź → x1>0.5 → klasa 1.
Rozwiązanie problemu klasyfikacji bazujące na drzewach decyzyjnych jest zrozumiałym i
popularnym podejściem do zadania klasyfikacji. Ma ono pewne zalety i wady. Do głównych
zalet drzewa decyzyjnego należą.
• Transparentność i zrozumiałość podejmowanych decyzji wyrażona poprzez
jednoznacznie przyjęte progi podejmowania decyzji.
• Łatwość określania ważności poszczególnych atrybutów wejściowych dla zadania
klasyfikacji. Wyeliminowanie pewnych atrybutów z drzewa świadczy o
nieuniezależnieniu decyzji klasyfikacyjnej od tych zmiennych.

52
• Duża odporność na wartości zmiennych wejściowych odstające od reszty (ang.
outliers).
• Znaczna odporność na pewne braki w bazie danych dotyczące określonych atrybutów.
• Małe wymagania co do pamięci komputera.
Do podstawowych wad drzewa decyzyjnego należą.
• Duża czułość na zmiany zawartości danych wejściowych. Drzewo trenowane na
innym zbiorze uczącym może generować zupełnie inne wyniki. Stąd klasyfikatory
budowane na bazie drzewa decyzyjnego są zaliczane do klasy słabych predyktorów.
• Podstawowa implementacja drzewa decyzyjnego zakłada działanie algorytmu na
pojedynczych zmiennych, co powoduje, że nie uwzględnia się współdziałania
(synergii) między poszczególnymi zmiennymi.
• Dla uzyskania stabilnego działania drzewa decyzyjnego wymagana jest duża baza
danych uczących, dobrze odzwierciedlających specyfikę problemu.
• Sposób podejmowania decyzji w każdym węźle jest typu horyzontalnego lub
wertykalnego. Prowadzi to do ogromnej rozbudowy struktury drzewa w przypadku
problemów o diagonalnym rozkładzie klas.
• Dla uzyskania końcowego wyniku klasyfikacji dla zadanych aktualnie atrybutów
wejściowych wymagane jest wykonanie dużej liczby operacji porównania, co
zwłaszcza przy dużym drzewie i dużej liczbie atrybutów wejściowych prowadzi do
znacznej złożoności i pogorszenia przejrzystości systemu.
Idea drzewa decyzyjnego powstała dla potrzeb rozwiązania zadania klasyfikacji. Jest ona
możliwa do zastosowania również dla zadania regresji (aproksymacji), gdzie wielkościami
przewidywanymi są wartości rzeczywiste funkcji. Tego typu rozszerzenie możliwości drzewa
polega na kwantyzacji poziomów wartości w ramach zadanego zakresu i sprowadzeniu w ten
sposób problemu regresji do zadania przypisania wartości poszukiwanej do określonego
poziomu kwantyzacji (traktowanej jako klasa), a więc zadania podobnego do klasyfikacji.

5.4 Implementacja modelu drzewa decyzyjnego w Matlabie

Matlab i Python zawierają szereg funkcji tworzących i wspomagających tworzenie modeli


drzewa decyzyjnego zarówno w trybie klasyfikacji jak i regresji [49,87]. Podstawową funkcją
tworzącą drzewo jest.

MATLAB Python
fitctree(X,d) klasa =model.predict(xt)

53
posterior=model.predict_proba(xt)

Parametrami wejściowymi dla niej jest macierz obserwacji X o wymiarze m  N , gdzie m jest
liczbą wektorów obserwacji x a N ich wymiarem oraz wektor d wielkości zadanych
stowarzyszonych z kolejnymi wektorami wejściowymi x. Jeśli d jest wektorem o wartościach
rzeczywistych (niebinarnych) wówczas program buduje drzewo dla zadania regresji. Jeśli
natomiast d składa się z elementów oznaczających kategorię (wartości binarne 0 lub 1) lub
elementów znakowych oznaczających klasę, wówczas drzewo decyzyjne tworzone jest dla
zadania klasyfikacji. Standardowy sposób wywołania funkcji ma postać

MATLAB Python
T=fitctree(X,d) T = DecisionTreeClassifier()
T.fit(X,d)
# graficzna prezentacja postaci klasa =model.predict(xt)
view(T,'Mode','graph') posterior=model.predict_proba(xt)

#testowanie drzewa
Y=predict(T,Xtest)

W wyniku wykonania tej funkcji tworzone są odpowiedzi dla każdego wektora x zawartego w
macierzy testującej Xtest. W przypadku klasyfikacji jest to etykieta klasy, a dla regresji jest to
wartość rzeczywista odpowiedzi systemu.
Istotnym parametrem wpływającym na stopień złożoności struktury drzewa jest
Minparentsize lub MinLeafSize (w starej wersji Matlaba splitmin). Jest to parametr sterujący
rozbiciem węzła na węzły podrzędne. Wartość wbudowana w Matlabie jest równa 10, co
oznacza, że dopiero po przekroczeniu 10 elementów należących do różnych klas w zadaniu
klasyfikacji lub 10 różnych wartości w zadaniu regresji następuje podział węzła na węzły
podrzędne. W szczególnych przypadkach wielkość parametru Minparentsize należy
zmniejszyć, zwiększając w ten sposób złożoność drzewa lub zwiększyć - zmniejszając ją.
Poniżej przedstawiono program tworzący drzewo decyzyjne do problemu klasyfikacji
przedstawionego w przykładzie z punktu poprzedniego
MATLAB Python
% Drzewo decyzyjne X=np.array(np.mat('''0.2 0.8;
X=[0.2 0.8 0.4 0.8;
0.4 0.8 0.6 0.8;
0.6 0.8 0.8 0.8;
0.8 0.8 0.2 0.6;
0.2 0.6 0.4 0.6;
0.4 0.6 0.6 0.6;
0.6 0.6 0.8 0.6;
0.8 0.6 0.2 0.4;
0.2 0.4 0.6 0.4;
0.6 0.4 0.4 0.2;
0.4 0.2 0.8 0.2'''));
0.8 0.2]; d= np.array(np.mat("""'kl1';
d= ['kl1' 'kl2';

54
'kl2' 'kl1';
'kl1' 'kl1';
'kl1' 'kl1';
'kl1' 'kl1';
'kl1' 'kl1';
'kl1' 'kl2';
'kl2' 'kl2';
'kl2' 'kl2';
'kl2' 'kl1';
'kl1' 'kl2'"""));
'kl2'];
C=[0 10 T = DecisionTreeClassifier()
10 0]; T.fit(X,d)
T=fitctree(X,d, 'splitcriterion',
'gdi','cost',C, 'Minparent',1); fig = plt.figure(figsize=(45,40), dpi=30)
_ = tree.plot_tree(T,
% zaprezentuj drzewo graficznie class_names=["kl1","kl2"],
view(T,'Mode','graph') filled=True)

W programie tym kryterium podziału węzła stosuje indeks Giniego (parametr gdi). Parametr
C definiuje współczynniki kosztu złej klasyfikacji danych zadane poprzez macierz C.
Elementy diagonalne tej macierzy równe zeru oznaczają brak kary lub nagrody za poprawną
klasyfikację. Element pozadiagonalny Cij macierzy C określa współczynnik kary za
sklasyfikowanie przykładu z klasy i-tej do klasy j-tej. W wyniku działania procedury
stworzone zostało drzewo decyzyjne przedstawione w konwencji Matlaba na rys. 5.5a oraz
Pythona na rys. 5.5b.

a) b)
Rys. 5.5 Drzewo decyzyjne z przykładu stworzone automatycznie przez program a) Matlab
oraz b) Python.

Z porównania rysunków 5.4 (utworzonego ręcznie) i 5.5 (utworzonego automatycznie przez


program) widać istotne różnice. Drzewo z rys. 5.4 posiada 7 węzłów i 8 liści, podczas gdy
drzewo stworzone automatycznie przez funkcję Matlaba fitctree (lub model

55
DecisionTreeClassifier w Pythonie) ma 8 węzłów i 9 liści. Jest więc bardziej rozbudowane a
przez to mniej optymalne. Zastosowanie powyższego drzewa do sklasyfikowania wektora
testowego x=[0.9 0.4] zapisane w postaci komendy
MATLAB Python
y=predict(T,[0.9 0.4]) y = T.predict([[0.9, 0.4]])
y

% generuje automatycznie wynik % generuje automatycznie wynik

y = 'kl2', array(['kl2'], dtype='<U3')

identycznie jak w przypadku drzewa z punktu pierwszego.


Jako następny przykład rozpatrzmy rozpoznanie 3 rodzajów kwiatów irysa na
podstawie jego 4 parametrów (długość i szerokość kielicha kwiatowego i płatka, w
centymetrach.). Poniżej podane są linie programów.

MATLAB Python
load fisheriris % funkcja Matlaba from sklearn import datasets
C=[0 10 10 iris = datasets.load_iris()
10 0 10 meas = iris.data
10 10 0]; species = iris.target
% T = fitctree(meas, species)
T =
T=fitctree(meas,species, 'splitcriterion', tree.DecisionTreeClassifier(criterion="gini",
'gdi','cost',C, 'MinLeafSize',1); min_samples_leaf=10, max_depth=4)
T.fit(meas,species)

view(T,'Mode','graph') fig = plt.figure(figsize=(45,40), dpi=30)


_ = tree.plot_tree(T,

class_names=iris["target_names"],
filled=True)

Wynik w postaci drzewa przedstawiony jest poniżej (Rys. 5.6)

a) b)
Rys. 5.6 Drzewo decyzyjne z przykładu rozpoznania kwiatów irysa

56
Testowanie drzewa przy pomocy danych testujących innych niż te użyte w uczeniu dały
następujące wyniki
MATLAB Python
y=predict(T,[ 5.31 3.55 1.42 0.23]) y = T.predict( [ [ 5.31, 3.55, 1.42,
0.23] ])
=> y = {'setosa'}
iris["target_names"][y[0]]

=> 'setosa'

y=predict(T,[ 5.95 3.12 5.18 1.93] y = T.predict( [ [ 5.95, 3.12, 5.18,


1.93] ])
=> y= {'virginica'}
iris["target_names"][y[0]]

=> 'virginica'

Jako inny przykład rozpatrzymy zastosowanie drzewa decyzyjnego do zadania regresji.


Zadaniem modelu jest aproksymacja funkcji sinus w zadanym zakresie zmienności. Poniższy
program pokazuje rozwiązanie dla dwu wartości parametru MinParentSize =3 (rozbicie
danych w węźle następuje po przekroczeniu 3 różnych atrybutów w węźle) oraz
MinParentSize =10 (dopiero po przekroczeniu 10 różnych wartościach atrybutu w węźle
następuje jego podział).
MATLAB Python
clear all X= np.array([np.arange(0, 10,0.1)]).T;
X=0:0.1:10; d=np.sin(X);
X=X';
d=sin(X);

T=fitrtree(X,d, 'splitcriterion', T =
'mse','MinParentSize',3); tree.DecisionTreeRegressor(min_samples_split=3
view(T,'Mode','graph'); );
T.fit(X, d)

Xtest=0:0.126:10; Xtest=np.array( [np.arange(0,10, 0.126)] ).T;


Xtest=Xtest'; y = T.predict(Xtest)
y=predict(T,Xtest)
figure,subplot(2,1,1),plot(X,d,'r',Xtest,y,'b plt.subplot(2,1,1)
'), grid, xlabel('x'), ylabel('f(x)') plt.plot(X,d)
T=fitrtree(X,d, 'splitcriterion', plt.plot(Xtest, y)
'mse','MinParentSize',10); plt.title("min_samples_split=3")
view(T); plt.grid()
T =
tree.DecisionTreeRegressor(min_samples_split=1
0);
T.fit(X, d)

Xtest=0:0.126:10; Xtest=np.array( [np.arange(0,10, 0.126)] ).T;


Xtest=Xtest'; y = T.predict(Xtest)
y=predict(T,Xtest)
plt.subplot(2,1,2)
subplot(2,1,2),plot(X,d,'r',Xtest,y,'b'), plt.plot(X,d)
grid, xlabel('x'), ylabel('f(x)') plt.plot(Xtest, y)
view(T,'Mode','graph') plt.title("min_samples_split=10")
plt.grid()
plt.tight_layout()

Już przy parametrze MinParentSize=3 następuje wystarczająco dokładne odwzorowanie


funkcji sinus, ale stosujące ogromną liczbę węzłów. Zwiększenie wartości tego parametru do
10 powoduje, że dopiero przy 10 różnych wartościach następuje rozdzielenie węzła. Takie
ograniczenie zdecydowanie zmniejsza liczbę węzłów i ostateczny wymiar drzewa, ale

57
kosztem dokładności odwzorowania. Uwidocznione jest to na rys. 5.7, gdzie przedstawiono
wyniki testowania drzewa na danych testujących nie użytych w uczeniu dla obu wartości
MinParentSize.

a) Matlab b) Python

Rys. 5.7 Wyniki testowania drzewa decyzyjnego dla dwu wartości parametru MinParentSize:
MinParentSize =3, MinParentSize=10 na tle wartości zadanych

Struktura drzewa decyzyjnego uzyskanego dla parametru MinParentSize =10 przedstawiona


jest na rys. 5.8.

a)

58
b)

Rys. 5.8 Struktura drzewa decyzyjnego zbudowanego automatycznie przez program w


a) Matlabie i b) Pythonie w problemie regresji przy wartości parametru MinParentSize=10

Liście tego drzewa tworzą poziomy dyskretyzacji widoczne na rys. 5.7. Dla przyjętej wartości
parametru MinParentSize=10 jest ich w sumie 21. Zmniejszenie wartości tego parametru
zwiększa liczbę liści, natomiast zwiększenie powoduje efekt odwrotny. Operując wartością
parametru MinParentSize można regulować efekt dokładności regresji rozbudowując bądź
redukując wielkość drzewa.

5.5 Las losowy drzew decyzyjnych


5.5.1 Opis metody

59
Las losowy drzew decyzyjnych (ang. Random Forests) jest odmianą zespołu drzew
decyzyjnych implementujących wiele losowo generowanych drzew decyzyjnych na raz, które
współpracując ze sobą w zespole tworzą końcowe rozwiązanie o podwyższonej dokładności
[6]. W metodzie tej do przewidywania wartości sygnału wyjściowego stosuje się zespół
wielu, stosunkowo prostych, drzew decyzyjnych. Każde z drzew dokonuje predykcji wartości
zmiennej wyjściowej na podstawie losowego zestawu zmiennych niezależnych (atrybutów
wejściowych) użytych w uczeniu. Przewidywanie wyjściowej wartości modelu odbywa się
przez głosowanie (klasyfikacja) bądź uśrednianie (zadanie regresji). Użytkownik ma wpływ
na przebieg procesu tworzenia modelu określając złożoność drzew składowych, maksymalną
liczbę drzew tworzących model jak również kryterium zakończenia procesu uczenia. Model
lasu losowego dobrze sprawdza się na bardzo dużych zbiorach danych, z ogromną liczbą
zmiennych niezależnych (predyktorów) bez konieczności ich usuwania.
Przyjmijmy liczbę przykładów uczących (obserwacji) równą n, każdy o wymiarze N
równym maksymalnej liczbie zmiennych wejściowych (atrybutów). W metodzie lasu
losowego zakłada się, że na każdym poziomie decyzji korzysta się jedocześnie z m<N
atrybutów (typowa wartość m  N ), przy czym wybór tych atrybutów dla każdego węzła
decyzyjnego jest losowy. Ze zbioru dostępnych n przykładów tworzy się zbiór uczący
zawierającą np próbek losowanych z zastępowaniem (ta sama próbka może być wylosowana
wiele razy) oraz zbiór testująco-weryfikujący zawierający pozostałe próbki. Zwykle do
uczenia używa się około 2/3 zbioru, pozostałe tworzą zbiór testujący (weryfikujący).
Równolegle tworzy się K drzew decyzyjnych, przy czym podział dostępnych danych
na część uczącą i weryfikującą odbywa się losowo dla każdego drzewa oddzielnie. W
procesie uczenia drzewa dla każdego węzła decyzyjnego wybiera się losowo m zmiennych dla
których podejmuje się decyzję klasyfikacyjną uwzględniającą warunki określone wartościami
progu dla każdej zmiennej. Zwykle decyzja jest podejmowana na podstawie sprawdzenia
jakości atrybutów wylosowanych w danym węźle decyzyjnym przy doborze zarówno
atrybutu jak i jego progu decyzyjnego, zapewniającym maksymalny uzysk klasyfikacyjny w
węźle. Procedura jest powtarzana na każdym poziomie decyzyjnym aż do uzyskania
najlepszego wyniku klasyfikacji na danych uczących dla danego poziomu. W wyniku
powtórzenia poszczególnych procesów decyzyjnych uzyskuje się w pełni wyrośnięte drzewa
(nie podlegające obcinaniu) tworzące las K drzew. Wynik klasyfikacji dla obserwacji
testowych jest ustalany poprzez głosowanie większościowe wszystkich drzew lasu przy
zasileniu ich poprzez dane zawarte w aktualnym wektorze x.

60
Zostało wykazane [6], że górne oszacowanie błędu generalizacji lasu losowego przy
dostatecznie dużej liczbie drzew może być wyrażone wzorem
 (1 − s )
2

 
g
(5.5)
s2
gdzie ρ oznacza uśredniony współczynnik korelacji między drzewami, a s jest
współczynnikiem mierzącym siłę drzew lasu. Siła ta jest rozumiana jako średnia miar
probabilistycznych dokładności klasyfikacyjnej poszczególnych drzew decyzyjnych w lesie,
przy czym miara dokładności i-tego klasyfikatora jest definiowana w postaci
prawdopodobieństwa
si = P( y ( x ) = d ) − max P( y ( x )  d ) (5.6)

We wzorze tym P oznacza prawdopodobieństwo, y(x) reprezentuje aktualną odpowiedź


drzewa przy pobudzeniu x, natomiast d jest oznaczeniem właściwej klasy, do której wektor x
w rzeczywistości przynależy. Im wyższa wartość marginesu tym jest bardziej prawdopodobne
podjęcie właściwej decyzji klasyfikacyjnej przez drzewo.
Zauważmy, że zgodnie ze wzorem (5.5) górne oszacowanie błędu generalizacji rośnie
przy wzroście korelacji działania poszczególnych drzew w lesie jak również w efekcie
zmniejszenia siły poszczególnych drzew. Losowy wybór atrybutów dla poszczególnych
węzłów drzewa prowadzi do zmniejszenia korelacji poszczególnych drzew. Zwiększenie
liczby zmiennych m prowadzi do zwiększenia siły poszczególnych drzew, ale jednocześnie
zwiększa średnią korelację ich działania w lesie. Stąd ustalenie właściwej wielkości tej
zmiennej musi uwzględniać oba aspekty i wymaga zwykle wykonania pewnej ilości
wstępnych prób.
Do głównych zalet metody lasu losowego należą:
• duża szybkość działania całego systemu
• zwiększona dokładność działania lasu, znacząco większa od dokładności
pojedynczego drzewa i porównywalna z najlepszymi klasycznymi rozwiązaniami
klasyfikatorów
• system może efektywnie operować na bardzo dużych bazach danych i wielkich
wymiarach wektora wejściowego x
• w procesie klasyfikacji, pomimo użycia ograniczonej liczby obserwacji przy
kształtowaniu pojedynczego drzewa, ze względu na wiele równolegle tworzonych
drzew, uwzględnia się praktycznie wszystkie dane uczące i zmienne nawet przy
bardzo dużej ich liczbie występującej w oryginalnej bazie danych

61
• stosunkowo łatwo jest dokonać estymacji błędu generalizacji systemu, stanowiącego
oszacowanie przyszłych błędów na danych nie uczestniczących w procesie uczenia
• metoda pozwala na estymację brakujących danych i stąd dobre wyniki uzyskuje się
przy wielu brakach zmiennych obserwowanych w oryginalnym zbiorze danych
podlegających modelowaniu
• metoda pozwala dokonać oceny, które ze zmiennych są ważne w procesie
podejmowania decyzji – stąd zastosowanie w selekcji cech diagnostycznych.
• metoda lasu losowego jest mało wrażliwa na przeuczenie; można generować dowolną
liczbę drzew w lesie. Tym nie mniej po osiągnięciu pewnej populacji drzew następuje
zwykle stagnacja funkcji błędu na określonym poziomie i dalsze dodawanie drzew w
lesie nie ma sensu.
Bardzo ważną zaletą lasu drzew decyzyjnych jest możliwość obiektywnej oceny ważności
poszczególnych cech diagnostycznych (zmiennych wejściowych sieci). Odbywa się to w
trybie testowania wytrenowanego lasu przy zastosowaniu perturbacji wartości pojedynczych
zmiennych wejściowych użytych w uczeniu (niewielkie zmiany losowe wartości kolejnych
zmiennych we wszystkich obserwacjach użytych w uczeniu sieci). Można również dokonać
perturbacji wyznaczonych wcześniej progów dla poszczególnych zmiennych w węzłach
decyzyjnych (nie zmieniając wartości samych zmiennych) osiągając podobny efekt.
Następnie notuje się zmiany wartości błędów działania sieci w stosunku do tych uzyskanych
na pierwotnych danych (niezaszumionych). Suma tych zmian dla całego zbioru wskazuje na
ważność danej cechy. Jeśli błąd wynikający z perturbacji określonej zmiennej wejściowej
wzrósł w istotny sposób, zmienna ta jest ważna w procesie podejmowania decyzji. Jeśli
natomiast perturbacja nie wpłynęła na zmianę błędu, bądź nawet zmniejszyła ten błąd w
stosunku do błędu uzyskanego na oryginalnych danych uczących, to taka zmienna traktowana
jest jako nieistotna i należy ją wyeliminować ze zbioru atrybutów wejściowych. W Matlabie
taka opcja selekcji jest zaimplementowana jako parametr OOBPermutedVarDeltaError w
programie treebagger. Można również użyć innej funkcji Matlaba
OOBPermutedVarCountRaiseMargin realizującej opcję estymacji ważności poszczególnych
zmiennych.

5.5.2 Implementacja lasu losowego


Program Matlab ma zaimplementowaną procedurę lasu losowego w postaci klasę TreeBagger
(proces uczenia lasu) i predict do wyznaczania odpowiedzi wytrenowanego modelu na nowe

62
wymuszenie [49]. Klasa TreeBagger realizuje strategię lasu drzew decyzyjnych L. Breimana
[6] zarówno w zadaniu klasyfikacji jak i regresji. W przypadku środowiska Python w
bibliotece scikit-learn [98] do dyspozycji mamy dwa osobne modele w pakiecie
sklearn.ensemble: RandomForestClassifier i RandomForestRegressor.
Podstawowy sposób wywołania tych funkcji ma postać
MATLAB Python
%Uczenie from sklearn.ensemble import
RandomForestClassifier
B=TreeBagger(K, X, d, ‘parametr1’, ‘val1’,
B = RandomForestClassifier(n_estimators=K)
‘parametr2’, ‘val2’, ...) B.fit(X,d)
%Testowanie
Y=predict(B, Xtest)

Poszczególne zmienne w wywołaniu funkcji mają następujące znaczenie:


B – struktura określająca zespół K drzew decyzyjnych;
K – liczba drzew w lesie wymaganych przez użytkownika;
X - macierz zawierająca zbiór obserwacji użytych w tworzeniu lasu, stanowiących zmienne
wejściowe; każda obserwacja to jeden wiersz macierzy, kolumny reprezentują poszczególne
atrybuty wejściowe;
d – wektor wartości zadanych odpowiadających poszczególnym obserwacjom zawartym w
macierzy X. Może przyjmować wartości numeryczne lub znakowe.
Sterowanie algorytmem można osiągnąć przy zastosowaniu odpowiedniego zbioru
parametrów i przypisanie im pożądanych wartości. Pełny zestaw tych parametrów można
uzyskać przy pomocy funkcji help w Matlabie, lub odwiedzając stronę biblioteki scikit-learn z
dokumentacją modelu RandomForestClassifier2. Do najważniejszych z punktu widzenia
użytkownika należą:
FBoot – udział procentowy danych użytych w uczeniu w stosunku do pełnego zbioru danych
(pozostała część danych jest zastosowana do weryfikacji lasu) (Python: bootstrap=true).
NVarToSample – liczba atrybutów m wybieranych losowo dla każdego węzła decyzyjnego.
Wartość wbudowana jest równa wartości całkowitej najbliższej pierwiastkowi kwadratowemu
z wymiaru N wektorów x dla klasyfikatora lub 1/3N w przypadku zadania regresji (Python:
max_samples).
W – wektor wag przypisanych obserwacjom przy tworzeniu zespołu drzew decyzyjnych
'oobpred' 'on'– parametr ustawiony na 'on' pozwala zapamiętać które obserwacje służą do
testowania (weryfikacji) wytrenowanego drzewa. Takie ustawienie parametru pozwala

2
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

63
wyznaczyć estymowaną przynależność do klas wszystkich obserwacji użytych w uczeniu
przy użyciu funkcji oobPredict. (Python: oob_score=True)
'Method' – rodzaj drzewa decyzyjnego, wartość tego parametru może być równa
'classification' lub 'regression'. W przypadku regresji wektor d musi przyjmować wartości
numeryczne (opcja dostępna wyłącznie w przypadku Matlaba, w środowisku Python należy
wybrać inną klasę modelu sklearn.ensemble.RandomForestRegressor).
oobError – metoda obliczająca błąd testowania lasu na danych weryfikujących ze zbioru X.
Przedstawia sobą średnie prawdopodobieństwo błędu klasyfikacji kolejnych drzew (od
jednego do maksymalnej liczby K, Python: atrybut wytrenowanego modelu oob_score_,
uzupełniany wyłącznie, gdy podczas inicjalizacji klasy podano oob_score=True).
Wytrenowany las losowy o parametrach zapisanych w strukturze B może być użyty w
predykcji (funkcja predict) odpowiedzi lasu na pobudzenie w postaci nowego zbioru danych
opisanego macierzą X. W wyniku wywołania tej funkcji

MATLAB Python
y = predict(B,X) y = B.predict(X)

otrzymuje się wektor y o liczbie wierszy równej liczbie wierszy macierzy X. Kolejny element
tego wektora przedstawia sobą odpowiedź lasu na wymuszenie w postaci danych zawartych w
odpowiednim wierszu macierzy X. W przypadku klasyfikatora będzie to oznaczenie klasy,
natomiast w przypadku zadania regresji są to wartości numeryczne estymowanej odpowiedzi.
Możliwe jest wzbogacenie wyników o inne wartości, np. odchylenie standardowe wyniku.
Więcej informacji można uzyskać przy pomocy funkcji help Matlaba.
Przykład programu wykorzystującego klasę TreeBagger w klasyfikacji danych 5-
wymiarowych generowanych losowo przypisanych do 3 klas przedstawiony jest poniżej.
MATLAB Python
% Przykład użycia klasy TreeBagger # Przykład użycia RandomForestClassifier
x1=1+randn(20,5); from numpy.random import randn
x2=-2+randn(20,5); x1=1+randn(20,5)
x3=3+randn(20,5); x2=-2+randn(20,5)
x=[x1;x2;x3]; x3=3+randn(20,5)
d=[ones(20,1);2*ones(20,1);3*ones(20,1)]; x=np.concatenate((x1,x2,x3),axis=0)
d=np.concatenate( ([1]*20,[2]*20,[3]*20) , axis=0)

b = TreeBagger(50,x,d,'oobpred','on', B = RandomForestClassifier(50,
'OOBVarImp', 'on', 'NVarToSample',3, oob_score=True,
'OOBPredictorImportance','on') max_samples=3)
B.fit(x,d)
% Ważność cech
q1=b.OOBPermutedVarDeltaError; plt.bar(np.arange(0,5), B.feature_importances_)
figure(1),bar(q1)

% Inna metoda oceny ważności cech # Inna metoda oceny ważności cech
q2=b.OOBPermutedVarCountRaiseMargin; # brak odpowiednika
figure(2),bar(q2)

64
% out-of-bag error # out-of-bag error
figure(3),plot(oobError(b)) def oobError(B):
xlabel('Liczba drzew') error = []
ylabel('Błąd klasyfikacji na danych for K in range(1,B.n_estimators+1):
weryfikujących') _B = RandomForestClassifier(K,
grid oob_score=True, max_samples=3)
_B.fit(x,d)
error.append(1-_B.oob_score_)
return error

plt.figure()
plt.plot(oobError(B))
plt.xlabel('Liczba drzew')
plt.ylabel('''Błąd klasyfikacji na danych
weryfikujących''')
plt.grid()

Na rys. 5.9 przedstawiono wykresy prawdopodobieństwa błędu klasyfikacji uzyskanego w


wyniku procesu uczenia lasu dla danych weryfikujących w funkcji liczby drzew lasu
(każdorazowe uruchomienie programu może generować nieco inne wyniki, co wyraźnie
widać zwłaszcza w przypadku różnych środowisk Matlaba i Pythona).

a) b)
Rys. 5.9 Wykres błędu testowania na danych weryfikujących z przykładu: a) Matlab, b)
Python

Z wykresu widać, że mała liczba drzew w lesie w ogólności powoduje zwiększenie


prawdopodobieństwa popełnienia błędnej klasyfikacji na danych nie uczestniczących w
uczeniu.
W Matlabie istnieje również implementacja lasu losowego w postaci funkcji
fitcensemble. Ona również pozwalająca na określenie jakości (wartości diagnostycznej)
poszczególnych atrybutów wejściowych przy wykorzystaniu specjalnej funkcji
oobPermutedPredictorImportance. Przykład takiego użycia w problemie klasyfikacji
pokazany jest poniżej (fitcensemble jest innym wywołaniem funkcji lasu losowego). Moduł
sc-kit-learn w Pythonie nie posiada dokładnego odpowiednika. Niemniej, do wyciągnięcia

65
istotności cech wykorzystujących permutacje możemy użyć funkcji
sklearn.inspection.permutation_importance3¶.
MATLAB Python
% Badanie ważności cech diagnostycznych # Badanie ważności cech diagnostycznych
x1=1+randn(20,5); # Przykład użycia permutation_importance
x2=-2+randn(20,5); from numpy.random import randn
x3=3+randn(20,5); from sklearn.inspection import
x=[x1;x2;x3]; permutation_importance
d=[ones(20,1);2*ones(20,1);3*ones(20,1)];
Mdl = fitcensemble(x,d,'Method', ... x1=1+randn(20,5)
'Bag','NumLearningCycles',50); x2=-2+randn(20,5)
x3=3+randn(20,5)
% funkcja badajaca ważność cech x=np.concatenate((x1,x2,x3),axis=0)
imp = d=np.concatenate( ([1]*20,[2]*20,[3]*20) , axis=0)
oobPermutedPredictorImportance(Mdl);

figure; B = RandomForestClassifier(50,
bar(imp); oob_score=True,
title({'Out-of-Bag Permuted Predictor' max_samples=3)
'Importance Estimates'}); B.fit(x,d)
ylabel('Estimates');
xlabel('Predictors'); result = permutation_importance(B, x, d,
h = gca; n_repeats=50)
h.XTickLabel = Mdl.PredictorNames;
h.XTickLabelRotation = 90; plt.bar(np.arange(0,5), result.importances_mean)
h.TickLabelInterpreter = 'none'; plt. title('''Out-of-Bag Permuted Predictor
Importance Estimates''');
plt.ylabel('Estimates');
plt.xlabel('Predictors');

Na rysunku 5.10 przedstawione zostały wykresy istotności cech dla przypadku danych
losowych.

a) b)
Rys. 5.10 Wykresy słupkowe przedstawiające istotność cech dla przykładowych danych
losowych a) Matlab, b) Python

3
https://scikit-
learn.org/stable/modules/generated/sklearn.inspection.permutation_importance.html#sklearn.inspection.permutat
ion_importance

66
Las losowy może być również użyty w problemie regresji. Przykład użycia klasy TreeBagger
w takim zadaniu pokazany jest w poniższym programie (model
sklearn.ensemble.RandomForestRegressor w Pythonie).
MATLAB Python
clear all from sklearn.ensemble import RandomForestRegressor
X=0:0.1:10;
X=X'; X=np.array( [np.arange(0,10,0.1)] ).T
d=sin(X); d=np.sin(X).ravel()
b = TreeBagger(50,X,d,...
'minleaf',3,... b = RandomForestRegressor(n_estimators=50,
'Method','regression',... min_samples_leaf=3,
'oobpred','on', ... oob_score=True)
'OOBVarImp', 'on', ... b.fit(X,d)
'NVarToSample',3) Xtest=np.array( [np.arange(0,10,0.126)] ).T
Xtest=0:0.126:10; y=b.predict(Xtest)
Xtest=Xtest';
y=predict(b,Xtest) plt.plot(X,d,'r')
figure, plot(X,d,'r',Xtest,y,'b') plt.plot(Xtest,y,'b')
grid, xlabel('x'), ylabel('f(x)') plt.grid; plt.xlabel('x'); plt.ylabel('f(x)')

a) b)
Rys. 5.11 Przebiegi funkcji sin(x) oraz jej regresji z wykorzystaniem lasów losowych drzew w
programie: a) Matlab, b) Python

Drzewa decyzyjne zgromadzone w zespole wykazują bardzo dobre działanie zarówno w


zadaniach klasyfikacji (głosowanie większościowe) jak i regresji (uśrednianie wyników
poszczególnych członków zespołu). W efekcie dużego zainteresowania takim rozwiązaniem
powstało wiele implementacji zespołu.
Jednym z takich rozwiązań jest tak zwany Extra Random Forest (ERF), zwany również
Extra Trees. Oba rozwiązania (RF i ERF) stosują wiele drzew decyzyjnych, zintegrowanych w
jeden werdykt zespołu poprzez głosowanie większościowe (klasyfikacja) lub uśrednianie
arytmetyczne w problemach regresji. Procedura rozrostu drzewa jest również podobna.
Wyniki uzyskane przez obie implementacje lasu losowego są zbliżone do siebie, choć nie
jednakowe. Pomiędzy nimi występują pewne różnice.

67
Klasyczny RF dokonuje optymalizacji w każdym węźle podziału danych przy losowo
wybranych zmiennych (selekcja wartości progowych każdej wylosowanej zmiennej użytych
przy podziale obserwacji), natomiast ERF dobiera wartości tych progów losowo, co
przyspiesza obliczenia. Tym nie mniej po dokonanym wyborze zmiennych i wartości progów
oba algorytmy dokonują najlepszego wyboru, według którego następuje podział obserwacji
uczących.
Druga różnica występuje przy selekcji obserwacji uczących z pełnego zbioru. W
rozwiązaniu ERF procedura losowania odbywa się bez zwrotu wylosowanej obserwacji do puli
losującej, podczas gdy w klasycznym rozwiązaniu RF obserwacja wylosowana wraca do puli,
więc może być wylosowana powtórnie.

68

You might also like