← Back to CoursesStemExpert
StemExpert
Expert · Handboek · 42. Classificatie en clustering
StemExpert · Brecht Corbeel · schoolium.me
StemExpert
E42. Classificatie en clustering
EExpert · deel E9 · Data science en AI

Handboek · hoofdstuk 42Classificatie en clustering

Labels voorspellen, groepen ontdekken en de kosten van verkeerde besluiten meten

Een droge plant kan dezelfde warme bladeren hebben als een zieke plant. Je leert sensorkenmerken naar een label omzetten en ongeëtiketteerde patronen groeperen. De centrale vraag blijft welk bewijs een voorspelling werkelijk levert en welke fout het station kan dragen.

8× uitleg6× uitgewerkt voorbeeld1× naslag1× verhaal1× het geheel2× code11 opdrachten in het werkboek± 13 lestijden
Een sensorpatroon en een diagnose hebben verschillende bewijslast.
Een sensorpatroon en een diagnose hebben verschillende bewijslast.
Na dit hoofdstuk
Uitleg · 42.1

Eerst het labelcontract

1/19

Een label ‘ziek’ vraagt een definitie: welke ziekte, volgens welke referentie, op welk moment? Een stresslabel uit bladtemperatuur is geen betrouwbare ziektediagnose zonder aanvullend bewijs. Droogte, hitte, licht en infectie kunnen overlappende patronen veroorzaken. De voorbeelden hier gebruiken synthetische labels om de algoritmen te leren.

Bewaar plant-ID, batch, meetplaats, tijd UTC+1, meetkwaliteit en labelherkomst. Meerdere beelden van dezelfde plant mogen niet over training en test worden verdeeld als je prestaties op nieuwe planten wilt kennen. Een referentiemeting wordt onafhankelijk van de modelsuggestie vastgesteld; anders bevestigt de annotator onbedoeld het model.

vraagvastleggen
positiefexpliciet gedefinieerd probleem
referentiecontrole door deskundige of passende proef
horizonnu of toekomstige aantasting
actieinspectievoorstel, geen directe diagnose
Uitleg · 42.2

Logistische regressie voorspelt een labelkans

2/19

Neem een score en . De log-odds is . Een lineaire score krijgt zo een waarde tussen nul en één. De grens p=0,5 is z=0: een rechte lijn bij twee features. De naam regressie verwijst naar het passen van parameters; het doel is hier classificatie.

Minimaliseer de gemiddelde binaire kruis-entropie. Met wordt de afgeleide naar z precies p−y. De gradiënt naar de gewichten is dus het gemiddelde van , plus een gekozen regularisatiestraf. Dit is een concrete verbinding met gradiëntafdaling uit e02.

binaire kruis-entropie
−6−4−202460,00,20,40,60,81,0score z (—)σ(z) (—)sigmoid
De drempel voor een actie wordt apart gekozen. Een scorekans is pas als risico interpreteerbaar na controle van kalibratie en populatie.
Uitgewerkt voorbeeld · 42.3

Een kans en één trainingsstap

3/19
Een plant heeft geschaalde x=(1,−1); b=−1 en w=(0,8;−0,6).
Gegeven
  • label y=1
  • leersnelheid η=0,1; geen regularisatie
Gevraagd
  • p en nieuwe parameters
Oplossing
  1. 1
    z=−1+0,8×1+(−0,6)×(−1)=0,4; p=0,598688.
  2. 2
    Afgeleide p−y=−0,401312. Gradiënten voor b,w1,w2: −0,401312; −0,401312; +0,401312.
  3. 3
    Aftrekken van η maal gradiënt geeft bnieuw=−0,959869; wnieuw=(0,840131;−0,640131). De positieve waarneming verhoogt zo haar score.
Antwoord
Eén stap beweegt in de richting van het label; een goede testscore volgt daar nog niet uit.
Uitleg · 42.4

K-dichtstbijzijnde buren gebruikt lokale voorbeelden

4/19

KNN bewaart de trainingswaarnemingen. Bereken de afstand tot een nieuwe plant, kies k buren en stem op hun labels. Met k=1 is de grens grillig; een grotere k verlaagt gevoeligheid voor lokale ruis maar kan kleine probleemgroepen overschreeuwen. Kies k op validatie.

Afstand vraagt betekenisvolle schaal. Een vochtpercentage met bereik 0–100 kan een temperatuurverschil van enkele kelvin domineren. Standaardiseer op training of kies een fysisch onderbouwde afstand. KNN extrapoleert niet betrouwbaar ver buiten bekende voorbeelden. Ontbrekende features mogen niet als nul worden toegevoegd. Bewaar ook de burenafstand als aanwijzing voor invoer buiten het domein.

afstand met trainingsschaal
Uitgewerkt voorbeeld · 42.5

Buren werkelijk tellen

5/19
Query (0,0); training: A(0,1) gezond, B(1,0) ziek, C(1,1) ziek, D(3,0) gezond.
Gegeven
  • features al gelijk geschaald
  • k=3
Gevraagd
  • buren en label
Oplossing
  1. 1
    Kwadratische afstanden: A=1, B=1, C=2, D=9.
  2. 2
    De drie buren zijn A,B,C; twee van drie zijn ziek. De meerderheidsvoorspelling is ziek; de stemmenfractie is 2/3.
  3. 3
    Die fractie is geen automatisch gekalibreerde kans. A en B zijn even ver; bij een grens op die afstand is een vaste tie-regel nodig.
Antwoord
k=3 geeft ziek; k=1 kan bij deze gelijke afstand van een implementatiedetail afhangen.
Uitleg · 42.6

Een beslisboom verdeelt met expliciete regels

6/19

Een boom kiest splitsingen zoals ΔT>1,5 K en daarna vocht<45%. Een blad bevat een klasse of trainingsfractie. De Gini-onzuiverheid voor een binaire fractie p is : nul bij een zuiver blad, 0,5 bij een helft-helftverdeling.

Een split wordt beoordeeld met de naar omvang gewogen onzuiverheid van de kinderen. Herhaalde greedy splits vinden een bruikbare lokale keuze, geen gegarandeerd globaal beste boom. Een diepe boom kan iedere trainingsplant memoriseren. Beperk diepte en minimumbladomvang en toets die instellingen onafhankelijk. De regels zijn leesbaar, maar worden pas oorzakelijk als het onderzoeksontwerp dat draagt.

instellinggevolg
grotere dieptemeer lokale details
groter minimumbladminder kleine uitzonderingsregels
Gini-criteriumvermindert gemengde labels
validatiekiest bruikbare complexiteit
Uitgewerkt voorbeeld · 42.7

Een splitsing narekenen

7/19
Tien planten: vier ziek en zes gezond. Links vijf: vier ziek, één gezond; rechts vijf: allemaal gezond.
Gegeven
  • binaire labels
Gevraagd
  • Gini voor en na splitsing
Oplossing
  1. 1
    Ouder: 2×0,4×0,6=0,48.
  2. 2
    Links: 2×0,8×0,2=0,32; rechts 0. Gewogen resultaat=(5/10)×0,32=0,16.
  3. 3
    Afname is 0,48−0,16=0,32. Dat is een verbetering op training; de vijf rechterplanten bewijzen nog geen perfecte regel buiten deze steekproef.
Antwoord
De split maakt labels zuiverder, maar heeft nog onafhankelijke toetsing nodig.
Code · 42.8

Drie classifiers op hetzelfde plantcontract

8/19

De code traint logistieke regressie met gradiëntafdaling, KNN en een echte recursieve beslisboom in NumPy. Stratificatie bewaart de synthetische 20% positieve prevalentie. Eén onafhankelijke waarneming per plant vermijdt herhaalde-plantenlekken. De validatieset kiest alleen de logistieke actiedrempel bij kosten vijf voor missen en één voor vals alarm; de eindtest blijft apart.

Pythonplant_classificatie.py66 regelsDownload
import numpy as nprng=np.random.default_rng(42)# Eén onafhankelijke modelwaarneming per plant; geen echte ziektegegevens.y=np.r_[np.zeros(360,dtype=int),np.ones(90,dtype=int)]deltaT=rng.normal(0.0+2.0*y,1.3,len(y))vocht=np.clip(rng.normal(55-12*y,10,len(y)),5,95)X=np.column_stack((deltaT,vocht))delen=[[],[],[]]for c in (0,1):    ids=rng.permutation(np.flatnonzero(y==c))    for j,a in enumerate(np.split(ids,[int(.6*len(ids)),int(.8*len(ids))])):        delen[j].extend(a)tr,va,te=[np.array(a) for a in delen]gem=X[tr].mean(axis=0); sd=X[tr].std(axis=0)Z=np.column_stack((np.ones(len(X)),(X-gem)/sd))def sigmoid(a): return 1/(1+np.exp(-np.clip(a,-40,40)))b=np.zeros(3)for stap in range(3000):    p=sigmoid(Z[tr]@b)    grad=Z[tr].T@(p-y[tr])/len(tr)+.01*np.r_[0,b[1:]]    b-=.1*gradp=sigmoid(Z@b)rooster=np.arange(.05,.96,.05)def kosten(ids,q,drempel):    pred=q>=drempel    return int(5*np.sum((y[ids]==1)&~pred)+np.sum((y[ids]==0)&pred))drempel=min(rooster,key=lambda t:kosten(va,p[va],t))def maat(waar,pred):    tn=np.sum((waar==0)&(pred==0)); fp=np.sum((waar==0)&(pred==1))    fn=np.sum((waar==1)&(pred==0)); tp=np.sum((waar==1)&(pred==1))    return [int(tn),int(fp),int(fn),int(tp)], tp/max(tp+fp,1),tp/max(tp+fn,1)print("drempel validatie",round(drempel,2),"kosten",kosten(va,p[va],drempel))for naam,q in (("logistiek0.5",p[te]>=.5),("logistiekgekozen",p[te]>=drempel)):    cm,pr,re=maat(y[te],q)    print(naam,"TN FP FN TP",cm,"precisie",round(pr,3),"recall",round(re,3))# KNN: afstanden in de met training gestandaardiseerde ruimte.afstand=((Z[te,None,1:]-Z[None,tr,1:])**2).sum(axis=2)ids=np.argsort(afstand,axis=1)[:,:7]knn=(y[tr][ids].mean(axis=1)>=.5)print("KNN7",maat(y[te],knn))# Kleine echte beslisboom: gewogen Gini, diepte3, minimaal12 per blad.def gini(a):    q=a.mean(); return 2*q*(1-q)def boom(ids,diepte=0):    blad=float(y[ids].mean())    if diepte==3 or len(ids)<24 or blad in (0.,1.): return blad    beste=(len(ids)*gini(y[ids]),None,None,None,None)    for j in range(2):        v=np.unique(X[ids,j]); grenzen=(v[:-1]+v[1:])/2        for t in grenzen:            links=ids[X[ids,j]<=t]; rechts=ids[X[ids,j]>t]            if min(len(links),len(rechts))<12: continue            verlies=len(links)*gini(y[links])+len(rechts)*gini(y[rechts])            if verlies<beste[0]: beste=(verlies,j,t,links,rechts)    if beste[1] is None: return blad    _,j,t,l,r=beste    return (j,float(t),boom(l,diepte+1),boom(r,diepte+1))def boomkans(knoop,x):    if isinstance(knoop,float): return knoop    j,t,l,r=knoop; return boomkans(l if x[j]<=t else r,x)tree=boom(tr)pt=np.array([boomkans(tree,x) for x in X[te]])print("boom3",maat(y[te],pt>=.5))print("boomwortel feature/grens",tree[:2])print("meerderheidsbasislijn accuracy",round(np.mean(y[te]==0),3))assert len(set(tr)&set(te))==0
drempel validatie 0.25 kosten 21
logistiek0.5 TN FP FN TP [68, 4, 9, 9] precisie 0.692 recall 0.5
logistiekgekozen TN FP FN TP [58, 14, 5, 13] precisie 0.481 recall 0.722
KNN7 ([64, 8, 8, 10], np.float64(0.5555555555555556), np.float64(0.5555555555555556))
boom3 ([66, 6, 9, 9], np.float64(0.6), np.float64(0.5))
boomwortel feature/grens (0, 1.4779002283226077)
meerderheidsbasislijn accuracy 0.8
−4−20246020406080100blad−lucht ΔT (K)wortelvocht (%)label gezondlabel ziek
Ziektelabels zijn synthetisch. Droogte, plaats en meetfout kunnen vergelijkbare sensorkenmerken veroorzaken; de figuur is geen diagnostische norm.
Uitgewerkt voorbeeld · 42.9

De werkelijke testuitvoer beoordelen

9/19
De gekozen logistieke drempel is 0,25.
Gegeven
  • 90 testplanten: 18 positief, 72 negatief
  • gekozen matrix TN=58, FP=14, FN=5, TP=13
Gevraagd
  • foutkosten en inzetbesluit
Oplossing
  1. 1
    De gekozen drempel geeft precisie 13/27=48,15% en recall 13/18=72,22%. Foutkosten=5×5+14=39.
  2. 2
    Bij drempel 0,5 waren FN=9 en FP=4: kosten=49. Altijd gezond kost 5×18=90. De gekozen actie helpt in dit voorbeeld, terwijl accuracy 71/90=78,89% lager is dan de 80%-meerderheidsbasislijn.
  3. 3
    Een voorstel voor 90% recall wordt nog niet gehaald. Met slechts 18 positieve testplanten is de onzekerheid bovendien aanzienlijk. Gebruik de lesuitkomst niet als bewezen kasdiagnose.
Antwoord
De kostenverbetering en een onhaalbare acceptatie-eis kunnen tegelijk waar zijn.
Uitleg · 42.10

Confusiematrix legt de foutsoorten bloot

10/19

Kies ‘ziek’ als positieve klasse. TP is een juist ziektevoorstel, FP een onterechte inspectie, FN een gemiste zieke plant en TN een correct gezond voorstel. Zet vooraf vast of rijen de waarheid of de voorspelling voorstellen. De code print TN,FP,FN,TP expliciet om verwisseling te voorkomen.

Precisie=TP/(TP+FP) beantwoordt hoeveel meldingen terecht zijn. Recall=TP/(TP+FN) vertelt hoeveel zieken gevonden zijn. Accuracy=(TP+TN)/N kan goed lijken wanneer ziekte zeldzaam is. Geef aantallen naast percentages: recall 100% op één zieke plant is weinig bewijs. Bij geen positieve voorspellingen is precisie niet informatief; documenteer hoe je die lege noemer rapporteert.

werkelijkheid / voorspellinggezondziek
gezondTNFP
ziekFNTP
Uitgewerkt voorbeeld · 42.11

Een goede accuracy kan veel missen

11/19
Van 100 planten zijn 10 ziek. Het model meldt 8: 6 terecht en 2 onterecht.
Gegeven
  • positief is ziek
Gevraagd
  • matrix, accuracy, precisie, recall en F1
Oplossing
  1. 1
    TP=6, FP=2, FN=4, TN=88.
  2. 2
    Accuracy=94/100=94%; precisie=6/8=75%; recall=6/10=60%.
  3. 3
    F1=2TP/(2TP+FP+FN)=12/18=66,67%. Een altijd-gezondbasislijn heeft al 90% accuracy, maar recall nul.
Antwoord
Het model mist vier van de tien zieken ondanks 94% accuracy.
Uitleg · 42.12

Drempels volgen foutkosten en kalibratie

12/19

Een lagere drempel meldt meer planten: doorgaans stijgt recall en daalt precisie. Kies de drempel op validatie vanuit inspectiecapaciteit en foutkosten. Als p een goed gekalibreerde ziekte-kans is, kost inspecteren en missen . Inspecteren wint als . Bij kosten 1 en 5 is dat 1/6.

Deze afleiding veronderstelt die kosten en kalibratie. De code kiest empirisch een grens uit een rooster, zodat dezelfde vereenvoudigingen niet als gemeten klinische of biologische waarheid worden gepresenteerd. Controleer op test de gekozen actie, scorekalibratie en prestaties per batch of omgeving. Een modelscore is een voorstel aan de inspecteur.

