Korsvalidering
Kunna använda k-fold korsvalidering och förstå när den behövs.
Förkunskaper
Intuition
Med lite data blir ett enda valideringssplit opålitligt: 200 exempel delat 80/20 ger 40 valideringsexempel, och resultatet svänger flera procentenheter beroende på vilka 40 som hamnade där.
k-fold korsvalidering: dela datan i k lika delar. Träna k gånger, varje gång med en del som validering och resten som träning. Medelvärdet av de k resultaten är mycket stabilare — och spridningen säger hur osäker siffran är.
k = 5 eller 10 är standard. Kostnaden är att du tränar k gånger.
Kod
from sklearn.model_selection import cross_val_score, StratifiedKFold, GroupKFold
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
# Pipeline i cross_val_score → skalningen anpassas inuti varje fold. Utan pipeline läcker
# valideringsdelens medelvärde in i träningen.
modell = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
s = cross_val_score(modell, X, y, cv=cv, scoring="f1_macro")
print(f"{s.mean():.3f} ± {s.std():.3f}") # 0.812 ± 0.024
# Flera rader per person? Dela per person, annars läcker individen mellan folds:
# cross_val_score(modell, X, y, cv=GroupKFold(5), groups=person_id)
Nästlad korsvalidering behövs om du både väljer hyperparametrar och vill ha en ärlig skattning: en yttre loop för skattningen, en inre för valet. Annars är resultatet optimistiskt eftersom valet gjordes på samma data som mäter.
Behärskning innebär
- Använder k-fold korsvalidering
- Förklarar när den behövs och vad den kostar
- Undviker läckage i korsvalideringen
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- scikit-learn User Guide (BSD-3) — BSD-3-Clause