{ "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-06T13:42:12+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "sr" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## Увод у регресију - Лекција 1\n", "\n", "#### Стављање у перспективу\n", "\n", "✅ Постоји много врста метода регресије, а коју ћете изабрати зависи од одговора који тражите. Ако желите да предвидите вероватну висину особе одређеног узраста, користили бисте `линеарну регресију`, јер тражите **нумеричку вредност**. Ако вас занима да ли одређена врста кухиње треба да се сматра веганском или не, тражите **категоријску класификацију**, па бисте користили `логистичку регресију`. О логистичкој регресији ћете више научити касније. Размислите мало о питањима која можете поставити подацима и који од ових метода би био прикладнији.\n", "\n", "У овом делу, радићете са [малим сетом података о дијабетесу](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html). Замислите да желите да тестирате третман за пацијенте са дијабетесом. Модели машинског учења могу вам помоћи да одредите који пацијенти би боље реаговали на третман, на основу комбинација променљивих. Чак и веома основни модел регресије, када се визуализује, може показати информације о променљивим које би вам помогле да организујете теоријске клиничке студије.\n", "\n", "С тим речима, хајде да започнемо овај задатак!\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> glimpse() и slice() су функције у [`dplyr`](https://dplyr.tidyverse.org/). Dplyr, део Tidyverse-а, је граматика за манипулацију подацима која пружа конзистентан сет глагола који вам помажу да решите најчешће изазове у манипулацији подацима.\n",
"\n",
"
\n",
"\n",
"Сада када имамо податке, усмерићемо се на једну карактеристику (`bmi`) коју ћемо циљати за ову вежбу. Ово ће захтевати да изаберемо жељене колоне. Па, како то можемо урадити?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) нам омогућава да *изаберемо* (и опционално преименујемо) колоне у оквиру података.\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. Тренинг и тестирање података\n",
"\n",
"У надгледаном учењу је уобичајена пракса да се *подели* подаци на два подскупа; (обично већи) скуп за тренирање модела и мањи \"резервни\" скуп за проверу како је модел функционисао.\n",
"\n",
"Сада када имамо припремљене податке, можемо видети да ли машина може помоћи у одређивању логичне поделе између бројева у овом скупу података. Можемо користити пакет [rsample](https://tidymodels.github.io/rsample/), који је део оквира Tidymodels, да креирамо објекат који садржи информације о *начину* поделе података, а затим још две rsample функције за издвајање креираних скупова за тренирање и тестирање:\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. Обучите модел линеарне регресије помоћу Tidymodels\n",
"\n",
"Сада смо спремни да обучимо наш модел!\n",
"\n",
"У Tidymodels-у, модели се специфицирају помоћу `parsnip()` кроз дефинисање три концепта:\n",
"\n",
"- **Тип модела** разликује моделе као што су линеарна регресија, логистичка регресија, модели одлуке стабла и тако даље.\n",
"\n",
"- **Режим модела** укључује уобичајене опције као што су регресија и класификација; неки типови модела подржавају обе опције, док неки имају само један режим.\n",
"\n",
"- **Енџин модела** је рачунарски алат који ће се користити за прилагођавање модела. Често су то R пакети, као што су **`\"lm\"`** или **`\"ranger\"`**\n",
"\n",
"Ове информације о моделу се чувају у спецификацији модела, па хајде да направимо једну!\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": [
"Након што је модел *одређен*, модел може бити `процењен` или `трениран` коришћењем функције [`fit()`](https://parsnip.tidymodels.org/reference/fit.html), обично уз помоћ формуле и неких података.\n",
"\n",
"`y ~ .` значи да ћемо прилагодити `y` као предвиђену вредност/циљ, објашњену свим предикторима/карактеристикама, односно `.` (у овом случају, имамо само један предиктор: `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": [
"Из модела можемо видети коефицијенте који су научени током тренинга. Они представљају коефицијенте линије најбољег прилагођавања која нам даје најмању укупну грешку између стварне и предвиђене променљиве.\n",
"
\n",
"\n",
"## 5. Направите предвиђања на тест сету\n",
"\n",
"Сада када смо обучили модел, можемо га користити за предвиђање прогресије болести y за тестни скуп података користећи [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Ово ће се користити за цртање линије између група података.\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": [
"Ура! 💃🕺 Управо смо обучили модел и користили га за прављење предвиђања!\n",
"\n",
"Када правимо предвиђања, конвенција tidymodels-а је да увек производимо tibble/data frame резултата са стандардизованим именима колона. Ово олакшава комбиновање оригиналних података и предвиђања у употребљивом формату за наредне операције као што је креирање графикона.\n",
"\n",
"`dplyr::bind_cols()` ефикасно спаја више data frame-ова по колонама.\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. Приказивање резултата модела\n",
"\n",
"Сада је време да ово видимо визуелно 📈. Направићемо расејани графикон свих `y` и `bmi` вредности из тест скупа, а затим ћемо користити предвиђања да нацртамо линију на најприкладнијем месту, између група података модела.\n",
"\n",
"R има неколико система за прављење графикона, али `ggplot2` је један од најелегантнијих и најсвестранијих. Овај пакет вам омогућава да креирате графиконе **комбиновањем независних компоненти**.\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": [
"✅ Размислите мало о томе шта се овде дешава. Права линија пролази кроз много малих тачака података, али шта она заправо ради? Можете ли да видите како би требало да будете у могућности да користите ову линију за предвиђање где би нова, непозната тачка података требало да се уклопи у односу на y осу графикона? Покушајте да речима опишете практичну употребу овог модела.\n",
"\n",
"Честитамо, направили сте свој први модел линеарне регресије, креирали предвиђање са њим и приказали га на графикону!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако се трудимо да обезбедимо тачност, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода.\n"
]
}
]
}