Professional Documents
Culture Documents
Rozdz5 Drzewa
Rozdz5 Drzewa
Rozdz5 Drzewa
Drzewa decyzyjne
5.1 Wprowadzenie
43
5.2 Struktura drzewa decyzyjnego
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.
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
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.
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.
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
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)
class_names=iris["target_names"],
filled=True)
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'
=> 'virginica'
T=fitrtree(X,d, 'splitcriterion', T =
'mse','MinParentSize',3); tree.DecisionTreeRegressor(min_samples_split=3
view(T,'Mode','graph'); );
T.fit(X, d)
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
a)
58
b)
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.
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)
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.
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)
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()
a) b)
Rys. 5.9 Wykres błędu testowania na danych weryfikujących z przykładu: a) Matlab, b)
Python
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
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