Masjienleer - Trein/toets
Evalueer jou model
In Masjienleer skep ons modelle om die uitkoms van sekere gebeurtenisse te voorspel, soos in die vorige hoofstuk waar ons die CO2-vrystelling van 'n motor voorspel het toe ons die gewig en enjingrootte geweet het.
Om te meet of die model goed genoeg is, kan ons 'n metode genaamd Train/Test gebruik.
Wat is trein/toets
Trein/toets is 'n metode om die akkuraatheid van jou model te meet.
Dit word Trein/Toets genoem omdat jy die datastel in twee stelle verdeel: 'n opleidingstel en 'n toetsstel.
80% vir opleiding en 20% vir toetsing.
Jy lei die model op deur die oefenstel te gebruik.
Jy toets die model deur die toetsstel te gebruik.
Trein die model beteken om die model te skep.
Toets die model beteken om die akkuraatheid van die model te toets.
Begin met 'n datastel
Begin met 'n datastel wat jy wil toets.
Ons datastel illustreer 100 klante in 'n winkel, en hul inkopiegewoontes.
Voorbeeld
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:
Die x-as verteenwoordig die aantal minute voordat 'n aankoop gedoen word.
Die y-as verteenwoordig die hoeveelheid geld wat aan die aankoop bestee is.
Verdeel in trein/toets
Die opleidingstel moet 'n ewekansige keuse van 80% van die oorspronklike data wees.
Die toetsstel moet die oorblywende 20% wees.
train_x = x[:80]
train_y = y[:80]
test_x = x[80:]
test_y = y[80:]
Vertoon die opleidingstel
Vertoon dieselfde verspreidingsdiagram met die oefenstel:
Voorbeeld
plt.scatter(train_x,
train_y)
plt.show()
Resultaat:
Dit lyk soos die oorspronklike datastel, so dit blyk 'n billike keuse te wees:
Vertoon die toetsstel
Om seker te maak die toetsstel is nie heeltemal anders nie, sal ons ook na die toetsstel kyk.
Voorbeeld
plt.scatter(test_x,
test_y)
plt.show()
Resultaat:
Die toetsstel lyk ook soos die oorspronklike datastel:
Pas die datastel aan
Hoe lyk die datastel? Na my mening dink ek die beste passing sal 'n polinoomregressie wees , so kom ons trek 'n lyn van polinoomregressie.
Om 'n lyn deur die datapunte te trek, gebruik ons die
plot()
metode van die matplotlib-module:
Voorbeeld
Trek 'n polinoom regressielyn deur die datapunte:
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:
Die resultaat kan my voorstel van die datastel wat by 'n polinoomregressie pas, ondersteun, al sou dit ons 'n paar vreemde resultate gee as ons probeer om waardes buite die datastel te voorspel. Voorbeeld: die lyn dui aan dat 'n klant wat 6 minute in die winkel spandeer 'n aankoop ter waarde van 200 sal maak. Dit is waarskynlik 'n teken van oorpas.
Maar wat van die R-kwadraat-telling? Die R-kwadraattelling is 'n goeie aanduiding van hoe goed my datastel by die model pas.
R2
Onthou jy R2, ook bekend as R-kwadraat?
Dit meet die verwantskap tussen die x-as en die y-as, en die waarde wissel van 0 tot 1, waar 0 geen verband beteken nie, en 1 totaal verwant beteken.
Die sklearn-module het 'n metode genoem r2_score()
wat ons sal help om hierdie verhouding te vind.
In hierdie geval wil ons graag die verhouding meet tussen die minute wat 'n klant in die winkel bly en hoeveel geld hulle spandeer.
Voorbeeld
Hoe goed pas my opleidingsdata in 'n polinoomregressie?
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)
Let wel: Die resultaat 0.799 toon dat daar 'n OK verwantskap is.
Bring die toetsstel in
Nou het ons 'n model gemaak wat in orde is, ten minste wanneer dit by opleidingsdata kom.
Nou wil ons die model met die toetsdata ook toets, om te sien of ons dieselfde resultaat gee.
Voorbeeld
Kom ons vind die R2-telling wanneer toetsdata gebruik word:
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)
Let wel: Die resultaat 0.809 toon dat die model ook by die toetsstel pas, en ons is vol vertroue dat ons die model kan gebruik om toekomstige waardes te voorspel.
Voorspel waardes
Noudat ons vasgestel het dat ons model in orde is, kan ons nuwe waardes begin voorspel.
Voorbeeld
Hoeveel geld sal 'n koopkliënt spandeer as hy of sy 5 minute in die winkel bly?
print(mymodel(5))
Die voorbeeld het voorspel dat die kliënt 22,88 dollar sou bestee, soos blykbaar ooreenstem met die diagram: