Cursus
Introductie: Machine Learning in R
Machine learning is een tak van de informatica die onderzoekt hoe je algoritmes ontwerpt die kunnen leren. Typische machine learning-taken zijn concept learning, function learning of “predictive modeling”, clusteren en voorspellende patronen vinden. Deze taken worden geleerd op basis van beschikbare data die bijvoorbeeld via ervaringen of instructies zijn geobserveerd. Machine learning gaat ervan uit dat het meenemen van ervaring in de taken uiteindelijk het leren verbetert. Het uiteindelijke doel is het leren zó te verbeteren dat het automatisch wordt, zodat mensen zoals jij en ik niet meer hoeven in te grijpen.
Deze korte tutorial is bedoeld om je te introduceren in de basis van machine learning in R: specifieker, je ziet hoe je R gebruikt met het bekende machine learning-algoritme “KNN” ofwel k-nearest neighbors.
Ben je geïnteresseerd in een cursus? Bekijk onze Introduction to Machine Learning with R of DataCamp’s cursus Unsupervised Learning in R!
R gebruiken voor k-Nearest Neighbors (KNN)
Het KNN- of k-nearest neighbors-algoritme is een van de eenvoudigste machine learning-algoritmes en is een voorbeeld van instance-based learning, waarbij nieuwe data geclassificeerd wordt op basis van opgeslagen, gelabelde voorbeelden.
Meer specifiek wordt de afstand tussen de opgeslagen data en het nieuwe voorbeeld berekend met behulp van een of andere gelijkenismaat. Deze gelijkenismaat wordt doorgaans uitgedrukt met een afstandsmaat zoals de Euclidische afstand, cosinusgelijkenis of de Manhattan-afstand.
Met andere woorden: voor elk nieuw datapunt dat je in het systeem stopt, wordt de gelijkenis met de data die al in het systeem zat berekend.
Daarna gebruik je deze gelijkeniswaarde voor predictive modeling. Predictive modeling is óf classificatie, waarbij je een label of klasse toekent aan het nieuwe voorbeeld, óf regressie, waarbij je een waarde toekent aan het nieuwe voorbeeld. Of je classificeert of een waarde toekent, hangt natuurlijk af van hoe je je model met KNN opzet.
Het k-nearest neighbors-algoritme voegt aan dit basisalgoritme toe dat, nadat de afstand van het nieuwe punt tot alle opgeslagen datapunten is berekend, de afstandswaarden worden gesorteerd en de k dichtstbijzijnde buren worden bepaald. De labels van deze buren worden verzameld en een meerderheidstem of gewogen stem wordt gebruikt voor classificatie- of regressiedoeleinden.
Met andere woorden: hoe hoger de score voor een bepaald opgeslagen datapunt, hoe waarschijnlijker het is dat het nieuwe voorbeeld dezelfde classificatie krijgt als die buur. In het geval van regressie is de waarde die aan het nieuwe datapunt wordt toegekend het gemiddelde van zijn k dichtstbijzijnde buren.
Stap één. Haal je data op
Machine learning begint meestal bij geobserveerde data. Je kunt je eigen dataset nemen of andere bronnen raadplegen om er een te vinden.
Ingebouwde datasets van R
Deze tutorial gebruikt de Iris-dataset, die zeer bekend is binnen machine learning. Deze dataset zit ingebouwd in R, dus je kunt ernaar kijken door het volgende in je console te typen:
UC Irvine Machine Learning Repository
Als je de dataset wilt downloaden in plaats van de ingebouwde in R te gebruiken, kun je naar het UC Irvine Machine Learning Repository gaan en de Iris-dataset opzoeken.
Tip: kijk niet alleen in de datafolder van de Iris-dataset, maar neem ook een kijkje op de pagina met de databescrijving!
Gebruik daarna het volgende commando om de data in te laden:
Het commando leest het .csv- of “Comma Separated Value”-bestand van de website. Het argument header is op FALSE gezet, wat betekent dat de Iris-dataset uit deze bron je niet de attribuutnamen van de data geeft.
In plaats van de attribuutnamen zie je misschien vreemde kolomnamen zoals “V1” of “V2” wanneer je het attribuut iris inspecteert met een functie zoals head(). Die worden willekeurig ingesteld.
Om het werken met de dataset te vereenvoudigen, is het een goed idee om zelf kolomnamen te zetten: dat kan met de functie names(), die de namen van een object ophaalt of instelt. Plak de namen van de attributen aan elkaar zoals je ze wilt laten verschijnen. In de code hierboven heb je Sepal.Length, Sepal.Width, Petal.Length, Petal.Width en Species gezet.
Ook deze namen komen niet uit de lucht vallen: bekijk de beschrijving van de dataset die hierboven gelinkt is; je ziet deze namen daar normaal allemaal terug.
Stap twee. Leer je data kennen
Nu je de Iris-dataset in RStudio hebt geladen, moet je proberen grondig te begrijpen waar je data over gaat. Alleen kijken of lezen over je data is zeker niet genoeg om te beginnen!
Je moet zelf aan de slag, je dataset verkennen en visualiseren en desnoods extra domeinkennis opdoen als je het gevoel hebt dat de data je boven het hoofd groeit.
Waarschijnlijk heb je de nodige domeinkennis al, maar ter herinnering: alle bloemen hebben een kelkblad (sepal) en een kroonblad (petal). Het kelkblad omsluit de kroonbladen en is typisch groen en bladachtig, terwijl de kroonbladen meestal gekleurd zijn. Bij irissen is dit net even anders, zoals je in de volgende afbeelding ziet:

