Ga naar hoofdinhoud

Kenmerken en labels

Je kunt nu elke kolom omzetten naar een getal. In deze stap maak je van elke rij twee dingen: de kenmerken, een lijst getallen waarmee de voorspeller rekent, en het label, het antwoord dat hij moet leren voorspellen. Zo wil Shopping de gegevens hebben.

Voorspel​

MAANDEN = {"Jan": 0, "Feb": 1, "Mar": 2}
rij = ["Mar", "12", "FALSE", "TRUE"]
kenmerk = [MAANDEN[rij[0]], int(rij[1])]
print(kenmerk)

Wat print dit programma?

Antwoord
[2, 12]

Zo werkt het​

Bij het fruit stonden de maten en de soort samen in één tuple: ((8, 8), "appel"). Bij Shopping staan ze in twee aparte lijsten, kenmerken en labels, even lang. De kenmerken van de eerste bezoeker staan op plek 0 van kenmerken, en of hij iets kocht op plek 0 van labels.

Een label is een getal: 1 als de bezoeker iets kocht, en anders 0. Daarmee kan de voorspeller net zo goed rekenen als met een tekst.

Opdracht: van tekst naar getallen​

Maak van elke rij twee dingen:

  • een lijst kenmerken met drie getallen: de maand (januari is 0, december is 11), het aantal pagina's, en 1 voor een terugkerende bezoeker of 0 voor een nieuwe;
  • een label: 1 als de bezoeker iets kocht, en anders 0.

Zet alle kenmerken in de lijst kenmerken en alle labels in de lijst labels. Met de regels hieronder print je aan het eind:

[[1, 3, 1], [2, 12, 0], [2, 1, 0], [10, 25, 1]]
[0, 1, 0, 1]

Begin klein, en breid de code stap voor stap uit:

  1. Draai de code: hij print elke rij als een lijst teksten, zoals ['Feb', '3', 'TRUE', 'FALSE'].
  2. Print in de loop alleen het getal van de maand: MAANDEN[rij[0]].
  3. Print ook het aantal pagina's als getal, met int(rij[1]).
  4. Maak met een if van rij[2] een 1 of een 0, en zet de drie getallen in een lijst. Voeg die met .append() toe aan kenmerken.
  5. Doe hetzelfde met rij[3] voor labels, en haal de prints uit de loop.
Python
Code-omgeving wordt voorbereid…
Tip

rij[2] is de tekst 'TRUE' of 'FALSE', niet de waarde True. Vergelijk hem dus met een tekst: if rij[2] == "TRUE":. Een lijst met drie getallen maak je met [maand, paginas, terug].

Antwoord
import csv

regels = [
"maand,paginas,terugkerend,gekocht",
"Feb,3,TRUE,FALSE",
"Mar,12,FALSE,TRUE",
"Mar,1,FALSE,FALSE",
"Nov,25,TRUE,TRUE",
]
MAANDEN = {
"Jan": 0, "Feb": 1, "Mar": 2, "Apr": 3, "May": 4, "Jun": 5,
"Jul": 6, "Aug": 7, "Sep": 8, "Oct": 9, "Nov": 10, "Dec": 11,
}

kenmerken = []
labels = []
lezer = csv.reader(regels)
next(lezer)
for rij in lezer:
if rij[2] == "TRUE":
terug = 1
else:
terug = 0
kenmerken.append([MAANDEN[rij[0]], int(rij[1]), terug])
if rij[3] == "TRUE":
labels.append(1)
else:
labels.append(0)

print(kenmerken) # [[1, 3, 1], [2, 12, 0], [2, 1, 0], [10, 25, 1]]
print(labels) # [0, 1, 0, 1]

Bij Shopping doe je hetzelfde, maar dan met zeventien kolommen. Kijk in het bestand zelf hoe de maanden en de soorten bezoekers precies geschreven zijn: één letter anders, en je dictionary vindt de maand niet.

Door naar de voorspeller uit scikit-learn.