Confronto equo tra modelli
Fa parte della sezione Apprendimento supervisionato del percorso Machine Learning di Coddy. Lezione 38 di 58.
Confrontare i modelli su una sola suddivisione è come lanciare una moneta: uno potrebbe capitare su un set di test fortunato. Assegna invece a ogni modello gli stessi cinque fold. Per 150 banconote, vere o false:
k-NN e la regressione logistica sono a pari merito entro il loro margine di oscillazione, e k-NN è più stabile. L'albero è indietro.
Uno splitter KFold mescola le righe una volta e fornisce a ogni modello fold identici:
from sklearn.model_selection import KFold
folds = KFold(n_splits=5, shuffle=True, random_state=0)
for model in [knn, logistic, tree]:
scores = cross_val_score(model, X, y, cv=folds)
print(f"{scores.mean():.3f} {scores.std():.3f}")Stampa i numeri nel grafico:
0.867 0.042
0.873 0.074
0.807 0.077Scegli la media più alta; quando le medie sono vicine, la deviazione standard più piccola.
Sfida
MedioUn sito di cucina prevede quali visitatori preparano una ricetta che aprono. Il programma iniziale valuta tre modelli con un'unica suddivisione e vince l'albero. Verificalo in modo equo; il programma legge il numero di fold.
- Crea un
KFoldcon quel numero di suddivisioni,shuffle=Trueerandom_state=0. - Esegui la convalida incrociata di ogni modello su quei fold; stampa la sua media e la sua deviazione standard, con 3 cifre decimali.
- Stampa il modello con la media più alta.
Per altri visitatori e 5:
One split picks: k-NN
k-NN: mean 0.833, std 0.045
logistic: mean 0.860, std 0.044
tree: mean 0.787, std 0.029
Cross-validation picks: logisticProvalo tu
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
n_folds = int(input())
# Non modificare le righe seguenti: 300 visitatori, 6 abitudini di navigazione; l'etichetta 1 indica che hanno preparato la ricetta
X, y = make_classification(n_samples=300, n_features=6, n_informative=4, n_redundant=0,
flip_y=0.06, class_sep=0.8, random_state=0)
names = ["k-NN", "logistic", "tree"]
models = [KNeighborsClassifier(), LogisticRegression(max_iter=1000),
DecisionTreeClassifier(max_depth=4, random_state=0)]
# Una sola suddivisione decreta il vincitore
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
single = []
for model in models:
model.fit(X_train, y_train)
single.append(model.score(X_test, y_test))
print(f"One split picks: {names[np.argmax(single)]}")
# Scrivi il tuo codice qui sotto
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Apprendimento supervisionato
1Il tuo primo modello
Imparare dagli esempiInsiemi di addestramento e testAdattare e prevedereValutare un modelloRiepilogo: Ordinatore di semi4Regressione logistica
Previsioni sì o noLa soglia decisionaleI pesi come evidenzePiù classiRiepilogo: filtro antispam2Vicini più prossimi
Come decide k-NNScegliere kConfini decisionaliNormalizzare le scale per i viciniRiepilogo: vicini del vino5Misurare i classificatori
La matrice di confusionePrecisione e richiamoIl punteggio F1Classi sbilanciateCurve ROCRiepilogo: test di screening8Convalida incrociata
Validazione K-foldConfronto equo tra modelliRicerca a grigliaRiepilogo: riparazioni di skateboard11Progetto: specie di pinguini
Incontra i pinguiniPrepara i datiScegli un modelloOttimizza il miglioreDistribuisci il modello3Regressione lineare
Prevedere numeriPiù caratteristicheMisurare gli erroriGrafici dei residuiRiepilogo: noleggio di biciclette6Alberi decisionali
Gli alberi fanno domandeLeggere un alberoProfondità dell’alberoImportanza delle caratteristicheRiepilogo: decisioni sui prestitiEsercitati da solo: Compilatore Python online