grens bij passende kansen en twee foutkosten
Uitleg · 42.13

Onevenwichtige data veranderen wat je ziet

13/19

Bij 1% positieve planten kan een model dat nooit ziek zegt 99% accuracy bereiken. Rapporteer daarom prevalentie, recall, precisie, foutaantallen en een precision-recallcurve over drempels. Vergelijk prestaties op dezelfde beoogde populatie; precisie verandert wanneer ziekte zeldzamer wordt.

Klassegewichten en oversampling kunnen training helpen, maar veranderen de verliesfunctie of trainingsverdeling. Een gewogen logistieke score is niet vanzelf de oorspronkelijke populatiekans. Corrigeer of kalibreer op representatieve onafhankelijke data. Resampling gebeurt uitsluitend binnen training. Houd alle herhalingen van een plant en synthetische afgeleiden in dezelfde fold. Maak het testdeel representatief voor de echte inzet.

ingreepcontrole
klassegewichtenkosten en scorekalibratie
oversamplinggeen kopieën in test
stratificatievoldoende positieve voorbeelden
groep-splitnieuwe planten echt nieuw
Uitgewerkt voorbeeld · 42.14

Een gewogen score is een andere kans

14/19
Training weegt positieve voorbeelden negenmaal zo zwaar.
Gegeven
  • populatiekans p
  • ideaal passende gewogen score q=9p/(9p+1−p)
Gevraagd
  • de oorspronkelijke kans bij q=0,75
Oplossing
  1. 1
    Herschikken van q=9p/(1+8p) geeft p=q/(9−8q).
  2. 2
    Bij q=0,75 is p=0,75/(9−6)=0,25. Een gewogen score van 75% kan dus overeenkomen met 25% onder het oorspronkelijke populatiemodel.
  3. 3
    Deze rekenrelatie veronderstelt een ideaal passend model en precies die gewichten. Controleer werkelijke scorekalibratie op representatieve onafhankelijke data.
Antwoord
Klassegewichten veranderen de verliesfunctie; drempel en interpretatie moeten daarbij passen.
Uitleg · 42.15

Clustering vraagt geen ziektelabels

15/19

K-means zoekt k centra en minimaliseert de som van kwadratische afstanden: . Wissel twee stappen af: wijs ieder punt toe aan het dichtste centrum; vervang ieder centrum door het gemiddelde van zijn toegewezen punten. Het gemiddelde minimaliseert de kwadratensom bij vaste toewijzing.

Elke gewone stap verhoogt J niet, maar de oplossing kan een lokaal minimum zijn. Begin meerdere keren en behoud de laagste J. Lege clusters vragen een expliciete herstartregel. Schaal kenmerken voordat je afstand vergelijkt. Groepen met verschillende dichtheid, langgerekte vorm of uitschieters passen niet altijd bij deze geometrie.

centrum bij vaste clusterleden
Code · 42.16

K-means met meerdere starts

16/19

De ongeëtiketteerde dataset bevat 210 geschaalde modelwaarnemingen. Acht starts beperken toevallige slechte initialisatie. De code toont centra, omvang, iteraties en J voor verschillende k. Er wordt geen ziektelabel gebruikt. Een lagere J bij meer centra is op zichzelf geen bewijs voor het juiste aantal biologische groepen.

