Logo
AfbeeldingThe AuditBuilder

Isolation Forest: Anomalies detecteren zonder business regels

6 minutenAudit leadAudit data-analist
In dit artikel introduceren we Isolation Forest, een algoritme dat je helpt zoeken naar afwijkingen op een hele begrijpelijke manier. Het zoekt niet naar specifieke fouten, maar identificeert observaties die anders zijn dan de rest, ongeacht de reden. Een krachtig hulpmiddel voor risico-analyse en het vinden van de "unknown unknowns".

Isolation Forest

Het concept

De naam "Isolation Forest" verraadt de werking al wel een beetje. Het algoritme probeert elk datapunt (bijvoorbeeld een transactie) te isoleren van de rest.

Stel je voor dat je een willekeurige transactie uit je dataset pakt. Om deze te isoleren, stelt het algoritme willekeurige 'ja/nee'-vragen over de data, bijvoorbeeld: "Is het bedrag hoger dan €500?" of "Is de factuurdatum na de 15e?".

Normale transacties lijken sterk op elkaar en vormen een dicht cluster; je hebt veel vragen nodig om één specifieke normale transactie te onderscheiden van de massa. Afwijkingen (anomalies) daarentegen hebben unieke eigenschappen en liggen figuurlijk gesproken aan de rand van de dataset. Vaak zijn er maar heel weinig vragen nodig om zo'n punt te isoleren. De kernregel is simpel: hoe sneller een transactie geïsoleerd wordt, hoe groter de kans dat het een anomalie is.

Het verschil met andere analyses

In de auditpraktijk leunen we sterk op verwachtingen. Bij een aansluiting controleren we of 'Saldo A' gelijk is aan 'Saldo B'. Bij een verbandscontrole verifiëren we of 'Volume x Prijs' overeenkomt met de 'Omzet'. En bij andere data-analyse schrijven we vaak queries op basis van specifieke criteria (bijv. "Segration of Duty" of "bedragen boven de €10.000").

De gemene deler bij al deze methoden is dat je vooraf definieert wat je zoekt. Je valideert een bestaande verwachting.

Isolation Forest draait dit om. Het is een agnostische methode. Het kijkt niet of een boeking voldoet aan jouw regels, maar kijkt puur naar de data zelf. Het vindt patronen waar je als auditor misschien nooit aan had gedacht. Bijvoorbeeld: een specifieke combinatie van een grootboekrekening en een kostenplaats die statistisch gezien nooit voorkomt, ook al is het bedrag laag en valt het binnen de budgetten. Waar traditionele analyses "controleren", ben je met Isolation Forest aan het "verkennen".

Voor de data scientists: de link met Random Forest

Misschien ben je al bekend met Random Forest, een populair algoritme voor voorspellingen. Isolation Forest deelt zijn DNA met deze techniek; beide methoden gebruiken een verzameling ('forest') van beslisbomen om tot een resultaat te komen. Het fundamentele verschil zit in het doel. Waar Random Forest 'supervised' is en leert van gelabelde voorbeelden uit het verleden (bijvoorbeeld: "dit waren foute transacties"), werkt Isolation Forest 'unsupervised'. Het heeft geen trainingsdata of historische fouten nodig. Het gebruikt de structuur van de bomen enkel om te meten hoe 'afgezonderd' een datapunt ligt.

Wanneer zet je dit in?

Omdat Isolation Forest zoekt naar afwijkingen van de norm, werkt het alleen goed in populaties waar ook daadwerkelijk een "norm" of patroon bestaat. De techniek is bijzonder relevant voor:

  • Journal Entry Testing (JET): In de enorme brij van memoriaalboekingen zitten veel repeterende processen (afschrijvingen, loonjournaalposten). Een handmatige correctie die afwijkt van dit patroon (ander bedrag, andere rekening-combinatie) komt direct bovendrijven.
  • Stamdata Analyse: Analyseer wijzigingen in crediteuren- of debiteurenstamdata. Een wijziging is op zichzelf niet erg, maar wel als deze wordt doorgevoerd op een tijdstip of door een gebruiker die afwijkt van het normale beheerproces.
  • Logistieke bewegingen: In goederenbewegingen is de relatie tussen gewicht, aantal en type product vaak sterk gecorreleerd. Isolation Forest kan zendingen eruit pikken die "niet kloppen" (bijv. heel zwaar maar klein volume), wat kan duiden op invoerfouten of wellicht verduistering.

