Drzewa decyzyjne to jedna z najbardziej intuicyjnych i wszechstronnych technik analizy danych, stosowanych zarówno w statystyce, jak i uczeniu maszynowym. Niezwykła w swojej prostocie metoda potrafi dostarczyć potężnych wyników. W tym wpisie zajmiemy się podstawami drzew decyzyjnych oraz przyjrzymy się, jak można je wykorzystać.
Wzory i przykładowe wyliczenia miar używanych podczas podziału zostały opisane w poście: https://thedatagame.tech/?p=738.
Teoria
Wyobraź sobie drzewo z korzeniem, rozgałęzieniami i liśćmi. Korzeń to zbiór danych – podstawa, na której budujemy algorytm, gałęzie reprezentują podejmowane decyzje – ścieżki, którymi podąża każdy rozpatrywany przykład, liście zaś to pogrupowane przykłady. Proces tworzenia drzewa decyzyjnego opiera się więc na podziale zestawu danych na segmenty (gałęzie), aż do osiągnięcia segmentów, które są na tyle jednorodne, że można je sklasyfikować (liście). Wybór cechy do podziału oraz punktu podziału jest zazwyczaj optymalizowany, aby zminimalizować pewien miernik złożoności, entropię lub indeks Giniego.
W procesie budowy i użycia drzewa decyzyjnego, wyróżnić można zatem następujące etapy:
1. Inicjalizacja: tworzy się korzeń drzewa, reprezentujący cały zbiór danych.
2. Wybór zmiennej decyzyjnej: dla każdej dostępnej zmiennej, dla każdej jej wartości, oblicza się jej związek z zmienną celu (np. Gini, entropia – dla problemu klasyfikacji) i wybiera się tą, która pozwala na dokonanie najlepszego podziału.
3. Podział zbioru danych: zbiór jest dzielony na mniejsze podzbiory na podstawie wartości wybranej zmiennej decyzyjnej.
4. Tworzenie węzłów: dla każdego z utworzonych podzbiorów danych tworzy się nowy węzeł, który jest powiązany z węzłem macierzystym (poprzednim) przez warunek podziału.
Rekurencja: powyższe kroki są powtarzane dla każdego nowo utworzonego węzła, aż do osiągnięcia warunku stopu (np. zadanej głębokości drzewa, brak redukcji niejednoznaczności itp.).
Klasyfikacja: gdy drzewo jest już gotowe, można sklasyfikować nowy przypadek, przemieszczając się po nim od korzenia do liści i stosując warunki podziału dla każdego węzła. Ostatecznie, przypadek zostanie przypisany do klasy reprezentowanej przez liść, do którego trafi.
Wady i zalety drzew decyzyjnych:
Zalety drzew decyzyjnych:
1. Interpretowalność: Drzewa decyzyjne są łatwe do zrozumienia i interpretacji, co czyni je przydatnym narzędziem w procesie podejmowania decyzji. Możesz w prosty sposób zrozumieć, dlaczego konkretna decyzja została podjęta, przeglądając strukturę drzewa.
2. Dobrze radzą sobie z danymi kategorycznymi i numerycznymi: Drzewa decyzyjne mogą obsługiwać zarówno dane kategoryczne, jak i numeryczne, co czyni je wszechstronnym narzędziem.
3. Skalowalność: Są stosunkowo szybkie w uczeniu się na małych i średnich zbiorach danych. Dodatkowo, drzewa mogą być rozbudowywane, co pozwala na tworzenie bardziej złożonych modeli.
4. Odporność na brakujące dane: Drzewa potrafią obsłużyć przypadki brakujących danych, co nie zawsze jest możliwe w innych algorytmach uczenia maszynowego.
Wady drzew decyzyjnych:
1. Overfitting: Drzewa decyzyjne mogą łatwo dopasować się do szumu w danych treningowych, co prowadzi do zjawiska overfittingu. Dla dużych, zbyt rozbudowanych drzew, model może być zbyt dopasowany do danych treningowych i słabo generalizować na nowe dane.
2. Brak stabilności: Małe zmiany w danych treningowych mogą prowadzić do znaczących zmian w strukturze drzewa, co czyni je niestabilnymi.
3. Bias: Drzewa decyzyjne mogą być podatne na przesunięcie (bias) w kierunku większościowej klasy, szczególnie w przypadku niezbalansowanych zbiorów danych.
4. Niedokładność: Drzewa mogą osiągać niższą dokładność niż niektóre bardziej zaawansowane algorytmy, szczególnie w zadaniach o dużej złożoności.
5. Trudność w modelowaniu pewnych problemów: Niektóre problemy, takie jak problem XOR, są trudne do rozwiązania za pomocą pojedynczego drzewa decyzyjnego, ponieważ wymagają skomplikowanych struktur decyzyjnych.
Przykład
Spróbujmy stworzyć proste drzewo decyzyjne w pythonie. W tym celu skorzystamy z popularnego zbioru Breast Cancer. Zbiór ten zawiera zestaw cech opisujących komórki nowotworowe wyodrębnione z badań mammograficznych. Te cechy obejmują m.in. średnicę komórek, symetrię jądra, teksturę i wiele innych. Każda próbka jest przypisana do jednej z dwóch klas: nowotwór złośliwy (malignant) lub nowotwór łagodny (benign). Jest to stosunkowo niewielki zbiór danych, co czyni go odpowiednim do eksperymentów i nauki algorytmów klasyfikacji.
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_breast_cancer from sklearn.tree import DecisionTreeClassifier, plot_tree from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix # Wczytanie zestawu danych Breast Cancer: data = load_breast_cancer() X = pd.DataFrame(data.data, columns=data.feature_names) y = data.target # Podział danych na zestawy treningowy testowy: X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) X_train.head()
Fragment wczytanego df’a:
Wytrenujmy i wyświetlmy drzewo:
# Stworzenie i wytrenowanie modelu: clf = DecisionTreeClassifier(max_depth=3) clf.fit(X_train, y_train) # Wyświetlenie drzewa za pomocą plot_tree: plt.figure(figsize=(16, 10)) # Zwiększ rozmiar wykresu plot_tree(clf, feature_names=list(X.columns), class_names=list(data.target_names), filled=True, rounded=True, fontsize=10, # Zmniejsz rozmiar czcionki impurity=True) # Wyświetl miarę nieczystości dla każdego węzła plt.show()
A następnie oceńmy dokładność predykcji:
y_pred = clf.predict(X_test) conf_matrix = confusion_matrix(y_test, y_pred) plt.figure(figsize=(6, 4)) sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names) plt.xlabel('Predicted') plt.ylabel('True') plt.title('Confusion Matrix') plt.show()
Na koniec warto wspomnieć jeszcze o najważniejszych parametrach, które możemy ustawić podczas budowy modelu:criterion
: określa metrykę używaną do oceny jakości podziału w węźle. Dwa popularne kryteria to “gini” (indeks Gini) i “entropy” (entropia).max_depth
: maksymalna głębokość drzewa. Ograniczenie głębokości może pomóc w zapobieganiu overfittingowi.min_samples_split
: minimalna liczba próbek wymagana do podziału węzła. Ograniczenie tego parametru może pomóc w kontrolowaniu złożoności drzewa.min_samples_leaf
: minimalna liczba próbek w liściu. Ograniczenie tego parametru może pomóc w zapobieganiu overfittingowi.max_features
: określa liczbę cech branych pod uwagę podczas poszukiwania najlepszego podziału.