- Je codeert nominale categorieën zonder een verzonnen volgorde.
- Je houdt de kolomvolgorde vast en behandelt onbekende waarden bewust.
Een plant kan rood, blauw of groen bloeien. Als je die kleuren de getallen 1, 2 en 3 geeft, lijkt groen verder van rood te liggen dan blauw. Die afstand heb je zelf verzonnen: de kleurnaam beschrijft hier een categorie, geen hoeveelheid.
Dit zijn nominale categorieën (nominal categories): namen zonder afgesproken rangorde. One-hot encoding maakt voor iedere bekende categorie een eigen kolom. Een rij zet precies die kolom aan die bij haar kleur hoort.
1. Bepaal eerst wat elke kolom betekent
Denk aan een formulier met één vakje voor blauw en één voor rood. De vakjes moeten voor iedere plant in dezelfde volgorde staan, anders betekent het tweede getal bij de ene rij iets anders dan bij de volgende. We leggen die volgorde vast tijdens fit.
Onze training bevat ["rood", "blauw", "rood"]. Er zijn twee unieke namen; alfabetisch geordend worden de kolommen ["blauw", "rood"]. Dit lijstje heet de vocabulaire (vocabulary) van de encoder.
train = ["rood", "blauw", "rood"]
uniek = set(train)
vocab = sorted(uniek)
print(vocab) # ['blauw', 'rood']
print(train) # ['rood', 'blauw', 'rood']
set(train) verwijdert herhaalde namen; sorted maakt er een voorspelbaar geordende lijst van. Je kent beide stappen al van recordidentiteit. De oorspronkelijke trainingslijst verandert niet.
Maak vocabulaire(train) voor een lijst teksten. Bij lege training krijg je []; er zijn dan geen bekende categorieën. Gebruik exacte tekstvergelijking: deze oefening past geen casefold toe, omdat kleuren hier al volgens één bronafspraak zijn aangeleverd.
Alfabetisch ordenen geeft geen waardeoordeel: blauw is niet “lager” of “beter” dan rood. Bij een kenmerk zoals klein, middel, groot kan wél een betekenisvolle ordening bestaan. Kies de codering dus vanuit het datacontract, niet alleen vanuit wat gemakkelijk in Python past.
2. Laat een onbekende kleur zichtbaar onbekend
Met de vastgelegde kolommen krijgt rood [0,1] en blauw [1,0]. Groen heeft geen eigen kolom: volgens ons contract krijgt groen [0,0] én een aparte onbekendvlag True. Een bekende kleur krijgt die vlag False.
| Waarde | Vector | Onbekend |
|---|---|---|
| rood | [0,1] | False |
| blauw | [1,0] | False |
| groen | [0,0] | True |
Loop per waarde langs de kolommen. Start ieder vakje op 0 en vervang het door 1 als de namen overeenkomen. Je krijgt dus altijd evenveel getallen als er namen in vocab staan.
def onehot(value, vocab):
vector = []
for i in range(len(vocab)):
vakje = 0
if value == vocab[i]:
vakje = 1
vector.append(vakje)
unknown = value not in vocab
return (vector, unknown)
print(onehot("rood", vocab))
# ([0, 1], False)
print(onehot("groen", vocab))
# ([0, 0], True)
unknown is Engels voor onbekend. De vergelijking met not in levert een echte boolean op; de functie geeft een tuple met vector en vlag terug. Maak onehot(value, vocab) zonder de vocabulaire te wijzigen.
Veelgemaakte fout: groen aan de kolommen toevoegen zodra het in test verschijnt. Dan veranderen zowel je geleerde vocabulaire als de matrixbreedte. Een model met twee invoerkolommen kan niet zomaar dezelfde gewichten gebruiken voor drie kolommen.
Training kent blauw en rood. Groen is een nieuwe categorie. De kolommen veranderen tijdens gebruik niet.
rood → [0, 1] · onbekend = nee
Een nulvector krijgt een expliciete vlag. Zo verwar je een nieuwe kleur niet met een bekende kleur.
Voorspel de rij voor groen en klik dan op die knop. Beide kleurkolommen zijn 0; alleen de onbekendvlag is 1. Wissel naar rood en blauw en controleer dat telkens dezelfde kolom bij dezelfde kleur hoort.
De visualisatie toont de boolean als 0 of 1 om haar zichtbaar te maken. Jouw functie geeft nog steeds False of True terug. Een onbekende kleur weigeren of een aparte onbekendkolom reserveren kan ook, maar hier houden we ons aan één vast beleid.
3. Verzamel rijen zonder de vorm te veranderen
Voor ["rood", "groen", "blauw"] worden de rijen achtereenvolgens [0,1], [0,0] en [1,0]. De aparte vlaggenlijst is [False,True,False]. Dezelfde positie in beide lijsten hoort bij dezelfde oorspronkelijke waarde.
values = ["rood", "groen", "blauw"]
matrix = []
unknowns = []
for i in range(len(values)):
paar = onehot(values[i], vocab)
matrix.append(paar[0])
unknowns.append(paar[1])
print(matrix) # [[0,1], [0,0], [1,0]]
print(unknowns) # [False, True, False]
Een tuple kun je net als een lijst op positie uitlezen: paar[0] is de vector en paar[1] de vlag. Maak codeer_batch(values, vocab) met resultaat (matrix, unknowns). Lege invoer geeft twee lege lijsten.
De vlaggen zijn hier apart gehouden. In het bouwproject voegen we zo'n vlag als laatste numerieke kolom aan de rij toe; dat is een expliciete volgende afspraak. Veel categorieën leveren veel kolommen op, waardoor later compactere representaties nuttig kunnen zijn.
Wat neem je mee?
- Leer unieke categorieën en hun kolomvolgorde alleen uit training.
- One-hot geeft geen verzonnen rangorde; onbekend wordt hier een nulvector met een aparte boolean.
- Iedere rij behoudt dezelfde breedte en de vlaggen blijven op dezelfde posities staan.
Hierna onderzoek je of de aantallen voorbeelden en gemeten groepen wel bij je toepassing passen.