ML Atlas

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.
Z lekcji 5.1: Drzewa decyzyjne: dwadzieścia pytań do danych Drzewo bez limitu głębokości osiąga prawie idealną trafność treningową. Dlaczego to sygnał ostrzegawczy?

Pokaż odpowiedź

Poprawna odpowiedź: Bo pewnie zapamiętało pasażerów z treningu, więc gorzej uogólni

Drzewo, które dzieli, aż każdy liść jest czysty, dopasowuje się do szumu próbki — klasyczny objaw przeuczenia.

Z lekcji 4.6: Pipeline: od tabeli do predykcji Co robi walidacja krzyżowa na treningu, gdy skaler siedzi w pipeline’ie?

Pokaż odpowiedź

Poprawna odpowiedź: Dopasowuje skaler w każdym foldzie od nowa, tylko na jego części do nauki

Pipeline to jeden model, więc w każdym foldzie cała maszyna uczy się od zera. Fold, który akurat udaje test, nie dotyka ani skalera, ani kNN.

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?

Przewidź, potem sprawdź Las losowy złożony z tylko jednego drzewa (losowa próbka pasażerów, 2 cechy do wyboru przy każdym podziale) i zwykłe drzewo wyhodowane do końca: które wypadnie lepiej na pasażerach testowych?
Jak bardzo jesteś pewny(-a)?

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.

1. Dlaczego uśrednianie wielu drzew pomaga tylko wtedy, gdy drzewa się różnią?
Pokaż odpowiedź

Poprawna odpowiedź: Bo identyczne drzewa mylą się tak samo, więc uśrednianie nic nie znosi

Błędy znoszą się tylko wtedy, gdy idą w różne strony; wspólna część błędu zostaje po uśrednieniu.

2. Czym jest próba bootstrapowa?
Pokaż odpowiedź

Poprawna odpowiedź: Wierszami wylosowanymi ze zbioru treningowego ze zwracaniem

Losowanie ze zwracaniem daje każdemu drzewu trochę inny zbiór danych, przez co drzewa różnią się w użyteczny sposób.

3. Zwiększasz las losowy z 300 do 3000 drzew. Jaki jest najbardziej prawdopodobny skutek?
Pokaż odpowiedź

Poprawna odpowiedź: Trafność zostaje mniej więcej taka sama, a trening trwa dużo dłużej

Gdy niezależna część błędu już się uśredniła, kolejne drzewa dokładają obliczeń, ale mało trafności i żadnego dodatkowego uczenia na pamięć.

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.

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.

Więcej w Atlasie

Hasła encyklopedii o pojęciach z tej lekcji: