Werkplaats / De werkplaats
In jouw eigen tempo
← Data
MODULE 03 · LES 08

Een kleur is geen rangnummer

Maak een vaste vocabulaire, one-hot-vectors en een expliciet beleid voor onbekende categorieën.

45 min3 checkpoints
DIT GA JE ONTDEKKEN
  • 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.

01
CHECKPOINTBepaal de kolommen tijdens fit

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.

Kolommen blijven blauw, rood
WaardeVectorOnbekend
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.

02
CHECKPOINTMaak onbekend expliciet

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.

VASTE KOLOMMEN, ZICHTBAAR ONBEKENDEen categorie wordt een vector

Training kent blauw en rood. Groen is een nieuwe categorie. De kolommen veranderen tijdens gebruik niet.

Kolom blauw0
Kolom rood1
Onbekend-vlag0

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.

03
CHECKPOINTEen dataset houdt dezelfde breedte

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.

Verder lezen & bronnen

Inhoud gecontroleerd op 2026-10-28.
DE VOLGENDE STAPEen grote dataset kan toch eenzijdig zijn
JOUW EXPERIMENT

Probeer het zelf

Python
main.py

Python start zodra jij code uitvoert.

UITVOER

Je uitvoer verschijnt hier.
Alles rekent in je eigen browser.

Jouw checkpoints0 / 3
01
Bepaal de kolommen tijdens fit

Schrijf vocabulaire(train) voor een lijst strings.

Een hint

Gebruik sorted(set(train)); verander de oorspronkelijke lijst niet.

02
Maak onbekend expliciet

Schrijf onehot(value,vocab) als (vector,unknown), met een bool voor unknown.

Een hint

De vector heeft altijd len(vocab) elementen; unknown is value not in vocab.

03
Een dataset houdt dezelfde breedte

Schrijf codeer_batch(values,vocab) en geef (matrix,unknowns) terug.

Een hint

Gebruik onehot per rij en verzamel de twee onderdelen apart.

Vastgelopen? Bekijk de voorbeeldoplossing
def vocabulaire(train):
    uniek = set(train)
    return sorted(uniek)


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)


def codeer_batch(values, vocab):
    matrix = []
    unknowns = []
    for i in range(len(values)):
        paar = onehot(values[i], vocab)
        matrix.append(paar[0])
        unknowns.append(paar[1])
    return (matrix, unknowns)

Voer de code uit en verklaar voor jezelf waarom elke stap werkt.