Apprendimento automatico - Addestramento/test
Valuta il tuo modello
In Machine Learning creiamo modelli per prevedere l'esito di determinati eventi, come nel capitolo precedente in cui prevedevamo le emissioni di CO2 di un'auto conoscendo il peso e la cilindrata.
Per misurare se il modello è abbastanza buono, possiamo usare un metodo chiamato Train/Test.
Che cos'è Train/Test
Train/Test è un metodo per misurare la precisione del tuo modello.
Si chiama Train/Test perché dividi il set di dati in due set: un set di addestramento e un set di test.
80% per la formazione e il 20% per i test.
Alleni il modello usando il set di allenamento.
Testare il modello utilizzando il set di test .
Addestrare il modello significa creare il modello.
Testare il modello significa testare l'accuratezza del modello.
Inizia con un set di dati
Inizia con un set di dati che vuoi testare.
Il nostro set di dati illustra 100 clienti in un negozio e le loro abitudini di acquisto.
Esempio
import numpy
import matplotlib.pyplot as plt
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
plt.scatter(x, y)
plt.show()
Risultato:
L'asse x rappresenta il numero di minuti prima di effettuare un acquisto.
L'asse y rappresenta la quantità di denaro speso per l'acquisto.
Dividi in treno/test
Il training set dovrebbe essere una selezione casuale dell'80% dei dati originali.
Il set di test dovrebbe essere il restante 20%.
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
Visualizza il set di allenamento
Visualizza lo stesso grafico a dispersione con il training set:
Esempio
plt.scatter(train_x,
train_y)
plt.show()
Risultato:
Sembra il set di dati originale, quindi sembra essere una selezione equa:
Visualizza il set di test
Per assicurarci che il set di test non sia completamente diverso, daremo un'occhiata anche al set di test.
Esempio
plt.scatter(test_x,
test_y)
plt.show()
Risultato:
Anche il set di test è simile al set di dati originale:
Adatta il set di dati
Che aspetto ha il set di dati? A mio parere, penso che la soluzione migliore sarebbe una regressione polinomiale , quindi tracciamo una linea di regressione polinomiale.
Per tracciare una linea attraverso i punti dati, utilizziamo il
plot()
metodo del modulo matplotlib:
Esempio
Disegna una linea di regressione polinomiale attraverso i punti dati:
import numpy
import
matplotlib.pyplot as plt
numpy.random.seed(2)
x =
numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40, 100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y =
y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y, 4))
myline = numpy.linspace(0, 6, 100)
plt.scatter(train_x, train_y)
plt.plot(myline, mymodel(myline))
plt.show()
Risultato:
Il risultato può supportare il mio suggerimento sul set di dati che si adatta a una regressione polinomiale, anche se ci darebbe alcuni risultati strani se proviamo a prevedere valori al di fuori del set di dati. Esempio: la riga indica che un cliente che trascorre 6 minuti in negozio farebbe un acquisto del valore di 200. Questo è probabilmente un segno di overfitting.
Ma per quanto riguarda il punteggio R al quadrato? Il punteggio R-quadrato è un buon indicatore di quanto bene il mio set di dati si adatti al modello.
R2
Ricordi R2, noto anche come R-quadrato?
Misura la relazione tra l'asse x e l'asse y e il valore varia da 0 a 1, dove 0 significa nessuna relazione e 1 significa totalmente correlato.
Il modulo sklearn ha un metodo chiamato r2_score()
che ci aiuterà a trovare questa relazione.
In questo caso vorremmo misurare il rapporto tra i minuti di permanenza di un cliente in negozio e quanto denaro spende.
Esempio
In che misura i miei dati di addestramento si adattano a una regressione polinomiale?
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y,
4))
r2 = r2_score(train_y, mymodel(train_x))
print(r2)
Nota: il risultato 0,799 mostra che esiste una relazione OK.
Porta il set di prova
Ora abbiamo creato un modello che va bene, almeno per quanto riguarda i dati di allenamento.
Ora vogliamo testare il modello anche con i dati di test, per vedere se ci dà lo stesso risultato.
Esempio
Troviamo il punteggio R2 quando si utilizzano i dati di test:
import numpy
from sklearn.metrics import r2_score
numpy.random.seed(2)
x = numpy.random.normal(3, 1, 100)
y = numpy.random.normal(150, 40,
100) / x
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
mymodel = numpy.poly1d(numpy.polyfit(train_x, train_y,
4))
r2 = r2_score(test_y, mymodel(test_x))
print(r2)
Nota: il risultato 0,809 mostra che il modello si adatta anche al set di test e siamo fiduciosi di poter utilizzare il modello per prevedere i valori futuri.
Prevedere i valori
Ora che abbiamo stabilito che il nostro modello è OK, possiamo iniziare a prevedere nuovi valori.
Esempio
Quanti soldi spenderà un cliente acquirente se rimane in negozio per 5 minuti?
print(mymodel(5))
L'esempio prevedeva che il cliente spendesse 22,88 dollari, come sembra corrispondere al diagramma: