Cursus

Motivatie
Stel, je bent een data scientist bij een retailbedrijf. Je baas vraagt je om klanten te segmenteren in de volgende groepen: low, average, medium of platinum-klanten op basis van hun bestedingsgedrag, voor gerichte marketing en productaanbevelingen.
Wetende dat er geen historische labels aan deze klanten zijn gekoppeld, hoe kun je ze dan toch categoriseren?
Hier kan clusteren helpen. Het is een unsupervised machine learning-techniek die ongetagde data groepeert in vergelijkbare categorieën.
Deze tutorial richt zich vooral op de hiërarchische clusteringaanpak, een van de vele technieken binnen unsupervised machine learning. We beginnen met een overzicht van wat hiërarchisch clusteren is, gevolgd door een vergelijking met enkele bestaande technieken.
Vervolgens begeleiden we je stap voor stap door een implementatie in Python met de populaire Scipy-bibliotheek.
Definitie van hiërarchisch clusteren
Een hiërarchische clusteringaanpak is gebaseerd op het bepalen van opeenvolgende clusters op basis van eerder gedefinieerde clusters. Het is een techniek die zich richt op het groeperen van data in een boomstructuur van clusters, zogenaamde dendrogrammen, die de hiërarchische relatie tussen de onderliggende clusters grafisch weergeven.
Vergelijking van hiërarchisch clusteren met andere clusteringtechnieken
Hiërarchisch clusteren is een krachtig algoritme, maar niet het enige, en elk type clusteren heeft zijn eigen voor- en nadelen.
Laten we bekijken hoe het zich verhoudt tot andere typen clusteren, zoals K-means en modelgebaseerd clusteren. Er bestaan veel meer technieken, maar deze twee, naast hiërarchisch clusteren, worden veel gebruikt en bieden een kader om de andere beter te begrijpen.
Je kunt meer leren over clusteren in machine learning in ons aparte artikel, waarin vijf essentiële clusteringalgoritmen worden behandeld.
Hiërarchisch clusteren vs. K-means clusteren
In tegenstelling tot hiërarchisch clusteren probeert K-means clusteren de oorspronkelijke datapunten op te delen in “K” groepen of clusters, waarbij de gebruiker “K” vooraf opgeeft.
Het algemene idee is te zoeken naar clusters die de kwadratische Euclidische afstand van alle punten tot de centra over alle attributen (variabelen of features) minimaliseren, en die individuen iteratief samen te voegen.
Onze tutorial K-means Clustering in Python met Scikit-learn helpt je de werking van K-means te begrijpen met een interessante casestudy.
Voordelen
- Het is computationeel efficiënter dan hiërarchisch clusteren en geschikt voor grote datasets.
- K-means is eenvoudiger te begrijpen en te implementeren.
Nadelen
- Het is minder flexibel dan hiërarchisch clusteren, omdat je het aantal clusters vooraf moet opgeven, wat in sommige situaties niet voor de hand ligt.
- Het resultaat is niet stabiel en verandert per iteratie voor dezelfde dataset.
- Het is gevoeliger voor uitschieters, omdat outliers in de data het gemiddelde van het cluster beïnvloeden.
- Zowel k-means als hiërarchisch clusteren kunnen niet direct met categorische data overweg en werken mogelijk minder goed met niet-continue data of data met zeer grote variantie.
Ondanks de beperkingen is k-means nog steeds een populaire methode vanwege het gebruiksgemak en de rekenkundige efficiëntie. Het wordt vaak als referentiepunt gebruikt om de prestaties van andere clusteringtechnieken te vergelijken.
Modelgebaseerd clusteren
Zowel K-means als hiërarchische technieken gebruiken een afstandsmatrix om de afstanden tussen alle punten in de dataset weer te geven. Modelgebaseerd clusteren past daarentegen statistische technieken toe om clusters in de data te identificeren. Het algemene proces is als volgt:
- Kies het te gebruiken statistische model en bepaal het aantal clusters.
- Fit het model op de data.
- Identificeer de clusters op basis van de modelparameters.
Voordelen
- Modelgebaseerd clusteren is flexibeler dan hiërarchisch clusteren omdat je verschillende modellen kunt gebruiken om verschillende soorten clusters te identificeren.
- Het werkt beter op data met complexe vormen of structuren.
Nadelen
- Het is computationeel duurder dan hiërarchisch clusteren, vooral voor grote datasets.
- Het vereist een beter begrip van statistische modelleertechnieken, omdat de modelkeuze het eindresultaat kan beïnvloeden.
- Net als bij K-means moet je het aantal clusters vooraf specificeren.
Toepassingen van hiërarchisch clusteren
Hiërarchisch clusteren kent tal van toepassingen in het dagelijks leven, waaronder (maar zeker niet beperkt tot) biologie, beeldverwerking, marketing, economie en analyse van sociale netwerken.
Biologie
Het clusteren van DNA-sequenties is een van de grootste uitdagingen in de bio-informatica.
Biologen kunnen hiërarchisch clusteren gebruiken om genetische relaties tussen organismen te bestuderen en die organismen in taxonomische groepen te classificeren. Dit is handig voor snelle analyse en visualisatie van onderliggende relaties.
Beeldverwerking
In de beeldverwerking kan hiërarchisch clusteren worden gebruikt om vergelijkbare regio’s of pixels van een afbeelding te groeperen op basis van kleur, intensiteit of andere kenmerken. Dit kan nuttig zijn voor vervolg taken zoals segmentatie, classificatie en objectherkenning.
Marketing
Marketingspecialisten kunnen hiërarchisch clusteren gebruiken om een hiërarchie aan te brengen tussen verschillende klanttypen op basis van hun koopgedrag, voor betere marketingstrategieën en aanbevelingen. Zo kunnen in de retail andere producten worden aanbevolen aan klanten die weinig, gemiddeld of juist veel besteden.
Analyse van sociale netwerken
Sociale netwerken zijn, mits efficiënt benut, een geweldige bron van waardevolle informatie. Hiërarchisch clusteren kan worden gebruikt om groepen of communities te identificeren en hun onderlinge relaties en de structuur van het netwerk als geheel te begrijpen.
Het hiërarchische clusteringalgoritme
In deze sectie bekijken we drie hoofdconcepten: de stappen van het hiërarchische algoritme, een overzicht van de twee typen hiërarchisch clusteren (agglomeratief en divisief) en tot slot enkele technieken om de juiste afstandsmaat te kiezen.
Stappen in het hiërarchische clusteringalgoritme
Het hiërarchische clusteringalgoritme gebruikt afstandsmaten om clusters te genereren. Dit generatieproces omvat de volgende hoofdzaken:

Preprocess de data door ontbrekende waarden te verwijderen en eventuele extra stappen toe te passen om de data zo schoon mogelijk te maken. Deze stap is algemener voor de meeste machinelearningtaken.
1. Bereken de afstandsmatrix met de afstand tussen elk paar datapunten, met een bepaalde afstandsmaat zoals Euclidische afstand, Manhattan-afstand of cosinusgelijkenis. De standaardafstand is de Euclidische.
2. Voeg de twee clusters samen die het dichtst bij elkaar liggen.
3. Werk de afstandsmatrix bij met betrekking tot de nieuwe clusters.
4. Herhaal stappen 1, 2 en 3 totdat alle clusters zijn samengevoegd tot één cluster.
Voorbeelden van hiërarchisch clusteren
We kunnen agglomeratief en divisief clusteren als elkaars tegenhangers zien. Laten we beter kijken hoe elk werkt, met een voorbeeld van hiërarchisch clusteren en een grafische visualisatie.
Agglomeratief hiërarchisch clusteren
Dit eerste scenario komt overeen met de hierboven uitgelegde aanpak. We beginnen met elke observatie als een singletoncluster (cluster met slechts één datapunt). Vervolgens voegen we iteratief clusters samen totdat er nog maar één cluster over is. Dit proces staat ook bekend als de bottom-up-benadering.
Zoals te zien in de onderstaande illustratie:
- We beginnen met elk dier als zijn eigen cluster.
- Vervolgens genereren we op basis van overeenkomsten drie verschillende clusters uit die unieke dieren:
- Vogels: adelaar en pauw
- Zoogdieren: leeuw en beer
- Meer dan drie poten: spin en schorpioen.
- We herhalen het samenvoegproces om het cluster Gewervelden te maken door de twee meest vergelijkbare clusters te combineren: Vogels en Zoogdieren.
- Daarna worden de twee overgebleven clusters, Gewervelden en Meer dan drie poten, samengevoegd tot één cluster Dieren.

Dendrogram van de agglomeratieve aanpak
Divisief clusteren
Divisief clusteren is daarentegen top-down, omdat het begint met alle datapunten als één cluster. Vervolgens worden ze gesplitst totdat alle datapunten uniek zijn.
Uit de grafiek van de divisieve aanpak:
- We zien dat de gehele dataset met dieren als één blok wordt beschouwd.
- Daarna delen we dat blok op in twee clusters: Gewervelden en Meer dan 3 poten.
- Het splitsingsproces wordt iteratief toegepast op de eerder gevormde clusters totdat we unieke dieren krijgen.

Dendrogram van de divisieve aanpak
De juiste afstandsmaat kiezen
Je keuze van afstandsmaat is een cruciale stap bij clusteren en hangt af van het probleem dat je probeert op te lossen. In het volgende scenario zouden we studenten op allerlei manieren kunnen clusteren, zoals op hun:
- Land van herkomst
- Geslacht, man of vrouw
- Eerder academische achtergrond.
Dit zijn allemaal valide clusters, maar met verschillende betekenissen.
Hoewel de Euclidische afstand de meest gebruikte maat is in de meeste clusteringsoftware, bestaan er andere maatregelen zoals de Manhattan-afstand, Canberra-afstand, Pearson- of Spearmancorrelatie en Minkowski-afstand.
Hoe clusters te meten vóór het samenvoegen
De eerder genoemde afstanden hebben betrekking op items. In deze sectie behandelen we drie standaardmanieren (niet uitputtend) om het dichtstbijzijnde paar clusters te meten vóór het samenvoegen: (1) single linkage, (2) complete linkage en (3) average linkage.
Single linkage
Van alle paarsgewijze afstanden tussen de items in de twee clusters C1 en C2 neemt single linkage de afstand tussen de clusters als de minimale afstand.
Distance (C1, C2) = Min { d(i, j), waarbij item i in C1 ligt en item j in C2}
Van alle itemparen uit de twee clusters hebben de paren die groen zijn gemarkeerd de minimale afstand.

Single linkage-illustratie
Complete linkage
Van alle paarsgewijze afstanden tussen de items in de twee clusters C1 en C2 neemt complete linkage de afstand tussen de clusters als de maximale afstand.
Distance (C1, C2) = Max { d(i, j), waarbij item i in C1 ligt en item j in C2}
Van alle itemparen uit de twee clusters hebben de paren die groen zijn gemarkeerd de maximale afstand.

Complete linkage-illustratie
Average linkage
Bij average linkage komt de afstand tussen twee gegeven clusters C1 en C2 overeen met de gemiddelde afstand tussen alle paren van items in de twee clusters.
Distance (C1, C2) = Sum{ d(i, j) } / Totaal aantal afstanden

Average linkage-illustratie
Vervolgens wordt average linkage als volgt uitgevoerd
d(a,j) + d(a,h) + d(a,n) + d(d,j) + d(d,h) + d(d,n)
—-----------------------------------------------------------, waarbij Totaal aantal afstanden = 6
Totaal aantal afstanden
Hiërarchisch clusteren implementeren in Python
Nu je begrijpt hoe hiërarchisch clusteren werkt, focussen we in deze sectie op de technische implementatie in Python.
Als je de implementatie liever met de R-programmeertaal doet, bekijk dan onze tutorial Hiërarchisch clusteren in R.
De omgeving opzetten
Om te beginnen heb je Python op je computer nodig, samen met de volgende bibliotheken:
- Pandas om de dataframe te laden.
- Scikit-learn voor datanormalisatie.
- Seaborn en matplotlib voor visualisatie.
- Scipy om te clusteren.
Je kunt deze bibliotheken installeren met pip, de Python package manager, als volgt:
pip install scikit-learn
pip install pandas
pip install matplotlib seaborn
pip install scipy
Vervolgens importeren we de benodigde modules en laden we de dataset. We gebruiken de ingebouwde iris-dataset uit scikit-learn, die informatie bevat over verschillende soorten irissen.
Om de usecase beter te illustreren, gebruiken we de Loan Data die beschikbaar is op DataLab. Alle code in deze tutorial is beschikbaar in deze DataLab-werkmap; je kunt eenvoudig een kopie maken om de code in de browser uit te voeren, zonder software op je computer te hoeven installeren.
De data begrijpen
De dataset bevat 9.500 leningen met informatie over de leningstructuur, de lener en of de lening volledig is terugbetaald. We verwijderen de targetkolom not.fully.paid om te voldoen aan het unsupervised-karakter.
import pandas as pd
loan_data = pd.read_csv("loan_data.csv")
loan_data.head()
Eerste vijf rijen van de data
De volgende instructie laat zien dat de data 9.578 rijen heeft en 14 kolommen met numerieke typen, behalve purpose, dat een object is en de tekstuele beschrijving van het doel van de lening geeft.
loan_data.info()
Informatie over de data
De data preproces sen
Voordat we gaan clusteren, moeten de data worden gepreprocessed om met ontbrekende informatie om te gaan, kolomwaarden te normaliseren en irrelevante kolommen te verwijderen.
Omgaan met ontbrekende waarden
Uit de onderstaande output blijkt dat er geen ontbrekende waarden in de data zitten.
percent_missing =round(100*(loan_data.isnull().sum())/len(loan_data),2)
percent_missing
Percentage ontbrekende waarden in de data
Ongewenste kolommen verwijderen
We gaan de leningsdata analyseren met alle kolommen behalve de volgende:
- Purpose
- Not.fully.paid, omdat dit het label is dat aangeeft of de lener volledig heeft terugbetaald.
cleaned_data komt overeen met de data zonder bovenstaande kolommen.
cleaned_data = loan_data.drop(['purpose', 'not.fully.paid'], axis=1)
cleaned_data.info()
De onderstaande afbeelding toont de informatie van de nieuwe data.

Nieuwe data zonder de ongewenste kolommen
Analyse van uitschieters
Een van de zwaktes van hiërarchisch clusteren is de gevoeligheid voor uitschieters. De verdeling van elke variabele wordt getoond met de boxplot.
def show_boxplot(df):
plt.rcParams['figure.figsize'] = [14,6]
sns.boxplot(data = df, orient="v")
plt.title("Outliers Distribution", fontsize = 16)
plt.ylabel("Range", fontweight = 'bold')
plt.xlabel("Attributes", fontweight = 'bold')
show_boxplot(cleaned_data)

Boxplot van alle variabelen in de data
Het doorlopende saldo van de lener (revol_bal) is het enige attribuut met datapunten die ver van de rest afliggen.
Met de interkwartielafstand kunnen we alle punten verwijderen die buiten het bereik vallen dat wordt gedefinieerd door de kwartielen +/- 1,5 * IQR, waarbij IQR de interkwartielafstand is.
Dit doen we met de volgende helperfunctie.
def remove_outliers(data):
df = data.copy()
for col in list(df.columns):
Q1 = df[str(col)].quantile(0.05)
Q3 = df[str(col)].quantile(0.95)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5*IQR
upper_bound = Q3 + 1.5*IQR
df = df[(df[str(col)] >= lower_bound) &
(df[str(col)] <= upper_bound)]
return df
Vervolgens kunnen we de functie toepassen op de dataset.
without_outliers = remove_outliers(cleaned_data)
Nu kunnen we de nieuwe boxplot bekijken en vergelijken met die van vóór het verwijderen van de uitschieters.
show_boxplot(without_outliers)

Er liggen geen datapunten meer buiten de interkwartielafstand.
without_outliers.shape
De vorm van de data is nu 9.319 rijen en 12 kolommen. Dit betekent dat 259 observaties uitschieters waren en zijn verwijderd.
De data schalen
Aangezien hiërarchisch clusteren gebruikmaakt van de Euclidische afstand, die erg gevoelig is voor variabelen met verschillende schalen, is het verstandig om alle variabelen te schalen vóór het berekenen van de afstand.
Dit doen we met de klasse StandardScaler uit sklearn.
from sklearn.preprocessing import StandardScaler
data_scaler = StandardScaler()
scaled_data = data_scaler.fit_transform(without_outliers)
scaled_data.shape
De vorm van de data blijft hetzelfde (9.319 rijen, 12 kolommen) omdat normalisatie de vorm niet verandert.
Het hiërarchische algoritme toepassen
We voldoen nu aan alle vereisten om de implementatie van het clusteringalgoritme uit te voeren.
Op dit punt kunnen we beslissen welke linkage-aanpak we gebruiken in het method-attribuut van de methode linkage(). In deze sectie behandelen we alle drie de linkage-technieken met de Euclidische afstand.
Dit doen we met de onderstaande code, na het importeren van de relevante bibliotheken.
from scipy.cluster.hierarchy import linkage, dendrogram
complete_clustering = linkage(scaled_data, method="complete", metric="euclidean")
average_clustering = linkage(scaled_data, method="average", metric="euclidean")
single_clustering = linkage(scaled_data, method="single", metric="euclidean")
Nadat we alle drie de clusterings hebben berekend, tonen we de bijbehorende dendrogrammen als volgt, te beginnen met complete clustering
dendrogram(complete_clustering)
plt.show()