Python Implementatie

Laten we kijken hoe dit werkt in Python. In dit voorbeeld gebruiken we simpelweg de 'Bedrag' kolom en de 'Grootboekrekening'. We hoeven niet zelf te bedenken welke bedragen bij welke rekening horen; dat verband legt het model zelf. Wel belangrijk dat je de packages 'pandas' en 'scikit-learn' geinstalleerd hebt. Meer over het installeren vind je hier..

import pandas as pd
from sklearn.ensemble import IsolationForest

# 1. Data inladen
df = pd.read_csv("journal_entries.csv")

# 2. Feature Selectie
# We gebruiken 'ruwe' data. Het model zal zelf ontdekken dat 
# hoge bedragen normaal zijn op rekening 4000 (Omzet), 
# maar verdacht op rekening 4500 (Kantine uitgaven).
features = [
    "Bedrag",               
    "Grootboekrekening_Nr"  
]

# Isolation Forest kan niet omgaan met lege waarden
X = df[features].fillna(0)

# 3. Het model trainen
# contamination=0.01: we focussen op de top 1% uitschieters
# random_state=42: zorgt voor reproduceerbare resultaten
model = IsolationForest(
    n_estimators=100,
    contamination=0.01,
    random_state=42
)

model.fit(X)

# 4. Scores toekennen
# decision_function geeft een score: hoe lager, hoe afwijkender
df["score"] = model.decision_function(X)

# 5. Resultaten tonen
# We sorteren op score om de grootste anomalieën bovenaan te krijgen
afwijkingen = df.sort_values("score").head(10)

print(afwijkingen)

De grenzen van de techniek

Hoewel Isolation Forest ontzettend handig kan zijn, blijft het een statistisch model zonder inhoudelijke vakkennis. Het algoritme kan een boeking van één cent als de grootste afwijking in de dataset bestempelen simpelweg omdat het bedrag uniek is, terwijl zo'n item voor de jaarrekeningcontrole zelden materieel relevant is. Als auditor moet je de resultaten daarom zelf altijd filteren op materialiteit en professionele relevantie. Bovendien is het model context-blind; een legitieme maar eenmalige gebeurtenis, zoals de aankoop van een bedrijfspand, zal statistisch altijd opvallen. Het algoritme vertelt je daarbij niet waarom iets afwijkt, wat betekent dat de interpretatie en het uiteindelijke oordeel altijd bij de auditor blijven liggen.

Is dit een "Black Box"?

Bij sommige algoritmes loop je tegen een black box of hallicunaties aan, waarbij een resultaat niet echt goed te herleiden is. Bij Isolation Forest is dit echter niet het geval. Omdat de techniek is gebaseerd op transparante beslisbomen, is elke score wiskundig te verklaren. Bovendien is de analyse volledig reproduceerbaar door het gebruik van een zogenaamde 'seed' (zoals de 'random_state' in het codevoorbeeld). Dit zorgt ervoor dat de willekeurige splitsingen van het algoritme elke keer exact hetzelfde zijn, wat cruciaal is voor de controleerbaarheid van je dossier.

In de documentatie voor je auditdossier beschrijf je dit algoritme dan ook niet als een vervanging van je oordeel, maar als een geavanceerde selectiemethode die je helpt je aandacht te richten. Door de gebruikte parameters en de specifieke 'random_state' vast te leggen, maak je de manier waarop je tot jouw 'uitzonderingen' gekomen bent volledig inzichtelijk voor een reviewer of toezichthouder. Daarnaast is dit natuurlijk vooral ter ondersteuning, naast allerlei andere analyses die je kunt uitvoeren.

Dit was een korte introductie op het algoritme 'Isolation Forest'. Pak het voorbeeld-script erbij en probeer het zelf eens uit!

Help ons The Audit Analytics verbeteren

Was dit artikel nuttig?

Laat ons weten of deze pagina nuttig is zodat we blijven verbeteren.

Feedback van lezersNog geen feedback