{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Изградња модела логистичке регресије - Лекција 4\n", "\n", "![Инфографика: Логистичка vs. линеарна регресија](../../../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png)\n", "\n", "#### **[Квиз пре предавања](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n", "\n", "#### Увод\n", "\n", "У овој последњој лекцији о регресији, једној од основних *класичних* техника машинског учења, погледаћемо логистичку регресију. Ову технику користите да бисте открили обрасце за предвиђање бинарних категорија. Да ли је овај слаткиш чоколада или не? Да ли је ова болест заразна или не? Да ли ће овај купац изабрати овај производ или не?\n", "\n", "У овој лекцији ћете научити:\n", "\n", "- Технике за логистичку регресију\n", "\n", "✅ Продубите своје разумевање рада са овом врстом регресије у овом [модулу за учење](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott)\n", "\n", "## Предуслов\n", "\n", "Радећи са подацима о бундевама, сада смо довољно упознати са њима да схватимо да постоји једна бинарна категорија са којом можемо радити: `Color`.\n", "\n", "Хајде да изградимо модел логистичке регресије да бисмо предвидели, на основу неких променљивих, *која је вероватно боја дате бундеве* (наранџаста 🎃 или бела 👻).\n", "\n", "> Зашто говоримо о бинарној класификацији у лекцији која се бави регресијом? Само ради језичке погодности, јер је логистичка регресија [заправо метода класификације](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), иако заснована на линеарним принципима. Сазнајте више о другим начинима класификације података у следећој групи лекција.\n", "\n", "За ову лекцију биће нам потребни следећи пакети:\n", "\n", "- `tidyverse`: [tidyverse](https://www.tidyverse.org/) је [збирка R пакета](https://www.tidyverse.org/packages) дизајнирана да учини науку о подацима бржом, лакшом и забавнијом!\n", "\n", "- `tidymodels`: [tidymodels](https://www.tidymodels.org/) оквир је [збирка пакета](https://www.tidymodels.org/packages/) за моделирање и машинско учење.\n", "\n", "- `janitor`: [janitor пакет](https://github.com/sfirke/janitor) пружа једноставне алате за испитивање и чишћење \"прљавих\" података.\n", "\n", "- `ggbeeswarm`: [ggbeeswarm пакет](https://github.com/eclarke/ggbeeswarm) пружа методе за креирање графикона у стилу \"роја пчела\" користећи ggplot2.\n", "\n", "Можете их инсталирати помоћу:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n", "\n", "Алтернативно, скрипта испод проверава да ли имате потребне пакете за завршетак овог модула и инсталира их ако недостају.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n", "\n", "pacman::p_load(tidyverse, tidymodels, janitor, ggbeeswarm)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## **Дефинишите питање**\n", "\n", "За наше потребе, изразићемо ово као бинарно: 'Бело' или 'Није бело'. У нашем сету података постоји и категорија 'пругасто', али има мало примерака, па је нећемо користити. Ионако нестаје када уклонимо вредности null из сета података.\n", "\n", "> 🎃 Забавна чињеница, понекад беле тикве називамо 'духовима' тиквама. Нису баш лаке за резбарење, па нису толико популарне као наранџасте, али изгледају занимљиво! Тако да бисмо могли да преобликујемо наше питање као: 'Дух' или 'Није дух'. 👻\n", "\n", "## **О логистичкој регресији**\n", "\n", "Логистичка регресија се разликује од линеарне регресије, коју сте раније учили, на неколико важних начина.\n", "\n", "#### **Бинарна класификација**\n", "\n", "Логистичка регресија не нуди исте могућности као линеарна регресија. Прва нуди предвиђање о `бинарној категорији` (\"наранџасто или није наранџасто\"), док је друга способна да предвиђа `континуалне вредности`, на пример, на основу порекла тикве и времена жетве, *колико ће њена цена порасти*.\n", "\n", "![Инфографик од Дасани Мадипали](../../../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png)\n", "\n", "### Друге класификације\n", "\n", "Постоје и други типови логистичке регресије, укључујући мултиномијалну и ординалну:\n", "\n", "- **Мултиномијална**, која укључује више од једне категорије - \"Наранџасто, Бело и Пругасто\".\n", "\n", "- **Ординална**, која укључује уређене категорије, корисна ако желимо да логички поређамо наше исходе, као тикве које су поређане по ограниченом броју величина (мини, мало, средње, велико, веома велико, екстра велико).\n", "\n", "![Мултиномијална vs ординална регресија](../../../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png)\n", "\n", "#### **Променљиве НЕ морају да буду корелисане**\n", "\n", "Сећате се како је линеарна регресија боље функционисала са више корелисаних променљивих? Логистичка регресија је супротна - променљиве не морају да буду усклађене. То одговара овим подацима који имају релативно слабе корелације.\n", "\n", "#### **Потребно је много чистих података**\n", "\n", "Логистичка регресија ће дати прецизније резултате ако користите више података; наш мали сет података није оптималан за овај задатак, па то имајте на уму.\n", "\n", "✅ Размислите о типовима података који би били погодни за логистичку регресију\n", "\n", "## Вежба - уредите податке\n", "\n", "Прво, мало очистите податке, уклањајући null вредности и бирајући само неке од колона:\n", "\n", "1. Додајте следећи код:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Load the core tidyverse packages\n", "library(tidyverse)\n", "\n", "# Import the data and clean column names\n", "pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\") %>% \n", " clean_names()\n", "\n", "# Select desired columns\n", "pumpkins_select <- pumpkins %>% \n", " select(c(city_name, package, variety, origin, item_size, color)) \n", "\n", "# Drop rows containing missing values and encode color as factor (category)\n", "pumpkins_select <- pumpkins_select %>% \n", " drop_na() %>% \n", " mutate(color = factor(color))\n", "\n", "# View the first few rows\n", "pumpkins_select %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Увек можете бацити поглед на ваш нови датафрејм користећи функцију [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) као што је приказано испод:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "pumpkins_select %>% \n", " glimpse()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Хајде да потврдимо да ћемо заправо радити на проблему бинарне класификације:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Subset distinct observations in outcome column\n", "pumpkins_select %>% \n", " distinct(color)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Визуелизација - категоријални графикон\n", "До сада сте поново учитали податке о бундевама и очистили их тако да задржите скуп података који садржи неколико променљивих, укључујући боју. Хајде да визуелизујемо dataframe у бележници користећи библиотеку ggplot.\n", "\n", "Библиотека ggplot нуди неке сјајне начине за визуелизацију ваших података. На пример, можете упоредити расподеле података за сваку сорту и боју у категоријалном графикону.\n", "\n", "1. Направите такав графикон користећи функцију geombar, користећи наше податке о бундевама, и одредите мапирање боја за сваку категорију бундеве (наранџаста или бела):\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "python" } }, "outputs": [], "source": [ "# Specify colors for each value of the hue variable\n", "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n", "\n", "# Create the bar plot\n", "ggplot(pumpkins_select, aes(y = variety, fill = color)) +\n", " geom_bar(position = \"dodge\") +\n", " scale_fill_manual(values = palette) +\n", " labs(y = \"Variety\", fill = \"Color\") +\n", " theme_minimal()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посматрајући податке, можете видети како се подаци о Боји односе на Врсту.\n", "\n", "✅ С обзиром на овај категоријални графикон, која занимљива истраживања можете замислити?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Предобрада података: кодирање карактеристика\n", "\n", "Наш скуп података о бундевама садржи стринг вредности за све своје колоне. Рад са категоријским подацима је интуитиван за људе, али не и за машине. Алгоритми машинског учења добро функционишу са бројевима. Зато је кодирање веома важан корак у фази предобраде података, јер нам омогућава да категоријске податке претворимо у нумеричке, без губитка информација. Добро кодирање води ка изградњи доброг модела.\n", "\n", "За кодирање карактеристика постоје два главна типа кодера:\n", "\n", "1. Ординални кодер: добро одговара ординалним променљивама, које су категоријске променљиве где њихови подаци следе логички редослед, као што је колона `item_size` у нашем скупу података. Он креира мапирање тако да је свака категорија представљена бројем, који је редослед категорије у колони.\n", "\n", "2. Категоријски кодер: добро одговара номиналним променљивама, које су категоријске променљиве где њихови подаци не следе логички редослед, као што су све карактеристике различите од `item_size` у нашем скупу података. То је једно-хот кодирање, што значи да је свака категорија представљена бинарном колоном: кодирана променљива је једнака 1 ако бундева припада тој врсти, а 0 у супротном.\n", "\n", "Tidymodels пружа још један користан пакет: [recipes](https://recipes.tidymodels.org/) - пакет за предобраду података. Дефинисаћемо `recipe` који спецификује да све колоне предиктора треба да буду кодиране у сет целих бројева, `prep` да процени потребне количине и статистике за било коју операцију и на крају `bake` да примени израчунавања на нове податке.\n", "\n", "> Уобичајено је да се recipes користи као предобрада за моделирање, где дефинише које кораке треба применити на скуп података како би био спреман за моделирање. У том случају је **топло препоручено** да користите `workflow()` уместо ручног процењивања рецепта помоћу prep и bake. Све ово ћемо видети ускоро.\n", ">\n", "> Међутим, за сада користимо recipes + prep + bake да спецификујемо које кораке треба применити на скуп података како би био спреман за анализу података и затим извукли предобрађене податке са примењеним корацима.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Preprocess and extract data to allow some data analysis\n", "baked_pumpkins <- recipe(color ~ ., data = pumpkins_select) %>%\n", " # Define ordering for item_size column\n", " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n", " # Convert factors to numbers using the order defined above (Ordinal encoding)\n", " step_integer(item_size, zero_based = F) %>%\n", " # Encode all other predictors using one hot encoding\n", " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE) %>%\n", " prep(data = pumpkin_select) %>%\n", " bake(new_data = NULL)\n", "\n", "# Display the first few rows of preprocessed data\n", "baked_pumpkins %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "✅ Које су предности коришћења ординалног енкодера за колону величине артикла?\n", "\n", "### Анализа односа између променљивих\n", "\n", "Сада када смо претходно обрадили наше податке, можемо анализирати односе између карактеристика и ознаке како бисмо стекли идеју о томе колико добро модел може предвидети ознаку на основу карактеристика. Најбољи начин за спровођење овакве анализе је кроз визуализацију података. \n", "Поново ћемо користити функцију ggplot geom_boxplot_, како бисмо визуализовали односе између величине артикла, сорте и боје у категоријалном графику. За бољу визуализацију података користићемо енкодовану колону величине артикла и неенкодовану колону сорте.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Define the color palette\n", "palette <- c(ORANGE = \"orange\", WHITE = \"wheat\")\n", "\n", "# We need the encoded Item Size column to use it as the x-axis values in the plot\n", "pumpkins_select_plot<-pumpkins_select\n", "pumpkins_select_plot$item_size <- baked_pumpkins$item_size\n", "\n", "# Create the grouped box plot\n", "ggplot(pumpkins_select_plot, aes(x = `item_size`, y = color, fill = color)) +\n", " geom_boxplot() +\n", " facet_grid(variety ~ ., scales = \"free_x\") +\n", " scale_fill_manual(values = palette) +\n", " labs(x = \"Item Size\", y = \"\") +\n", " theme_minimal() +\n", " theme(strip.text = element_text(size = 12)) +\n", " theme(axis.text.x = element_text(size = 10)) +\n", " theme(axis.title.x = element_text(size = 12)) +\n", " theme(axis.title.y = element_blank()) +\n", " theme(legend.position = \"bottom\") +\n", " guides(fill = guide_legend(title = \"Color\")) +\n", " theme(panel.spacing = unit(0.5, \"lines\"))+\n", " theme(strip.text.y = element_text(size = 4, hjust = 0)) \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Користите swarm plot\n", "\n", "Пошто је Color бинарна категорија (Бела или Не), потребан је 'специјализовани приступ [визуализацији](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf)'.\n", "\n", "Пробајте `swarm plot` да бисте приказали расподелу боје у односу на item_size.\n", "\n", "Користићемо [ggbeeswarm пакет](https://github.com/eclarke/ggbeeswarm) који пружа методе за креирање beeswarm-стил графикона користећи ggplot2. Beeswarm графикони су начин приказивања тачака које би се иначе преклапале тако да падају једна поред друге.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Create beeswarm plots of color and item_size\n", "baked_pumpkins %>% \n", " mutate(color = factor(color)) %>% \n", " ggplot(mapping = aes(x = color, y = item_size, color = color)) +\n", " geom_quasirandom() +\n", " scale_color_brewer(palette = \"Dark2\", direction = -1) +\n", " theme(legend.position = \"none\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сада када имамо идеју о односу између бинарних категорија боје и веће групе величина, хајде да истражимо логистичку регресију како бисмо одредили вероватну боју одређене тикве.\n", "\n", "## Направите свој модел\n", "\n", "Изаберите променљиве које желите да користите у свом класификационом моделу и поделите податке на сетове за обуку и тестирање. [rsample](https://rsample.tidymodels.org/), пакет у оквиру Tidymodels, пружа инфраструктуру за ефикасно раздвајање и ресемплинг података:\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Split data into 80% for training and 20% for testing\n", "set.seed(2056)\n", "pumpkins_split <- pumpkins_select %>% \n", " initial_split(prop = 0.8)\n", "\n", "# Extract the data in each split\n", "pumpkins_train <- training(pumpkins_split)\n", "pumpkins_test <- testing(pumpkins_split)\n", "\n", "# Print out the first 5 rows of the training set\n", "pumpkins_train %>% \n", " slice_head(n = 5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "🙌 Сада смо спремни да обучимо модел тако што ћемо прилагодити карактеристике за обуку ознаци за обуку (боји).\n", "\n", "Почећемо креирањем рецепта који одређује кораке предобраде који треба да се спроведу на нашим подацима како би били спремни за моделирање, тј. кодирање категоријских променљивих у скуп целих бројева. Баш као `baked_pumpkins`, креирамо `pumpkins_recipe`, али не `prep` и `bake`, јер ће бити укључено у радни ток, што ћете видети за само неколико корака.\n", "\n", "Постоји прилично велики број начина за спецификацију модела логистичке регресије у Tidymodels. Погледајте `?logistic_reg()`. За сада ћемо специфицирати модел логистичке регресије преко подразумеваног `stats::glm()` механизма.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Create a recipe that specifies preprocessing steps for modelling\n", "pumpkins_recipe <- recipe(color ~ ., data = pumpkins_train) %>% \n", " step_mutate(item_size = ordered(item_size, levels = c('sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo'))) %>%\n", " step_integer(item_size, zero_based = F) %>% \n", " step_dummy(all_nominal(), -all_outcomes(), one_hot = TRUE)\n", "\n", "# Create a logistic model specification\n", "log_reg <- logistic_reg() %>% \n", " set_engine(\"glm\") %>% \n", " set_mode(\"classification\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сада када имамо рецепт и спецификацију модела, потребно је да пронађемо начин да их спојимо у један објекат који ће прво обрадити податке (припрема+печење у позадини), затим обучити модел на обрађеним подацима, а такође омогућити потенцијалне активности пост-обраде.\n", "\n", "У Tidymodels-у, овај практични објекат се назива [`workflow`](https://workflows.tidymodels.org/) и згодно чува ваше компоненте за моделирање.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Bundle modelling components in a workflow\n", "log_reg_wf <- workflow() %>% \n", " add_recipe(pumpkins_recipe) %>% \n", " add_model(log_reg)\n", "\n", "# Print out the workflow\n", "log_reg_wf\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Након што је радни ток *одређен*, модел може бити `обучен` коришћењем функције [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html). Радни ток ће проценити рецепт и претходно обрадити податке пре обуке, тако да нећемо морати то ручно да радимо користећи prep и bake.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Train the model\n", "wf_fit <- log_reg_wf %>% \n", " fit(data = pumpkins_train)\n", "\n", "# Print the trained workflow\n", "wf_fit\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Модел приказује коефицијенте научене током тренинга.\n", "\n", "Сада када смо обучили модел користећи податке за тренинг, можемо направити предвиђања на тест подацима користећи [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Хајде да започнемо тако што ћемо користити модел за предвиђање ознака за наш тест сет и вероватноћа за сваку ознаку. Када је вероватноћа већа од 0.5, предвиђена класа је `WHITE`, иначе је `ORANGE`.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Make predictions for color and corresponding probabilities\n", "results <- pumpkins_test %>% select(color) %>% \n", " bind_cols(wf_fit %>% \n", " predict(new_data = pumpkins_test)) %>%\n", " bind_cols(wf_fit %>%\n", " predict(new_data = pumpkins_test, type = \"prob\"))\n", "\n", "# Compare predictions\n", "results %>% \n", " slice_head(n = 10)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Врло лепо! Ово пружа додатне увиде у то како логистичка регресија функционише.\n", "\n", "### Боље разумевање кроз матрицу конфузије\n", "\n", "Поређење сваке предикције са њеном одговарајућом \"истинском\" вредношћу није баш ефикасан начин да се утврди колико добро модел предвиђа. Срећом, Tidymodels има још неке трикове у рукаву: [`yardstick`](https://yardstick.tidymodels.org/) - пакет који се користи за мерење ефикасности модела помоћу метрика перформанси.\n", "\n", "Једна од метрика перформанси која се повезује са проблемима класификације је [`матрица конфузије`](https://wikipedia.org/wiki/Confusion_matrix). Матрица конфузије описује колико добро модел класификације функционише. Матрица конфузије приказује колико примера у свакој класи је модел исправно класификовао. У нашем случају, показаће вам колико наранџастих бундева је класификовано као наранџасте и колико белих бундева је класификовано као беле; матрица конфузије такође показује колико је њих класификовано у **погрешне** категорије.\n", "\n", "Функција [**`conf_mat()`**](https://tidymodels.github.io/yardstick/reference/conf_mat.html) из yardstick-а израчунава ову крос-табелацију посматраних и предвиђених класа.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Confusion matrix for prediction results\n", "conf_mat(data = results, truth = color, estimate = .pred_class)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Хајде да интерпретирамо матрицу конфузије. Наш модел треба да класификује бундеве у две бинарне категорије, категорију `бела` и категорију `није бела`.\n", "\n", "- Ако ваш модел предвиди да је бундева бела и она заиста припада категорији „бела“, то називамо `истински позитивно`, што је приказано горњим левим бројем.\n", "\n", "- Ако ваш модел предвиди да бундева није бела, а она заиста припада категорији „бела“, то називамо `лажно негативно`, што је приказано доњим левим бројем.\n", "\n", "- Ако ваш модел предвиди да је бундева бела, а она заиста припада категорији „није бела“, то називамо `лажно позитивно`, што је приказано горњим десним бројем.\n", "\n", "- Ако ваш модел предвиди да бундева није бела, а она заиста припада категорији „није бела“, то називамо `истински негативно`, што је приказано доњим десним бројем.\n", "\n", "| Истина |\n", "|:-----:|\n", "\n", "| | | |\n", "|---------------|--------|-------|\n", "| **Предвиђено** | БЕЛА | НАРАНЏАСТА |\n", "| БЕЛА | TP | FP |\n", "| НАРАНЏАСТА | FN | TN |\n", "\n", "Као што сте можда претпоставили, пожељно је имати већи број истински позитивних и истински негативних резултата, а мањи број лажно позитивних и лажно негативних резултата, што имплицира да модел боље ради.\n", "\n", "Матрица конфузије је корисна јер омогућава израчунавање других метрика које нам могу помоћи да боље проценимо перформансе класификационог модела. Хајде да их размотримо:\n", "\n", "🎓 Прецизност: `TP/(TP + FP)` дефинисана као однос предвиђених позитивних резултата који су заиста позитивни. Такође се назива [позитивна предиктивна вредност](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\").\n", "\n", "🎓 Осетљивост: `TP/(TP + FN)` дефинисана као однос позитивних резултата у односу на број узорака који су заиста позитивни. Такође позната као `осетљивост`.\n", "\n", "🎓 Специфичност: `TN/(TN + FP)` дефинисана као однос негативних резултата у односу на број узорака који су заиста негативни.\n", "\n", "🎓 Тачност: `TP + TN/(TP + TN + FP + FN)` Проценат етикета које су тачно предвиђене за узорак.\n", "\n", "🎓 F мера: Тежински просек прецизности и осетљивости, где је најбољи резултат 1, а најгори 0.\n", "\n", "Хајде да израчунамо ове метрике!\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Combine metric functions and calculate them all at once\n", "eval_metrics <- metric_set(ppv, recall, spec, f_meas, accuracy)\n", "eval_metrics(data = results, truth = color, estimate = .pred_class)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Прикажи РОЦ криву за овај модел\n", "\n", "Хајде да направимо још једну визуализацију како бисмо видели такозвану [`РОЦ криву`](https://en.wikipedia.org/wiki/Receiver_operating_characteristic):\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Make a roc_curve\n", "results %>% \n", " roc_curve(color, .pred_ORANGE) %>% \n", " autoplot()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ROC криве се често користе за добијање увида у резултате класификатора у смислу његових истинских и лажних позитивних резултата. ROC криве обично приказују `True Positive Rate`/Сензитивност на Y оси и `False Positive Rate`/1-Специфичност на X оси. Због тога су стрмина криве и простор између средишње линије и криве важни: желите криву која брзо иде нагоре и прелази линију. У нашем случају, постоје лажни позитивни резултати на почетку, а затим линија правилно иде нагоре и прелази.\n", "\n", "На крају, хајде да користимо `yardstick::roc_auc()` за израчунавање стварне Површине испод криве (Area Under the Curve). Један од начина тумачења AUC је као вероватноћа да модел рангира насумични позитиван пример више него насумични негативан пример.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "vscode": { "languageId": "r" } }, "outputs": [], "source": [ "# Calculate area under curve\n", "results %>% \n", " roc_auc(color, .pred_ORANGE)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rezultat je oko `0.975`. S obzirom na to da AUC varira od 0 do 1, želite visok rezultat, jer model koji je 100% tačan u svojim predikcijama ima AUC od 1; u ovom slučaju, model je *prilično dobar*.\n", "\n", "U budućim lekcijama o klasifikacijama, naučićete kako da poboljšate rezultate svog modela (na primer, kako da se nosite sa neuravnoteženim podacima u ovom slučaju).\n", "\n", "## 🚀Изазов\n", "\n", "Postoji mnogo toga što treba istražiti u vezi sa logističkom regresijom! Ali najbolji način da naučite jeste da eksperimentišete. Pronađite skup podataka koji se može analizirati ovim tipom modela i napravite model koristeći ga. Шта сте научили? савет: пробајте [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) за занимљиве скупове података.\n", "\n", "## Преглед и Самостално Учење\n", "\n", "Прочитајте првих неколико страница [овог рада са Стенфорда](https://web.stanford.edu/~jurafsky/slp3/5.pdf) о неким практичним применама логистичке регресије. Размислите о задацима који су боље прилагођени једном или другом типу регресије које смо до сада проучавали. Шта би најбоље функционисало?\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако настојимо да обезбедимо тачност, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква погрешна тумачења или неспоразуме који могу произаћи из коришћења овог превода.\n" ] } ], "metadata": { "anaconda-cloud": "", "kernelspec": { "display_name": "R", "langauge": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.4.1" }, "coopTranslator": { "original_hash": "feaf125f481a89c468fa115bf2aed580", "translation_date": "2025-09-06T13:32:16+00:00", "source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb", "language_code": "sr" } }, "nbformat": 4, "nbformat_minor": 1 }