{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_1-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1", "translation_date": "2025-09-04T01:34:22+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "de" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## Einführung in die Regression - Lektion 1\n", "\n", "#### Einordnung in den Kontext\n", "\n", "✅ Es gibt viele Arten von Regressionsmethoden, und welche du wählst, hängt von der Frage ab, die du beantworten möchtest. Möchtest du beispielsweise die wahrscheinliche Körpergröße einer Person in einem bestimmten Alter vorhersagen, würdest du `lineare Regression` verwenden, da du nach einem **numerischen Wert** suchst. Wenn du hingegen herausfinden möchtest, ob eine bestimmte Küche als vegan betrachtet werden sollte oder nicht, suchst du nach einer **Kategorisierung**, und dafür würdest du `logistische Regression` verwenden. Mehr über logistische Regression wirst du später lernen. Überlege dir ein paar Fragen, die du an Daten stellen könntest, und welche dieser Methoden dafür am besten geeignet wäre.\n", "\n", "In diesem Abschnitt wirst du mit einem [kleinen Datensatz über Diabetes](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html) arbeiten. Stell dir vor, du möchtest eine Behandlung für Diabetespatienten testen. Machine-Learning-Modelle könnten dir dabei helfen, herauszufinden, welche Patienten besser auf die Behandlung ansprechen würden, basierend auf Kombinationen von Variablen. Selbst ein sehr einfaches Regressionsmodell könnte, wenn es visualisiert wird, Informationen über Variablen liefern, die dir bei der Organisation deiner theoretischen klinischen Studien helfen könnten.\n", "\n", "Also, lass uns mit dieser Aufgabe beginnen!\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> `glimpse()` und `slice()` sind Funktionen aus [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, ein Teil des Tidyverse, ist eine Grammatik für Datenmanipulation, die eine konsistente Reihe von Verben bereitstellt, um die häufigsten Herausforderungen bei der Datenmanipulation zu lösen.\n",
"\n",
"
\n",
"\n",
"Da wir nun die Daten haben, konzentrieren wir uns auf ein Merkmal (`bmi`), das wir für diese Übung verwenden möchten. Dafür müssen wir die gewünschten Spalten auswählen. Wie machen wir das?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) ermöglicht es uns, Spalten in einem Dataframe *auszuwählen* (und optional umzubenennen).\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Trainings- und Testdaten\n",
"\n",
"Es ist gängige Praxis im überwachten Lernen, die Daten in zwei Teilmengen aufzuteilen: einen (in der Regel größeren) Satz, mit dem das Modell trainiert wird, und einen kleineren \"Rückhalte\"-Satz, mit dem überprüft wird, wie gut das Modell funktioniert hat.\n",
"\n",
"Da wir nun die Daten vorbereitet haben, können wir prüfen, ob eine Maschine helfen kann, eine logische Aufteilung zwischen den Zahlen in diesem Datensatz zu bestimmen. Wir können das [rsample](https://tidymodels.github.io/rsample/)-Paket verwenden, das Teil des Tidymodels-Frameworks ist, um ein Objekt zu erstellen, das die Informationen darüber enthält, *wie* die Daten aufgeteilt werden sollen. Anschließend können zwei weitere rsample-Funktionen verwendet werden, um die erstellten Trainings- und Testdatensätze zu extrahieren:\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Trainieren eines linearen Regressionsmodells mit Tidymodels\n",
"\n",
"Jetzt sind wir bereit, unser Modell zu trainieren!\n",
"\n",
"In Tidymodels spezifizieren Sie Modelle mit `parsnip()`, indem Sie drei Konzepte angeben:\n",
"\n",
"- Der **Modelltyp** unterscheidet Modelle wie lineare Regression, logistische Regression, Entscheidungsbaum-Modelle und so weiter.\n",
"\n",
"- Der **Modus des Modells** umfasst gängige Optionen wie Regression und Klassifikation; einige Modelltypen unterstützen beide, während andere nur einen Modus haben.\n",
"\n",
"- Die **Engine des Modells** ist das rechnerische Werkzeug, das verwendet wird, um das Modell anzupassen. Oft sind dies R-Pakete, wie **`\"lm\"`** oder **`\"ranger\"`**.\n",
"\n",
"Diese Modellinformationen werden in einer Modellspezifikation erfasst, also erstellen wir eine!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"Nachdem ein Modell *spezifiziert* wurde, kann das Modell mit der [`fit()`](https://parsnip.tidymodels.org/reference/fit.html)-Funktion `geschätzt` oder `trainiert` werden, typischerweise unter Verwendung einer Formel und einiger Daten.\n",
"\n",
"`y ~ .` bedeutet, dass wir `y` als die vorhergesagte Größe/Zielvariable anpassen, erklärt durch alle Prädiktoren/Merkmale, also `.` (in diesem Fall haben wir nur einen Prädiktor: `bmi`).\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"Aus den Modell-Ausgaben können wir die während des Trainings gelernten Koeffizienten erkennen. Sie repräsentieren die Koeffizienten der Ausgleichsgeraden, die den geringsten Gesamtfehler zwischen der tatsächlichen und der vorhergesagten Variablen liefert.\n",
"
\n",
"\n",
"## 5. Vorhersagen für den Testdatensatz treffen\n",
"\n",
"Nachdem wir nun ein Modell trainiert haben, können wir es verwenden, um die Krankheitsprogression y für den Testdatensatz mithilfe von [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) vorherzusagen. Dies wird genutzt, um die Linie zwischen den Datenclustern zu ziehen.\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 💃🕺 Wir haben gerade ein Modell trainiert und es verwendet, um Vorhersagen zu treffen!\n",
"\n",
"Beim Erstellen von Vorhersagen ist es in der tidymodels-Konvention üblich, immer ein Tibble/Data-Frame mit standardisierten Spaltennamen zu erzeugen. Dies erleichtert es, die Originaldaten und die Vorhersagen in einem nutzbaren Format zu kombinieren, um sie für nachfolgende Operationen wie das Plotten zu verwenden.\n",
"\n",
"`dplyr::bind_cols()` verbindet effizient mehrere Data-Frames spaltenweise.\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## 6. Modellierungsergebnisse visualisieren\n",
"\n",
"Jetzt ist es an der Zeit, dies visuell darzustellen 📈. Wir erstellen ein Streudiagramm aller `y`- und `bmi`-Werte des Testdatensatzes und verwenden dann die Vorhersagen, um eine Linie an der passendsten Stelle zwischen den Datenclustern des Modells zu zeichnen.\n",
"\n",
"R bietet mehrere Systeme zur Erstellung von Grafiken, aber `ggplot2` ist eines der elegantesten und vielseitigsten. Es ermöglicht dir, Grafiken durch **Kombination unabhängiger Komponenten** zu erstellen.\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"✅ Denk mal darüber nach, was hier genau passiert. Eine gerade Linie verläuft durch viele kleine Datenpunkte, aber was macht sie eigentlich genau? Kannst du erkennen, wie du diese Linie nutzen könntest, um vorherzusagen, wo ein neuer, noch nicht gesehener Datenpunkt in Bezug auf die y-Achse des Plots liegen sollte? Versuche, den praktischen Nutzen dieses Modells in Worte zu fassen.\n",
"\n",
"Herzlichen Glückwunsch, du hast dein erstes lineares Regressionsmodell erstellt, eine Vorhersage damit gemacht und es in einem Plot dargestellt!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"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 sich aus der Nutzung dieser Übersetzung ergeben.\n"
]
}
]
}