CMD + K

Kapittel 10Begreper & formler · Ensembler: bagging, random forest og boosting
Referanseside · Kapittel 10

Begreper & referanser

Alle nøkkelbegrepene, formlene og referansene fra Ensembler: bagging, random forest og boosting, samlet på én side. Bruk denne som oppslag når du leser, øver flashcards eller tar quiz.

Øv med flashcards15 kort fra dette kapittelet

Begreper

Sentrale begreper fra kapittelet med korte definisjoner.

01Bagging

Trening av flere modeller på bootstrap-utvalg og aggregering av prediksjonene deres.

02Random forest

Et bagging-ensemble av beslutningstrær som også bruker tilfeldige featureutvalg ved splittene.

03Gradient boosting

En sekvensiell ensemblemetode der hver ny modell trenes for å korrigere den foreløpige modellens feil.

04Bootstrap-utvalg

Et utvalg på rader trukket med tilbakelegging fra et datasett med rader. Noen rader kommer med flere ganger og andre ikke i det hele tatt, og i snitt er rundt av de unike radene med.

05Out-of-bag

Radene som ikke kom med i bootstrap-utvalget til et tre, i snitt rundt . Trærne som ikke har sett en rad, kan predikere den ærlig, og det gir et OOB-estimat av testfeilen uten eget valideringssett.

06AdaBoost

Boostingmetode der svake lærere trenes etter hverandre på vektede data. Feilklassifiserte punkter får høyere vekt i neste runde, og hver lærer får stemmevekten i den endelige avstemningen.

07Pseudo-residual

Den negative gradienten av tapet med hensyn til dagens prediksjon, , som hvert nytt tre i gradient boosting tilpasses. Med kvadratisk tap er den den vanlige residualen .

Formler

Hver formel: hva den heter, hvordan den ser ut, og hva symbolene betyr.

flertallsstemme

Flertallsstemme

Et klassifikasjonsensemble kan velge klassen flest av de modellene stemmer på.

ŷensemblets predikerte klasse
h_m(x)prediksjonen fra modell m
Mantall modeller
gradient-boosting

Gradient boosting

Boosting legger til et nytt tre som korrigerer feilene i den foreløpige modellen.

F_m(x)ensemblet etter steg m
h_m(x)det nye treets korreksjon
ηlæringsrate
adaboost-alfa

AdaBoost-stemmevekt

Stemmevekten til lærer ut fra den vektede feilen . Lav feil gir stor vekt, gir , og gir negativ vekt.

α_mstemmevekten til lærer m
ε_mvektet feil til lærer m
adaboost-vektoppdatering

AdaBoost-vektoppdatering

Med er for feilklassifiserte punkter, som da ganges med , og for riktige, som ganges med . normaliserer slik at vektene summerer til 1.

w_ivekten til punkt i
y_ifasit, −1 eller +1
h_m(x_i)prediksjonen til lærer m
Z_mnormaliseringskonstant
ensemble-varians

Varians for et snitt av modeller

Variansen til snittet av modeller som hver har varians og parvis korrelasjon . Det andre leddet forsvinner når vokser, men det første gjør det ikke: korrelasjonen setter et gulv.

σ²variansen til én modell
ρkorrelasjon mellom to modeller
Mantall modeller

Kodesnutter

Kodesnutter fra kapittelet, vist literal.

Kode

Bootstrap og flertallsstemme

Python
import numpy as np rng = np.random.default_rng(4172)n = 1000  # @param 2..1000traer = 5  # @param 1..51 2 # 200 bootstrap-utvalg: n trekk med tilbakelegging, tell unike raderandeler = [np.unique(rng.integers(0, n, size=n)).size / n for _ in range(200)]print(f"andel unike rader i snitt: {np.mean(andeler):.3f}")print(f"teori 1 - (1 - 1/n)^n:     {1 - (1 - 1 / n) ** n:.3f}") # Flertallsstemme: trær som hver har rett med sannsynlighet 0,7, uavhengigstemmer = rng.random(size=(traer, 2000)) < 0.7   # True = riktig stemmeprint(f"ett tre har rett:          {stemmer[0].mean():.3f}")print(f"flertallet av {traer:2d} har rett: {(stemmer.mean(axis=0) > 0.5).mean():.3f}")

