You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/de/4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb

727 lines
29 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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-04T02:48:56+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "de"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Erstellen Sie ein Klassifikationsmodell: Köstliche asiatische und indische Küchen\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Einführung in die Klassifikation: Daten bereinigen, vorbereiten und visualisieren\n",
"\n",
"In diesen vier Lektionen wirst du einen grundlegenden Schwerpunkt des klassischen maschinellen Lernens erkunden - *Klassifikation*. Wir werden verschiedene Klassifikationsalgorithmen mit einem Datensatz über die großartigen Küchen Asiens und Indiens durchgehen. Hoffentlich hast du Appetit!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Feiere pan-asiatische Küchen in diesen Lektionen! Bild von Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Feiere pan-asiatische Küchen in diesen Lektionen! Bild von Jen Looper](../../../../../../translated_images/pinch.b33c0ba76f284aad94a3c4e3ed83e13ed1e17fbcf4db8ca8583c3a0c135e2e99.de.png)-->\n",
"\n",
"Klassifikation ist eine Form des [überwachten Lernens](https://wikipedia.org/wiki/Supervised_learning), die viele Gemeinsamkeiten mit Regressionstechniken hat. Bei der Klassifikation trainierst du ein Modell, um vorherzusagen, zu welcher `Kategorie` ein Element gehört. Wenn maschinelles Lernen darauf abzielt, Werte oder Namen von Dingen mithilfe von Datensätzen vorherzusagen, fällt die Klassifikation im Allgemeinen in zwei Gruppen: *binäre Klassifikation* und *Mehrklassenklassifikation*.\n",
"\n",
"Denke daran:\n",
"\n",
"- **Lineare Regression** hat dir geholfen, Beziehungen zwischen Variablen vorherzusagen und genaue Vorhersagen darüber zu treffen, wo ein neuer Datenpunkt in Bezug auf diese Linie liegen würde. So konntest du beispielsweise numerische Werte wie *den Preis eines Kürbisses im September vs. Dezember* vorhersagen.\n",
"\n",
"- **Logistische Regression** hat dir geholfen, \"binäre Kategorien\" zu entdecken: Bei diesem Preisniveau, *ist dieser Kürbis orange oder nicht-orange*?\n",
"\n",
"Klassifikation verwendet verschiedene Algorithmen, um andere Möglichkeiten zu finden, das Label oder die Klasse eines Datenpunkts zu bestimmen. Lass uns mit diesen Küchendaten arbeiten, um herauszufinden, ob wir anhand einer Gruppe von Zutaten die Herkunftsküche bestimmen können.\n",
"\n",
"### [**Quiz vor der Lektion**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Einführung**\n",
"\n",
"Klassifikation ist eine der grundlegenden Tätigkeiten eines Forschers im Bereich maschinelles Lernen und eines Datenwissenschaftlers. Von der einfachen Klassifikation eines binären Wertes (\"Ist diese E-Mail Spam oder nicht?\") bis hin zur komplexen Bildklassifikation und Segmentierung mithilfe von Computer Vision ist es immer nützlich, Daten in Klassen zu sortieren und Fragen dazu zu stellen.\n",
"\n",
"Um den Prozess wissenschaftlicher auszudrücken: Deine Klassifikationsmethode erstellt ein prädiktives Modell, das es dir ermöglicht, die Beziehung zwischen Eingabevariablen und Ausgabevariablen abzubilden.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Binäre vs. Mehrklassenprobleme, die Klassifikationsalgorithmen bewältigen können. Infografik von Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"Bevor wir mit dem Bereinigen unserer Daten, ihrer Visualisierung und Vorbereitung für unsere ML-Aufgaben beginnen, lass uns ein wenig über die verschiedenen Möglichkeiten lernen, wie maschinelles Lernen genutzt werden kann, um Daten zu klassifizieren.\n",
"\n",
"Abgeleitet aus der [Statistik](https://wikipedia.org/wiki/Statistical_classification) verwendet die Klassifikation im klassischen maschinellen Lernen Merkmale wie `Raucher`, `Gewicht` und `Alter`, um die *Wahrscheinlichkeit der Entwicklung von Krankheit X* zu bestimmen. Als eine Technik des überwachten Lernens, ähnlich den Regressionsexperimenten, die du zuvor durchgeführt hast, sind deine Daten beschriftet, und die ML-Algorithmen verwenden diese Beschriftungen, um Klassen (oder 'Merkmale') eines Datensatzes zu klassifizieren und sie einer Gruppe oder einem Ergebnis zuzuordnen.\n",
"\n",
"✅ Nimm dir einen Moment Zeit, um dir einen Datensatz über Küchen vorzustellen. Welche Fragen könnte ein Mehrklassenmodell beantworten? Welche Fragen könnte ein binäres Modell beantworten? Was wäre, wenn du herausfinden möchtest, ob eine bestimmte Küche wahrscheinlich Bockshornklee verwendet? Was wäre, wenn du herausfinden möchtest, ob du mit einer Tüte voller Sternanis, Artischocken, Blumenkohl und Meerrettich ein typisches indisches Gericht zubereiten könntest?\n",
"\n",
"### **Hallo 'Classifier'**\n",
"\n",
"Die Frage, die wir diesem Küchendatensatz stellen möchten, ist tatsächlich eine **Mehrklassenfrage**, da wir mehrere potenzielle nationale Küchen zur Auswahl haben. Angenommen, wir haben eine Gruppe von Zutaten - zu welcher dieser vielen Klassen passt die Daten?\n",
"\n",
"Tidymodels bietet verschiedene Algorithmen, um Daten zu klassifizieren, je nachdem, welche Art von Problem du lösen möchtest. In den nächsten zwei Lektionen wirst du einige dieser Algorithmen kennenlernen.\n",
"\n",
"#### **Voraussetzung**\n",
"\n",
"Für diese Lektion benötigen wir die folgenden Pakete, um unsere Daten zu bereinigen, vorzubereiten und zu visualisieren:\n",
"\n",
"- `tidyverse`: Das [tidyverse](https://www.tidyverse.org/) ist eine [Sammlung von R-Paketen](https://www.tidyverse.org/packages), die darauf abzielt, Datenwissenschaft schneller, einfacher und unterhaltsamer zu machen!\n",
"\n",
"- `tidymodels`: Das [tidymodels](https://www.tidymodels.org/) Framework ist eine [Sammlung von Paketen](https://www.tidymodels.org/packages/) für Modellierung und maschinelles Lernen.\n",
"\n",
"- `DataExplorer`: Das [DataExplorer-Paket](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) soll den EDA-Prozess und die Berichterstellung vereinfachen und automatisieren.\n",
"\n",
"- `themis`: Das [themis-Paket](https://themis.tidymodels.org/) bietet zusätzliche Rezeptschritte für den Umgang mit unausgewogenen Daten.\n",
"\n",
"Du kannst sie wie folgt installieren:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Alternativ überprüft das untenstehende Skript, ob du die Pakete hast, die für die Durchführung dieses Moduls erforderlich sind, und installiert sie für dich, falls sie fehlen.\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": [
"Wir werden später diese großartigen Pakete laden und in unserer aktuellen R-Sitzung verfügbar machen. (Dies dient nur zur Veranschaulichung, `pacman::p_load()` hat das bereits für Sie erledigt)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Übung Daten bereinigen und ausbalancieren\n",
"\n",
"Die erste Aufgabe, bevor Sie mit diesem Projekt beginnen, besteht darin, Ihre Daten zu bereinigen und **auszubalancieren**, um bessere Ergebnisse zu erzielen.\n",
"\n",
"Lernen wir die Daten kennen! 🕵️\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! Vom Aussehen her ist die erste Spalte eine Art `id`-Spalte. Lassen Sie uns ein wenig mehr Informationen über die Daten erhalten.\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": [
"Aus der Ausgabe können wir sofort erkennen, dass wir `2448` Zeilen und `385` Spalten sowie `0` fehlende Werte haben. Außerdem haben wir eine diskrete Spalte, *cuisine*.\n",
"\n",
"## Übung - mehr über Küchen lernen\n",
"\n",
"Jetzt wird die Arbeit interessanter. Lassen Sie uns die Verteilung der Daten pro Küche entdecken.\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": [
"Es gibt eine begrenzte Anzahl von Küchen, aber die Verteilung der Daten ist ungleichmäßig. Du kannst das ändern! Bevor du das tust, erkunde die Daten ein wenig mehr.\n",
"\n",
"Als Nächstes ordnen wir jede Küche in ihre eigene Tibble und finden heraus, wie viele Daten (Zeilen, Spalten) pro Küche verfügbar sind.\n",
"\n",
"> Ein [tibble](https://tibble.tidyverse.org/) ist ein modernes Daten-Frame.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Kunstwerk von @allison_horst</figcaption>\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": [
"## **Übung - Entdecken der wichtigsten Zutaten nach Küche mit dplyr**\n",
"\n",
"Jetzt kannst du tiefer in die Daten eintauchen und herausfinden, welche typischen Zutaten zu den verschiedenen Küchen gehören. Du solltest wiederkehrende Daten bereinigen, die Verwirrung zwischen den Küchen stiften, also lass uns mehr über dieses Problem lernen.\n",
"\n",
"Erstelle eine Funktion `create_ingredient()` in R, die ein Zutaten-Datenframe zurückgibt. Diese Funktion beginnt damit, eine wenig hilfreiche Spalte zu entfernen und die Zutaten nach ihrer Häufigkeit zu sortieren.\n",
"\n",
"Die grundlegende Struktur einer Funktion in R ist:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Eine übersichtliche Einführung in R-Funktionen findest du [hier](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Legen wir direkt los! Wir werden [dplyr-Verben](https://dplyr.tidyverse.org/) verwenden, die wir in unseren vorherigen Lektionen gelernt haben. Zur Erinnerung:\n",
"\n",
"- `dplyr::select()`: hilft dir, **Spalten** auszuwählen, die du behalten oder ausschließen möchtest.\n",
"\n",
"- `dplyr::pivot_longer()`: hilft dir, Daten zu \"verlängern\", indem die Anzahl der Zeilen erhöht und die Anzahl der Spalten verringert wird.\n",
"\n",
"- `dplyr::group_by()` und `dplyr::summarise()`: helfen dir, zusammenfassende Statistiken für verschiedene Gruppen zu finden und sie in einer übersichtlichen Tabelle darzustellen.\n",
"\n",
"- `dplyr::filter()`: erstellt eine Teilmenge der Daten, die nur Zeilen enthält, die deine Bedingungen erfüllen.\n",
"\n",
"- `dplyr::mutate()`: hilft dir, Spalten zu erstellen oder zu ändern.\n",
"\n",
"Schau dir dieses [*kunstvolle* Learnr-Tutorial](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) von Allison Horst an, das einige nützliche Datenbearbeitungsfunktionen in dplyr *(Teil des Tidyverse)* vorstellt.\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": [
"Jetzt können wir die Funktion nutzen, um eine Vorstellung von den zehn beliebtesten Zutaten nach Küche zu bekommen. Probieren wir es mit `thai_df` aus.\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": [
"Im vorherigen Abschnitt haben wir `geom_col()` verwendet, lassen Sie uns sehen, wie Sie auch `geom_bar` verwenden können, um Balkendiagramme zu erstellen. Verwenden Sie `?geom_bar` für weitere Informationen.\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": [
"Lass uns dasselbe für die japanischen Daten tun\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": [
"Was ist mit der chinesischen Küche?\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": [
"Schließlich die koreanischen Zutaten plotten.\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": [
"Aus den Datenvisualisierungen können wir nun die häufigsten Zutaten entfernen, die Verwirrung zwischen verschiedenen Küchenstilen stiften, indem wir `dplyr::select()` verwenden.\n",
"\n",
"Jeder liebt Reis, Knoblauch und Ingwer!\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": [
"## Datenvorverarbeitung mit Recipes 👩‍🍳👨‍🍳 - Umgang mit unausgeglichenen Daten ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Illustration von @allison_horst</figcaption>\n",
"\n",
"Da es in dieser Lektion um Küchen geht, müssen wir `recipes` in den richtigen Kontext setzen.\n",
"\n",
"Tidymodels bietet ein weiteres praktisches Paket: `recipes` - ein Paket zur Datenvorverarbeitung.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Werfen wir erneut einen Blick auf die Verteilung unserer Küchen.\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": [
"Wie Sie sehen können, gibt es eine ziemlich ungleiche Verteilung in der Anzahl der Küchen. Koreanische Küchen sind fast dreimal so häufig wie thailändische Küchen. Unausgewogene Daten haben oft negative Auswirkungen auf die Modellleistung. Denken Sie an eine binäre Klassifikation. Wenn der Großteil Ihrer Daten zu einer Klasse gehört, wird ein ML-Modell diese Klasse häufiger vorhersagen, einfach weil es dafür mehr Daten gibt. Das Ausbalancieren der Daten gleicht jede Schieflage aus und hilft, dieses Ungleichgewicht zu beseitigen. Viele Modelle erzielen die besten Ergebnisse, wenn die Anzahl der Beobachtungen gleich ist, und haben daher oft Schwierigkeiten mit unausgewogenen Daten.\n",
"\n",
"Es gibt im Wesentlichen zwei Ansätze, um mit unausgewogenen Datensätzen umzugehen:\n",
"\n",
"- Hinzufügen von Beobachtungen zur Minderheitsklasse: `Over-sampling`, z. B. mit einem SMOTE-Algorithmus\n",
"\n",
"- Entfernen von Beobachtungen aus der Mehrheitsklasse: `Under-sampling`\n",
"\n",
"Lassen Sie uns nun demonstrieren, wie man mit unausgewogenen Datensätzen mithilfe eines `Rezepts` umgeht. Ein Rezept kann als eine Art Blaupause betrachtet werden, die beschreibt, welche Schritte auf einen Datensatz angewendet werden sollten, um ihn für die Datenanalyse vorzubereiten.\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": [
"Lassen Sie uns unsere Vorverarbeitungsschritte aufschlüsseln.\n",
"\n",
"- Der Aufruf von `recipe()` mit einer Formel teilt dem Rezept die *Rollen* der Variablen unter Verwendung der `df_select`-Daten als Referenz mit. Zum Beispiel wurde der `cuisine`-Spalte die Rolle `outcome` zugewiesen, während die restlichen Spalten die Rolle `predictor` erhalten haben.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) erstellt eine *Spezifikation* eines Rezeptschritts, der synthetisch neue Beispiele der Minderheitsklasse generiert, indem die nächsten Nachbarn dieser Fälle verwendet werden.\n",
"\n",
"Wenn wir nun die vorverarbeiteten Daten sehen möchten, müssten wir unser Rezept [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) und [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) anwenden.\n",
"\n",
"`prep()`: schätzt die erforderlichen Parameter aus einem Trainingsdatensatz, die später auf andere Datensätze angewendet werden können.\n",
"\n",
"`bake()`: nimmt ein vorbereitetes Rezept und wendet die Operationen auf einen beliebigen Datensatz an.\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": [
"Lassen Sie uns nun die Verteilung unserer Küchen überprüfen und sie mit den unausgewogenen Daten vergleichen.\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! Die Daten sind schön sauber, ausgewogen und sehr lecker 😋!\n",
"\n",
"> Normalerweise wird ein Rezept als Vorverarbeitungswerkzeug für das Modellieren verwendet, wobei es definiert, welche Schritte auf einen Datensatz angewendet werden müssen, um ihn für das Modellieren vorzubereiten. In diesem Fall wird typischerweise ein `workflow()` verwendet (wie wir bereits in unseren vorherigen Lektionen gesehen haben), anstatt ein Rezept manuell zu schätzen.\n",
">\n",
"> Daher ist es normalerweise nicht notwendig, **`prep()`** und **`bake()`** zu verwenden, wenn man mit tidymodels arbeitet. Dennoch sind es hilfreiche Funktionen, die man in seinem Werkzeugkasten haben sollte, um sicherzustellen, dass Rezepte das tun, was man erwartet so wie in unserem Fall.\n",
">\n",
"> Wenn du ein vorbereitetes Rezept mit **`new_data = NULL`** **`bake()`**, erhältst du die Daten zurück, die du beim Definieren des Rezepts bereitgestellt hast, jedoch mit den angewendeten Vorverarbeitungsschritten.\n",
"\n",
"Speichern wir nun eine Kopie dieser Daten, um sie in zukünftigen Lektionen zu verwenden:\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": [
"Diese neue CSV-Datei befindet sich jetzt im Hauptdatenordner.\n",
"\n",
"**🚀Herausforderung**\n",
"\n",
"Dieses Curriculum enthält mehrere interessante Datensätze. Durchsuche die `data`-Ordner und prüfe, ob sie Datensätze enthalten, die sich für binäre oder Multi-Klassen-Klassifikationen eignen. Welche Fragen würdest du zu diesem Datensatz stellen?\n",
"\n",
"## [**Quiz nach der Vorlesung**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Überblick & Selbststudium**\n",
"\n",
"- Schau dir [das Paket themis](https://github.com/tidymodels/themis) an. Welche anderen Techniken könnten wir verwenden, um mit unausgeglichenen Daten umzugehen?\n",
"\n",
"- Tidy Models [Referenz-Website](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham und G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
"\n",
"#### EIN GROSSES DANKESCHÖN AN:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) für die Erstellung der großartigen Illustrationen, die R einladender und ansprechender machen. Weitere Illustrationen findest du in ihrer [Galerie](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) und [Jen Looper](https://www.twitter.com/jenlooper) für die Erstellung der ursprünglichen Python-Version dieses Moduls ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Kunstwerk von @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Haftungsausschluss**: \nDieses Dokument wurde mithilfe des KI-Übersetzungsdienstes [Co-op Translator](https://github.com/Azure/co-op-translator) übersetzt. Obwohl wir uns um Genauigkeit bemühen, weisen wir darauf hin, dass automatisierte Übersetzungen Fehler oder Ungenauigkeiten enthalten können. Das Originaldokument in seiner ursprünglichen Sprache sollte als maßgebliche Quelle betrachtet werden. Für kritische Informationen wird eine professionelle menschliche Übersetzung empfohlen. Wir übernehmen keine Haftung für Missverständnisse oder Fehlinterpretationen, die aus der Nutzung dieser Übersetzung entstehen.\n"
]
}
]
}