Eerste overzicht van de dataset
Eerst kun je al een idee krijgen van je data door grafieken te maken, zoals histogrammen of boxplots. In dit geval kunnen scatterplots je echter een uitstekend beeld geven van wat je voor je hebt: het kan interessant zijn te zien in welke mate één variabele wordt beïnvloed door een andere.
Met andere woorden: je wilt zien of er correlatie is tussen twee variabelen.
Je kunt scatterplots maken met bijvoorbeeld het ggvis-pakket.
Let op dat je eerst het pakket ggvis moet laden:
# Load in `ggvis`
library(ggvis)
# Iris scatter plot
iris %>% ggvis(~Sepal.Length, ~Sepal.Width, fill = ~Species) %>% layer_points()

Je ziet dat er een hoge correlatie is tussen de kelkbladdlengte (sepal length) en de kelkbladbreedte (sepal width) van de Setosa-irissen, terwijl de correlatie wat minder hoog is voor de Virginica- en Versicolor-bloemen: de datapunten liggen meer verspreid over de grafiek en vormen geen cluster zoals bij de Setosa-bloemen.
De scatterplot die de kroonbladlengte (petal length) en -breedte (petal width) in kaart brengt, vertelt een vergelijkbaar verhaal:
iris %>% ggvis(~Petal.Length, ~Petal.Width, fill = ~Species) %>% layer_points()

