Strategie walidacji krzyżowej
k-fold, stratified k-fold, leave-one-out i podział szeregów czasowych — kiedy używać każdej metody.
Strategie walidacji krzyżowej to bezpłatna lekcja Learn AI with Python na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn AI with Python, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn AI with Python zawiera 4 lekcji w sumie.
Dlaczego walidacja krzyżowa
Pojedynczy podział na zbiór treningowy i testowy może być przypadkowo korzystny lub niekorzystny. Walidacja krzyżowa powtarza ewaluację na różnych podziałach i uśrednia wyniki, zapewniając bardziej wiarygodne oszacowanie wydajności.
Walidacja krzyżowa K-fold
KFold dzieli dane na K równych części. Każdy fold jest raz używany jako zbiór testowy, a na pozostałych trenowany jest model. Otrzymuje się K wyników, które można uśrednić.
from sklearn.model_selection import KFold
kf = KFold(n_splits=5, shuffle=True, random_state=0)
for train_idx, test_idx in kf.split(X):
Xtr, Xte = X[train_idx], X[test_idx]
ytr, yte = y[train_idx], y[test_idx]
# train and evaluate hereStratyfikowana walidacja K-fold dla klasyfikacji
W klasyfikacji zwykły K-fold może tworzyć podzbiory o niezrównoważonych proporcjach klas. StratifiedKFold zachowuje proporcje klas w każdym foldzie.
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
for train_idx, test_idx in skf.split(X, y):
# each fold keeps the same class balance as the full set
passSkrót cross_val_score
cross_val_score wykonuje całą pętlę za Państwa i zwraca tablicę wyników poszczególnych foldów. W przypadku klasyfikatorów automatycznie używa StratifiedKFold.
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(random_state=0)
scores = cross_val_score(clf, X, y, cv=5, scoring="accuracy")
print(scores)
print("Mean:", scores.mean(), "Std:", scores.std())Wybór liczby foldów
Większa liczba foldów (np. 10) zapewnia mniej obciążone oszacowanie, ale wymaga większej mocy obliczeniowej. Walidacja 5-fold to popularny kompromis. W przypadku bardzo małych zbiorów danych metoda leave-one-out wykorzystuje N foldów, z których każdy zbiór testowy zawiera jedną próbkę.
from sklearn.model_selection import LeaveOneOut, cross_val_score
loo = LeaveOneOut()
scores = cross_val_score(clf, X, y, cv=loo)
print("Mean:", scores.mean())TimeSeriesSplit dla danych czasowych
W przypadku szeregów czasowych nigdy nie należy trenować na danych z przyszłości. TimeSeriesSplit zawsze wykorzystuje dane z przeszłości do trenowania, a następny blok do testowania, rozszerzając okno treningowe w kolejnych foldach.
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
# train_idx always precedes test_idx in time
print(len(train_idx), len(test_idx))Dlaczego kolejność ma znaczenie w szeregach czasowych
Losowe mieszanie danych uporządkowanych w czasie powoduje wyciek informacji z przyszłości do procesu trenowania i zawyża wyniki. TimeSeriesSplit zachowuje kolejność chronologiczną, dzięki czemu ewaluacja odzwierciedla rzeczywiste warunki prognozowania.
cross_validate dla wielu metryk
cross_validate działa podobnie jak cross_val_score, ale zwraca jednocześnie kilka metryk i może uwzględniać wyniki trenowania oraz czasy dopasowania.
from sklearn.model_selection import cross_validate
results = cross_validate(
clf, X, y, cv=5,
scoring=["accuracy", "f1_macro", "roc_auc_ovr"],
return_train_score=True,
)
print(results["test_accuracy"])
print(results["test_f1_macro"])Odczytywanie wyników cross_validate
Wynikiem jest słownik z kluczami takimi jak test_<metric>, train_<metric>, fit_time i score_time. Porównanie wyników treningowych i testowych pomaga wykryć przeuczenie.
import numpy as np
gap = results["train_accuracy"].mean() - results["test_accuracy"].mean()
print("Overfit gap:", gap)
print("Avg fit time:", np.mean(results["fit_time"]))Walidacja krzyżowa a wyciek danych
Zawsze należy dopasowywać wstępne przetwarzanie (skalowanie, kodowanie) wewnątrz pętli CV, a nie przed nią. Należy użyć obiektu Pipeline, aby każdy fold skalował dane wyłącznie na podstawie własnych danych treningowych, zapobiegając wyciekowi informacji.
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
pipe = make_pipeline(StandardScaler(), SVC())
scores = cross_val_score(pipe, X, y, cv=5)Wybór właściwej strategii
Należy używać StratifiedKFold w klasyfikacji, zwykłego KFold w regresji oraz TimeSeriesSplit dla danych czasowych. Wstępne przetwarzanie należy umieścić w potoku, a następnie raportować średnią i odchylenie standardowe wyników z poszczególnych foldów.
Szybki test
Sprawdź swoją wiedzę na temat walidacji krzyżowej.
Podsumowanie
Podsumowanie: Walidacja krzyżowa uśrednia wydajność dla wielu podziałów. Należy używać KFold w regresji, StratifiedKFold w zrównoważonej klasyfikacji oraz TimeSeriesSplit dla danych czasowych. cross_val_score zwraca jedną metrykę, a cross_validate wiele metryk oraz czasy wykonania. Wstępne przetwarzanie należy zawsze wykonywać wewnątrz obiektu Pipeline, aby zapobiec wyciekowi danych.
Często zadawane pytania
Czy lekcja „Strategie walidacji krzyżowej” jest bezpłatna?
Tak — pełny tekst „Strategie walidacji krzyżowej” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn AI with Python, przejdź na CoddyKit PRO. Kurs Learn AI with Python zawiera 4 lekcji w sumie.
Co nauczysz się w „Strategie walidacji krzyżowej”?
k-fold, stratified k-fold, leave-one-out i podział szeregów czasowych — kiedy używać każdej metody. Ćwiczysz Learn AI with Python z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Learn AI with Python?
Nie wymagamy żadnego doświadczenia. Learn AI with Python w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Strategie walidacji krzyżowej”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Learn AI with Python?
Tak. Każda lekcja Learn AI with Python zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Strategie walidacji krzyżowej
- Dogłębne omówienie metryk klasyfikacji
- Wyszukiwanie siatkowe i losowe
- Optymalizacja bayesowska z Optuna