Drzewa decyzyjne

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.

Zobacz także:

  • Piotr Szymański

    Kategoria:

    Hejka! Zapraszam na skrót z minionych dwóch tygodni, który przyswoić możecie przy ciepłej herbatce w te mroczne, szare dni. W opublikowanym przez Google 14 listopada ostrzeżeniu wskazano kilka najważniejszych rodzajów oszustw internetowych. Uwagę zwrócono między na niebezpieczne techniki ataków typu cloaking, które nabierają nowego wymiaru dzięki wykorzystaniu sztucznej inteligencji. Cloaking polega na ukrywaniu przed użytkownikiem […]
  • Piotr Szymański

    Kategoria:

    Hejka po dłuższej przerwie! Zaczynamy świeżym tematem. Raptem kilkanaście godzin temu do użytkowników trafiła, zapowiedziana 25 lipca, funkcja SearchGPT od OpenAI, umożliwiająca, w przeciwieństwie do tradycyjnych modeli językowych, na integrację z internetem w czasie rzeczywistym. SearchGPT ma dostęp do aktualnych informacji z sieci, co pozwala na udzielanie odpowiedzi opartych na najnowszych danych. Ponadto SearchGPT dostarcza […]
  • Piotr Szymański

    Kategoria:

    Hejson! Dzisiejsza konsumpcja mediów ma to do siebie, że odbywa się na 5-6 calowym ekranie telefonu. Ma też to do siebie, że zanim zdjęcie dotrze do Ciebie, to przejdzie przez 6 konwersacji na jedynym słusznym messengerze, zatem zostanie 6-cio krotnie skompresowane. W międzyczasie, jak będziecie mieli pecha, to jakiś wujek zrobi screena, zamiast zapisać zdjęcie […]
  • Piotr Szymański

    Kategoria:

    Hej! Robimy bardzo dużo zdjęć, a co za tym idzie – wiele z nich jest niechlujnych, z zabałagnionym tłem. Możemy jednak chcieć wykorzystać je do pochwalenia się naszym ryjkiem na jakimś publicznym profilu, gdyż np. naturalne, miękkie światło korzystnie eksponuje naszą facjatę. Podejścia mogą być dwa – albo zdecydujemy się na blur bądź zupełne usunięcie […]
  • Piotr Szymański

    Kategoria:

    Strzałeczka. Nvidia przejęła OctoAI, startup specjalizujący się w optymalizacji modeli uczenia maszynowego. To już piąta akwizycja Nvidii w 2024 roku, co czyni aktualnie nam panujący rok rekordowym pod względem liczby przejęć. OctoAI, założone w 2019 roku przez Luisa Ceze, skupiło się na tworzeniu oprogramowania zwiększającego wydajność modeli uczenia maszynowego na różnych platformach sprzętowych. Oprogramowanie OctoAI […]