CMD + K

Kapittel 1Begreper & formler · Fra problem til datasett
Referanseside · Kapittel 1

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.

Øv med flashcards23 kort fra dette kapittelet

Begreper

Sentrale begreper fra kapittelet med korte definisjoner.

01Veiledet læring

Læring fra eksempler der hvert input har en kjent målverdi som modellen skal lære å predikere.

02Uveiledet læring

Læring uten kjente målverdier, der algoritmen leter etter struktur eller avvik i inputdataene.

03Feature

En målbar inputvariabel modellen bruker for å lage en prediksjon.

04Label

Den observerte klassen eller målverdien som en veiledet modell trenes mot.

05Treningssett

Datadelen som brukes til å tilpasse modellparametere og preprocessing-transformasjoner.

06Valideringssett

En separat datadel som brukes til modellvalg og hyperparameterjustering under utvikling.

07Testsett

En urørt datadel som brukes én gang til en avsluttende vurdering av valgt arbeidsflyt.

08Datalekkasje

At informasjon som ikke ville vært tilgjengelig ved reell prediksjon, påvirker trening eller modellvalg.

09Kategorisk feature

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.

10Target-lekkasje

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.

11Pipeline

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.

12Stratifisert splitt

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

Standardisering sentrerer en feature og uttrykker verdien i antall standardavvik fra middelverdien.

xopprinnelig featureverdi
μmiddelverdi estimert fra treningssettet
σstandardavvik estimert fra treningssettet
min-maks-skalering

Min–maks-skalering

Min–maks-skalering flytter treningsområdets minste verdi til 0 og største verdi til 1.

x_minminste treningsverdi
x_maxstørste treningsverdi
x'skalert verdi
treningsandel

Andel i treningssettet

Med treningsandel legges omtrent av de observasjonene i treningssettet.

rvalgt treningsandel
ntotalt antall observasjoner
n_trainantall treningsobservasjoner
one-hot-koding

One-hot-koding

En kategoriverdi erstattes av en indikatorvektor slik at kategoriene ikke får en falsk tallrekkefølge.

kkategorien til observasjonen
e_kindikatorvektor med én aktiv posisjon
one-hot-dimensjon

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.

d_numantall numeriske features
K_jantall kategorier i kategorisk feature j
d_nyantall features etter kodingen

Kodesnutter

Kodesnutter fra kapittelet, vist literal.

Kode

En stratifisert trenings-, validerings- og testsplitt

Python
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.

Kode

Standardiser uten å lekke teststatistikk

Python
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.

Kode

Veiledet og uveiledet læring på samme data

Python
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.

Kode

One-hot-koding mot heltallskoder

Python
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.

Kode

Skalering endrer hvem som er nærmeste nabo

Python
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.

Kode

Lekkasje fra featureutvalg utenfor kryssvalideringen

Python
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.

  1. 01Formuler et ML-problem med enhet, prediksjonstidspunkt, features og label, og avgjør om det er veiledet eller uveiledet læring
  2. 02Forklar hvorfor nominelle kategorier one-hot-kodes i stedet for å få heltallskoder, og regn ut antall features etter kodingen
  3. 03Regn ut standardiserte og min–maks-skalerte verdier med treningsstatistikk, også for testverdier utenfor treningsområdet
  4. 04Velg riktig bruk av fit, transform og fit_transform, og forklar hvorfor scaler.fit_transform(X_test) er feil
  5. 05Finn datalekkasje, også target-lekkasje, i en featureliste eller en kodesnutt, og forklar hvordan en Pipeline hindrer den
  6. 06Tolk argumentene til train_test_split (test_size, stratify, random_state og shuffle), og velg splitt for tidsserier og grupperte data