{ "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-03T19:41:46+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "pl" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## Wprowadzenie do regresji - Lekcja 1\n", "\n", "#### Umieszczenie w kontekście\n", "\n", "✅ Istnieje wiele rodzajów metod regresji, a wybór odpowiedniej zależy od pytania, na które chcesz odpowiedzieć. Jeśli chcesz przewidzieć prawdopodobny wzrost osoby w określonym wieku, użyjesz `regresji liniowej`, ponieważ szukasz **wartości numerycznej**. Jeśli interesuje Cię ustalenie, czy dany typ kuchni powinien być uznany za wegański, szukasz **przypisania kategorii**, więc użyjesz `regresji logistycznej`. Więcej o regresji logistycznej dowiesz się później. Zastanów się nad pytaniami, które możesz zadać danym, i które z tych metod byłyby bardziej odpowiednie.\n", "\n", "W tej sekcji będziesz pracować z [małym zestawem danych dotyczącym cukrzycy](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Wyobraź sobie, że chcesz przetestować leczenie dla pacjentów z cukrzycą. Modele uczenia maszynowego mogą pomóc w określeniu, którzy pacjenci lepiej zareagują na leczenie, na podstawie kombinacji zmiennych. Nawet bardzo podstawowy model regresji, gdy zostanie zwizualizowany, może dostarczyć informacji o zmiennych, które pomogą Ci zorganizować teoretyczne badania kliniczne.\n", "\n", "A zatem, zaczynajmy!\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> glimpse() i slice() to funkcje w [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, będący częścią Tidyverse, to gramatyka manipulacji danymi, która oferuje spójny zestaw czasowników pomagających rozwiązywać najczęstsze wyzwania związane z manipulacją danymi.\n",
"\n",
"
\n",
"\n",
"Teraz, gdy mamy dane, skupmy się na jednej zmiennej (`bmi`), którą będziemy analizować w tym ćwiczeniu. Wymaga to wybrania odpowiednich kolumn. Jak to zrobić?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) pozwala nam *wybrać* (i opcjonalnie zmienić nazwy) kolumny w ramce danych.\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. Dane treningowe i testowe\n",
"\n",
"W uczeniu nadzorowanym często stosuje się praktykę *dzielenia* danych na dwa podzbiory: (zazwyczaj większy) zestaw do trenowania modelu oraz mniejszy zestaw \"odłożony na bok\", który służy do oceny, jak model sobie poradził.\n",
"\n",
"Teraz, gdy mamy gotowe dane, możemy sprawdzić, czy maszyna może pomóc w określeniu logicznego podziału liczb w tym zbiorze danych. Możemy skorzystać z pakietu [rsample](https://tidymodels.github.io/rsample/), który jest częścią frameworku Tidymodels, aby stworzyć obiekt zawierający informacje o tym, *jak* podzielić dane, a następnie użyć dwóch dodatkowych funkcji rsample do wyodrębnienia utworzonych zestawów treningowych i testowych:\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. Trenuj model regresji liniowej za pomocą Tidymodels\n",
"\n",
"Teraz jesteśmy gotowi, aby wytrenować nasz model!\n",
"\n",
"W Tidymodels modele definiuje się za pomocą `parsnip()`, określając trzy kluczowe elementy:\n",
"\n",
"- **Typ modelu** rozróżnia modele, takie jak regresja liniowa, regresja logistyczna, modele drzew decyzyjnych i inne.\n",
"\n",
"- **Tryb modelu** obejmuje popularne opcje, takie jak regresja i klasyfikacja; niektóre typy modeli obsługują oba te tryby, podczas gdy inne mają tylko jeden tryb.\n",
"\n",
"- **Silnik modelu** to narzędzie obliczeniowe, które będzie używane do dopasowania modelu. Często są to pakiety R, takie jak **`\"lm\"`** lub **`\"ranger\"`**\n",
"\n",
"Te informacje o modelu są przechowywane w specyfikacji modelu, więc zbudujmy jedną!\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": [
"Po określeniu modelu, można go `oszacować` lub `wytrenować` za pomocą funkcji [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), zazwyczaj używając formuły i danych.\n",
"\n",
"`y ~ .` oznacza, że dopasujemy `y` jako przewidywaną wartość/cel, wyjaśnioną przez wszystkie predyktory/cechy, czyli `.` (w tym przypadku mamy tylko jeden predyktor: `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": [
"Z wyników modelu możemy zobaczyć współczynniki wyuczone podczas treningu. Reprezentują one współczynniki linii najlepszego dopasowania, która daje nam najniższy ogólny błąd między rzeczywistą a przewidywaną zmienną.\n",
"
\n",
"\n",
"## 5. Dokonaj prognoz na zbiorze testowym\n",
"\n",
"Teraz, gdy wytrenowaliśmy model, możemy go użyć do przewidywania postępu choroby y dla zbioru danych testowych, korzystając z [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). To będzie użyte do narysowania linii między grupami danych.\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": [
"Hurra! 💃🕺 Właśnie wytrenowaliśmy model i użyliśmy go do wykonania prognoz!\n",
"\n",
"Podczas wykonywania prognoz konwencja tidymodels zakłada zawsze generowanie tibble/ramki danych z wynikami, które mają ustandaryzowane nazwy kolumn. Dzięki temu łatwo połączyć oryginalne dane z prognozami w użytecznym formacie do dalszych operacji, takich jak tworzenie wykresów.\n",
"\n",
"`dplyr::bind_cols()` efektywnie łączy wiele ramek danych w kolumny.\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. Wizualizacja wyników modelowania\n",
"\n",
"Teraz czas zobaczyć to wizualnie 📈. Stworzymy wykres punktowy wszystkich wartości `y` i `bmi` z zestawu testowego, a następnie użyjemy przewidywań, aby narysować linię w najbardziej odpowiednim miejscu, pomiędzy grupami danych modelu.\n",
"\n",
"R oferuje kilka systemów do tworzenia wykresów, ale `ggplot2` jest jednym z najbardziej eleganckich i wszechstronnych. Umożliwia komponowanie wykresów poprzez **łączenie niezależnych komponentów**.\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": [
"✅ Zastanów się chwilę, co tu się dzieje. Przez wiele małych punktów danych przebiega prosta linia, ale co dokładnie robi? Czy widzisz, jak można użyć tej linii, aby przewidzieć, gdzie nowy, niewidziany wcześniej punkt danych powinien pasować w odniesieniu do osi y wykresu? Spróbuj opisać praktyczne zastosowanie tego modelu.\n",
"\n",
"Gratulacje, stworzyłeś swój pierwszy model regresji liniowej, dokonałeś za jego pomocą predykcji i wyświetliłeś ją na wykresie!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Zastrzeżenie**: \nTen dokument został przetłumaczony za pomocą usługi tłumaczenia AI [Co-op Translator](https://github.com/Azure/co-op-translator). Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za źródło autorytatywne. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.\n"
]
}
]
}