Menu
CoddyTech

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:

Punteggi dei cinque fold per modello, rappresentati come punti, con una linea nera in corrispondenza di ciascuna media. I punti di k-NN sono ravvicinati intorno a 0.867; quelli della regressione logistica sono distribuiti da 0.73 a 0.93 intorno a 0.873; l’albero è ultimo con 0.807

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.077

Scegli la media più alta; quando le medie sono vicine, la deviazione standard più piccola.

challenge icon

Sfida

Medio

Un 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.

  1. Crea un KFold con quel numero di suddivisioni, shuffle=True e random_state=0.
  2. Esegui la convalida incrociata di ogni modello su quei fold; stampa la sua media e la sua deviazione standard, con 3 cifre decimali.
  3. 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: logistic

Provalo 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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Apprendimento supervisionato

Esercitati da solo: Compilatore Python online