Prøv: Dra n ned mot 5 og se «andel unike rader» stige over 0,632; dra traer opp og se «flertallet av … har rett» nærme seg 1.

Kode

Snittet av korrelerte modeller

Python
import numpy as npimport matplotlib.pyplot as plt rng = np.random.default_rng(10)rho = 0.5  # @param 0..1 0.05sigma2 = 4.0                                   # varians i feilen til én modellM = np.arange(1, 101)                          # antall modeller i ensembletfelles = rng.normal(size=(5000, 1))            # feil alle modellene deleregen = rng.normal(size=(5000, 100))            # feil hver modell har alenefeil = np.sqrt(sigma2) * (np.sqrt(rho) * felles + np.sqrt(1 - rho) * egen)simulert = (np.cumsum(feil, axis=1) / M).var(axis=0)   # varians til snittet av de M førsteformel = rho * sigma2 + (1 - rho) * sigma2 / Mprint(f"rho = {rho:.2f}: varians {simulert[0]:.2f} for én modell, {simulert[24]:.2f} for 25, {simulert[99]:.2f} for 100")print(f"gulvet rho·σ² = {rho * sigma2:.2f} forsvinner ikke uansett hvor mange modeller du legger til") plt.figure()plt.plot(M, simulert, label="simulert")plt.plot(M, formel, label="formel ρσ² + (1 − ρ)σ²/M")plt.ylim(0, sigma2 * 1.05)plt.xlabel("antall modeller M")plt.ylabel("varians til snittet")plt.legend()plt.tight_layout()plt.show()

Prøv: Dra rho fra 0 mot 0,9 og se «varians … for 100» stoppe på gulvet «rho·σ²»: med korrelerte modeller hjelper flere modeller nesten ikke.

Kode

Random forest mot gradient boosting

Python
import numpy as npfrom sklearn.datasets import make_classificationfrom sklearn.ensemble import GradientBoostingClassifier, RandomForestClassifierfrom sklearn.model_selection import train_test_split X, y = make_classification(n_samples=600, n_features=8, n_informative=4,                           flip_y=0.08, random_state=3)X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0)bagging = 0  # @param 0..1laeringsrate = 0.1  # @param 0.05..1 0.05 rf = RandomForestClassifier(n_estimators=100, max_features=None if bagging else "sqrt",                            oob_score=True, random_state=0).fit(X_tr, y_tr)print(f"{'bagging' if bagging else 'random forest'}: trening {rf.score(X_tr, y_tr):.2f}, "      f"OOB {rf.oob_score_:.2f}, test {rf.score(X_te, y_te):.2f}") gb = GradientBoostingClassifier(n_estimators=200, learning_rate=laeringsrate,                                max_depth=2, random_state=0).fit(X_tr, y_tr)tren = [np.mean(p == y_tr) for p in gb.staged_predict(X_tr)]   # accuracy etter hver rundetest = [np.mean(p == y_te) for p in gb.staged_predict(X_te)]for m in [1, 10, 50, 200]:    print(f"boosting, {m:>3} runder: trening {tren[m - 1]:.2f}, test {test[m - 1]:.2f}")

Prøv: Dra laeringsrate mot 1 og se «trening» for boosting nå 1,00 raskere mens «test» flater ut; sett bagging til 1 for vanlig bagging.

Læringsmål

Hva du skal kunne etter å ha lest kapittelet.

  1. 01Forklar hva et bootstrap-utvalg er, og regn ut andelen rader som blir out-of-bag
  2. 02Forklar hvorfor bagging reduserer varians, og hvorfor korrelasjon mellom trærne begrenser gevinsten
  3. 03Forklar hvordan random forest dekorrelerer trærne med tilfeldig featureutvalg ved hver split
  4. 04Regn ut stemmevekten og de nye vektene i én AdaBoost-runde
  5. 05Regn ut én runde gradient boosting med residualer og læringsrate
  6. 06Sammenlign bagging og boosting med hensyn til bias, varians og parallellisering