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/hu/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb

447 lines
18 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-04T07:09:07+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "hu"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## Bevezetés a regresszióba - 1. lecke\n",
"\n",
"#### Helyzetbe helyezés\n",
"\n",
"✅ Számos regressziós módszer létezik, és hogy melyiket választod, az attól függ, milyen kérdésre keresed a választ. Ha például meg szeretnéd jósolni egy adott korú személy valószínű magasságát, akkor `lineáris regressziót` használnál, mivel egy **numerikus értéket** keresel. Ha viszont azt szeretnéd kideríteni, hogy egy adott konyha típusa vegánnak tekinthető-e vagy sem, akkor egy **kategória hozzárendelésére** van szükséged, így `logisztikus regressziót` alkalmaznál. A logisztikus regresszióról később többet fogsz tanulni. Gondolj néhány kérdésre, amelyeket az adatokkal kapcsolatban feltehetsz, és hogy ezek közül melyik módszer lenne a legmegfelelőbb.\n",
"\n",
"Ebben a részben egy [kis adatállománnyal a cukorbetegségről](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html) fogsz dolgozni. Képzeld el, hogy egy kezelést szeretnél tesztelni cukorbeteg pácienseken. A gépi tanulási modellek segíthetnek meghatározni, hogy mely páciensek reagálnának jobban a kezelésre, a változók kombinációi alapján. Még egy nagyon alapvető regressziós modell is, ha vizualizáljuk, olyan információkat mutathat a változókról, amelyek segítenek megszervezni az elméleti klinikai vizsgálatokat.\n",
"\n",
"Nos, kezdjünk bele ebbe a feladatba!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>Illusztráció: @allison_horst</figcaption>\n",
"\n",
"<!--![Illusztráció: \\@allison_horst](../../../../../../2-Regression/1-Tools/images/encouRage.jpg)<br>Illusztráció: @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. Eszközkészlet betöltése\n",
"\n",
"Ehhez a feladathoz a következő csomagokra lesz szükségünk:\n",
"\n",
"- `tidyverse`: A [tidyverse](https://www.tidyverse.org/) egy [R csomagok gyűjteménye](https://www.tidyverse.org/packages), amelyet azért terveztek, hogy a data science gyorsabb, könnyebb és szórakoztatóbb legyen!\n",
"\n",
"- `tidymodels`: A [tidymodels](https://www.tidymodels.org/) keretrendszer egy [csomaggyűjtemény](https://www.tidymodels.org/packages/) modellezéshez és gépi tanuláshoz.\n",
"\n",
"A következőképpen telepítheted őket:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"Az alábbi szkript ellenőrzi, hogy megvannak-e a szükséges csomagok a modul elvégzéséhez, és telepíti őket, ha hiányoznak.\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": [
"Most töltsük be ezeket a nagyszerű csomagokat, és tegyük elérhetővé őket a jelenlegi R munkamenetünkben. (Ez csak szemléltetés, a `pacman::p_load()` ezt már megtette helyetted)\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. A cukorbetegség adatállomány\n",
"\n",
"Ebben a gyakorlatban a regressziós készségeinket fogjuk bemutatni azáltal, hogy előrejelzéseket készítünk egy cukorbetegség adatállomány alapján. A [cukorbetegség adatállomány](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) `442 mintát` tartalmaz a cukorbetegségről, 10 előrejelző változóval: `életkor`, `nem`, `testtömeg-index`, `átlagos vérnyomás`, és `hat vérszérum mérés`, valamint egy kimeneti változóval `y`: a betegség előrehaladásának kvantitatív mértéke egy évvel az alapállapot után.\n",
"\n",
"|Megfigyelések száma|442|\n",
"|-------------------|:---|\n",
"|Előrejelzők száma|Az első 10 oszlop numerikus előrejelző|\n",
"|Kimenet/Cél|A 11. oszlop a betegség előrehaladásának kvantitatív mértéke egy évvel az alapállapot után|\n",
"|Előrejelző információ|- életkor években\n",
"||- nem\n",
"||- bmi testtömeg-index\n",
"||- bp átlagos vérnyomás\n",
"||- s1 tc, összes szérum koleszterin\n",
"||- s2 ldl, alacsony sűrűségű lipoproteinek\n",
"||- s3 hdl, magas sűrűségű lipoproteinek\n",
"||- s4 tch, összes koleszterin / HDL\n",
"||- s5 ltg, valószínűleg a szérum trigliceridszint logaritmusa\n",
"||- s6 glu, vércukorszint|\n",
"\n",
"> 🎓 Ne feledd, ez felügyelt tanulás, és szükségünk van egy megnevezett 'y' célváltozóra.\n",
"\n",
"Mielőtt adatokat tudnál manipulálni R-ben, először be kell importálnod az adatokat R memóriájába, vagy létre kell hoznod egy kapcsolatot az adatokkal, amelyet R távolról elérhet.\n",
"\n",
"> A [readr](https://readr.tidyverse.org/) csomag, amely a Tidyverse része, gyors és barátságos módot kínál az adatok téglalap alakú formában történő beolvasására R-be.\n",
"\n",
"Most töltsük be a cukorbetegség adatállományt az alábbi forrás URL-ről: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"Ezenkívül végezzünk egy gyors ellenőrzést az adatainkon a `glimpse()` segítségével, és jelenítsük meg az első 5 sort a `slice()` használatával.\n",
"\n",
"Mielőtt továbbmennénk, mutassunk be valamit, amivel gyakran találkozni fogsz R kódban 🥁🥁: a pipe operátort `%>%`\n",
"\n",
"A pipe operátor (`%>%`) logikai sorrendben hajt végre műveleteket azáltal, hogy egy objektumot továbbít egy függvénybe vagy hívási kifejezésbe. Gondolhatsz a pipe operátorra úgy, mintha a kódodban azt mondanád: \"és aztán\".\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": [
"A `glimpse()` megmutatja, hogy ez az adat 442 sort és 11 oszlopot tartalmaz, az összes oszlop adattípusa pedig `double`.\n",
"\n",
"<br>\n",
"\n",
"> A `glimpse()` és a `slice()` a [`dplyr`](https://dplyr.tidyverse.org/) függvényei. A dplyr, amely a Tidyverse része, egy adatmanipulációs nyelvtan, amely egy következetes igekészletet biztosít, hogy segítsen megoldani a leggyakoribb adatmanipulációs kihívásokat.\n",
"\n",
"<br>\n",
"\n",
"Most, hogy megvan az adat, szűkítsük le egyetlen jellemzőre (`bmi`), amelyet célként használunk ebben a gyakorlatban. Ehhez ki kell választanunk a kívánt oszlopokat. Hogyan tehetjük ezt meg?\n",
"\n",
"A [`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) lehetővé teszi, hogy *kiválasszuk* (és opcionálisan átnevezzük) az oszlopokat egy adatkeretben.\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. Tanító- és tesztadatok\n",
"\n",
"A felügyelt tanulásban bevett gyakorlat, hogy az adatokat *két részre osztjuk*: egy (általában nagyobb) adathalmazra, amelyet a modell tanítására használunk, és egy kisebb, \"visszatartott\" adathalmazra, amellyel ellenőrizzük, hogyan teljesített a modell.\n",
"\n",
"Most, hogy az adataink készen állnak, megnézhetjük, hogy egy gép segíthet-e logikus módon szétválasztani a számokat ebben az adathalmazban. Ehhez használhatjuk az [rsample](https://tidymodels.github.io/rsample/) csomagot, amely a Tidymodels keretrendszer része. Ez a csomag lehetővé teszi, hogy létrehozzunk egy objektumot, amely tartalmazza az adatfelosztás *módját*, majd két további rsample függvényt használhatunk a létrehozott tanító- és tesztadatok kinyerésére:\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. Lineáris regressziós modell tanítása Tidymodels segítségével\n",
"\n",
"Most készen állunk arra, hogy betanítsuk a modellünket!\n",
"\n",
"A Tidymodels-ben a modelleket a `parsnip()` segítségével határozzuk meg, három alapfogalom megadásával:\n",
"\n",
"- A modell **típusa** különbözteti meg a modelleket, például lineáris regresszió, logisztikus regresszió, döntési fa modellek és így tovább.\n",
"\n",
"- A modell **módja** olyan általános lehetőségeket tartalmaz, mint a regresszió és a klasszifikáció; egyes modell típusok mindkettőt támogatják, míg mások csak egyetlen módot.\n",
"\n",
"- A modell **motorja** az a számítási eszköz, amelyet a modell illesztésére használunk. Gyakran ezek R csomagok, mint például **`\"lm\"`** vagy **`\"ranger\"`**.\n",
"\n",
"Ez a modellezési információ egy modell specifikációban kerül rögzítésre, úgyhogy építsünk egyet!\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": [
"Miután egy modellt *meghatároztak*, a modellt `becsülni` vagy `tanítani` lehet a [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) függvény segítségével, általában egy formula és némi adat felhasználásával.\n",
"\n",
"`y ~ .` azt jelenti, hogy `y`-t fogjuk illeszteni mint előrejelzett mennyiséget/célt, amelyet az összes prediktor/jellemző magyaráz, azaz `.` (ebben az esetben csak egy prediktorunk van: `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": [
"A modell tanítása során kapott kimenetből láthatjuk a tanulás során meghatározott együtthatókat. Ezek az együtthatók a legjobban illeszkedő egyenes együtthatói, amely a legkisebb összesített hibát adja az aktuális és a becsült változó között.\n",
"<br>\n",
"\n",
"## 5. Készítsünk előrejelzéseket a tesztkészleten\n",
"\n",
"Most, hogy betanítottunk egy modellt, használhatjuk azt a betegség előrehaladásának y értékének előrejelzésére a tesztadatkészletben a [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) segítségével. Ez arra szolgál, hogy meghúzzuk a vonalat az adatcsoportok között.\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": [
"Hurrá! 💃🕺 Épp most tanítottunk be egy modellt, és használtuk előrejelzések készítésére!\n",
"\n",
"Az előrejelzések készítésekor a tidymodels konvenciója szerint mindig egy tibble/adatkeret készül az eredményekkel, szabványosított oszlopnevekkel. Ez megkönnyíti az eredeti adatok és az előrejelzések kombinálását egy használható formátumba, amely alkalmas további műveletekre, például ábrázolásra.\n",
"\n",
"A `dplyr::bind_cols()` hatékonyan összekapcsol több adatkeretet oszlopok mentén.\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. Modell eredmények ábrázolása\n",
"\n",
"Most itt az ideje, hogy ezt vizuálisan is megnézzük 📈. Készítünk egy szórásdiagramot a tesztkészlet összes `y` és `bmi` értékéről, majd a predikciók segítségével egy vonalat rajzolunk a legmegfelelőbb helyre, a modell adatcsoportosításai közé.\n",
"\n",
"Az R több rendszert kínál grafikonok készítésére, de a `ggplot2` az egyik legelegánsabb és legsokoldalúbb. Ez lehetővé teszi, hogy grafikonokat **független komponensek kombinálásával** állítsunk össze.\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": [
"✅ Gondolkodj el egy kicsit azon, mi történik itt. Egy egyenes vonal halad át sok apró adatponton, de pontosan mit csinál? Látod, hogyan tudnád ezt a vonalat felhasználni arra, hogy megjósolj egy új, még nem látott adatpont helyét a grafikon y tengelyéhez viszonyítva? Próbáld meg szavakba önteni ennek a modellnek a gyakorlati hasznát.\n",
"\n",
"Gratulálok, elkészítetted az első lineáris regressziós modelledet, létrehoztál vele egy előrejelzést, és megjelenítetted egy grafikonon!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Felelősségkizárás**: \nEz a dokumentum az [Co-op Translator](https://github.com/Azure/co-op-translator) AI fordítási szolgáltatás segítségével készült. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Kritikus információk esetén javasolt professzionális, emberi fordítást igénybe venni. Nem vállalunk felelősséget a fordítás használatából eredő félreértésekért vagy téves értelmezésekért.\n"
]
}
]
}