Machine Learning - Training/Testing

Model evalueren

In de machine learning maken we modellen om de uitkomst van bepaalde gebeurtenissen te voorspellen, net zoals in het vorige hoofdstuk toen we de massa en het motorgedeputeerde begrepen, voorspelden we de CO2-uitstoot van de auto.

Om te meten of het model voldoende goed is, kunnen we een methode gebruiken die training/test heet.

Wat is training/test

Training/test is een methode om de nauwkeurigheid van het model te meten.

Het wordt getiteld training/test omdat we de dataset hebben verdeeld in twee groepen: de trainingsset en de testset.

80% wordt gebruikt voor training, 20% voor testing.

U kunt de trainingsset gebruiken om het model te trainen.

U kunt de testset gebruiken om het model te testen.

Het trainen van het model betekent het creëren van het model.

Het testen van het model betekent het testen van de nauwkeurigheid van het model.

Begin met de dataset.

Begin met de dataset die moet worden getest.

Onze dataset toont 100 klanten in de winkel en hun aankoopgewoonten.

Example

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()

Resultaat:

De x-as geeft het aantal minuten voor de aankoop aan.

De y-as geeft het bedrag aan dat wordt uitgegeven.


Run Instance

Trainings-/testverdeling

De trainingsset zou een willekeurige selectie van 80% van de oorspronkelijke gegevens moeten zijn.

De testset zou 20% moeten zijn van de resterende gegevens.

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

Toon de trainingsset

Toon een scatterplot zoals het trainingsset:

Example

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

Resultaat:

Het ziet eruit als de oorspronkelijke dataset, dus het lijkt een redelijke keuze te zijn:


Run Instance

Toon de testset

Om ervoor te zorgen dat de testset niet compleet anders is, moeten we ook een kijkje nemen naar de testset.

Example

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

Resultaat:

De testset ziet eruit als de oorspronkelijke dataset:


Run Instance

Fitting van de dataset

Hoe ziet de dataset eruit? Ik denk dat een polynoomregressie het meest geschikt is voor de fitting, dus laten we een polynoomregressielijn tekenen.

Om een lijn door de datapunten te tekenen, gebruiken we de matplotlib-module plott() Methode:

Example

Tekenen van een polynoomregressielijn door de datapunten:

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()

Resultaat:


Run Instance

Dit resultaat kan ons advies ondersteunen om een polynoomregressie te gebruiken voor de dataset, zelfs als we proberen waarden buiten de dataset te voorspellen, wat ons enkele vreemde resultaten kan opleveren. Bijvoorbeeld: deze regel suggereert dat een klant die 6 minuten in de winkel heeft geweest, een aankoop van 200 euro heeft gedaan. Dit kan een teken van overfitting zijn.

Maar wat is de R-squared score? De R-squared score geeft goed aan hoe goed mijn dataset past in het model.

R2

Herinner je je R2, ook wel R-kwadraat (R-squared) genoemd?

Die meet de relatie tussen de x-as en de y-as, met waarden van 0 tot 1, waarbij 0 geen relatie betekent en 1 volledige relatie.

De sklearn-module heeft een module genaamd rs_score() Deze methode, die ons zal helpen om deze relatie te vinden.

Hier willen we de relatie meten tussen de tijd die klanten in de winkel doorbrengen en het bedrag dat ze uitgeven.

Example

Hoe goed passen onze trainingsgegevens in een polynoomregressie?

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)

Run Instance

Note:Het resultaat 0.799 toont een goed verband aan.

Introduceren van de testset

Nu hebben we ten minste op het gebied van trainingsgegevens een aardige model opgebouwd.

Vervolgens moeten we testgegevens gebruiken om het model te testen om te controleren of het dezelfde resultaten oplevert.

Example

Let's determine the R2 score when using test data:

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)

Run Instance

Note:The result of 0.809 indicates that the model is also suitable for the test set, and we are confident that we can use this model to predict future values.

Predicted Value

Now that we have confirmed that our model is good, we can start predicting new values.

Example

How much money will the customer spend if they stay in the store for 5 minutes?

print(mymodel(5))

Run Instance

This example predicts that the customer spent 22.88 US dollars, which seems to correspond to the chart: