Python Academy · Lekcja

Ocena modeli i walidacja krzyżowa

Proszę oceniać modele za pomocą accuracy, F1, ROC-AUC i walidacji krzyżowej k-fold.

Lekcja 4 z 413 kroki

Ocena modeli i walidacja krzyżowa to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 4 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 Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.

Podział na zbiory treningowy, walidacyjny i testowy

Należy używać podziału na trzy części: zbioru treningowego do dopasowania modelu, walidacyjnego do dostrajania hiperparametrów oraz testowego do raportowania ostatecznej wydajności. Podczas tworzenia modelu nigdy nie należy używać zbioru testowego.

from sklearn.model_selection import train_test_split
import numpy as np

X = np.random.rand(1000, 10)
y = (X[:,0] > 0.5).astype(int)

X_tr, X_rest, y_tr, y_rest = train_test_split(X, y, test_size=0.3)
X_val, X_te, y_val, y_te = train_test_split(X_rest, y_rest, test_size=0.5)

Dokładność

accuracy_score to odsetek poprawnych predykcji. Należy używać go w przypadku zrównoważonych klas; dla niezrównoważonych danych lepiej użyć F1 lub AUC.

from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = LogisticRegression().fit(X_tr, y_tr)
print("Accuracy:", accuracy_score(y_te, model.predict(X_te)))

Precyzja, czułość i F1

W przypadku niezrównoważonych klas: precyzja = TP/(TP+FP), czułość = TP/(TP+FN), a F1 = średnia harmoniczna precyzji i czułości.

from sklearn.metrics import precision_score, recall_score, f1_score, classification_report

# Use classification_report for a full summary:
print(classification_report(y_te, model.predict(X_te)))
# shows precision, recall, f1 for each class

Macierz pomyłek

Macierz pomyłek pokazuje wyniki prawdziwie dodatnie, fałszywie dodatnie, prawdziwie ujemne i fałszywie ujemne.

from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt

cm = confusion_matrix(y_te, model.predict(X_te))
print(cm)
# [[TN FP]
#  [FN TP]]

Krzywa ROC i AUC

roc_auc_score mierzy pole pod krzywą ROC. AUC = 1.0 oznacza wynik idealny, a 0.5 — wynik losowy.

from sklearn.metrics import roc_auc_score, roc_curve

y_prob = model.predict_proba(X_te)[:,1]
print("AUC:", roc_auc_score(y_te, y_prob))

fpr, tpr, thresholds = roc_curve(y_te, y_prob)
# plot fpr vs tpr for the full ROC curve

Metryki regresji

W zadaniach regresji należy używać mean_squared_error (MSE), root_mean_squared_error (RMSE) oraz r2_score.

from sklearn.metrics import mean_squared_error, r2_score

y_pred = regression_model.predict(X_te)
mse = mean_squared_error(y_te, y_pred)
print("RMSE:", mse**0.5)
print("R²:", r2_score(y_te, y_pred))

Walidacja krzyżowa k-fold

cross_val_score dzieli dane na k części, trenuje model na k-1 częściach, ocenia go na jednej części i powtarza ten proces k razy. Jest to bardziej niezawodne niż pojedynczy podział.

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X, y = make_classification(random_state=0)
scores = cross_val_score(LogisticRegression(), X, y, cv=10, scoring="accuracy")
print(f"{scores.mean():.3f} ± {scores.std():.3f}")

StratifiedKFold

Należy użyć StratifiedKFold, aby zapewnić taki sam rozkład klas w każdej części — ma to kluczowe znaczenie w przypadku niezrównoważonych zbiorów danych.

from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X, y = make_classification(weights=[0.9,0.1], random_state=0)
cv = StratifiedKFold(n_splits=5)
scores = cross_val_score(LogisticRegression(), X, y, cv=cv, scoring="f1")
print("Stratified F1:", scores.mean())

Kompromis obciążenie–wariancja

Duże obciążenie oznacza niedouczenie (model jest zbyt prosty). Duża wariancja oznacza przeuczenie (model jest zbyt złożony). Walidacja krzyżowa pokazuje, z którym problemem mamy do czynienia.

# Underfitting: low train score AND low val score
# → increase model complexity, add features

# Overfitting: high train score, low val score
# → regularise, reduce complexity, get more data

from sklearn.model_selection import validation_curve
import numpy as np

train_sc, val_sc = validation_curve(DecisionTreeClassifier(), X, y, param_name="max_depth", param_range=range(1,10))

Zagnieżdżona walidacja krzyżowa

Aby przeprowadzać bezstronne dostrajanie hiperparametrów i ocenę, należy użyć zagnieżdżonej walidacji krzyżowej: pętla wewnętrzna dostraja model, a zewnętrzna go ocenia.

from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification

X, y = make_classification(random_state=0)
gs = GridSearchCV(SVC(), {"C":[0.1,1,10]}, cv=5)
outer_scores = cross_val_score(gs, X, y, cv=5)
print("Nested CV accuracy:", outer_scores.mean())

Kalibracja

Oszacowania prawdopodobieństwa klasyfikatora mogą być źle skalibrowane. Aby uzyskać lepsze oszacowania prawdopodobieństw, należy użyć CalibratedClassifierCV.

from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y)

cal = CalibratedClassifierCV(SVC(), cv=5).fit(X_tr, y_tr)
print(cal.predict_proba(X_te[:3]))

Szybkie sprawdzenie

Dlaczego podczas oceniania modeli walidacja krzyżowa jest preferowana zamiast pojedynczego podziału na zbiór treningowy i testowy?

Podsumowanie

W przypadku zrównoważonych problemów należy używać dokładności, a w przypadku niezrównoważonych — F1/AUC. Ocenę należy przeprowadzać za pomocą k-fold cross_val_score, w przypadku niezrównoważonych danych używać StratifiedKFold, a podczas dostrajania hiperparametrów stosować zagnieżdżoną walidację krzyżową, aby uzyskać bezstronne oszacowanie końcowe. Podczas tworzenia modelu nigdy nie należy zaglądać do zbioru testowego.

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
76
Lekcje
320

Często zadawane pytania

Czy lekcja „Ocena modeli i walidacja krzyżowa” jest bezpłatna?

Tak — pełny tekst „Ocena modeli i walidacja krzyżowa” 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 Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Ocena modeli i walidacja krzyżowa”?

Proszę oceniać modele za pomocą accuracy, F1, ROC-AUC i walidacji krzyżowej k-fold. Ćwiczysz Python Academy 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ąć Python Academy?

Nie wymagamy żadnego doświadczenia. Python Academy 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 4 z 4.

Ile czasu zajmuje lekcja „Ocena modeli i walidacja krzyżowa”?

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 Python Academy?

Tak. Każda lekcja Python Academy 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

  1. API scikit-learn: fit, transform, predict
  2. Modele liniowe: regresja i klasyfikacja
  3. Modele drzewiaste: drzewa decyzyjne i lasy losowe
  4. Ocena modeli i walidacja krzyżowa
← Powrót do Python Academy