Kurs uczenia maszynowego od zera · Lekcja 5.1 · 26 z 33 gotowych lekcji · 10 min
Drzewa decyzyjne: dwadzieścia pytań do danych
W skrócie
Drzewo decyzyjne klasyfikuje, zadając pytania tak lub nie, z których każde możliwie czysto dzieli dane. Przykład: kto przeżył katastrofę Titanica.
Rozgrzewka Dwa pytania z wcześniejszych lekcji. Minuta, a lekcji nie blokuje.
Pamiętasz grę w dwadzieścia pytań? „Czy to żyje?”, „Czy jest większe od kota?”. Dobry gracz nie pyta na chybił trafił; zadaje pytanie, które odcina mniej więcej połowę pozostałych możliwości. Drzewo decyzyjne to model, który gra w tę grę z danymi — a ponieważ jego pytania da się zapisać zwykłym językiem, to jeden z nielicznych modeli, które można czytać jak schemat blokowy.
Wybierz odpowiedź i pewność.
Odpowiedz, żeby odblokować lab.
Eksperyment
Ten interaktywny eksperyment działa w przeglądarce z włączonym JavaScriptem. Tekst wokół opisuje, co w nim widać.
Pokaż odpowiedź
Poprawna odpowiedź: Płytkie (głębokość 1)
Głębokość 20 ma 98,7% na treningu, ale 73,9% na teście. Głębokość 1 ma 79,3% na treningu i 77,2% na teście. Głębokie drzewo zapamiętało pasażerów (114 z jego 145 liści obejmuje najwyżej 5 osób), zamiast nauczyć się reguły; najlepszy wynik testowy, 79,5%, daje głębokość 3.
Spróbuj
- Ustaw suwak maksymalnej głębokości na 1. Drzewo może zadać tylko jedno pytanie. Przeczytaj je na liście podziałów: którą cechę algorytm uznał za najbardziej pouczającą?
- Podnoś suwak głębokości o jeden krok. Patrz, jak rośnie trafność treningowa, i porównuj ją z trafnością testową przy każdej głębokości.
- Przesuń suwak głębokości na maksimum. Czy trafność treningowa jest bliska idealnej? Co stało się z testową?
- Znajdź głębokość z najlepszą trafnością testową i przeczytaj tam najważniejsze podziały. Umiałbyś wytłumaczyć to drzewo komuś w dwóch zdaniach?
Gdy już sprawdzisz to w labie, zobaczmy, co się tam właściwie działo.
Pomysł w prostych słowach
Drzewo decyzyjne przewiduje, zadając ciąg pytań tak lub nie o cechy: „Czy pasażer ma mniej niż tyle lat?”, „Czy płynął pierwszą klasą?”. Każda odpowiedź kieruje przykład do jednej gałęzi, a kolejne pytanie zależy od poprzednich odpowiedzi. Na końcu każdej ścieżki jest liść z przewidywaniem — zwykle najczęstszą etykietą wśród przykładów treningowych, które tam trafiły.
W tej lekcji korzystamy z danych o 891 pasażerach Titanica, z których 342 przeżyło. Cechy to między innymi klasa biletu, płeć, wiek, liczba krewnych na pokładzie i cena biletu. Drzewo uczy się, które pytania o te cechy najlepiej oddzielają tych, którzy przeżyli, od tych, którzy zginęli.
Pomyśl o pielęgniarce na izbie przyjęć, która prowadzi segregację pacjentów. Nie liczy ważonej sumy; idzie krótkim łańcuchem pytań — oddycha? krwawi? jest przytomny? — z których każde zawęża, co robić. Drzewo to taki łańcuch, tylko wyuczony z danych, a nie spisany przez lekarzy. Dzięki temu można je pokazać ekspertowi i zapytać: „czy to ma sens?” — czego z większością innych modeli zrobić się nie da.
Dlaczego to działa
Drzewo buduje się od góry, po jednym pytaniu. Na każdym kroku algorytm próbuje każdej cechy i każdej możliwej wartości odcięcia i pyta: które pytanie dzieli tę grupę na dwie grupy możliwie czyste, czyli takie, w których dominuje jedna etykieta? Popularną miarą nieczystości grupy jest indeks Giniego:
Gini = 1 − Σ pₖ²
gdzie pₖ to udział etykiety k w grupie. Grupa, w której wszyscy mają tę samą etykietę, ma Gini równy 0; grupa podzielona po połowie między dwie etykiety ma Gini 0,5, najgorszy możliwy przy dwóch klasach. Algorytm wybiera pytanie, które najbardziej obniża średnią nieczystość, a potem powtarza procedurę osobno w każdej gałęzi. Takie zachłanne szukanie krok po kroku nie gwarantuje najlepszego możliwego drzewa, ale jest szybkie i w praktyce dobrze działa.
Zostawione samo sobie drzewo dzieli dalej, aż każdy liść będzie czysty — nawet jeśli w liściu siedzi jeden pasażer. Wtedy nauczyło się danych treningowych na pamięć, razem z szumem: przeuczenie z lekcji 7 w nowym przebraniu. Główne pokrętło to maksymalna głębokość, czyli liczba pytań dozwolona na każdej ścieżce. Płytkie drzewo łatwo przeczytać, ale może przegapić prawdziwe wzorce; głębokie dopasowuje się do danych treningowych prawie idealnie i gorzej uogólnia. Uczciwym sposobem wyboru głębokości jest walidacja krzyżowa z lekcji 8.
Częsty błąd
Podział to nie wyjaśnienie przyczyny. Drzewo pyta o cechę, która w tych danych najlepiej rozdziela etykiety, a ta może zastępować coś innego: klasa biletu i jego cena idą w parze i obie mówią coś o tym, gdzie na statku pasażer spał. Drugi błąd to zaufanie głębokiemu drzewu dlatego, że jego reguły wyglądają tak precyzyjnie. Reguła w rodzaju „wiek od 31,5 do 32,5 i bilet droższy niż tyle” to zwykle opis jednego czy dwóch pasażerów, a nie wzorzec. Małe zmiany w danych potrafią też zmienić pierwszy podział, a przez to całe drzewo, co czyni pojedyncze drzewa niestabilnymi.
Ta niestabilność to słabość, ale da się z niej zrobić siłę. W następnej lekcji wyhodujemy wiele różnych drzew i pozwolimy im głosować.
Quiz
Trzy pytania na sprawdzenie się. Wybierz odpowiedź albo rozwiń odpowiedź pod pytaniem. Z klawiatury: strzałki wybierają, Enter albo spacja zatwierdza.
Najważniejsze wnioski
- Drzewo decyzyjne przewiduje łańcuchem pytań tak lub nie, który da się czytać jak schemat blokowy.
- Każdy podział wybiera się zachłannie tak, żeby powstałe grupy były możliwie czyste, na przykład według indeksu Giniego.
- Maksymalna głębokość steruje złożonością: płytkie drzewa są niedouczone, głębokie uczą się na pamięć.
- Podział pokazuje, co rozdziela etykiety w danych, a nie co jest przyczyną wyniku.
Głębiej: wzór, kod, praktyka
Matematyka
Dla grupy z udziałami etykiet pₖ mamy Gini = 1 − Σ pₖ². Przy dwóch klasach przyjmuje wartości od 0 (jedna etykieta) do 0,5 (pół na pół). Cała tabela Titanica, 342 ocalałych z 891, ma Gini = 1 − (342/891)² − (549/891)² ≈ 0,473.
Podział wysyła n_L wierszy w lewo i n_R w prawo, n = n_L + n_R. Jego jakość to spadek nieczystości: Δ = G(rodzic) − (n_L/n) · G(lewy) − (n_R/n) · G(prawy). Drzewo wybiera pytanie o największym Δ, a potem powtarza to w każdej gałęzi. Entropia, −Σ pₖ log₂ pₖ, to alternatywna miara nieczystości o podobnym zachowaniu.
Drzewo o głębokości d ma najwyżej 2^d liści. Liść przewiduje etykietę większościową swoich wierszy treningowych, więc liść z jednym pasażerem przewiduje dokładnie jego etykietę.
W kodzie (Python)
891 pasażerów i sześć cech (płeć jako 0/1, brakujący wiek uzupełniony medianą z treningu) oraz stratyfikowany podział z 30% na test. To ten sam rodzaj eksperymentu co w labie, ale inny podział, więc liczby trochę różnią się od labowych. Notebook podlinkowany pod wynikiem sam pobierze dane.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
df = pd.read_csv("data/raw/titanic.csv")
X = pd.DataFrame({"female": (df["sex"] == "female").astype(int)}).join(df[["pclass", "age", "sibsp", "parch", "fare"]])
Xtr, Xte, ytr, yte = train_test_split(X, df["survived"], test_size=0.3, stratify=df["survived"], random_state=1)
Xtr, Xte = Xtr.fillna({"age": Xtr["age"].median()}), Xte.fillna({"age": Xtr["age"].median()}) # mediana z treningu dla obu zbiorów
print(f"passengers {len(df)}, survived {df['survived'].sum()}")
for d in (1, 3, 20):
t = DecisionTreeClassifier(max_depth=d, random_state=0).fit(Xtr, ytr)
print(f"depth {d:2d}: train {t.score(Xtr, ytr):.3f}, test {t.score(Xte, yte):.3f}, leaves {t.get_n_leaves()}")
Wynik
passengers 891, survived 342
depth 1: train 0.780, test 0.802, leaves 2
depth 3: train 0.833, test 0.802, leaves 8
depth 20: train 0.986, test 0.780, leaves 141
Drzewo o głębokości 1 to jedno pytanie. Drzewo o głębokości 20 jest prawie idealne na pasażerach treningowych, a na testowych gorsze niż to jedno pytanie.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
Dla praktyka
- Ogranicz drzewo:
max_depth,min_samples_leafalboccp_alpha(przycinanie). Wartość wybieraj walidacją krzyżową, a nie trafnością treningową. - Nie czytaj głębokiego drzewa jak zestawu reguł. Liść z garstką pasażerów to pamięć, a nie prawidłowość.
- Drzewa nie wymagają skalowania cech, ale wymagają liczb. Zakoduj kategorie (np. płeć jako 0/1) i zdecyduj, co zrobić z brakami. Uzupełnianie dopasuj tylko na zbiorze treningowym.
- Pojedyncze drzewo jest niestabilne: mała zmiana danych może zmienić pierwszy podział. Jeśli zależy ci tylko na trafności, bezpieczniejszy jest zespół drzew.
- Podział to twierdzenie o tych danych, a nie o przyczynie. Klasa biletu i cena zastępują się nawzajem, więc drzewo może wybrać dowolną z nich.
Czy to było pomocne?
Dzięki! To pomaga nam poprawiać Atlas.
Więcej w Atlasie
Hasła encyklopedii o pojęciach z tej lekcji: