Begreper & referanser
Alle nøkkelbegrepene, formlene og referansene fra Generalisering og modellvalg, 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.
At modellen lærer detaljer og støy i treningsdata så godt at ytelsen på nye data blir dårligere.
En prosedyre som roterer hvilken fold som validerer modellen, slik at flere observasjoner bidrar til ytelsesestimatet.
En innstilling som velges utenfor selve treningen, for eksempel lagbredde, læringsrate eller regulariseringsstyrke.
Antakelsene en læringsalgoritme gjør for å velge blant de mange funksjonene som passer treningsdataene, og dermed kunne generalisere. Eksempler: lineær sammenheng (lineær regresjon), at nære punkter ligner hverandre (k-NN) og aksevise trappetrinn (beslutningstrær).
At modellen er for enkel eller for sterkt regularisert til å fange mønsteret, slik at feilen er høy både på trening og validering. Tilsvarer høy bias.
Forventet kvadratfeil på nye data er . Mer fleksible modeller får lavere bias, men høyere varians, og den beste modellen minimerer summen.
Et straffeledd i tapet som gjør store vekter dyre, for eksempel ridge () eller lasso (). Bytter litt høyere bias mot lavere varians.
Å trekke eksempler med tilbakelegging fra et datasett med eksempler. Utvalget har duplikater, og omtrent 36,8 % av eksemplene blir ikke trukket (out-of-bag).
Formler
Hver formel: hva den heter, hvordan den ser ut, og hva symbolene betyr.
Gjennomsnittlig kryssvalideringsscore
Ved -fold kryssvalidering oppsummeres valideringsresultatene fra de foldene.
Bias–varians-dekomponering
Forventet kvadratfeil i et punkt , tatt over mange mulige treningssett, er bias i annen pluss varians pluss irreduserbar støy .
Ridge-tap (L2)
Kvadratstraffen krymper alle vektene jevnt mot null. Større gir høyere bias og lavere varians.
Lasso-tap (L1)
Absoluttverdistraffen kan sette vekter nøyaktig lik null og gjør dermed featureutvalg.
Out-of-bag-andel
Sannsynligheten for at et bestemt punkt aldri trekkes når punkter trekkes med tilbakelegging. Omtrent 36,8 % av dataene blir out-of-bag.
Kodesnutter
Kodesnutter fra kapittelet, vist literal.
Tre modeller, tre antakelser
import numpy as npfrom sklearn.linear_model import LinearRegressionfrom sklearn.neighbors import KNeighborsRegressorfrom sklearn.tree import DecisionTreeRegressor rng = np.random.default_rng(7)x = np.sort(rng.uniform(0, 10, 30)).reshape(-1, 1) # treningsdata mellom 0 og 10y = 2.0 * x.ravel() + 1 + rng.normal(0, 1.5, 30)x_ny = 15.0 # @param 0..20 0.5 modeller = { "lineær": LinearRegression(), "5-NN": KNeighborsRegressor(n_neighbors=5), "tre, dybde 3": DecisionTreeRegressor(max_depth=3, random_state=0),}for navn, modell in modeller.items(): print(f"{navn:13s} predikerer {modell.fit(x, y).predict([[x_ny]])[0]:6.2f}")print(f"sann sammenheng gir {2.0 * x_ny + 1:6.2f}")Prøv: Dra x_ny inn i dataområdet (0–10) og ut igjen, og se hvor «lineær», «5-NN» og «tre» predikerer likt, og hvor de skilles fra «sann sammenheng».
Bias og varians ved simulering
import numpy as npimport matplotlib.pyplot as pltP = np.polynomial.polynomial rng = np.random.default_rng(42)n = 20 # @param 15..100 5x0 = 1.2 # punktet vi studererf = lambda x: np.sin(2 * x) # den sanne sammenhengenxs = rng.uniform(0, 3, (300, n)) # 300 nye treningssett fra samme kildeys = f(xs) + rng.normal(0, 0.3, (300, n)) def bias_varians(grad): pred = np.array([P.polyval(x0, P.polyfit(x, y, grad)) for x, y in zip(xs, ys)]) return (pred.mean() - f(x0)) ** 2, pred.var() grader = np.arange(1, 10)bias2, varians = np.array([bias_varians(g) for g in grader]).Ttotal = bias2 + variansprint(f"n = {n}: lavest sum for grad {grader[total.argmin()]} (bias² {bias2[total.argmin()]:.4f} + varians {varians[total.argmin()]:.4f})") plt.figure()plt.plot(grader, bias2, label="bias²")plt.plot(grader, varians, label="varians")plt.plot(grader, total, label="sum")plt.ylim(0, 0.3)plt.xlabel("polynomgrad")plt.ylabel("feil i x = 1,2")plt.legend()plt.tight_layout()plt.show()Prøv: Dra n opp og se variansen krympe, slik at «lavest sum for grad» flytter seg til en høyere grad.
Velg grad på validering, mål på test
import numpy as npimport matplotlib.pyplot as plt seed = 3 # @param 0..20rng = np.random.default_rng(seed)x = rng.uniform(-1, 1, 60)y = np.cos(3 * x) + rng.normal(0, 0.25, 60)tren, val, test = np.split(rng.permutation(60), [36, 48]) # 36 / 12 / 12 def mse(koef, idx): return np.mean((np.polyval(koef, x[idx]) - y[idx]) ** 2) grader = list(range(1, 9))modeller = {g: np.polyfit(x[tren], y[tren], g) for g in grader}beste = min(grader, key=lambda g: mse(modeller[g], val)) # valg på VALIDERINGprint(f"seed {seed}: valgt grad {beste}, test-MSE målt én gang: {mse(modeller[beste], test):.3f}") plt.figure()plt.plot(grader, [mse(modeller[g], tren) for g in grader], label="trening")plt.plot(grader, [mse(modeller[g], val) for g in grader], label="validering")plt.yscale("log")plt.xlabel("polynomgrad")plt.ylabel("MSE (log-skala)")plt.legend()plt.tight_layout()plt.show()Prøv: Dra seed og se om «valgt grad» blir den samme hver gang, og hvor mye «test-MSE» svinger.
Lekkasjefri kryssvalidering med pipeline
import numpy as npfrom sklearn.feature_selection import SelectKBest, f_classiffrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import StratifiedKFold, cross_val_scorefrom sklearn.pipeline import make_pipelinefrom sklearn.preprocessing import StandardScaler rng = np.random.default_rng(4172)X = rng.normal(size=(100, 500)) # 500 features med ren støyy = rng.integers(0, 2, size=100) # labels uten sammenheng med Xk = 10 # @param 1..100folder = StratifiedKFold(n_splits=5, shuffle=True, random_state=0) # Riktig: skalering og utvalg tilpasses på nytt i hver treningsfoldmodell = make_pipeline(StandardScaler(), SelectKBest(f_classif, k=k), LogisticRegression(max_iter=1000))riktig = cross_val_score(modell, X, y, cv=folder) # Galt: featurene velges med ALLE labels før kryssvalideringenX_lekk = SelectKBest(f_classif, k=k).fit_transform(X, y)galt = cross_val_score(LogisticRegression(max_iter=1000), X_lekk, y, cv=folder) print(f"pipeline (riktig): {riktig.mean():.2f}")print(f"utvalg før CV (galt): {galt.mean():.2f}")Prøv: Dra k opp og se «utvalg før CV (galt)» klatre, mens «pipeline (riktig)» blir liggende rundt 0,5.
Bootstrap og out-of-bag-andelen
import numpy as np rng = np.random.default_rng(10)n = 1000 # @param 2..2000gjentak = 200 # antall bootstrap-utvalg trekk = rng.integers(0, n, size=(gjentak, n)) # hver rad: n trekk MED tilbakeleggingantall = np.array([np.bincount(rad, minlength=n) for rad in trekk]) # ganger hvert punkt ble trukket print(f"aldri trukket (out-of-bag): {np.mean(antall == 0):.3f}")print(f"trukket nøyaktig én gang: {np.mean(antall == 1):.3f}")print(f"trukket to ganger eller mer: {np.mean(antall >= 2):.3f}")print(f"teori for out-of-bag: (1 - 1/n)^n = {(1 - 1 / n) ** n:.3f}, grensen 1/e = {np.exp(-1):.3f}")Prøv: Dra n fra små verdier oppover og se «aldri trukket (out-of-bag)» nærme seg «grensen 1/e» = 0,368.
Læringsmål
Hva du skal kunne etter å ha lest kapittelet.
- 01Forklar hva induktiv bias er, og angi antakelsen bak lineære modeller, k-NN og beslutningstrær
- 02Diagnostiser under- og overtilpasning fra en tabell med trenings- og valideringsfeil
- 03Regn ut bias i annen og varians fra prediksjoner, og forklar hvordan modellkompleksitet flytter balansen
- 04Forklar hvordan ridge og lasso straffer vektene, og hva som skjer når regulariseringsstyrken øker
- 05Skill parametre fra hyperparametre, og forklar hvorfor testsettet bare røres én gang
- 06Gjennomfør lekkasjefri k-fold kryssvalidering og regn ut antall modeller og foldstørrelser
- 07Sammenlign kryssvalidering og bootstrap, og regn ut den forventede out-of-bag-andelen