Begreper & referanser
Alle nøkkelbegrepene, formlene og referansene fra Fra problem til datasett, 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.
Læring fra eksempler der hvert input har en kjent målverdi som modellen skal lære å predikere.
Læring uten kjente målverdier, der algoritmen leter etter struktur eller avvik i inputdataene.
Den observerte klassen eller målverdien som en veiledet modell trenes mot.
Datadelen som brukes til å tilpasse modellparametere og preprocessing-transformasjoner.
En separat datadel som brukes til modellvalg og hyperparameterjustering under utvikling.
En urørt datadel som brukes én gang til en avsluttende vurdering av valgt arbeidsflyt.
At informasjon som ikke ville vært tilgjengelig ved reell prediksjon, påvirker trening eller modellvalg.
En feature der verdiene er kategorier og ikke målte tall, for eksempel drivstofftype eller fylke. Nominelle kategorier har ingen rekkefølge og one-hot-kodes. Ordinale kategorier, som S, M og L, har en rekkefølge og kan kodes som ett heltall.
Datalekkasje der en feature er en følge av labelen eller først blir kjent etter den, for eksempel antall behandlingsdøgn brukt til å forutsi liggetid. Gir urealistisk høy score i test og svikter i bruk.
En kjede av preprocessing-steg og en modell som tilpasses og brukes som én enhet. Hvert steg tilpasses bare på treningsdataene, og i kryssvalidering tilpasses alt på nytt i hver fold. Det hindrer lekkasje.
En splitt som bevarer klasseandelene i hver del, i scikit-learn med stratify=y. Viktig når én klasse er sjelden, ellers kan trenings- og testdelen få svært ulike andeler.
Formler
Hver formel: hva den heter, hvordan den ser ut, og hva symbolene betyr.
Standardisering
Standardisering sentrerer en feature og uttrykker verdien i antall standardavvik fra middelverdien.
Min–maks-skalering
Min–maks-skalering flytter treningsområdets minste verdi til 0 og største verdi til 1.
Andel i treningssettet
Med treningsandel legges omtrent av de observasjonene i treningssettet.
One-hot-koding
En kategoriverdi erstattes av en indikatorvektor slik at kategoriene ikke får en falsk tallrekkefølge.
Antall features etter one-hot
Hver kategoriske feature med kategorier gir kolonner, mens de numeriske featurene beholdes. Med drop="first" gir hver kategoriske feature kolonner.
Kodesnutter
Kodesnutter fra kapittelet, vist literal.
En stratifisert trenings-, validerings- og testsplitt
import numpy as npfrom sklearn.model_selection import train_test_split rng = np.random.default_rng(4172)X = rng.normal(size=(1_000, 3))y = (rng.random(1_000) < 0.1).astype(int) # omtrent 10 % positivestratifiser = 1 # @param 0..1seed = 42 # @param 0..50 # Først testsettet ut, så validering fra resten: 60/20/20X_rest, X_test, y_rest, y_test = train_test_split( X, y, test_size=0.2, stratify=y if stratifiser else None, random_state=seed)X_train, X_val, y_train, y_val = train_test_split( X_rest, y_rest, test_size=0.25, stratify=y_rest if stratifiser else None, random_state=seed) for navn, ys in [("trening", y_train), ("validering", y_val), ("test", y_test)]: print(f"{navn:10s} n = {len(ys):3d}, andel positive = {ys.mean():.3f}")Prøv: Sett stratifiser til 0 og dra seed: se «andel positive» på «test» svinge, mens den står på 0,110 med 1.
Standardiser uten å lekke teststatistikk
import numpy as npfrom sklearn.preprocessing import StandardScaler X_train = np.array([[40.0, 2.0], [55.0, 3.0], [70.0, 4.0], [85.0, 5.0]]) # [areal, rom]areal_test = 100 # @param 40..130 5X_test = np.array([[areal_test, (areal_test - 10) / 15], [areal_test + 15, (areal_test + 5) / 15]]) scaler = StandardScaler().fit(X_train) # lærer mu og sigma fra treningprint(f"lært fra trening: mu = {scaler.mean_}, sigma = {np.round(scaler.scale_, 2)}")riktig = scaler.transform(X_test)feil = StandardScaler().fit_transform(X_test) # tilpasser på nytt på testfor i in range(len(X_test)): print(f"testrad {i} (areal {X_test[i, 0]:.0f}): riktig {riktig[i, 0]:5.2f} / {riktig[i, 1]:5.2f}" f" feil {feil[i, 0]:5.2f} / {feil[i, 1]:5.2f} (areal / rom)")Prøv: Dra areal_test og se «riktig» følge testdataene, mens «feil» (fit_transform på test) alltid gir −1,00 og 1,00.
Veiledet og uveiledet læring på samme data
import numpy as npfrom sklearn.cluster import KMeansfrom sklearn.linear_model import LinearRegression rng = np.random.default_rng(1)temp = rng.uniform(-5, 25, 60) # feature 1: temperaturhelg = rng.integers(0, 2, 60) # feature 2: helg (0/1)X = np.column_stack([temp, helg]) # form (60, 2): én rad per dagy = 40 + 3 * temp + 25 * helg + rng.normal(0, 8, 60) # label: solgte isprint(f"X {X.shape}, y {y.shape}") veiledet = LinearRegression().fit(X, y) # lærer fra X OG ygrupper = KMeans(n_clusters=2, n_init=10, random_state=0).fit(X) # bare Xtry: LinearRegression().fit(X) # veiledet uten fasitexcept TypeError as feil: print("fit(X) uten y:", str(feil)[:60]) temp_ny = 18 # @param 0..25dag = [[temp_ny, 1]] # en helgedagprint(f"veiledet: {veiledet.predict(dag)[0]:.0f} solgte is ved {temp_ny} grader")print(f"uveiledet: dagen havner i gruppe {grupper.predict(dag)[0]}, uten noe salgstall")Prøv: Dra temp_ny og se «veiledet» gi et salgstall som følger temperaturen, mens «uveiledet» bare plasserer dagen i en gruppe.
One-hot-koding mot heltallskoder
import warningsimport numpy as npfrom sklearn.preprocessing import OneHotEncoder warnings.filterwarnings("ignore", message="Found unknown categories")drivstoff = np.array([["el"], ["diesel"], ["bensin"], ["el"], ["hybrid"]])dropp_forste = 0 # @param 0..1enc = OneHotEncoder(drop="first" if dropp_forste else None, sparse_output=False, handle_unknown="ignore").fit(drivstoff) print(f"kategorier {enc.categories_[0].tolist()} gir {len(enc.get_feature_names_out())} kolonner")for kat in ["bensin", "diesel", "el", "hydrogen"]: print(f"{kat:9s}", enc.transform([[kat]])[0]) koder = {"bensin": 0, "diesel": 1, "el": 2, "hybrid": 3} # heltallskodera, b, c = enc.transform([["bensin"], ["el"], ["diesel"]])print(f"bensin–el: koder {koder['el'] - koder['bensin']}, one-hot {np.linalg.norm(a - b):.3f}")print(f"bensin–diesel: koder {koder['diesel'] - koder['bensin']}, one-hot {np.linalg.norm(a - c):.3f}")Prøv: Sett dropp_forste til 1 og se «bensin» bli bare nuller (referansen), lik den ukjente «hydrogen», og «one-hot»-avstandene bli 1,000.
Skalering endrer hvem som er nærmeste nabo
import numpy as npfrom sklearn.preprocessing import MinMaxScaler, StandardScaler enhet = 1 # @param 1..1000# Kunder: [årsinntekt, antall kjøp siste år]. Inntekten måles i enheter på «enhet» kroner.X = np.array([[420_000, 2], [455_000, 30], [600_000, 3], [430_000, 28]]) / [enhet, 1]ny = np.array([[445_000, 3]]) / [enhet, 1] def naermeste(navn, X, ny): d = np.linalg.norm(X - ny, axis=1) avst = " · ".join(f"k{i} {x:.0f}" if x >= 100 else f"k{i} {x:.2f}" for i, x in enumerate(d)) print(f"{navn:14s} nærmeste = kunde {d.argmin()} avstand {avst}") naermeste("uskalert:", X, ny)std = StandardScaler().fit(X) # fit på kjente kundernaermeste("standardisert:", std.transform(X), std.transform(ny))mm = MinMaxScaler().fit(X)naermeste("min–maks:", mm.transform(X), mm.transform(ny))Prøv: Dra enhet fra 1 mot 1000 og se «uskalert» bytte nærmeste kunde, mens «standardisert» og «min–maks» står stille.
Lekkasje fra featureutvalg utenfor kryssvalideringen
import numpy as npfrom sklearn.feature_selection import SelectKBest, f_classiffrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import cross_val_scorefrom sklearn.pipeline import make_pipeline rng = np.random.default_rng(0)X = rng.normal(size=(80, 2000)) # ren støy: ingen feature henger sammen med yy = rng.integers(0, 2, size=80)k = 20 # @param 5..200 5 # FEIL: velg de k «beste» featurene på HELE datasettet, kryssvalider etterpåX_valgt = SelectKBest(f_classif, k=k).fit_transform(X, y)feil = cross_val_score(LogisticRegression(max_iter=1000), X_valgt, y, cv=5) # RIKTIG: utvelgelsen ligger i pipelinen og tilpasses på nytt i hver foldpipe = make_pipeline(SelectKBest(f_classif, k=k), LogisticRegression(max_iter=1000))riktig = cross_val_score(pipe, X, y, cv=5) print(f"utvalg før kryssvalidering (lekkasje): {feil.mean():.2f}")print(f"utvalg inne i pipelinen: {riktig.mean():.2f}")Prøv: Dra k opp mot 200 og se «utvalg før kryssvalidering (lekkasje)» klatre, mens «utvalg inne i pipelinen» blir liggende rundt 0,5.
Læringsmål
Hva du skal kunne etter å ha lest kapittelet.
- 01Formuler et ML-problem med enhet, prediksjonstidspunkt, features og label, og avgjør om det er veiledet eller uveiledet læring
- 02Forklar hvorfor nominelle kategorier one-hot-kodes i stedet for å få heltallskoder, og regn ut antall features etter kodingen
- 03Regn ut standardiserte og min–maks-skalerte verdier med treningsstatistikk, også for testverdier utenfor treningsområdet
- 04Velg riktig bruk av fit, transform og fit_transform, og forklar hvorfor scaler.fit_transform(X_test) er feil
- 05Finn datalekkasje, også target-lekkasje, i en featureliste eller en kodesnutt, og forklar hvordan en Pipeline hindrer den
- 06Tolk argumentene til train_test_split (test_size, stratify, random_state og shuffle), og velg splitt for tidsserier og grupperte data