Machine Learning Academy · Les

Projectafbakening: het probleem en de succescriteria definiëren

U schrijft een projectcharter van één pagina waarin u het voorspellingsdoel, de succesmetrics, de databronnen en de implementatiebeperkingen vastlegt voordat u code schrijft.

Les 1 van 413 stappen

Projectafbakening: het probleem en de succescriteria definiëren is een gratis Machine Learning Academy-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Machine Learning Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Machine Learning Academy bevat in totaal 4 lessen.

Waarom afbakening de belangrijkste stap is

De meest voorkomende reden dat ML-projecten mislukken, is niet een slecht gekozen algoritme — het is een slecht gedefinieerd probleem. Projectafbakening vertaalt een vage zakelijke behoefte ('we willen AI gebruiken') naar een nauwkeurige, meetbare specificatie die elke daaropvolgende technische beslissing stuurt. Een goed afgebakend project definieert het te voorspellen doel, de succescriteria, de gegevensvereisten en de beperkingen voor ingebruikname voordat er ook maar één regel modelleercode wordt geschreven.

De juiste ML-formulering kiezen

De eerste beslissing bij de afbakening is het type ML-taak. Vraag jezelf af: is de uitvoer een getal (regressie), een categorie (classificatie), een rangschikking (leren rangschikken), een cluster (zonder toezicht), of een reeks (NLP/tijdreeks)? Elk type leidt tot andere algoritmen, gegevensvereisten en evaluatiemaatstaven. Zo is ‘voorspel welke klanten vertrekken’ een binair classificatieprobleem en geen regressieprobleem, ook al draait het bedrijf uiteindelijk om omzet.

# Scoping checklist — ML task type
questions = [
    'What is the exact output the model should produce?',
    'Is the output a number (regression) or a category (classification)?',
    'Do we need probabilities, or just labels?',
    'Is there a natural ordering in the labels (ordinal vs nominal)?',
    'Is this supervised (labelled data exists) or unsupervised?',
    'Is time ordering important (time-series)?'
]
for q in questions:
    print('•', q)

Het voorspellingsdoel definiëren

Het voorspellingsdoel (label of afhankelijke variabele) moet ondubbelzinnig worden gedefinieerd. ‘Zal deze klant vertrekken?’ is niet eenduidig: binnen welke periode? Welke definitie van vertrek gebruik je (opzegging, inactiviteit, terugbetaling)? Een precieze definitie kan zijn: ‘zal de klant in de 90 dagen na zijn laatste aankoop geen enkele aankoop meer doen?’ Elk woord telt, omdat het bepaalt welke rijen in de database trainingsvoorbeelden worden.

# Example: formalising target definition in code
import pandas as pd

def label_churn(df, observation_date, prediction_window_days=90):
    '''
    Label a customer as churned (1) if they made no purchase
    in the prediction_window_days after observation_date.
    '''
    cutoff = pd.Timestamp(observation_date)
    window_end = cutoff + pd.Timedelta(days=prediction_window_days)
    churned = (
        df.groupby('customer_id')['purchase_date']
        .apply(lambda dates: not any((dates > cutoff) & (dates <= window_end)))
        .reset_index(name='churned')
    )
    return churned

Gegevensbronnen en haalbaarheid vaststellen

Controleer na het definiëren van het doel de beschikbare gegevens. Vraag jezelf af: bestaan er historische gegevens met labels? Hoe ver terug gaan die — zijn dat genoeg trainingsvoorbeelden? Zijn de kenmerken op het moment van voorspellen beschikbaar (en niet pas na de gebeurtenis)? Een kenmerk dat pas na de uitkomst wordt geregistreerd (bijvoorbeeld ‘klacht ingediend’) vormt een risico op gegevenslekken. Breng voor elk kandidaatkenmerk de bron, de verzamelingsfrequentie en de beschikbaarheidsvertraging in kaart voordat je het vastlegt.

# Data audit template
data_sources = [
    {'feature': 'days_since_last_purchase', 'source': 'orders DB', 'latency_hours': 1, 'leakage_risk': False},
    {'feature': 'total_spend_90d', 'source': 'orders DB', 'latency_hours': 1, 'leakage_risk': False},
    {'feature': 'support_tickets_opened', 'source': 'CRM', 'latency_hours': 24, 'leakage_risk': False},
    {'feature': 'refund_requested', 'source': 'finance DB', 'latency_hours': 1, 'leakage_risk': True}
]
import pandas as pd
audit = pd.DataFrame(data_sources)
print(audit)
print('\nFeatures with leakage risk:')
print(audit[audit['leakage_risk'] == True]['feature'].tolist())

Kwantitatieve succescriteria vaststellen

Vage succescriteria (‘het model moet nauwkeurig zijn’) maken projecten onmogelijk te evalueren. Succescriteria moeten specifiek, meetbaar, haalbaar, relevant en tijdgebonden (SMART) zijn. Definieer een primaire maatstaf (bijvoorbeeld recall ≥ 0.80 voor fraudedetectie), een secundaire maatstaf (precision ≥ 0.70) en een bedrijfsmaatstaf (verliezen door klantvertrek binnen 6 maanden met 15% verminderen). Deze bepalen wanneer je het model uitrolt en wanneer je het opnieuw traint.

