Kurs uczenia maszynowego od zera · Lekcja 5.2 · 27 z 33 gotowych lekcji · 10 min
Zespoły modeli: czemu wiele drzew bije jedno
W skrócie
Zespół łączy wiele niedoskonałych modeli, których błędy częściowo się znoszą. Las losowy zyskuje trafność i stabilność z każdym nowym drzewem.
Rozgrzewka Dwa pytania z wcześniejszych lekcji. Minuta, a lekcji nie blokuje.
Poproś jedną osobę, żeby zgadła, ile cukierków jest w dużym słoju, a strzał może być zupełnie chybiony. Poproś kilkaset osób i uśrednij ich odpowiedzi, a wynik często okazuje się zaskakująco bliski prawdy. Nikt nie zmądrzał. Błędy po prostu szły w różne strony i się znosiły. Czy da się tak zbudować model — z wielu przeciętnych?
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ź: Zwykłe drzewo
Las z jednym drzewem trafia w 70,9% pasażerów testowych, a zwykłe drzewo w 73,9%: pojedyncze drzewo z losowaniami jest nawet słabsze. Pomaga dopiero uśrednianie wielu drzew: 10 drzew daje 76,1%, a 100 drzew 76,9%.
Spróbuj
- Zacznij od suwaka liczby drzew ustawionego na jedno i porównaj las z pojedynczym drzewem. Przy jednym drzewie „las” to po prostu jedno zrandomizowane drzewo.
- Stopniowo podnoś suwak liczby drzew i patrz na trafność lasu na teście. Zauważ, w którym miejscu przestaje wyraźnie rosnąć.
- Dokładaj dalej. Czy trafność lasu zaczyna spadać, jak trafność głębokiego drzewa w lekcji 9, czy się stabilizuje?
- Porównaj pojedyncze drzewo z dużym lasem. Któremu powierzyłbyś przypadek, którego nigdy nie widziałeś?
Gdy już sprawdzisz to w labie, zobaczmy, co się tam właściwie działo.
Pomysł w prostych słowach
Zespół (ang. ensemble) to model złożony z wielu modeli, których przewidywania się łączy: przez głosowanie przy kategoriach albo uśrednianie przy liczbach. Najsłynniejszy zespół to las losowy, zaproponowany przez Leo Breimana w 2001 roku: duża liczba drzew decyzyjnych, każde wyhodowane trochę inaczej, które głosują razem.
Lekcja 9 skończyła się na słabości drzew: mała zmiana w danych potrafi dać zupełnie inne drzewo. Pojedyncze głębokie drzewo jest jak jeden pewny siebie zgadywacz — bystry, ale nieobliczalny. Las zamienia tę nieobliczalność w atut. Jeśli każde drzewo myli się inaczej, głos większości ma rację częściej niż typowe drzewo.
Dlaczego to działa
Kluczowe słowo to inaczej. Uśrednianie identycznych modeli niczego nie zmienia; ich pomyłki są te same. Las losowy sprawia, że drzewa się różnią, na dwa sposoby. Po pierwsze, każde drzewo uczy się na próbie bootstrapowej: wierszach wylosowanych ze zbioru treningowego ze zwracaniem, więc każde widzi trochę inny zbiór — jedne wiersze powtórzone, innych brak. Ten pomysł nazywa się baggingiem. Po drugie, przy każdym podziale drzewo może wybierać tylko spośród losowego podzbioru cech, więc nie wszystkie drzewa opierają się na tej samej najsilniejszej cesze.
Statystyka mówi, ile to daje. Jeśli błąd każdego drzewa ma wariancję σ², a błędy dowolnych dwóch drzew są skorelowane ze współczynnikiem ρ, to średnia z n drzew ma wariancję
ρ·σ² + (1 − ρ)·σ² / n
Drugi składnik maleje, gdy dodajesz drzewa, i dla dużego n znika. Pierwszy nie: to ta część błędu, którą wszystkie drzewa mają wspólną. Ten sam efekt znasz z codzienności: średnia ocen wielu recenzentów jest pewniejsza niż opinia jednego, ale tylko wtedy, gdy recenzenci nie przepisują od siebie nawzajem. Jeśli wszyscy przeczytali wcześniej tę samą recenzję i powtarzają ją swoimi słowami, ich średnia jest niewiele warta — to właśnie duże ρ. Dlatego losowość jest taka ważna. Im mniej drzewa są do siebie podobne (im mniejsze ρ), tym więcej zyskuje las — i dlatego dokładanie drzew od pewnego momentu prawie nic nie daje.
Miła konsekwencja: dokładanie drzew nie sprawia, że las uczy się bardziej na pamięć. Każde nowe drzewo po prostu dołącza do głosowania, a przewidywania lasu się uspokajają, zamiast dziczeć. Ceną za więcej drzew jest czas obliczeń, a nie przeuczenie.
Jest druga duża rodzina zespołów, boosting, która działa odwrotnie: zamiast niezależnych drzew, które głosują, buduje małe drzewa jedno po drugim, a każde poprawia błędy poprzednich. Drzewa wzmacniane gradientowo często wygrywają na danych tabelarycznych, także w wielu konkursach Kaggle.
Częsty błąd
Zespół nie stworzy informacji, której nie ma w cechach. Jeśli każde drzewo daje się nabrać w ten sam sposób — na przykład przez cechę, która zdradza odpowiedź, albo przez dane niereprezentatywne dla ludzi, o których będziesz przewidywać — głosowanie tylko powtórzy ten sam błąd z większą pewnością. Skorelowany składnik we wzorze to właśnie ten wspólny błąd. Inny błąd to założenie, że więcej drzew zawsze pomaga: gdy zyski się wypłaszczą, kolejne drzewa kosztują już tylko czas. I wreszcie las jest dużo trudniejszy do przeczytania niż pojedyncze drzewo; wymieniasz schemat blokowy na trafność.
Drzewa i lasy dzielą przestrzeń cech na prostokątne pudełka. W następnej lekcji poznamy model, który zamiast tego płynnie wygina granicę: sieć neuronową.
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
- Zespół łączy wiele modeli; błędy idące w różne strony się znoszą.
- Las losowy różnicuje drzewa próbami bootstrapowymi i losowymi podzbiorami cech.
- Błąd wspólny dla wszystkich drzew się nie uśrednia, więc zyski z kolejnych drzew się wypłaszczają.
- Więcej drzew kosztuje czas, ale nie przeucza lasu; boosting to druga, sekwencyjna rodzina zespołów.
Głębiej: wzór, kod, praktyka
Matematyka
Las uśrednia przewidywania n drzew. Niech błąd każdego drzewa ma wariancję σ², a błędy dowolnych dwóch drzew korelację ρ. Wtedy średnia ma wariancję:
Var = ρ·σ² + (1 − ρ)·σ² / n
- Drugi składnik,
(1 − ρ)·σ² / n, to ta część, która maleje, gdy dodajesz drzewa. - Pierwszy składnik,
ρ·σ², to podłoga: błąd wspólny wszystkim drzewom. Żadna liczba drzew go nie usunie. - Dla niezależnych drzew (
ρ = 0) wariancja spada jakσ² / n. Dla identycznych drzew (ρ = 1) nie spada wcale. - Próby bootstrapowe i losowe podzbiory cech służą temu, by obniżyć
ρ. - Uśrednianie zmniejsza tylko część wariancyjną błędu. Obciążenie, które mają wspólne wszystkie drzewa, zostaje, więc las obciążonych drzew nadal jest obciążony.
W kodzie (Python)
Prawdziwy las losowy na pasażerach Titanica, z 2 cechami próbowanymi w każdym podziale. Używa tego samego podziału co kod z lekcji 9, a nie podziału z laba, więc liczby różnią się od labowych 73,9% i 76,9%. Notebook podlinkowany pod wynikiem sam pobierze dane.
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
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
tree = DecisionTreeClassifier(random_state=0).fit(Xtr, ytr)
print(f"one full tree: test {tree.score(Xte, yte):.3f}")
for n in (1, 10, 100, 500):
forest = RandomForestClassifier(n_estimators=n, max_features=2, random_state=0).fit(Xtr, ytr)
print(f"forest of {n:3d}: test {forest.score(Xte, yte):.3f}")
oob = RandomForestClassifier(n_estimators=500, max_features=2, oob_score=True, random_state=0).fit(Xtr, ytr)
print(f"out-of-bag estimate (500 trees, training rows only): {oob.oob_score_:.3f}")
Wynik
one full tree: test 0.780
forest of 1: test 0.754
forest of 10: test 0.806
forest of 100: test 0.802
forest of 500: test 0.802
out-of-bag estimate (500 trees, training rows only): 0.809
Jedno drzewo z losowaniami (0,754) jest gorsze niż jedno pełne drzewo (0,780), ale głosowanie bije oba: 10 drzew daje 0,806, a 100 i 500 drzew daje 0,802. Las się stabilizuje, a nie spada, jak głębokie drzewo w lekcji 9. Oszacowanie out-of-bag, 0,809, liczy się tylko na wierszach treningowych.
Pobierz notebook (.ipynb). Otwórz go w Jupyterze albo wgraj do Google Colab; brakujące dane pobierze sam.
Dla praktyka
- Zacznij od wartości domyślnych, na przykład 100–500 drzew, a potem sprawdź na danych walidacyjnych, gdzie krzywa się spłaszcza. Dalej dodatkowe drzewa kosztują tylko czas i pamięć.
- Zanim zaczniesz stroić liczbę drzew, dostrój liczbę cech próbowanych w podziale oraz głębokość lub rozmiar liścia. To one zmieniają korelację między drzewami.
- Używaj wyniku out-of-bag (
oob_score=True) jako darmowego oszacowania: każdy wiersz treningowy jest przewidywany tylko przez te drzewa, których próba bootstrapowa go pominęła, i te przewidywania są oceniane. Nie stroj modelu na zbiorze testowym. - Sprawdź, skąd są dane, zanim zaufasz głosowaniu. Jeśli cecha przeciekająca wprowadza w błąd wszystkie drzewa, las powtórzy błąd z jeszcze większą pewnością.
- Las trudno czytać. Ważność cech daje przybliżony ranking, ale faworyzuje cechy o wielu różnych wartościach; bezpieczniejsza jest ważność permutacyjna na danych wstrzymanych.
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: