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:
- Draai de code: hij print elke rij als een lijst teksten, zoals
['Feb', '3', 'TRUE', 'FALSE']. - Print in de loop alleen het getal van de maand:
MAANDEN[rij[0]]. - Print ook het aantal pagina's als getal, met
int(rij[1]). - Maak met een
ifvanrij[2]een 1 of een 0, en zet de drie getallen in een lijst. Voeg die met.append()toe aankenmerken. - Doe hetzelfde met
rij[3]voorlabels, en haal de prints uit de loop.
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.