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.
Begreper
Sentrale begreper fra kapittelet med korte definisjoner.
Trening av flere modeller på bootstrap-utvalg og aggregering av prediksjonene deres.
Et bagging-ensemble av beslutningstrær som også bruker tilfeldige featureutvalg ved splittene.
En sekvensiell ensemblemetode der hver ny modell trenes for å korrigere den foreløpige modellens feil.
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.
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.
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.
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
Et klassifikasjonsensemble kan velge klassen flest av de modellene stemmer på.
Gradient boosting
Boosting legger til et nytt tre som korrigerer feilene i den foreløpige modellen.
AdaBoost-stemmevekt
Stemmevekten til lærer ut fra den vektede feilen . Lav feil gir stor vekt, gir , og gir negativ vekt.
AdaBoost-vektoppdatering
Med er for feilklassifiserte punkter, som da ganges med , og for riktige, som ganges med . normaliserer slik at vektene summerer til 1.
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.
Kodesnutter
Kodesnutter fra kapittelet, vist literal.
Bootstrap og flertallsstemme
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.
Snittet av korrelerte modeller
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.
Random forest mot gradient boosting
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.
- 01Forklar hva et bootstrap-utvalg er, og regn ut andelen rader som blir out-of-bag
- 02Forklar hvorfor bagging reduserer varians, og hvorfor korrelasjon mellom trærne begrenser gevinsten
- 03Forklar hvordan random forest dekorrelerer trærne med tilfeldig featureutvalg ved hver split
- 04Regn ut stemmevekten og de nye vektene i én AdaBoost-runde
- 05Regn ut én runde gradient boosting med residualer og læringsrate
- 06Sammenlign bagging og boosting med hensyn til bias, varians og parallellisering