Je ziet dat deze grafiek een positieve correlatie aangeeft tussen kroonbladlengte en -breedte voor alle verschillende soorten die in de Iris-dataset zijn opgenomen. Natuurlijk moet je deze hypothese waarschijnlijk nog wat verder testen als je hier echt zeker van wilt zijn:
Je ziet dat, wanneer je alle drie de soorten combineert, de correlatie iets sterker is dan wanneer je naar de verschillende soorten afzonderlijk kijkt: de totale correlatie is 0,96, terwijl dit voor Versicolor 0,79 is. Setosa en Virginica hebben daarentegen correlaties tussen kroonbladlengte en -breedte van respectievelijk 0,31 en 0,32 wanneer je afrondt.
Tip: ben je nieuwsgierig naar ggvis, grafieken of specifiek histogrammen? Bekijk onze histogram-tutorial en/of de ggvis-cursus.
Na een algemeen gevisualiseerd overzicht van de data kun je de dataset ook opvragen met
Zoals je uit het resultaat van dit commando zult zien, is dit echt niet de beste manier om je dataset grondig te inspecteren: de dataset neemt veel ruimte in de console in, wat je belemmert om een helder beeld te vormen. Daarom kun je beter head(iris) of str(iris) uitvoeren.
Let op dat het laatste commando je helpt om duidelijk het datatype num en de drie levels van het attribuut Species te onderscheiden, wat een factor is. Dat is erg handig, omdat veel R-classificators voor machine learning vereisen dat de doelvariabele als factor is gecodeerd.
Onthoud dat factorvariabelen categorische variabelen voorstellen in R. Ze kunnen dus slechts een beperkt aantal verschillende waarden aannemen.
Een snelle blik op het attribuut Species leert je dat de verdeling van de bloemsoorten 50-50-50 is. Als je de procentuele verdeling van het attribuut Species wilt controleren, kun je om een tabel met proporties vragen:
Let op dat het argument round de waarden van het eerste argument, prop.table(table(iris$Species))*100, afrondt tot het opgegeven aantal decimalen, hier één cijfer na de komma. Je kunt dit eenvoudig aanpassen door de waarde van het argument digits te veranderen.
Diepgaand begrip van je data
Laten we niet op dit hoog-over overzicht blijven! R geeft je de mogelijkheid om dieper te gaan met de functie summary(). Deze geeft je de minimumwaarde, het eerste kwartiel, de mediaan, het gemiddelde, het derde kwartiel en de maximumwaarde van de Iris-dataset voor numerieke datatypen. Voor de klassevariabele wordt het aantal factoren teruggegeven:
Zoals je ziet, is de functie c() toegevoegd aan het originele commando: de kolommen petal width en sepal width worden samengevoegd en er wordt vervolgens alleen van deze twee kolommen van de Iris-dataset een samenvatting gevraagd.
Stap drie. Hoe nu verder?
Nadat je een goed begrip van je data hebt opgebouwd, moet je beslissen welke use-cases relevant zijn voor je dataset. Met andere woorden: je denkt na over wat je dataset je zou kunnen leren of wat jij denkt uit je data te kunnen halen. Van daaruit kun je nadenken over welke algoritmes je op je dataset kunt toepassen om de resultaten te krijgen die je verwacht.
Tip: hoe vertrouwder je bent met je data, hoe makkelijker het wordt om de use-cases voor jouw specifieke dataset te bepalen. Dit geldt ook voor het vinden van het juiste machine learning-algoritme.
Voor deze tutorial wordt de Iris-dataset gebruikt voor classificatie, een voorbeeld van predictive modeling. Het laatste attribuut van de dataset, Species, is de doelvariabele, oftewel de variabele die je in dit voorbeeld wilt voorspellen.
Let op dat je ook een van de numerieke klassen als doelvariabele kunt nemen als je KNN wilt gebruiken voor regressie.
Stap vier. Bereid je werkomgeving voor
Veel algoritmes die in machine learning worden gebruikt, zitten niet standaard in R. Waarschijnlijk moet je de pakketten die je wilt gebruiken downloaden wanneer je aan de slag gaat met machine learning.
Tip: heb je een idee welk leeralgoritme je wilt gebruiken, maar niet welk pakket je nodig hebt? Je vindt hier een vrij compleet overzicht van alle pakketten die in R worden gebruikt.
Om het KNN-algoritme te illustreren, werkt deze tutorial met het pakket class:
Als je dit pakket nog niet hebt, kun je het snel en eenvoudig installeren door de volgende regel code te typen:
install.packages("<package name>")
Onthoud de nerdtip: als je niet zeker weet of je dit pakket hebt, kun je de volgende opdracht uitvoeren om daarachter te komen!
any(grepl("<name of your package>", installed.packages()))
Stap vijf. Bereid je data voor
Na het verkennen van je data en het inrichten van je werkomgeving kun je je eindelijk weer richten op de taak: een machine learning-model maken. Voordat je dat kunt doen, is het echter belangrijk om ook je data voor te bereiden. In de volgende sectie staan twee manieren beschreven om dit te doen: door je data te normaliseren (indien nodig) en door je data op te splitsen in trainings- en testsets.
Normalisatie
Als onderdeel van je datavoorbereiding moet je mogelijk je data normaliseren, zodat deze consistent is. Voor deze introductietutorial is het genoeg om te onthouden dat normalisatie het KNN-algoritme helpt om makkelijker te leren. Er zijn twee soorten normalisatie:
- voorbeeldnormalisatie is het afzonderlijk schalen van elk voorbeeld, en
- featurenormalisatie houdt in dat je elk kenmerk op dezelfde manier aanpast over alle voorbeelden heen.
Wanneer moet je je dataset normaliseren?
Kort gezegd: wanneer je vermoedt dat de data niet consistent is.
Je ziet dit gemakkelijk wanneer je de resultaten van de functie summary() doorloopt. Kijk naar de minimum- en maximumwaarden van alle (numerieke) attributen. Als je ziet dat één attribuut een brede range aan waarden heeft, moet je je dataset normaliseren, omdat dit betekent dat de afstand gedomineerd zal worden door dat kenmerk.
Stel bijvoorbeeld dat je dataset slechts twee attributen heeft, X en Y. X heeft waarden van 1 tot 1000, terwijl Y alleen waarden van 1 tot 100 heeft. Dan zal Y’s invloed op de afstandsfunctie meestal overschaduwd worden door X’ invloed.
Als je normaliseert, pas je in feite de range van alle kenmerken aan, zodat afstanden tussen variabelen met grotere bereiken niet te veel worden benadrukt.
Tip: ga terug naar het resultaat van summary(iris) en probeer te bepalen of normalisatie nodig is.
De Iris-dataset hoeft niet te worden genormaliseerd: het attribuut Sepal.Length heeft waarden van 4,3 tot 7,9 en Sepal.Width bevat waarden van 2 tot 4,4, terwijl de waarden van Petal.Length variëren van 1 tot 6,9 en Petal.Width gaat van 0,1 tot 2,5. Alle waarden van alle attributen liggen binnen het bereik van 0,1 en 7,9, wat je acceptabel kunt vinden.
Toch is het een goed idee om normalisatie en het effect ervan te bestuderen, zeker als je nieuw bent met machine learning. Je kunt bijvoorbeeld featurenormalisatie uitvoeren door eerst je eigen functie normalize() te maken.
Je kunt dit argument vervolgens gebruiken in een ander commando, waarbij je de resultaten van de normalisatie in een data frame zet via as.data.frame() nadat de functie lapply() een lijst heeft teruggegeven met dezelfde lengte als de dataset die je hebt meegegeven. Elk element van die lijst is het resultaat van het toepassen van het argument normalize op de dataset die als input diende:
YourNormalizedDataSet <- as.data.frame(lapply(YourDataSet, normalize))
Test dit in het DataCamp Light-blok hieronder!
Voor de Iris-dataset zou je het argument normalize hebben toegepast op de vier numerieke attributen van de Iris-dataset (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) en de resultaten in een data frame hebben gezet.
Tip: om het effect van normalisatie op de dataset grondiger te illustreren, vergelijk je het volgende resultaat met de samenvatting van de Iris-dataset uit stap twee.
Trainings- en testsets
Om later de prestaties van je model te beoordelen, moet je de dataset in twee delen splitsen: een trainingsset en een testset.
De eerste wordt gebruikt om het systeem te trainen, terwijl de tweede wordt gebruikt om het geleerde of getrainde systeem te evalueren. In de praktijk is de opsplitsing van je dataset in test- en trainingsets disjunct: de meest gangbare keuze is om 2/3 van je oorspronkelijke dataset als trainingsset te nemen, terwijl de overblijvende 1/3 de testset vormt.
Een laatste blik op de dataset leert je dat, als je de verdeling van beide sets op de dataset in de huidige vorm uitvoert, je een trainingsklasse krijgt met alle soorten “Setosa” en “Versicolor”, maar geen “Virginica”. Het model zou daarom alle onbekende voorbeelden classificeren als “Setosa” of “Versicolor”, omdat het zich niet bewust is van de aanwezigheid van een derde bloemsoort in de data.
Kortom, je zou onjuiste voorspellingen voor de testset krijgen.
Je moet er dus voor zorgen dat alle drie de klassen van soorten aanwezig zijn in het trainingsmodel. Bovendien moet het aantal voorbeelden van alle drie de soorten min of meer gelijk zijn, zodat je in je voorspellingen geen enkele klasse bevoordeelt.
Om je trainings- en testsets te maken, zet je eerst een seed. Dit is een getal voor de willekeurigegetallengenerator van R. Het grote voordeel van het instellen van een seed is dat je dezelfde reeks willekeurige getallen kunt krijgen wanneer je dezelfde seed doorgeeft aan de generator.
set.seed(1234)
Vervolgens wil je ervoor zorgen dat je Iris-dataset wordt geschud en dat je een gelijk aantal van elke soort in je trainings- en testsets hebt.
Je gebruikt de functie sample() om een steekproef te nemen met een grootte die is ingesteld op het aantal rijen van de Iris-dataset, ofwel 150. Je steekproeft met teruglegging: je kiest uit een vector van 2 elementen en kent ofwel 1 of 2 toe aan de 150 rijen van de Iris-dataset. De toewijzing van de elementen is onderhevig aan waarschijnlijkheidsgewichten van 0,67 en 0,33.
ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.67, 0.33))
Let op dat het argument replace is ingesteld op TRUE: dit betekent dat je een 1 of een 2 toekent aan een bepaalde rij en vervolgens de vector van 2 weer in de oorspronkelijke staat zet. Dat betekent dat je voor de volgende rijen in je dataset telkens weer een 1 of 2 kunt toekennen. De kans om een 1 of 2 te kiezen moet niet proportioneel zijn aan de gewichten van de overgebleven items, dus geef je waarschijnlijkheidsgewichten op. Let er ook op dat, hoewel je het niet in het DataCamp Light-blok ziet, de seed nog steeds is ingesteld op 1234.
Onthoud dat je wilt dat je trainingsset 2/3 van je oorspronkelijke dataset is: daarom ken je “1” toe met een kans van 0,67 en de “2” met een kans van 0,33 aan de 150 steekproefrijen.
Je kunt vervolgens de steekproef die is opgeslagen in de variabele ind gebruiken om je trainings- en testsets te definiëren:
Let op dat je, naast de hierboven gespecificeerde verhoudingen 2/3 en 1/3, niet alle attributen meeneemt om de trainings- en testsets te vormen. Je neemt specifiek Sepal.Length, Sepal.Width, Petal.Length en Petal.Width. Dit komt omdat je het vijfde attribuut, Species, juist wilt voorspellen: het is je doelvariabele. Je wilt het echter wel meenemen in het KNN-algoritme, anders komt er nooit een voorspelling voor.
Je moet daarom de klasselabels opslaan in factorvectoren en ze verdelen over de trainings- en testsets:
Stap zes. Het daadwerkelijke KNN-model
Je classifier bouwen
Na al deze voorbereidende stappen heb je ervoor gezorgd dat al je bekende (trainings)data is opgeslagen. Tot nu toe is er geen echt model of leerproces uitgevoerd. Nu wil je de k dichtstbijzijnde buren van je trainingsset vinden.
Een eenvoudige manier om deze twee stappen te doen, is met de functie knn(), die de Euclidische afstandsmaat gebruikt om de k dichtstbijzijnde buren van je nieuwe, onbekende voorbeeld te vinden. Hier stel je de parameter k zelf in.
Zoals eerder vermeld, worden nieuwe voorbeelden geclassificeerd door te kijken naar de meerderheidstem of gewogen stem. In het geval van classificatie wint het datapunt met de hoogste score en krijgt het onbekende voorbeeld het label van dat winnende datapunt. Als er evenveel winnaars zijn, gebeurt de classificatie willekeurig.
Let op: de parameter k is vaak een oneven getal om gelijke stemmen te voorkomen.
Om je classifier te bouwen, neem je de functie knn() en voeg je simpelweg wat argumenten toe, zoals in dit voorbeeld:
Je slaat in iris_pred de functie knn() op, die als argumenten de trainingsset, de testset, de trainingslabels en het aantal buren neemt dat je met dit algoritme wilt vinden. Het resultaat van deze functie is een factorvector met de voorspelde klassen voor elke rij van de testdata.
Let op dat je de testlabels niet wilt invullen: die gebruik je om te zien of je model goed is in het voorspellen van de werkelijke klassen van je voorbeelden!
Je ziet dat wanneer je het resultaat, iris_pred, bekijkt, je de factorvector terugkrijgt met de voorspelde klassen voor elke rij van de testdata.
Stap zeven. Evaluatie van je model
Een essentiële volgende stap in machine learning is de evaluatie van de prestaties van je model. Met andere woorden: je wilt analyseren hoe correct de voorspellingen van het model zijn.
Voor een abstracter beeld kun je simpelweg de resultaten van iris_pred vergelijken met de testlabels die je eerder hebt gedefinieerd:
Je ziet dat het model redelijk accurate voorspellingen doet, met uitzondering van één verkeerde classificatie in rij 29, waar “Versicolor” werd voorspeld terwijl het testlabel “Virginica” is.
Dit geeft al een indicatie van de prestaties van je model, maar je wilt misschien nog dieper gaan in je analyse. Daarvoor kun je het pakket gmodels importeren:
install.packages("package name")
Als je dit pakket al hebt geïnstalleerd, kun je gewoon invoeren
library(gmodels)
Vervolgens kun je een kruistabel of contingency table maken. Dit type tabel wordt vaak gebruikt om de relatie tussen twee variabelen te begrijpen. In dit geval wil je begrijpen hoe de klassen van je testdata, opgeslagen in iris.testLabels, zich verhouden tot je model dat is opgeslagen in iris_pred:
CrossTable(x = iris.testLabels, y = iris_pred, prop.chisq=FALSE)

