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.
447 lines
17 KiB
447 lines
17 KiB
{
|
|
"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",
|
|
"<p >\n",
|
|
" <img src=\"../../images/encouRage.jpg\"\n",
|
|
" width=\"630\"/>\n",
|
|
" <figcaption>Ilustracja autorstwa @allison_horst</figcaption>\n",
|
|
"\n",
|
|
"<!--<br>Ilustracja autorstwa @allison_horst-->\n"
|
|
],
|
|
"metadata": {
|
|
"id": "LWNNzfqd6feZ"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 1. Ładowanie naszego zestawu narzędzi\n",
|
|
"\n",
|
|
"Do tego zadania będziemy potrzebować następujących pakietów:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) to [zbiór pakietów R](https://www.tidyverse.org/packages) zaprojektowany, aby uczynić analizę danych szybszą, łatwiejszą i bardziej przyjemną!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) to [zbiór pakietów](https://www.tidymodels.org/packages/) przeznaczonych do modelowania i uczenia maszynowego.\n",
|
|
"\n",
|
|
"Możesz je zainstalować za pomocą:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
|
|
"\n",
|
|
"Poniższy skrypt sprawdza, czy masz zainstalowane pakiety potrzebne do ukończenia tego modułu, i instaluje je w przypadku, gdyby jakieś brakowały.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "FIo2YhO26wI9"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"source": [
|
|
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
|
|
"pacman::p_load(tidyverse, tidymodels)"
|
|
],
|
|
"outputs": [
|
|
{
|
|
"output_type": "stream",
|
|
"name": "stderr",
|
|
"text": [
|
|
"Loading required package: pacman\n",
|
|
"\n"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"id": "cIA9fz9v7Dss",
|
|
"colab": {
|
|
"base_uri": "https://localhost:8080/"
|
|
},
|
|
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"Teraz załadujmy te niesamowite pakiety i udostępnijmy je w naszej bieżącej sesji R. (To tylko ilustracja, `pacman::p_load()` już to dla Ciebie zrobił)\n"
|
|
],
|
|
"metadata": {
|
|
"id": "gpO_P_6f9WUG"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# load the core Tidyverse packages\r\n",
|
|
"library(tidyverse)\r\n",
|
|
"\r\n",
|
|
"# load the core Tidymodels packages\r\n",
|
|
"library(tidymodels)\r\n"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "NLMycgG-9ezO"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"## 2. Zbiór danych dotyczących cukrzycy\n",
|
|
"\n",
|
|
"W tym ćwiczeniu wykorzystamy nasze umiejętności regresji, aby przewidywać na podstawie zbioru danych dotyczących cukrzycy. [Zbiór danych dotyczących cukrzycy](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) zawiera `442 próbki` danych związanych z cukrzycą, z 10 zmiennymi predykcyjnymi: `wiek`, `płeć`, `wskaźnik masy ciała`, `średnie ciśnienie krwi` oraz `sześć pomiarów surowicy krwi`, a także zmienną wynikową `y`: ilościowy wskaźnik postępu choroby rok po badaniu bazowym.\n",
|
|
"\n",
|
|
"|Liczba obserwacji|442|\n",
|
|
"|------------------|:---|\n",
|
|
"|Liczba predyktorów|Pierwsze 10 kolumn to numeryczne zmienne predykcyjne|\n",
|
|
"|Wynik/Cel|Kolumna 11 to ilościowy wskaźnik postępu choroby rok po badaniu bazowym|\n",
|
|
"|Informacje o predyktorach|- wiek w latach\n",
|
|
"||- płeć\n",
|
|
"||- bmi wskaźnik masy ciała\n",
|
|
"||- bp średnie ciśnienie krwi\n",
|
|
"||- s1 tc, całkowity cholesterol w surowicy\n",
|
|
"||- s2 ldl, lipoproteiny o niskiej gęstości\n",
|
|
"||- s3 hdl, lipoproteiny o wysokiej gęstości\n",
|
|
"||- s4 tch, całkowity cholesterol / HDL\n",
|
|
"||- s5 ltg, prawdopodobnie logarytm poziomu trójglicerydów w surowicy\n",
|
|
"||- s6 glu, poziom cukru we krwi|\n",
|
|
"\n",
|
|
"> 🎓 Pamiętaj, że to uczenie nadzorowane, więc potrzebujemy określonego celu 'y'.\n",
|
|
"\n",
|
|
"Zanim będziesz mógł manipulować danymi w R, musisz zaimportować dane do pamięci R lub zbudować połączenie z danymi, które R może wykorzystać do zdalnego dostępu.\n",
|
|
"\n",
|
|
"> Pakiet [readr](https://readr.tidyverse.org/), który jest częścią Tidyverse, oferuje szybki i przyjazny sposób na wczytywanie danych prostokątnych do R.\n",
|
|
"\n",
|
|
"Teraz załadujmy zbiór danych dotyczących cukrzycy z podanego adresu URL: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
|
|
"\n",
|
|
"Dodatkowo przeprowadzimy kontrolę poprawności naszych danych za pomocą `glimpse()` i wyświetlimy pierwsze 5 wierszy za pomocą `slice()`.\n",
|
|
"\n",
|
|
"Zanim przejdziemy dalej, wprowadźmy coś, co często spotkasz w kodzie R 🥁🥁: operator pipe `%>%`\n",
|
|
"\n",
|
|
"Operator pipe (`%>%`) wykonuje operacje w logicznej kolejności, przekazując obiekt do funkcji lub wyrażenia. Możesz myśleć o operatorze pipe jako o powiedzeniu \"a następnie\" w swoim kodzie.\n"
|
|
],
|
|
"metadata": {
|
|
"id": "KM6iXLH996Cl"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"source": [
|
|
"# Import the data set\r\n",
|
|
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Get a glimpse and dimensions of the data\r\n",
|
|
"glimpse(diabetes)\r\n",
|
|
"\r\n",
|
|
"\r\n",
|
|
"# Select the first 5 rows of the data\r\n",
|
|
"diabetes %>% \r\n",
|
|
" slice(1:5)"
|
|
],
|
|
"outputs": [],
|
|
"metadata": {
|
|
"id": "Z1geAMhM-bSP"
|
|
}
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"source": [
|
|
"`glimpse()` pokazuje nam, że te dane mają 442 wiersze i 11 kolumn, przy czym wszystkie kolumny są typu danych `double`.\n",
|
|
"\n",
|
|
"<br>\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",
|
|
"<br>\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",
|
|
"<br>\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"
|
|
]
|
|
}
|
|
]
|
|
} |