{ "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", "
\n",
" \n",
"
\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",
"
\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",
"
\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"
]
}
]
}