- Drzewo decyzyjne to Technika uczenia się pod nadzorem można go zastosować zarówno do problemów klasyfikacji, jak i regresji, ale przede wszystkim jest preferowany do rozwiązywania problemów klasyfikacji. Jest to klasyfikator o strukturze drzewiastej, gdzie węzły wewnętrzne reprezentują cechy zbioru danych, gałęzie reprezentują reguły decyzyjne I każdy węzeł liścia reprezentuje wynik.
- W drzewie decyzyjnym znajdują się dwa węzły, którymi są: Węzeł decyzyjny I Węzeł liścia. Węzły decyzyjne służą do podejmowania dowolnej decyzji i mają wiele gałęzi, podczas gdy węzły liści są wynikiem tych decyzji i nie zawierają żadnych dalszych gałęzi.
- Decyzje lub test podejmowane są na podstawie cech danego zbioru danych.
- Nazywa się je drzewem decyzyjnym, ponieważ podobnie jak drzewo zaczyna się od węzła głównego, który rozwija się na dalsze gałęzie i konstruuje strukturę drzewiastą.
- Aby zbudować drzewo, używamy algorytm KOSZYKA, co oznacza Algorytm drzewa klasyfikacji i regresji.
- Drzewo decyzyjne po prostu zadaje pytanie i na podstawie odpowiedzi (Tak/Nie) dzieli drzewo na poddrzewa.
- Poniższy diagram wyjaśnia ogólną strukturę drzewa decyzyjnego:
Uwaga: Drzewo decyzyjne może zawierać dane kategoryczne (TAK/NIE), a także dane liczbowe.
Dlaczego warto używać drzew decyzyjnych?
W uczeniu maszynowym istnieją różne algorytmy, dlatego wybór najlepszego algorytmu dla danego zbioru danych i problemu jest główną kwestią, o której należy pamiętać podczas tworzenia modelu uczenia maszynowego. Poniżej znajdują się dwa powody korzystania z drzewa decyzyjnego:
- Drzewa decyzyjne zwykle naśladują zdolność ludzkiego myślenia podczas podejmowania decyzji, dzięki czemu są łatwe do zrozumienia.
- Logikę stojącą za drzewem decyzyjnym można łatwo zrozumieć, ponieważ ma ono strukturę drzewiastą.
Terminologie dotyczące drzew decyzyjnych
Jak działa algorytm drzewa decyzyjnego?
teoria drzew i grafów
W drzewie decyzyjnym algorytm przewidywania klasy danego zbioru danych rozpoczyna się od węzła głównego drzewa. Algorytm ten porównuje wartości atrybutu root z atrybutem rekordu (rzeczywistego zbioru danych) i na podstawie porównania podąża za gałęzią i przeskakuje do następnego węzła.
Dla kolejnego węzła algorytm ponownie porównuje wartość atrybutu z pozostałymi podwęzłami i przechodzi dalej. Kontynuuje proces, aż dotrze do węzła liścia drzewa. Cały proces można lepiej zrozumieć, korzystając z poniższego algorytmu:
Przykład: Załóżmy, że mamy kandydata, który ma ofertę pracy i chce zdecydować, czy przyjąć tę ofertę, czy nie. Aby rozwiązać ten problem, drzewo decyzyjne zaczyna się od węzła głównego (atrybut Salary według ASM). Węzeł główny dzieli się dalej na następny węzeł decyzyjny (odległość od biura) i jeden węzeł liścia w oparciu o odpowiednie etykiety. Następny węzeł decyzyjny zostaje dalej podzielony na jeden węzeł decyzyjny (obiekt kabinowy) i jeden węzeł liściowy. Na koniec węzeł decyzyjny dzieli się na dwa węzły-liście (oferty zaakceptowane i oferta odrzucona). Rozważ poniższy diagram:
Miary wyboru atrybutów
Podczas wdrażania drzewa decyzyjnego pojawia się główny problem, jak wybrać najlepszy atrybut dla węzła głównego i podwęzłów. Aby rozwiązać takie problemy, istnieje technika zwana tzw Miara wyboru atrybutu lub ASM. Dzięki temu pomiarowi możemy łatwo wybrać najlepszy atrybut dla węzłów drzewa. Istnieją dwie popularne techniki ASM, którymi są:
1. Zysk informacyjny:
- Zysk informacyjny to pomiar zmian entropii po segmentacji zbioru danych na podstawie atrybutu.
- Oblicza, ile informacji o klasie dostarcza nam dana funkcja.
- W zależności od wartości przyrostu informacji dzielimy węzeł i budujemy drzewo decyzyjne.
- Algorytm drzewa decyzyjnego zawsze stara się maksymalizować wartość przyrostu informacji, a węzeł/atrybut mający najwyższy zysk informacji jest dzielony jako pierwszy. Można go obliczyć korzystając z poniższego wzoru:
Information Gain= Entropy(S)- [(Weighted Avg) *Entropy(each feature)
Entropia: Entropia to metryka służąca do pomiaru zanieczyszczenia w danym atrybucie. Określa losowość danych. Entropię można obliczyć jako:
Entropy(s)= -P(yes)log2 P(yes)- P(no) log2 P(no)
Gdzie,
2. Indeks Giniego:
- Indeks Giniego jest miarą domieszki lub czystości wykorzystywaną przy tworzeniu drzewa decyzyjnego w algorytmie CART (Classification and Regression Tree).
- Preferowana powinna być cecha o niskim indeksie Giniego w porównaniu z wysokim indeksem Giniego.
- Tworzy tylko podziały binarne, a algorytm CART wykorzystuje indeks Giniego do tworzenia podziałów binarnych.
- Indeks Giniego można obliczyć korzystając z poniższego wzoru:
Gini Index= 1- ∑<sub>j</sub>P<sub>j</sub><sup>2</sup>
Przycinanie: uzyskiwanie optymalnego drzewa decyzyjnego
Przycinanie to proces usuwania niepotrzebnych węzłów z drzewa w celu uzyskania optymalnego drzewa decyzyjnego.
Zbyt duże drzewo zwiększa ryzyko nadmiernego dopasowania, a małe drzewo może nie uchwycić wszystkich ważnych cech zbioru danych. Dlatego technika, która zmniejsza rozmiar drzewa uczenia się bez zmniejszania dokładności, nazywana jest przycinaniem. Istnieją głównie dwa rodzaje drzew przycinanie zastosowana technologia:
Zalety drzewa decyzyjnego
- Łatwo to zrozumieć, ponieważ przebiega według tego samego procesu, którym kieruje się człowiek podejmując jakąkolwiek decyzję w prawdziwym życiu.
- Może być bardzo przydatny przy rozwiązywaniu problemów związanych z podejmowaniem decyzji.
- Pomaga przemyśleć wszystkie możliwe skutki problemu.
- W porównaniu z innymi algorytmami wymagane jest mniejsze czyszczenie danych.
Wady drzewa decyzyjnego
- Drzewo decyzyjne zawiera wiele warstw, co czyni je złożonym.
- Może występować problem z nadmiernym dopasowaniem, który można rozwiązać za pomocą Algorytm Losowego Lasu.
- W przypadku większej liczby etykiet klas złożoność obliczeniowa drzewa decyzyjnego może wzrosnąć.
Implementacja drzewa decyzyjnego w Pythonie
Teraz zaimplementujemy drzewo decyzyjne przy użyciu języka Python. W tym celu użyjemy zbioru danych „ dane_użytkownika.csv ”, którego używaliśmy w poprzednich modelach klasyfikacji. Korzystając z tego samego zbioru danych, możemy porównać klasyfikator drzewa decyzyjnego z innymi modelami klasyfikacji, takimi jak KNN SVM, Regresja logistyczna itp.
Kroki również pozostaną takie same, które podano poniżej:
1. Etap wstępnego przetwarzania danych:
Poniżej znajduje się kod etapu wstępnego przetwarzania:
# 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)
W powyższym kodzie dane zostały wstępnie przetworzone. Gdzie załadowaliśmy zbiór danych, który jest podany jako:
2. Dopasowanie algorytmu drzewa decyzyjnego do zbioru uczącego
Teraz dopasujemy model do zbioru uczącego. W tym celu zaimportujemy plik Klasyfikator drzewa decyzji klasa od sklearn.tree biblioteka. Poniżej znajduje się jego kod:
#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)
W powyższym kodzie utworzyliśmy obiekt klasyfikatora, w którym przekazaliśmy dwa główne parametry;
Poniżej znajduje się wynik tego:
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. Przewidywanie wyniku testu
Teraz będziemy przewidywać wynik zestawu testowego. Stworzymy nowy wektor predykcyjny y_pred. Poniżej znajduje się jego kod:
#Predicting the test set result y_pred= classifier.predict(x_test)
Wyjście:
Na poniższym obrazie wyjściowym podano przewidywany wynik i rzeczywisty wynik testu. Wyraźnie widać, że w wektorze predykcyjnym znajdują się pewne wartości, które różnią się od wartości wektora rzeczywistego. To są błędy prognoz.
kolekcje Java Java
4. Sprawdź dokładność wyniku (macierz tworzenia zamieszania)
W powyższym wyniku widzieliśmy, że było kilka błędnych przewidywań, więc jeśli chcemy poznać liczbę prawidłowych i błędnych przewidywań, musimy skorzystać z macierzy zamieszania. Poniżej znajduje się jego kod:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
Wyjście:
Na powyższym obrazie wyjściowym możemy zobaczyć macierz zamieszania, która ma 6+3= 9 błędnych przewidywań I 62+29=91 prawidłowych przewidywań. Można zatem powiedzieć, że w porównaniu do innych modeli klasyfikacji klasyfikator Drzewa decyzyjnego dokonał dobrej prognozy.
5. Wizualizacja wyniku zbioru uczącego:
Tutaj zwizualizujemy wynik zestawu treningowego. Aby zwizualizować wynik zbioru uczącego, narysujemy wykres dla klasyfikatora drzewa decyzyjnego. Klasyfikator przewidzi odpowiedź „tak” lub „nie” dla użytkowników, którzy kupili lub nie kupili samochód typu SUV, tak jak to zrobiliśmy w przypadku regresji logistycznej. Poniżej znajduje się jego kod:
#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()
Wyjście:
Powyższy wynik różni się całkowicie od pozostałych modeli klasyfikacji. Zawiera linie pionowe i poziome, które dzielą zbiór danych według wieku i szacowanej zmiennej wynagrodzenia.
Jak widzimy, drzewo próbuje przechwycić każdy zbiór danych, co ma miejsce w przypadku nadmiernego dopasowania.
6. Wizualizacja wyniku zestawu testowego:
Wizualizacja wyniku zbioru testowego będzie podobna do wizualizacji zbioru uczącego, z tą różnicą, że zbiór uczący zostanie zastąpiony zbiorem testowym.
#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()
Wyjście:
Jak widać na powyższym obrazku, w fioletowym obszarze znajdują się zielone punkty danych i odwrotnie. Są to więc błędne przewidywania, które omówiliśmy w macierzy zamieszania.