# Formalised success criteria
success_criteria = {
    'primary_metric': {
        'name': 'recall (churn class)',
        'threshold': 0.80,
        'rationale': 'Missing a churner costs more than a false alert'
    },
    'secondary_metric': {
        'name': 'precision (churn class)',
        'threshold': 0.60,
        'rationale': 'Intervention budget: can only contact 40% of flagged customers'
    },
    'business_metric': {
        'name': 'retained revenue lift',
        'threshold': '+15% over no-model baseline',
        'measurement': 'A/B test over 90 days post-launch'
    }
}
for metric, spec in success_criteria.items():
    print(f'{metric}: {spec}')

Bas prestaties: de grens die je moet overtreffen

Definieer voordat je een model bouwt een referentieniveau — de eenvoudigste redelijke oplossing waarmee alle modellen worden vergeleken. Bij classificatie is het referentieniveau meestal een DummyClassifier die de grootste klasse voorspelt, of willekeurige voorspellingen doet met gewichten op basis van de klassenfrequentie. Bij regressie voorspel je het gemiddelde. Een model dat dit referentieniveau niet kan overtreffen, levert geen enkele bedrijfswaarde op en mag niet worden geïmplementeerd.

from sklearn.dummy import DummyClassifier
from sklearn.metrics import classification_report
import numpy as np

# Simulate imbalanced dataset (10% churn rate)
np.random.seed(42)
y = np.random.choice([0, 1], size=1000, p=[0.9, 0.1])

# Majority-class baseline
dummy = DummyClassifier(strategy='most_frequent')
dummy.fit(np.zeros((1000, 1)), y)  # features irrelevant for dummy
y_dummy = dummy.predict(np.zeros((1000, 1)))
print(classification_report(y, y_dummy, target_names=['retained', 'churned']))

Implementatiebeperkingen: vertraging en verwerkingscapaciteit

Een model dat voor 95% nauwkeurig is maar 10 seconden per voorspelling nodig heeft, is nutteloos in een realtime-aanbevelingssysteem. Leg implementatiebeperkingen al tijdens de afbakening vast: vertraging (maximale tijd per voorspelling), verwerkingscapaciteit (voorspellingen per seconde), geheugengebruik (mobiel versus cloud) en bijwerkfrequentie (elke dag versus elke maand opnieuw trainen). Deze beperkingen sluiten vaak hele groepen algoritmen uit voordat er code is geschreven.

# Deployment constraint spec
deployment = {
    'serving_mode': 'batch (nightly scoring of all active customers)',
    'max_latency_ms': None,   # batch: no real-time constraint
    'throughput_rps': None,
    'memory_budget_mb': 512,  # must run on a single EC2 t3.medium
    'retraining_frequency': 'weekly',
    'max_model_size_mb': 100,
    'explainability_required': True,
    'regulatory_audit_trail': True
}
for k, v in deployment.items():
    print(f'{k}: {v}')

Ethische en juridische beoordeling vooraf

Beoordeel ethische en juridische risico’s voordat je je aan een project vastlegt. Vraag jezelf af: heeft het model invloed op de toegang van personen tot diensten, werk of krediet? Zijn beschermde kenmerken (ras, gender, leeftijd) direct aanwezig of af te leiden uit plaatsvervangende kenmerken? Zijn er AVG-, CCPA- of sectorspecifieke voorschriften van toepassing (HIPAA voor gezondheidszorg, FCRA voor krediet)? Deze kwesties tijdens de afbakening identificeren kost minuten; ze pas na implementatie ontdekken kan miljoenen kosten en het vertrouwen van gebruikers vernietigen.

# Ethics and legal checklist
ethics_checklist = [
    ('High-stakes decisions on individuals?', True,   'churn model triggers retention offers, low risk'),
    ('Protected attributes in data?',          True,   'age and region present — must audit for proxy bias'),
    ('GDPR data minimisation required?',       True,   'only collect features needed for prediction'),
    ('Right to explanation required?',         True,   'EU AI Act high-risk? Check with legal team'),
    ('Regulatory filing required?',            False,  'B2C retention model, not financial services')
]
for question, answer, note in ethics_checklist:
    print(f'[{"YES" if answer else "NO"}] {question}  -> {note}')

Het projectcharter van één pagina

Leg alle beslissingen over de afbakening vast in een beknopt projectcharter — een document van één pagina dat belanghebbenden, engineers en datawetenschappers allemaal kunnen lezen en goedkeuren voordat het werk begint. Het charter specificeert: probleemstelling, type ML-taak, definitie van het voorspellingsdoel, gegevensbronnen, succesmaatstaven, referentieniveau, implementatiebeperkingen en ethische overwegingen. Het vormt de bron van waarheid bij discussies over scope creep gedurende het hele project.

charter_template = '''
PROJECT CHARTER
===============
Problem: Identify customers at risk of churning before they cancel.
ML Task: Binary classification (churned=1, retained=0)
Target: No purchase in 90 days after monthly observation date
Data Sources: orders DB, CRM (support tickets), product analytics
Primary Metric: Recall >= 0.80 on held-out test set
Secondary Metric: Precision >= 0.60
Baseline: DummyClassifier majority-class (recall = 0, precision = NaN)
Deployment: Batch scoring, weekly retraining, 100 MB model limit
Ethical Flags: Audit for age/region proxy bias; GDPR minimisation
Timeline: MVP in 6 weeks; A/B test for 90 days; review in month 5
'''
print(charter_template)

De afbakening iteratief aanpassen

Afbakening is geen eenmalige activiteit. Na een eerste verkenning van de gegevens (EDA) ontdek je mogelijk dat het label historisch niet te berekenen is, dat de scheefheid tussen klassen groter is dan verwacht, of dat het meest informatieve kenmerk te veel vertraging heeft voor realtime gebruik. Plan minstens één herziening van de afbakening na EDA en één na het uitvoeren van een referentiemodel. Geef het projectcharter versies met datums, zodat je kunt bijhouden hoe de probleembeschrijving zich heeft ontwikkeld.

# Charter revision log (tracked in version control)
revision_log = [
    {'version': 'v1.0', 'date': '2026-06-01',
     'change': 'Initial scope: 30-day churn window'},
    {'version': 'v1.1', 'date': '2026-06-05',
     'change': 'EDA: 30-day window has only 4% churn rate (too imbalanced); widened to 90 days'},
    {'version': 'v1.2', 'date': '2026-06-10',
     'change': 'Baseline run: dummy recall=0, real-time serving infeasible (10s latency); switched to batch'}
]
for rev in revision_log:
    print(f"{rev['version']} ({rev['date']}): {rev['change']}")

Van charter naar uitvoerbaar plan

Een voltooid charter vormt de basis voor een concreet werkplan. Deel het project op in fasen: Fase 1 — EDA en controle van de gegevenskwaliteit; Fase 2 — kenmerken construeren en referentieniveau; Fase 3 — modelselectie en afstemming; Fase 4 — evaluatie en controle op eerlijkheid; Fase 5 — implementatie, monitoring en A/B-toets. Wijs aan elke fase verantwoordelijken en deadlines toe. Deze structuur is hetzelfde, of je tijdlijn nu twee weken of zes maanden duurt.

project_phases = [
    ('Phase 1', 'EDA + data quality audit', '2026-06-01', '2026-06-07'),
    ('Phase 2', 'Feature engineering + baseline model', '2026-06-08', '2026-06-14'),
    ('Phase 3', 'Model selection + hyperparameter tuning', '2026-06-15', '2026-06-21'),
    ('Phase 4', 'Evaluation, fairness audit, model card', '2026-06-22', '2026-06-25'),
    ('Phase 5', 'Deploy + A/B test + monitoring setup', '2026-06-26', '2026-07-31')
]
print(f'{'Phase':8} | {'Deliverable':42} | Start      | End')
print('-' * 80)
for phase, desc, start, end in project_phases:
    print(f'{phase:8} | {desc:42} | {start} | {end}')

Korte controle

Toets je begrip van de concepten uit deze les over Machine Learning with Python.

Samenvatting van de les

In deze les heb je geleerd dat het afbakenen van een project bedrijfsbehoeften vertaalt naar precieze ML-specificaties voordat er code wordt geschreven, dat succescriteria kwantitatief moeten zijn en gekoppeld aan zowel modelmaatstaven als bedrijfsresultaten, en dat implementatiebeperkingen, ethische risico’s en de haalbaarheid van gegevens vooraf moeten worden beoordeeld om dure koerswijzigingen later te voorkomen. Hierna gaan we aan de slag met het bewerken en verkennen van gegevens om de onbewerkte gegevensverzameling te begrijpen en kwaliteitsproblemen te ontdekken.

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
30
Lessen
120

Veelgestelde vragen

Is de les “Projectafbakening: het probleem en de succescriteria definiëren” gratis?

Ja — de volledige tekst van “Projectafbakening: het probleem en de succescriteria definiëren” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Machine Learning Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Machine Learning Academy bevat in totaal 4 lessen.

Wat leer ik in “Projectafbakening: het probleem en de succescriteria definiëren”?

U schrijft een projectcharter van één pagina waarin u het voorspellingsdoel, de succesmetrics, de databronnen en de implementatiebeperkingen vastlegt voordat u code schrijft. Je oefent met Machine Learning Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Machine Learning Academy te beginnen?

Ervaring vooraf is niet nodig. Machine Learning Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Projectafbakening: het probleem en de succescriteria definiëren”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Machine Learning Academy?

Ja. Elke les over Machine Learning Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Projectafbakening: het probleem en de succescriteria definiëren
  2. Datavoorbereiding en verkennende data-analyse
  3. Toernooi voor modelselectie: vijf algoritmen vergelijken
  4. Het uiteindelijke model verpakken, documenteren en presenteren
← Terug naar Machine Learning Academy