Strategie di cross-validation
k-fold, k-fold stratificato, leave-one-out e suddivisione per serie temporali: quando utilizzare ciascuno.
Strategie di cross-validation è una lezione Learn AI with Python gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Learn AI with Python, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Learn AI with Python include 4 lezioni in totale.
Perché usare la convalida incrociata
Una singola suddivisione tra addestramento e test può essere fortunata o sfortunata. La convalida incrociata ripete la valutazione su suddivisioni diverse e calcola la media dei punteggi, fornendo una stima più affidabile delle prestazioni.
Convalida incrociata K-Fold
KFold suddivide i dati in K parti uguali. Ogni fold viene utilizzato una volta come set di test, mentre gli altri servono per addestrare il modello. Si ottengono K punteggi da mediare.
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 hereStratified K-Fold per la classificazione
Nella classificazione, un normale K-Fold può produrre fold con rapporti tra le classi sbilanciati. StratifiedKFold mantiene le proporzioni tra le classi in ogni fold.
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
passLa scorciatoia cross_val_score
cross_val_score esegue l'intero ciclo al posto Suo e restituisce un array di punteggi, uno per ogni fold. Per i classificatori utilizza automaticamente 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())Scegliere il numero di fold
Un numero maggiore di fold (ad es. 10) fornisce una stima meno distorta, ma richiede più risorse di calcolo. La convalida a 5 fold rappresenta un compromesso comune. Per dataset molto piccoli, il leave-one-out utilizza N fold, ciascuno dei quali ha un solo campione nel set di test.
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 per i dati temporali
Per le serie temporali non bisogna mai addestrare il modello sui dati futuri. TimeSeriesSplit utilizza sempre i dati passati per l'addestramento e il blocco successivo per il test, ampliando la finestra di addestramento tra i vari fold.
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))Perché l'ordine è importante nelle serie temporali
Mescolare dati ordinati temporalmente fa filtrare informazioni future nell'addestramento e gonfia i punteggi. TimeSeriesSplit rispetta l'ordine cronologico, quindi la valutazione rispecchia le reali condizioni di previsione.
cross_validate per più metriche
cross_validate è simile a cross_val_score, ma restituisce più metriche contemporaneamente e può includere i punteggi di addestramento e i tempi di adattamento.
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"])Interpretare l'output di cross_validate
Il risultato è un dizionario con chiavi come test_<metric>, train_<metric>, fit_time e score_time. Il confronto tra i punteggi di addestramento e di test aiuta a diagnosticare l'overfitting.
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"]))Convalida incrociata e data leakage
Esegua sempre il preprocessing (scaling, codifica) all'interno del ciclo di convalida incrociata, non prima. Utilizzi una Pipeline, in modo che ogni fold esegua lo scaling utilizzando solo i propri dati di addestramento e prevenga il leakage.
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)Scegliere la strategia giusta
Utilizzi StratifiedKFold per la classificazione, il normale KFold per la regressione e TimeSeriesSplit per i dati temporali. Incapsuli il preprocessing in una pipeline e riporti la media e la deviazione standard calcolate sui vari fold.
Verifica rapida
Verifichi le Sue conoscenze sulla convalida incrociata.
Riepilogo
Riepilogo: la convalida incrociata calcola la media delle prestazioni su più suddivisioni. Utilizzi KFold per la regressione, StratifiedKFold per la classificazione bilanciata e TimeSeriesSplit per i dati temporali. cross_val_score restituisce una metrica; cross_validate ne restituisce diverse, oltre ai tempi di esecuzione. Esegua sempre il preprocessing all'interno di una Pipeline per prevenire il leakage.
Domande Frequenti
La lezione «Strategie di cross-validation» è gratuita?
Sì — il testo completo di «Strategie di cross-validation» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Learn AI with Python, passa a CoddyKit PRO. Il corso Learn AI with Python include 4 lezioni in totale.
Cosa imparerò in «Strategie di cross-validation»?
k-fold, k-fold stratificato, leave-one-out e suddivisione per serie temporali: quando utilizzare ciascuno. Eserciti Learn AI with Python con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Learn AI with Python?
Non è richiesta alcuna esperienza precedente. Learn AI with Python su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Strategie di cross-validation»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Learn AI with Python?
Sì. Ogni lezione Learn AI with Python include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Strategie di cross-validation
- Approfondimento sulle metriche di classificazione
- Grid search e random search
- Ottimizzazione bayesiana con Optuna