Een eigen Shopping
Je hebt alle stukken los geoefend: een CSV lezen, kenmerken en labels maken, voorspellen, en beoordelen met gevoeligheid en specificiteit. Bij Shopping zet je ze in functies, en de code van CS50 roept die aan. Dat doe je hier eerst zelf, op een ander probleem: gaat het morgen regenen?
Voorspel
def tel(labels):
enen = 0
nullen = 0
for label in labels:
if label == 1:
enen = enen + 1
else:
nullen = nullen + 1
return enen, nullen
a, b = tel([1, 0, 0, 1, 0])
print(a, b)
Wat print dit programma?
Antwoord
2 3
return enen, nullen geeft twee getallen tegelijk terug, als tuple. Met
a, b = … pak je ze meteen uit in twee variabelen.
Zo werkt het
Onderaan de editor staat code die je niet verandert, zoals CS50 je ook een deel van de code geeft. Die roept twee functies aan die jij afmaakt:
lees(regels)maakt van de regels twee lijsten,kenmerkenenlabels, en geeft ze allebei terug;beoordeel(labels, voorspellingen)geeft de gevoeligheid en de specificiteit terug.
Het voorspellen zelf doet voorspel_lijst in de verborgen code onder de
editor. Dat is wat scikit-learn bij Shopping voor je doet: de dichtstbijzijnde
buur zoeken voor elke dag in de toets. De eerste vier dagen zijn de toets, de
rest is de oefenset.
Bouw zelf: regent het morgen?
Elke regel is een dag: de temperatuur, de wind, of het bewolkt was, en of
het de dag erna regende. Maak lees en beoordeel af, zodat de code onderaan
dit print:
12 dagen
gevoeligheid: 1.0
specificiteit: 0.6666666666666666
Begin klein, en breid de code stap voor stap uit:
- Draai de code:
leesprint elke rij, maar geeft nog twee lege lijsten terug. Daarom staat er0 dagen, en geeftbeoordeelnog twee nullen. - Maak in
leesvan elke rij de kenmerken[temperatuur, wind, bewolkt]als getallen, en het label: 1 bij regen, anders 0. Zet ze inkenmerkenenlabels, en haal de print weg. Nu staat er12 dagen. - Print in
beoordeeleerstlabelsenvoorspellingen, zodat je ziet wat de voorspeller over de vier toetsdagen zei. - Reken in
beoordeelde gevoeligheid en de specificiteit uit, zoals in de vorige stap, en geef ze terug metreturn gevoeligheid, specificiteit.
Tip
Bij stap 3 zie je [1, 0, 0, 0] en [1, 0, 1, 0]. Hoeveel regendagen zitten
er in de toets, en hoeveel droge dagen noemt de voorspeller ook droog?
Antwoord
Dit vervangt alles onder de lijst regels:
def lees(regels):
kenmerken = []
labels = []
lezer = csv.reader(regels)
next(lezer)
for rij in lezer:
temperatuur = float(rij[0])
wind = int(rij[1])
if rij[2] == "TRUE":
bewolkt = 1
else:
bewolkt = 0
kenmerken.append([temperatuur, wind, bewolkt])
if rij[3] == "TRUE":
labels.append(1)
else:
labels.append(0)
return kenmerken, labels
def beoordeel(labels, voorspellingen):
regen = 0
herkend = 0
droog = 0
droog_herkend = 0
for echt, voorspeld in zip(labels, voorspellingen):
if echt == 1:
regen = regen + 1
if voorspeld == 1:
herkend = herkend + 1
else:
droog = droog + 1
if voorspeld == 0:
droog_herkend = droog_herkend + 1
return herkend / regen, droog_herkend / droog
kenmerken, labels = lees(regels)
print(len(kenmerken), "dagen")
voorspellingen = voorspel_lijst(kenmerken[4:], labels[4:], kenmerken[:4])
gevoeligheid, specificiteit = beoordeel(labels[:4], voorspellingen)
print("gevoeligheid:", gevoeligheid)
print("specificiteit:", specificiteit)
12 dagen
gevoeligheid: 1.0
specificiteit: 0.6666666666666666
De ene regendag herkent hij, en van de drie droge dagen noemt hij er twee
droog. Op de derde dag, 9.5,6,TRUE, was het bewolkt en winderig zonder
regen. Met vier toetsdagen zegt dat nog weinig; bij Shopping toets je met
duizenden bezoeken.
Door naar aan de slag met Shopping.