Let op dat het laatste argument prop.chisq aangeeft of de chi-kwadraatbijdrage van elke cel wordt opgenomen. De chi-kwadraatstatistiek is de som van de bijdragen van elk van de afzonderlijke cellen en wordt gebruikt om te beslissen of het verschil tussen de geobserveerde en verwachte waarden significant is.
Uit deze tabel kun je het aantal correcte en onjuiste voorspellingen afleiden: één voorbeeld uit de testset werd door het model gelabeld als Versicolor, terwijl het eigenlijk een bloem van de soort Virginica was. Je ziet dit in de eerste rij van de soort “Virginica” in de kolom iris.testLabels. In alle andere gevallen zijn correcte voorspellingen gedaan. Je kunt concluderen dat de prestaties van het model goed genoeg zijn en dat je het model niet verder hoeft te verbeteren!
Machine Learning in R met caret
In de vorige secties ben je gestart met supervised learning in R via het KNN-algoritme. Zoals je hierboven misschien hebt gemerkt, kan machine learning in R best complex worden, omdat er allerlei algoritmes met verschillende syntaxis, parameters, enzovoort zijn. Misschien ben je het met me eens dat het onthouden van de verschillende pakketnamen voor elk algoritme best lastig kan zijn, of dat het toepassen van de syntaxis voor elk specifiek algoritme gewoon te veel is.
Daar komt het pakket caret van pas: het staat voor “Classification and Regression Training” en biedt alles wat je nodig hebt om supervised machine learning-problemen op te lossen: het levert een uniforme interface naar een heleboel machine learning-algoritmes. Als je een beetje bekend bent met machine learning in Python, zie je misschien overeenkomsten met scikit-learn!
Hieronder doorloop je de stappen zoals ze hierboven zijn beschreven, maar dit keer gebruik je caret om je data te classificeren. Merk op dat je al veel werk hebt gedaan als je de stappen hierboven hebt gevolgd: je hebt grip op je data, je hebt die verkend, je werkomgeving voorbereid, enzovoort. Nu is het tijd om je data te pre-processen met caret!
Net als eerder kun je het effect van normalisatie bestuderen, maar dat zie je later in de tutorial.
Je weet wat er nu komt! Laten we de data splitsen in een trainings- en testset. In dit geval pak je het net even anders aan: je splitst de data op basis van de labels die je vindt in iris$Species. Ook is de verhouding hier 75-25 voor de trainings- en testsets.
Je bent klaar om modellen te trainen! Maar zoals je je herinnert, is caret een enorm project dat veel algoritmes omvat. Als je twijfelt welke algoritmes in het project zitten, kun je een lijst opvragen. Haal de lijst op met names(getModelInfo()), zoals het codeblok hieronder laat zien. Kies vervolgens een algoritme en train een model met de functie train():
Let op dat het maken van andere modellen extreem eenvoudig is als je eenmaal zo ver bent; je hoeft alleen het argument method te wijzigen, zoals in dit voorbeeld:
model_cart <- train(iris.training[, 1:4], iris.training[, 5], method='rpart2')
Nu je je model hebt getraind, is het tijd om de labels van de testset die je zojuist hebt gemaakt te voorspellen en te evalueren hoe het model het heeft gedaan op jouw data:
Daarnaast kun je proberen dezelfde test als eerder uit te voeren om het effect van pre-processing, zoals schalen en centreren, op je model te onderzoeken. Voer het volgende codeblok uit:
Door naar Big Data
Gefeliciteerd! Je bent aan het einde van deze tutorial gekomen!
Deze tutorial richtte zich vooral op het uitvoeren van het basisalgoritme KNN met behulp van R. De gebruikte Iris-dataset was klein en overzichtelijk; je hebt niet alleen gezien hoe je alle stappen zelf kunt uitvoeren, maar ook hoe je eenvoudig gebruik kunt maken van een uniforme interface, zoals die van caret, om je machine learning een kickstart te geven.
Maar er is nog zoveel meer mogelijk!
Als je voldoende hebt geëxperimenteerd met de basis die in deze tutorial is gepresenteerd en met andere machine learning-algoritmes, vind je het misschien interessant om verder de diepte in te gaan met R en data-analyse.

