Addestramento/Prova nella Machine Learning

Valutare il modello

Nella machine learning, creiamo modelli per prevedere i risultati di alcuni eventi, come nel capitolo precedente, quando abbiamo previsto le emissioni di CO2 delle automobili conosciendo il peso e la cilindrata del motore.

Per valutare se un modello è sufficientemente buono, possiamo utilizzare un metodo chiamato addestramento/test.

Cos'è addestramento/test

Addestramento/test è un metodo per misurare l'accuratezza del modello.

Il motivo per cui si chiama addestramento/test è perché dividiamo il set di dati in due gruppi: il set di addestramento e il set di test.

80% per l'addestramento, 20% per il test.

Puoi utilizzare il set di addestramento per addestrare il modello.

Puoi utilizzare il set di test per testare il modello.

Addestrare il modello significa creare il modello.

Testare il modello significa testare l'accuratezza del modello.

Inizia con il set di dati.

Inizia con il set di dati da testare.

Il nostro set di dati mostra 100 clienti del 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 i minuti prima dell'acquisto.

L'asse y rappresenta l'importo speso nell'acquisto.


Eseguire l'istanza

Splitting del set di addestramento/test

Il set di addestramento dovrebbe essere una selezione casuale del 80% dei dati originali.

Il set di test dovrebbe essere il 20% rimanente.

train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]

Mostra il set di addestramento

Mostra la stessa scatter plot del set di addestramento:

Esempio

plt.scatter(train_x, train_y)
plt.show()

Risultato:

Sembra il set di dati originale, quindi sembra una scelta ragionevole:


Eseguire l'istanza

Mostra il set di test

Per assicurarsi che il set di test non sia completamente diverso, dobbiamo anche guardare il set di test.

Esempio

plt.scatter(test_x, test_y)
plt.show()

Risultato:

Il set di test sembra anche il set di dati originale:


Eseguire l'istanza

Adattamento del set di dati

Che aspetto ha il set di dati? Penso che il modello polinomiale sia il più adatto, quindi disegnano una retta di regressione polinomiale.

Per tracciare una linea attraverso i punti di dati, utilizziamo il modulo matplotlib plott() Metodo:

Esempio

Disegnare una retta di regressione polinomiale attraverso i punti di 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:


Eseguire l'istanza

Questo risultato può supportare la nostra raccomandazione di adattare il set di dati con regressione polinomiale, anche se provare a prevedere valori al di fuori del set di dati può portare a risultati strani. Ad esempio: questa riga indica che un cliente che rimane nel negozio per 6 minuti farà un acquisto di 200. Questo potrebbe essere un segno di overfitting.

Ma cosa è il punteggio R-squared? Il punteggio R-squared indica bene l'adattamento del mio set di dati al modello.

R2

Ricordi R2, noto anche come R quadrato (R-squared)?

Che misura la relazione tra l'asse x e l'asse y, con valori che vanno da 0 a 1, dove 0 significa assenza di relazione e 1 rappresenta una relazione completa.

Il modulo sklearn ha un nome rs_score() Il metodo, che ci aiuterà a trovare questa relazione.

Qui, dobbiamo misurare la relazione tra il tempo che il cliente trascorre nel negozio e l'importo che spende.

Esempio

Come si comporta la nostra dati di addestramento in termini di adattamento a 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)

Eseguire l'istanza

Nota:Il risultato 0.799 mostra una buona relazione.

Inserimento del set di test

Ora, almeno in termini di dati di addestramento, abbiamo costruito un modello abbastanza buono.

Poi, dobbiamo utilizzare i dati di test per testare il modello, per verificare se fornisce risultati identici.

Esempio

Determiniamo il punteggio R2 utilizzando 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)

Eseguire l'istanza

Nota:Il risultato 0.809 indica che il modello è adatto anche al set di test, siamo certi di poter utilizzare questo modello per prevedere valori futuri.

Valore predittivo

Ora che abbiamo stabilito che il nostro modello è buono, possiamo iniziare a prevedere nuovi valori.

Esempio

Quanto spenderà un cliente che rimane nel negozio per 5 minuti?

print(mymodel(5))

Eseguire l'istanza

Questo esempio prevede che il cliente abbia speso 22.88 dollari, sembra corrispondere al grafico: