- Rozhodovací strom je a Technika učení pod dohledem který může být použit pro klasifikační i regresní problémy, ale většinou je preferován pro řešení klasifikačních problémů. Jedná se o stromově strukturovaný klasifikátor, kde vnitřní uzly představují vlastnosti datové sady, větve představují rozhodovací pravidla a každý listový uzel představuje výsledek.
- V rozhodovacím stromě jsou dva uzly, kterými jsou Rozhodovací uzel a Listový uzel. Rozhodovací uzly se používají k rozhodování a mají více větví, zatímco uzly Leaf jsou výstupem těchto rozhodnutí a neobsahují žádné další větve.
- Rozhodnutí nebo test se provádí na základě vlastností daného datového souboru.
- Říká se mu rozhodovací strom, protože podobně jako strom začíná kořenovým uzlem, který se rozšiřuje o další větve a vytváří strukturu podobnou stromu.
- Abychom postavili strom, použijeme algoritmus CART, což znamená Algoritmus klasifikačního a regresního stromu.
- Rozhodovací strom jednoduše položí otázku a na základě odpovědi (Ano/Ne) dále rozdělí strom na podstromy.
- Níže uvedený diagram vysvětluje obecnou strukturu rozhodovacího stromu:
Poznámka: Rozhodovací strom může obsahovat kategorická data (ANO/NE) i číselná data.
Proč používat rozhodovací stromy?
Ve strojovém učení existují různé algoritmy, takže výběr nejlepšího algoritmu pro danou datovou sadu a problém je hlavním bodem, který je třeba pamatovat při vytváření modelu strojového učení. Níže jsou uvedeny dva důvody pro použití rozhodovacího stromu:
- Rozhodovací stromy obvykle napodobují schopnost lidského myšlení při rozhodování, takže je snadné je pochopit.
- Logiku rozhodovacího stromu lze snadno pochopit, protože ukazuje stromovou strukturu.
Terminologie rozhodovacího stromu
Jak funguje algoritmus rozhodovacího stromu?
V rozhodovacím stromu, pro predikci třídy daného datového souboru, začíná algoritmus od kořenového uzlu stromu. Tento algoritmus porovnává hodnoty kořenového atributu s atributem záznamu (skutečné datové sady) a na základě porovnání následuje větev a skočí na další uzel.
U dalšího uzlu algoritmus opět porovná hodnotu atributu s ostatními poduzly a posune se dále. Pokračuje v procesu, dokud nedosáhne listového uzlu stromu. Celý proces lze lépe pochopit pomocí níže uvedeného algoritmu:
Příklad: Předpokládejme, že existuje kandidát, který má pracovní nabídku a chce se rozhodnout, zda má nabídku přijmout nebo ne. Aby se tento problém vyřešil, rozhodovací strom začíná kořenovým uzlem (atribut Plat podle ASM). Kořenový uzel se dále dělí na další rozhodovací uzel (vzdálenost od kanceláře) a jeden listový uzel na základě odpovídajících štítků. Další rozhodovací uzel se dále rozdělí na jeden rozhodovací uzel (zařízení kabiny) a jeden listový uzel. Nakonec se rozhodovací uzel rozdělí na dva listové uzly (Přijaté nabídky a Odmítnutá nabídka). Zvažte níže uvedený diagram:
Opatření pro výběr atributů
Při implementaci stromu rozhodnutí vyvstává hlavní problém, jak vybrat nejlepší atribut pro kořenový uzel a pro poduzly. Takže k řešení takových problémů existuje technika, která se nazývá as Míra výběru atributu neboli ASM. Tímto měřením můžeme snadno vybrat nejlepší atribut pro uzly stromu. Existují dvě populární techniky pro ASM, které jsou:
1. Získávání informací:
- Informační zisk je měření změn entropie po segmentaci souboru dat na základě atributu.
- Vypočítává, kolik informací nám funkce poskytuje o třídě.
- Podle hodnoty zisku informace rozdělíme uzel a postavíme rozhodovací strom.
- Algoritmus rozhodovacího stromu se vždy snaží maximalizovat hodnotu informačního zisku a uzel/atribut s nejvyšším informačním ziskem je rozdělen jako první. Lze jej vypočítat pomocí níže uvedeného vzorce:
Information Gain= Entropy(S)- [(Weighted Avg) *Entropy(each feature)
Entropie: Entropie je metrika pro měření nečistot v daném atributu. Specifikuje náhodnost v datech. Entropii lze vypočítat takto:
Entropy(s)= -P(yes)log2 P(yes)- P(no) log2 P(no)
Kde,
2. Gini index:
- Gini index je míra nečistoty nebo čistoty používaná při vytváření rozhodovacího stromu v algoritmu CART (Klasifikační a regresní strom).
- Atribut s nízkým Gini indexem by měl být preferován ve srovnání s vysokým Gini indexem.
- Vytváří pouze binární rozdělení a algoritmus CART používá index Gini k vytváření binárních rozdělení.
- Gini index lze vypočítat pomocí níže uvedeného vzorce:
Gini Index= 1- ∑<sub>j</sub>P<sub>j</sub><sup>2</sup>
Prořezávání: Získání stromu optimálního rozhodování
Prořezávání je proces odstranění nepotřebných uzlů ze stromu za účelem získání optimálního rozhodovacího stromu.
Příliš velký strom zvyšuje riziko přemontování a malý strom nemusí zachytit všechny důležité vlastnosti datové sady. Proto je technika, která zmenšuje velikost učícího stromu bez snížení přesnosti, známá jako prořezávání. Existují především dva druhy stromů prořezávání použitá technologie:
Výhody rozhodovacího stromu
- Je to snadno pochopitelné, protože se řídí stejným procesem, který člověk sleduje, když činí jakékoli rozhodnutí v reálném životě.
- To může být velmi užitečné pro řešení problémů souvisejících s rozhodováním.
- Pomáhá přemýšlet o všech možných důsledcích problému.
- Ve srovnání s jinými algoritmy je zde menší požadavek na čištění dat.
Nevýhody rozhodovacího stromu
- Rozhodovací strom obsahuje mnoho vrstev, což jej činí složitým.
- Může se jednat o problém s přesazením, který lze vyřešit pomocí Algoritmus náhodného lesa.
- Pro více označení tříd se může zvýšit výpočetní složitost rozhodovacího stromu.
Implementace rozhodovacího stromu v Pythonu
Nyní implementujeme rozhodovací strom pomocí Pythonu. K tomu použijeme datovou sadu ' uživatelská_data.csv “, který jsme používali v předchozích klasifikačních modelech. Použitím stejného datasetu můžeme porovnat klasifikátor rozhodovacího stromu s jinými klasifikačními modely jako např KNN SVM, LogisticRegression atd.
Kroky také zůstanou stejné, které jsou uvedeny níže:
1. Krok předběžného zpracování dat:
Níže je uveden kód pro krok předběžného zpracování:
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv('user_data.csv') #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test)
Ve výše uvedeném kódu jsme data předem zpracovali. Kde jsme načetli datovou sadu, která je dána jako:
2. Přizpůsobení algoritmu rozhodovacího stromu do tréninkové sady
Nyní model přizpůsobíme tréninkové sadě. Za tímto účelem budeme importovat DecisionTreeClassifier třídy od sklearn.strom knihovna. Níže je pro něj uveden kód:
#Fitting Decision Tree classifier to the training set From sklearn.tree import DecisionTreeClassifier classifier= DecisionTreeClassifier(criterion='entropy', random_state=0) classifier.fit(x_train, y_train)
Ve výše uvedeném kódu jsme vytvořili objekt klasifikátoru, kterému jsme předali dva hlavní parametry;
Níže je k tomu výstup:
Out[8]: DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=0, splitter='best')
3. Předvídání výsledku testu
Nyní předpovíme výsledek testovací sady. Vytvoříme nový vektor predikce y_před. Níže je pro něj uveden kód:
#Predicting the test set result y_pred= classifier.predict(x_test)
Výstup:
Na níže uvedeném výstupním obrázku je uveden předpokládaný výstup a skutečný testovací výstup. Jasně vidíme, že v predikčním vektoru jsou některé hodnoty, které se liší od skutečných vektorových hodnot. To jsou chyby předpovědí.
4. Test přesnosti výsledku (Creation of Confusion matrix)
Ve výše uvedeném výstupu jsme viděli, že tam byly některé nesprávné predikce, takže pokud chceme znát počet správných a nesprávných predikcí, musíme použít matici zmatků. Níže je pro něj uveden kód:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Výstup:
Na výše uvedeném výstupním obrázku můžeme vidět matoucí matici, která má 6+3= 9 nesprávných předpovědí a 62+29=91 správných předpovědí. Můžeme tedy říci, že ve srovnání s jinými klasifikačními modely udělal klasifikátor Decision Tree dobrou předpověď.
5. Vizualizace výsledku tréninkové sady:
Zde si vizualizujeme výsledek tréninkové sestavy. Pro vizualizaci výsledku trénovací množiny vyneseme graf pro klasifikátor rozhodovacího stromu. Klasifikátor předpoví ano nebo ne pro uživatele, kteří si koupili nebo nezakoupili vůz SUV, jako jsme to udělali v Logistic Regression. Níže je pro něj uveden kód:
#Visulaizing the trianing set result from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('purple','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) fori, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('purple', 'green'))(i), label = j) mtp.title('Decision Tree Algorithm (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
Výstup:
Výše uvedený výstup je zcela odlišný od ostatních klasifikačních modelů. Má svislé i vodorovné čáry, které rozdělují soubor dat podle věku a odhadované platové proměnné.
java tutoriál
Jak vidíme, strom se snaží zachytit každou datovou sadu, což je případ přemontování.
6. Vizualizace výsledku testovací sady:
Vizualizace výsledku testovací sady bude podobná vizualizaci trénovací sady s tím rozdílem, že trénovací sada bude nahrazena testovací sadou.
#Visulaizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('purple','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) fori, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('purple', 'green'))(i), label = j) mtp.title('Decision Tree Algorithm(Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
Výstup:
Jak můžeme vidět na obrázku výše, ve fialové oblasti jsou nějaké zelené datové body a naopak. Takže toto jsou nesprávné předpovědi, o kterých jsme diskutovali ve zmatkové matici.