{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_10-R.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "2621e24705e8100893c9bf84e0fc8aef", "translation_date": "2025-09-06T12:38:41+00:00", "source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb", "language_code": "nl" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Bouw een classificatiemodel: Heerlijke Aziatische en Indiase Keukens\n" ], "metadata": { "id": "ItETB4tSFprR" } }, { "cell_type": "markdown", "source": [ "## Introductie tot classificatie: Maak je data schoon, bereid voor en visualiseer\n", "\n", "In deze vier lessen ga je een fundamenteel aspect van klassieke machine learning verkennen - *classificatie*. We zullen verschillende classificatie-algoritmen gebruiken met een dataset over de briljante keukens van Azië en India. Hopelijk heb je trek!\n", "\n", "

\n", " \n", "

Vier pan-Aziatische keukens in deze lessen! Afbeelding door Jen Looper
\n", "\n", "\n", "\n", "\n", "Classificatie is een vorm van [supervised learning](https://wikipedia.org/wiki/Supervised_learning) die veel gemeen heeft met regressietechnieken. Bij classificatie train je een model om te voorspellen tot welke `categorie` een item behoort. Als machine learning draait om het voorspellen van waarden of namen door datasets te gebruiken, dan valt classificatie over het algemeen in twee groepen: *binaire classificatie* en *multiclass classificatie*.\n", "\n", "Onthoud:\n", "\n", "- **Lineaire regressie** hielp je relaties tussen variabelen te voorspellen en nauwkeurige voorspellingen te doen over waar een nieuw datapunt zou vallen in relatie tot die lijn. Zo kon je bijvoorbeeld een numerieke waarde voorspellen zoals *wat de prijs van een pompoen zou zijn in september versus december*.\n", "\n", "- **Logistische regressie** hielp je \"binaire categorieën\" ontdekken: bij dit prijsniveau, *is deze pompoen oranje of niet-oranje*?\n", "\n", "Classificatie gebruikt verschillende algoritmen om andere manieren te bepalen waarop een label of klasse van een datapunt kan worden vastgesteld. Laten we met deze keukendata werken om te zien of we, door een groep ingrediënten te observeren, de herkomstkeuken kunnen bepalen.\n", "\n", "### [**Pre-lecture quiz**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n", "\n", "### **Introductie**\n", "\n", "Classificatie is een van de fundamentele activiteiten van de machine learning-onderzoeker en datawetenschapper. Van eenvoudige classificatie van een binaire waarde (\"is deze e-mail spam of niet?\") tot complexe beeldclassificatie en segmentatie met behulp van computer vision, het is altijd nuttig om data in klassen te sorteren en er vragen over te stellen.\n", "\n", "Om het proces op een meer wetenschappelijke manier te beschrijven, creëert je classificatiemethode een voorspellend model dat je in staat stelt de relatie tussen invoervariabelen en uitvoervariabelen in kaart te brengen.\n", "\n", "

\n", " \n", "

Binaire versus multiclass problemen voor classificatie-algoritmen. Infographic door Jen Looper
\n", "\n", "\n", "\n", "Voordat we beginnen met het schoonmaken van onze data, het visualiseren ervan en het voorbereiden voor onze ML-taken, laten we eerst wat meer leren over de verschillende manieren waarop machine learning kan worden gebruikt om data te classificeren.\n", "\n", "Afgeleid van [statistiek](https://wikipedia.org/wiki/Statistical_classification), gebruikt classificatie met klassieke machine learning kenmerken zoals `smoker`, `weight` en `age` om de *waarschijnlijkheid van het ontwikkelen van X ziekte* te bepalen. Als een supervised learning-techniek, vergelijkbaar met de regressieoefeningen die je eerder hebt uitgevoerd, is je data gelabeld en gebruiken de ML-algoritmen die labels om klassen (of 'kenmerken') van een dataset te classificeren en te voorspellen en ze aan een groep of uitkomst toe te wijzen.\n", "\n", "✅ Neem even de tijd om je een dataset over keukens voor te stellen. Welke vragen zou een multiclass-model kunnen beantwoorden? Welke vragen zou een binair model kunnen beantwoorden? Wat als je wilde bepalen of een bepaalde keuken waarschijnlijk fenegriek gebruikt? Wat als je wilde zien of je, met een tas vol steranijs, artisjokken, bloemkool en mierikswortel, een typisch Indiaas gerecht zou kunnen maken?\n", "\n", "### **Hallo 'classifier'**\n", "\n", "De vraag die we willen stellen over deze keukendataset is eigenlijk een **multiclass-vraag**, omdat we met verschillende mogelijke nationale keukens werken. Gegeven een groep ingrediënten, in welke van deze vele klassen past de data?\n", "\n", "Tidymodels biedt verschillende algoritmen om data te classificeren, afhankelijk van het soort probleem dat je wilt oplossen. In de volgende twee lessen leer je over enkele van deze algoritmen.\n", "\n", "#### **Vereisten**\n", "\n", "Voor deze les hebben we de volgende pakketten nodig om onze data schoon te maken, voor te bereiden en te visualiseren:\n", "\n", "- `tidyverse`: De [tidyverse](https://www.tidyverse.org/) is een [verzameling van R-pakketten](https://www.tidyverse.org/packages) ontworpen om data science sneller, eenvoudiger en leuker te maken!\n", "\n", "- `tidymodels`: Het [tidymodels](https://www.tidymodels.org/) framework is een [verzameling van pakketten](https://www.tidymodels.org/packages/) voor modellering en machine learning.\n", "\n", "- `DataExplorer`: Het [DataExplorer-pakket](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) is bedoeld om het EDA-proces te vereenvoudigen en rapporten te genereren.\n", "\n", "- `themis`: Het [themis-pakket](https://themis.tidymodels.org/) biedt extra stappen voor het omgaan met onevenwichtige data.\n", "\n", "Je kunt ze installeren met:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n", "\n", "Als alternatief controleert het onderstaande script of je de benodigde pakketten hebt om deze module te voltooien en installeert ze voor je als ze ontbreken.\n" ], "metadata": { "id": "ri5bQxZ-Fz_0" } }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n", "\r\n", "pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)" ], "outputs": [], "metadata": { "id": "KIPxa4elGAPI" } }, { "cell_type": "markdown", "source": [ "We zullen later deze geweldige pakketten laden en beschikbaar maken in onze huidige R-sessie. (Dit is slechts ter illustratie, `pacman::p_load()` heeft dat al voor je gedaan)\n" ], "metadata": { "id": "YkKAxOJvGD4C" } }, { "cell_type": "markdown", "source": [ "## Oefening - maak je gegevens schoon en balanceer ze\n", "\n", "De eerste taak, voordat je met dit project begint, is om je gegevens schoon te maken en **te balanceren** om betere resultaten te behalen.\n", "\n", "Laten we de gegevens bekijken!🕵️\n" ], "metadata": { "id": "PFkQDlk0GN5O" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Import data\r\n", "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n", "\r\n", "# View the first 5 rows\r\n", "df %>% \r\n", " slice_head(n = 5)\r\n" ], "outputs": [], "metadata": { "id": "Qccw7okxGT0S" } }, { "cell_type": "markdown", "source": [ "Interessant! Aan de hand van hoe het eruitziet, is de eerste kolom een soort `id`-kolom. Laten we wat meer informatie over de gegevens krijgen.\n" ], "metadata": { "id": "XrWnlgSrGVmR" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Basic information about the data\r\n", "df %>%\r\n", " introduce()\r\n", "\r\n", "# Visualize basic information above\r\n", "df %>% \r\n", " plot_intro(ggtheme = theme_light())" ], "outputs": [], "metadata": { "id": "4UcGmxRxGieA" } }, { "cell_type": "markdown", "source": [ "Uit de output kunnen we direct zien dat we `2448` rijen en `385` kolommen hebben en `0` ontbrekende waarden. We hebben ook 1 discrete kolom, *cuisine*.\n", "\n", "## Oefening - meer leren over keukens\n", "\n", "Nu begint het werk interessanter te worden. Laten we de verdeling van de gegevens per keuken ontdekken.\n" ], "metadata": { "id": "AaPubl__GmH5" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Count observations per cuisine\r\n", "df %>% \r\n", " count(cuisine) %>% \r\n", " arrange(n)\r\n", "\r\n", "# Plot the distribution\r\n", "theme_set(theme_light())\r\n", "df %>% \r\n", " count(cuisine) %>% \r\n", " ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n", " geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n", " ylab(\"cuisine\")" ], "outputs": [], "metadata": { "id": "FRsBVy5eGrrv" } }, { "cell_type": "markdown", "source": [ "Er zijn een beperkt aantal keukens, maar de verdeling van de gegevens is ongelijk. Dat kun je oplossen! Voordat je dat doet, verken eerst wat meer.\n", "\n", "Laten we vervolgens elke keuken toewijzen aan een individuele tibble en ontdekken hoeveel gegevens er beschikbaar zijn (rijen, kolommen) per keuken.\n", "\n", "> Een [tibble](https://tibble.tidyverse.org/) is een moderne data frame.\n", "\n", "

\n", " \n", "

Illustratie door @allison_horst
\n" ], "metadata": { "id": "vVvyDb1kG2in" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Create individual tibble for the cuisines\r\n", "thai_df <- df %>% \r\n", " filter(cuisine == \"thai\")\r\n", "japanese_df <- df %>% \r\n", " filter(cuisine == \"japanese\")\r\n", "chinese_df <- df %>% \r\n", " filter(cuisine == \"chinese\")\r\n", "indian_df <- df %>% \r\n", " filter(cuisine == \"indian\")\r\n", "korean_df <- df %>% \r\n", " filter(cuisine == \"korean\")\r\n", "\r\n", "\r\n", "# Find out how much data is available per cuisine\r\n", "cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n", " \"japanese df:\", dim(japanese_df), \"\\n\",\r\n", " \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n", " \"indian_df:\", dim(indian_df), \"\\n\",\r\n", " \"korean_df:\", dim(korean_df))" ], "outputs": [], "metadata": { "id": "0TvXUxD3G8Bk" } }, { "cell_type": "markdown", "source": [ "## **Oefening - Ontdekken van topingrediënten per keuken met dplyr**\n", "\n", "Nu kun je dieper in de data duiken en ontdekken wat de typische ingrediënten per keuken zijn. Je moet terugkerende gegevens verwijderen die verwarring tussen keukens veroorzaken, dus laten we meer leren over dit probleem.\n", "\n", "Maak een functie `create_ingredient()` in R die een ingrediënten-databestand retourneert. Deze functie begint met het verwijderen van een nutteloze kolom en sorteert de ingrediënten op basis van hun aantal.\n", "\n", "De basisstructuur van een functie in R is:\n", "\n", "`myFunction <- function(arglist){`\n", "\n", "**`...`**\n", "\n", "**`return`**`(value)`\n", "\n", "`}`\n", "\n", "Een overzichtelijke introductie tot R-functies is te vinden [hier](https://skirmer.github.io/presentations/functions_with_r.html#1).\n", "\n", "Laten we meteen aan de slag gaan! We maken gebruik van [dplyr werkwoorden](https://dplyr.tidyverse.org/) die we in onze vorige lessen hebben geleerd. Als samenvatting:\n", "\n", "- `dplyr::select()`: helpt je te kiezen welke **kolommen** je wilt behouden of uitsluiten.\n", "\n", "- `dplyr::pivot_longer()`: helpt je om data te \"verlengen\", waardoor het aantal rijen toeneemt en het aantal kolommen afneemt.\n", "\n", "- `dplyr::group_by()` en `dplyr::summarise()`: helpt je om samenvattende statistieken te vinden voor verschillende groepen en deze in een overzichtelijke tabel te plaatsen.\n", "\n", "- `dplyr::filter()`: maakt een subset van de data die alleen rijen bevat die aan jouw voorwaarden voldoen.\n", "\n", "- `dplyr::mutate()`: helpt je om kolommen te maken of te wijzigen.\n", "\n", "Bekijk deze [*kunst*-rijke learnr tutorial](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) van Allison Horst, die enkele handige data-wrangling functies in dplyr *(onderdeel van de Tidyverse)* introduceert.\n" ], "metadata": { "id": "K3RF5bSCHC76" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Creates a functions that returns the top ingredients by class\r\n", "\r\n", "create_ingredient <- function(df){\r\n", " \r\n", " # Drop the id column which is the first colum\r\n", " ingredient_df = df %>% select(-1) %>% \r\n", " # Transpose data to a long format\r\n", " pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n", " # Find the top most ingredients for a particular cuisine\r\n", " group_by(ingredients) %>% \r\n", " summarise(n_instances = sum(count)) %>% \r\n", " filter(n_instances != 0) %>% \r\n", " # Arrange by descending order\r\n", " arrange(desc(n_instances)) %>% \r\n", " mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n", " \r\n", " \r\n", " return(ingredient_df)\r\n", "} # End of function" ], "outputs": [], "metadata": { "id": "uB_0JR82HTPa" } }, { "cell_type": "markdown", "source": [ "Nu kunnen we de functie gebruiken om een idee te krijgen van de tien populairste ingrediënten per keuken. Laten we het uitproberen met `thai_df`.\n" ], "metadata": { "id": "h9794WF8HWmc" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Call create_ingredient and display popular ingredients\r\n", "thai_ingredient_df <- create_ingredient(df = thai_df)\r\n", "\r\n", "thai_ingredient_df %>% \r\n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "agQ-1HrcHaEA" } }, { "cell_type": "markdown", "source": [ "In de vorige sectie hebben we `geom_col()` gebruikt, laten we eens kijken hoe je ook `geom_bar` kunt gebruiken om staafdiagrammen te maken. Gebruik `?geom_bar` voor meer informatie.\n" ], "metadata": { "id": "kHu9ffGjHdcX" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a bar chart for popular thai cuisines\r\n", "thai_ingredient_df %>% \r\n", " slice_head(n = 10) %>% \r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "fb3Bx_3DHj6e" } }, { "cell_type": "markdown", "source": [ "Laten we hetzelfde doen voor de Japanse gegevens\n" ], "metadata": { "id": "RHP_xgdkHnvM" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Japanese cuisines and make bar chart\r\n", "create_ingredient(df = japanese_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")\r\n" ], "outputs": [], "metadata": { "id": "019v8F0XHrRU" } }, { "cell_type": "markdown", "source": [ "Wat dacht je van de Chinese keukens?\n" ], "metadata": { "id": "iIGM7vO8Hu3v" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Chinese cuisines and make bar chart\r\n", "create_ingredient(df = chinese_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "lHd9_gd2HyzU" } }, { "cell_type": "markdown", "source": [], "metadata": { "id": "ir8qyQbNH1c7" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Indian cuisines and make bar chart\r\n", "create_ingredient(df = indian_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "ApukQtKjH5FO" } }, { "cell_type": "markdown", "source": [ "Ten slotte, plot de Koreaanse ingrediënten.\n" ], "metadata": { "id": "qv30cwY1H-FM" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Korean cuisines and make bar chart\r\n", "create_ingredient(df = korean_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "lumgk9cHIBie" } }, { "cell_type": "markdown", "source": [ "Uit de datavisualisaties kunnen we nu de meest voorkomende ingrediënten verwijderen die verwarring veroorzaken tussen verschillende keukens, met behulp van `dplyr::select()`.\n", "\n", "Iedereen houdt van rijst, knoflook en gember!\n" ], "metadata": { "id": "iO4veMXuIEta" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Drop id column, rice, garlic and ginger from our original data set\r\n", "df_select <- df %>% \r\n", " select(-c(1, rice, garlic, ginger))\r\n", "\r\n", "# Display new data set\r\n", "df_select %>% \r\n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "iHJPiG6rIUcK" } }, { "cell_type": "markdown", "source": [ "## Gegevens voorbewerken met recepten 👩‍🍳👨‍🍳 - Omgaan met onevenwichtige gegevens ⚖️\n", "\n", "

\n", " \n", "

Illustratie door @allison_horst
\n", "\n", "Aangezien deze les over keukens gaat, moeten we `recepten` in context plaatsen.\n", "\n", "Tidymodels biedt nog een ander handig pakket: `recipes` - een pakket voor het voorbewerken van gegevens.\n" ], "metadata": { "id": "kkFd-JxdIaL6" } }, { "cell_type": "markdown", "source": [ "Laten we nog eens kijken naar de verdeling van onze keukens.\n" ], "metadata": { "id": "6l2ubtTPJAhY" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Distribution of cuisines\r\n", "old_label_count <- df_select %>% \r\n", " count(cuisine) %>% \r\n", " arrange(desc(n))\r\n", "\r\n", "old_label_count" ], "outputs": [], "metadata": { "id": "1e-E9cb7JDVi" } }, { "cell_type": "markdown", "source": [ "Zoals je kunt zien, is er een behoorlijk ongelijke verdeling in het aantal keukens. Koreaanse keukens zijn bijna drie keer zoveel als Thaise keukens. Onevenwichtige data heeft vaak negatieve effecten op de prestaties van het model. Denk bijvoorbeeld aan een binaire classificatie. Als het grootste deel van je data tot één klasse behoort, zal een ML-model die klasse vaker voorspellen, simpelweg omdat er meer data voor beschikbaar is. Het balanceren van de data corrigeert scheve verdelingen en helpt deze onevenwichtigheid te verwijderen. Veel modellen presteren het beste wanneer het aantal observaties gelijk is en hebben daarom vaak moeite met onevenwichtige data.\n", "\n", "Er zijn grofweg twee manieren om met onevenwichtige datasets om te gaan:\n", "\n", "- Observaties toevoegen aan de minderheidsklasse: `Over-sampling`, bijvoorbeeld met behulp van een SMOTE-algoritme\n", "\n", "- Observaties verwijderen uit de meerderheidsklasse: `Under-sampling`\n", "\n", "Laten we nu demonstreren hoe je met onevenwichtige datasets kunt omgaan met behulp van een `recept`. Een recept kan worden gezien als een blauwdruk die beschrijft welke stappen moeten worden toegepast op een dataset om deze klaar te maken voor data-analyse.\n" ], "metadata": { "id": "soAw6826JKx9" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load themis package for dealing with imbalanced data\r\n", "library(themis)\r\n", "\r\n", "# Create a recipe for preprocessing data\r\n", "cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n", " step_smote(cuisine)\r\n", "\r\n", "cuisines_recipe" ], "outputs": [], "metadata": { "id": "HS41brUIJVJy" } }, { "cell_type": "markdown", "source": [ "Laten we onze preprocessiestappen opsplitsen.\n", "\n", "- De aanroep van `recipe()` met een formule geeft de *rollen* van de variabelen aan met behulp van de `df_select`-gegevens als referentie. Bijvoorbeeld, de kolom `cuisine` heeft de rol `outcome` gekregen, terwijl de rest van de kolommen de rol `predictor` hebben gekregen.\n", "\n", "- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) maakt een *specificatie* van een receptstap die synthetisch nieuwe voorbeelden van de minderheidsklasse genereert met behulp van de dichtstbijzijnde buren van deze gevallen.\n", "\n", "Als we nu de voorbewerkte gegevens willen bekijken, moeten we onze recept [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) en [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) uitvoeren.\n", "\n", "`prep()`: schat de benodigde parameters op basis van een trainingsset, die later op andere datasets kan worden toegepast.\n", "\n", "`bake()`: neemt een voorbereid recept en past de bewerkingen toe op elke dataset.\n" ], "metadata": { "id": "Yb-7t7XcJaC8" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Prep and bake the recipe\r\n", "preprocessed_df <- cuisines_recipe %>% \r\n", " prep() %>% \r\n", " bake(new_data = NULL) %>% \r\n", " relocate(cuisine)\r\n", "\r\n", "# Display data\r\n", "preprocessed_df %>% \r\n", " slice_head(n = 5)\r\n", "\r\n", "# Quick summary stats\r\n", "preprocessed_df %>% \r\n", " introduce()" ], "outputs": [], "metadata": { "id": "9QhSgdpxJl44" } }, { "cell_type": "markdown", "source": [ "Laten we nu de verdeling van onze keukens bekijken en deze vergelijken met de onevenwichtige gegevens.\n" ], "metadata": { "id": "dmidELh_LdV7" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Distribution of cuisines\r\n", "new_label_count <- preprocessed_df %>% \r\n", " count(cuisine) %>% \r\n", " arrange(desc(n))\r\n", "\r\n", "list(new_label_count = new_label_count,\r\n", " old_label_count = old_label_count)" ], "outputs": [], "metadata": { "id": "aSh23klBLwDz" } }, { "cell_type": "markdown", "source": [ "Yum! De data is mooi schoon, gebalanceerd en erg lekker 😋!\n", "\n", "> Normaal gesproken wordt een recept meestal gebruikt als een voorverwerker voor modellering, waarbij het definieert welke stappen moeten worden toegepast op een dataset om deze klaar te maken voor modellering. In dat geval wordt meestal een `workflow()` gebruikt (zoals we al hebben gezien in onze eerdere lessen) in plaats van een recept handmatig te schatten.\n", ">\n", "> Daarom hoef je meestal geen **`prep()`** en **`bake()`** recepten te gebruiken wanneer je tidymodels gebruikt, maar het zijn handige functies om in je toolkit te hebben om te bevestigen dat recepten doen wat je verwacht, zoals in ons geval.\n", ">\n", "> Wanneer je een geprept recept **`bake()`** met **`new_data = NULL`**, krijg je de data terug die je hebt verstrekt bij het definiëren van het recept, maar dan met de toegepaste voorbewerkingsstappen.\n", "\n", "Laten we nu een kopie van deze data opslaan voor gebruik in toekomstige lessen:\n" ], "metadata": { "id": "HEu80HZ8L7ae" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Save preprocessed data\r\n", "write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")" ], "outputs": [], "metadata": { "id": "cBmCbIgrMOI6" } }, { "cell_type": "markdown", "source": [ "Deze nieuwe CSV is nu te vinden in de hoofdmap voor data.\n", "\n", "**🚀Uitdaging**\n", "\n", "Dit curriculum bevat verschillende interessante datasets. Doorzoek de `data`-mappen en kijk of er datasets zijn die geschikt zijn voor binaire of multi-klasse classificatie. Welke vragen zou je stellen over deze dataset?\n", "\n", "## [**Quiz na de les**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n", "\n", "## **Review & Zelfstudie**\n", "\n", "- Bekijk [pakket themis](https://github.com/tidymodels/themis). Welke andere technieken kunnen we gebruiken om om te gaan met onevenwichtige data?\n", "\n", "- Tidy models [referentie website](https://www.tidymodels.org/start/).\n", "\n", "- H. Wickham en G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n", "\n", "#### DANK AAN:\n", "\n", "[`Allison Horst`](https://twitter.com/allison_horst/) voor het maken van de geweldige illustraties die R toegankelijker en aantrekkelijker maken. Vind meer illustraties in haar [galerij](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n", "\n", "[Cassie Breviu](https://www.twitter.com/cassieview) en [Jen Looper](https://www.twitter.com/jenlooper) voor het maken van de originele Python-versie van deze module ♥️\n", "\n", "

\n", " \n", "

Kunstwerk door @allison_horst
\n" ], "metadata": { "id": "WQs5621pMGwf" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n" ] } ] }