Dendrogram van de complete linkage-aanpak
dendrogram(average_clustering)
plt.show()

Dendrogram van de average linkage-aanpak
dendrogram(single_clustering)
plt.show()

Dendrogram van de single linkage-aanpak
De resultaten interpreteren (dendrogram visualiseren, aantal clusters bepalen)
Voor elke linkage-aanpak zie je hoe het dendrogram wordt opgebouwd en hoe elk datapunt uiteindelijk in één cluster terechtkomt.
- De x-as van het dendrogram stelt de samples in de data voor.
- De y-as stelt de afstand tussen die samples voor. Hoe hoger de lijn, hoe minder vergelijkbaar de samples/clusters.
- We krijgen het juiste aantal clusters door een horizontale lijn te trekken door de hoogste verticale lijn; het aantal kruisingen komt overeen met het aantal clusters.
Het optimale aantal clusters kun je bepalen door de hoogste verticale lijn te vinden die geen kruising heeft met andere clusters (horizontale lijn). Zo’n lijn is hieronder te zien met een rode cirkel en groen vinkje.
- Voor complete linkage is het de blauwe lijn rechts, en dat levert drie clusters op.

Optimaal aantal clusters op basis van de hoogste afstand zonder kruising (complete linkage)
- Voor average linkage is het de eerste blauwe verticale lijn, en dat levert twee clusters op.

Optimaal aantal clusters op basis van de hoogste afstand zonder kruising (average linkage)
- Voor single linkage is het de eerste verticale lijn, en dat levert slechts één cluster op.

Optimaal aantal clusters op basis van de hoogste afstand zonder kruising (single linkage)
Uit bovenstaande observaties lijkt average linkage de beste clustering te geven, in tegenstelling tot single en complete linkage, die respectievelijk één en drie clusters suggereren. Ook komt het optimale aantal clusters van twee overeen met onze voorkennis over de dataset, namelijk de twee typen leners.
Nu we het optimale aantal clusters hebben gevonden, kijken we wat die clusters betekenen op basis van de kredietscore van de lener.
cluster_labels = cut_tree(average_clustering, n_clusters=2).reshape(-1, )
without_outliers["Cluster"] = cluster_labels
sns.boxplot(x='Cluster', y='fico', data=without_outliers)

Uit de bovenstaande boxplot kunnen we het volgende opmaken:
- Leners uit cluster 0 hebben de hoogste kredietscore.
- Leners uit cluster 1 hebben lagere kredietscores.
Cluster Analysis in Python is een goede volgende stap om dieper in K-means en hiërarchisch clusteren te duiken met de Scipy-bibliotheek.
Conclusie
Dit artikel heeft behandeld wat hiërarchisch clusteren is, de voor- en nadelen, en hoe het zich verhoudt tot k-means en modelgebaseerd clusteren.
We hopen dat dit artikel je de vaardigheden geeft om je ongetagde data efficiënt te clusteren voor actiegerichte beslissingen.
Veelgestelde vragen over hiërarchisch clusteren
Hoe kies je het juiste aantal clusters?
Bij hiërarchisch clusteren kun je het juiste aantal clusters bepalen uit het dendrogram door de hoogste verticale afstandslijn te identificeren die geen kruising heeft met andere clusters.
Hoe ga je om met categorische data bij hiërarchisch clusteren?
Hiërarchisch clusteren werkt standaard niet met categorische data. Een manier om dit te omzeilen is ze vooraf om te zetten naar een geschikt numeriek formaat, zoals one-hot encoding en ordinale codering, voordat je het algoritme toepast.
Hoe ga je om met grote datasets?
Hoe groter de data, hoe langer het clusteren duurt. De agglomeratieve aanpak kan sneller zijn dan de divisieve.
Wat is een agglomerative information bottleneck (AIB)?
Dit is een clusteringalgoritme dat de wederzijdse informatie per cluster tussen de data en een set gegeven categorieën maximaliseert.
Wat is gewogen hiërarchisch clusteren?
Dit is een variant van hiërarchisch clusteren die aan elk datapunt een gewicht toekent om het belang of de relevantie in het clusteringproces weer te geven.