Pythonplant_clusters.py21 regelsDownload
import numpy as nprng=np.random.default_rng(420)# Ongeëtiketteerde, gestandaardiseerde modelsamples.X=np.vstack([rng.normal(c,.45,(70,2)) for c in [(-1,-1),(1,0),(0,1.5)]])def kmeans(X,k,seed):    r=np.random.default_rng(seed)    c=X[r.choice(len(X),k,replace=False)].copy()    for it in range(100):        lab=((X[:,None,:]-c[None,:,:])**2).sum(axis=2).argmin(axis=1)        nieuw=np.array([X[lab==j].mean(axis=0) if np.any(lab==j)                        else X[r.integers(len(X))] for j in range(k)])        if np.max(np.abs(nieuw-c))<1e-8: c=nieuw; break        c=nieuw    lab=((X[:,None,:]-c[None,:,:])**2).sum(axis=2).argmin(axis=1)    sse=np.sum((X-c[lab])**2)    return sse,c,lab,it+1sse,c,lab,it=min([kmeans(X,3,s) for s in range(8)],key=lambda v:v[0])print("k3 SSE",round(sse,3),"iteraties",it)print("clusteromvang",np.bincount(lab).tolist())print("centra",np.round(c,3))print("SSE per k",[(k,round(min(kmeans(X,k,s)[0] for s in range(8)),2)) for k in (1,2,3,4)])
k3 SSE 75.519 iteraties 6
clusteromvang [69, 70, 71]
centra [[ 1.037  0.022]
 [-0.998 -0.974]
 [ 0.046  1.53 ]]
SSE per k [(1, np.float64(443.84)), (2, np.float64(189.5)), (3, np.float64(75.52)), (4, np.float64(65.22))]
−3−2−10123−3−2−10123geschaalde feature 1 (—)geschaalde feature 2 (—)cluster 1cluster 2cluster 3
Cluster-ID's zijn willekeurig. De algoritmische groepen leveren zonder externe beoordeling geen naam of oorzaak van plantproblemen.
Verhaal · 42.17

Een cluster krijgt betekenis door een nieuwe vraag

17/19

Een operator kan clusters gebruiken om representatieve planten voor inspectie te selecteren. Vergelijk per cluster licht, batch, cultivar en referentiediagnose. Een cluster kan een hoek van de kas of sensormontage herkennen in plaats van ziekte. Veranderde clusteromvang kan daarom een meetprobleem of veranderde omgeving zijn.

De primaire algoritmedocumentatie staat bij logistische regressie, beslisbomen en k-means van scikit-learn, geraadpleegd 30-09-2026. De lescode gebruikt NumPy zodat de update en splitsing zichtbaar blijven. Clusters worden pas als probleemgroepen benoemd na externe beoordeling.

−3−2−10123−3−2−10123geschaalde feature 1 (—)geschaalde feature 2 (—)cluster 1cluster 2cluster 3
Cluster-ID's zijn willekeurig. De algoritmische groepen leveren zonder externe beoordeling geen naam of oorzaak van plantproblemen.
Naslag · 42.18

De evaluatie op één blad

18/19
twee verschillende foutvragen
symboolbetekeniseenheid
juist positieve voorspellingen—
vals positief—
vals negatief—
methodevraagt
logistieklineaire score, goede features en kalibratie
KNNschaal en representatieve buren
boomcomplexiteitsgrens en onafhankelijke test
k-meansk, afstand en externe interpretatie
Het geheel · 42.19

Van plantdata naar begrensde inspectie

19/19

Een classifier brengt referentielabels, statistiek en beheer samen. Een cluster helpt zoeken. Het station bewaart waarom een plant is voorgesteld en wie het voorstel bevestigde.

Onzekerheid in sensorkenmerken.

Eerlijke splits en preprocessing.

Meer flexibele beslisgrenzen.

Bevoegdheid en bias.

Een toetsbaar inspectiecontract.

Habitat

Habitat start met een inspectievoorstel. Datasetlabels, batch-split, drempel en foutkosten worden vastgelegd. De getoonde vocht- en bladkenmerken zijn lesvoorbeelden en voegen geen nieuwe sensor aan de vaste stationsconfiguratie toe.

Samenvatting

In het kort

Begrippen

Wat je nu kent

classificatie
Een waarneming aan een vooraf gedefinieerd label toewijzen.
clustering
Groepen zoeken op overeenkomst zonder de doelgroepen als labels aan te leveren.
precisie
Aandeel werkelijk positieve gevallen onder positieve voorspellingen.
recall
Aandeel gevonden positieve gevallen onder alle werkelijk positieve gevallen.
actiedrempel
Scoregrens waarboven een vooraf afgesproken handeling volgt.
Aan de slag in het werkboek11 opdrachten, van oefenen tot uitdagen