{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_10-R.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "2621e24705e8100893c9bf84e0fc8aef", "translation_date": "2025-09-06T14:56:46+00:00", "source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb", "language_code": "sr" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Направите класификациони модел: Укусна азијска и индијска јела\n" ], "metadata": { "id": "ItETB4tSFprR" } }, { "cell_type": "markdown", "source": [ "## Увод у класификацију: Чишћење, припрема и визуализација података\n", "\n", "У ове четири лекције истражићете један од основних аспеката класичног машинског учења - *класификацију*. Проћи ћемо кроз употребу различитих алгоритама класификације са скупом података о свим сјајним кухињама Азије и Индије. Надамо се да сте гладни!\n", "\n", "

\n", " \n", "

Прославите паназијске кухиње у овим лекцијама! Слика: Џен Лупер
\n", "\n", "\n", "\n", "\n", "Класификација је облик [надгледаног учења](https://wikipedia.org/wiki/Supervised_learning) који има доста сличности са техникама регресије. У класификацији, обучавате модел да предвиди којој `категорији` неки елемент припада. Ако је машинско учење усмерено на предвиђање вредности или имена ствари коришћењем скупова података, онда се класификација углавном дели на две групе: *бинарна класификација* и *вишекласна класификација*.\n", "\n", "Запамтите:\n", "\n", "- **Линеарна регресија** вам је помогла да предвидите односе између променљивих и направите тачна предвиђања о томе где би нова тачка података пала у односу на ту линију. На пример, могли сте да предвидите нумеричке вредности као што је *која би цена бундеве била у септембру у односу на децембар*.\n", "\n", "- **Логистичка регресија** вам је помогла да откријете \"бинарне категорије\": на овој цени, *да ли је ова бундева наранџаста или није-наранџаста*?\n", "\n", "Класификација користи различите алгоритме за одређивање других начина за идентификацију ознаке или класе неке тачке података. Хајде да радимо са овим подацима о кухињама како бисмо видели да ли можемо, посматрајући групу састојака, одредити њихово порекло.\n", "\n", "### [**Квиз пре предавања**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n", "\n", "### **Увод**\n", "\n", "Класификација је једна од основних активности истраживача машинског учења и научника за податке. Од основне класификације бинарне вредности (\"да ли је овај имејл спам или није?\"), до сложене класификације слика и сегментације коришћењем рачунарског вида, увек је корисно бити у могућности да сортирате податке у класе и постављате питања о њима.\n", "\n", "Научно речено, ваш метод класификације креира предиктивни модел који вам омогућава да мапирате однос између улазних променљивих и излазних променљивих.\n", "\n", "

\n", " \n", "

Бинарни наспрам вишекласних проблема за алгоритме класификације. Инфографика: Џен Лупер
\n", "\n", "\n", "\n", "Пре него што започнемо процес чишћења наших података, њихове визуализације и припреме за задатке машинског учења, хајде да научимо мало више о различитим начинима на које се машинско учење може користити за класификацију података.\n", "\n", "Изведена из [статистике](https://wikipedia.org/wiki/Statistical_classification), класификација коришћењем класичног машинског учења користи карактеристике, као што су `пушач`, `тежина` и `године`, како би одредила *вероватноћу развоја X болести*. Као техника надгледаног учења слична вежбама регресије које сте раније радили, ваши подаци су означени, а алгоритми машинског учења користе те ознаке да класификују и предвиђају класе (или 'карактеристике') скупа података и додељују их групи или исходу.\n", "\n", "✅ Одвојите тренутак да замислите скуп података о кухињама. На шта би вишекласни модел могао да одговори? На шта би бинарни модел могао да одговори? Шта ако желите да утврдите да ли је одређена кухиња вероватно користила пискавац? Шта ако желите да видите да ли, уз поклон у виду кесе са намирницама пуне звездастог аниса, артичока, карфиола и рена, можете направити типично индијско јело?\n", "\n", "### **Здраво, 'класификаторе'**\n", "\n", "Питање које желимо да поставимо овом скупу података о кухињама је заправо **вишекласно питање**, јер имамо неколико потенцијалних националних кухиња са којима радимо. С обзиром на групу састојака, којој од ових многих класа ће подаци припадати?\n", "\n", "Tidymodels нуди неколико различитих алгоритама за класификацију података, у зависности од врсте проблема који желите да решите. У наредне две лекције, научићете о неколико ових алгоритама.\n", "\n", "#### **Предуслови**\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", "- `DataExplorer`: [DataExplorer пакет](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) је намењен поједностављењу и аутоматизацији процеса истраживачке анализе података и генерисању извештаја.\n", "\n", "- `themis`: [themis пакет](https://themis.tidymodels.org/) пружа додатне кораке за рецепте за рад са неуравнотеженим подацима.\n", "\n", "Можете их инсталирати помоћу:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n", "\n", "Алтернативно, скрипта испод проверава да ли имате пакете потребне за завршетак овог модула и инсталира их у случају да недостају.\n" ], "metadata": { "id": "ri5bQxZ-Fz_0" } }, { "cell_type": "code", "execution_count": null, "source": [ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n", "\r\n", "pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)" ], "outputs": [], "metadata": { "id": "KIPxa4elGAPI" } }, { "cell_type": "markdown", "source": [ "Касније ћемо учитати ове сјајне пакете и учинити их доступним у нашој тренутној R сесији. (Ово је само за илустрацију, `pacman::p_load()` је то већ урадио за вас)\n" ], "metadata": { "id": "YkKAxOJvGD4C" } }, { "cell_type": "markdown", "source": [ "## Вежба - очистите и избалансирајте своје податке\n", "\n", "Први задатак који треба обавити пре почетка овог пројекта је да очистите и **избалансирате** своје податке како бисте добили боље резултате.\n", "\n", "Хајде да упознамо податке! 🕵️\n" ], "metadata": { "id": "PFkQDlk0GN5O" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Import data\r\n", "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n", "\r\n", "# View the first 5 rows\r\n", "df %>% \r\n", " slice_head(n = 5)\r\n" ], "outputs": [], "metadata": { "id": "Qccw7okxGT0S" } }, { "cell_type": "markdown", "source": [ "Интересантно! По изгледу, прва колона је нека врста `id` колоне. Хајде да добијемо мало више информација о подацима.\n" ], "metadata": { "id": "XrWnlgSrGVmR" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Basic information about the data\r\n", "df %>%\r\n", " introduce()\r\n", "\r\n", "# Visualize basic information above\r\n", "df %>% \r\n", " plot_intro(ggtheme = theme_light())" ], "outputs": [], "metadata": { "id": "4UcGmxRxGieA" } }, { "cell_type": "markdown", "source": [ "Iz rezultata odmah možemo videti da imamo `2448` redova i `385` kolona, kao i `0` nedostajućih vrednosti. Takođe imamo 1 diskretnu kolonu, *cuisine*.\n", "\n", "## Vežba - upoznavanje sa kuhinjama\n", "\n", "Sada posao postaje zanimljiviji. Hajde da otkrijemo raspodelu podataka po kuhinjama.\n" ], "metadata": { "id": "AaPubl__GmH5" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Count observations per cuisine\r\n", "df %>% \r\n", " count(cuisine) %>% \r\n", " arrange(n)\r\n", "\r\n", "# Plot the distribution\r\n", "theme_set(theme_light())\r\n", "df %>% \r\n", " count(cuisine) %>% \r\n", " ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n", " geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n", " ylab(\"cuisine\")" ], "outputs": [], "metadata": { "id": "FRsBVy5eGrrv" } }, { "cell_type": "markdown", "source": [ "Постоји коначан број кухиња, али је расподела података неравномерна. Можете то поправити! Пре него што то урадите, истражите мало више.\n", "\n", "Следеће, хајде да сваку кухињу доделимо њеној појединачној табели (tibble) и сазнамо колико је података доступно (редови, колоне) по кухињи.\n", "\n", "> [Tibble](https://tibble.tidyverse.org/) је модеран облик података (data frame).\n", "\n", "

\n", " \n", "

Илустрација: @allison_horst
\n" ], "metadata": { "id": "vVvyDb1kG2in" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Create individual tibble for the cuisines\r\n", "thai_df <- df %>% \r\n", " filter(cuisine == \"thai\")\r\n", "japanese_df <- df %>% \r\n", " filter(cuisine == \"japanese\")\r\n", "chinese_df <- df %>% \r\n", " filter(cuisine == \"chinese\")\r\n", "indian_df <- df %>% \r\n", " filter(cuisine == \"indian\")\r\n", "korean_df <- df %>% \r\n", " filter(cuisine == \"korean\")\r\n", "\r\n", "\r\n", "# Find out how much data is available per cuisine\r\n", "cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n", " \"japanese df:\", dim(japanese_df), \"\\n\",\r\n", " \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n", " \"indian_df:\", dim(indian_df), \"\\n\",\r\n", " \"korean_df:\", dim(korean_df))" ], "outputs": [], "metadata": { "id": "0TvXUxD3G8Bk" } }, { "cell_type": "markdown", "source": [ "## **Вежба - Откривање најбољих састојака по кухињи уз помоћ dplyr**\n", "\n", "Сада можете дубље истражити податке и сазнати који су типични састојци за сваку кухињу. Треба да очистите поновљене податке који стварају забуну између кухиња, па хајде да научимо више о овом проблему.\n", "\n", "Направите функцију `create_ingredient()` у R-у која враћа датафрејм са састојцима. Ова функција ће започети уклањањем некорисне колоне и сортирањем састојака према њиховом броју.\n", "\n", "Основна структура функције у R-у је:\n", "\n", "`myFunction <- function(arglist){`\n", "\n", "**`...`**\n", "\n", "**`return`**`(value)`\n", "\n", "`}`\n", "\n", "Уредан увод у функције у R-у можете пронаћи [овде](https://skirmer.github.io/presentations/functions_with_r.html#1).\n", "\n", "Хајде да кренемо! Користићемо [глаголе из dplyr-а](https://dplyr.tidyverse.org/) које смо учили у претходним лекцијама. Као подсетник:\n", "\n", "- `dplyr::select()`: помаже вам да изаберете које **колоне** желите да задржите или искључите.\n", "\n", "- `dplyr::pivot_longer()`: помаже вам да \"продужите\" податке, повећавајући број редова и смањујући број колона.\n", "\n", "- `dplyr::group_by()` и `dplyr::summarise()`: помажу вам да пронађете статистику за различите групе и представите је у лепој табели.\n", "\n", "- `dplyr::filter()`: креира подскуп података који садржи само редове који задовољавају ваше услове.\n", "\n", "- `dplyr::mutate()`: помаже вам да креирате или измените колоне.\n", "\n", "Погледајте овај [*уметнички*-испуњен learnr туторијал](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) од Алисон Хорст, који представља неке корисне функције за обраду података у dplyr-у *(део Tidyverse-а)*.\n" ], "metadata": { "id": "K3RF5bSCHC76" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Creates a functions that returns the top ingredients by class\r\n", "\r\n", "create_ingredient <- function(df){\r\n", " \r\n", " # Drop the id column which is the first colum\r\n", " ingredient_df = df %>% select(-1) %>% \r\n", " # Transpose data to a long format\r\n", " pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n", " # Find the top most ingredients for a particular cuisine\r\n", " group_by(ingredients) %>% \r\n", " summarise(n_instances = sum(count)) %>% \r\n", " filter(n_instances != 0) %>% \r\n", " # Arrange by descending order\r\n", " arrange(desc(n_instances)) %>% \r\n", " mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n", " \r\n", " \r\n", " return(ingredient_df)\r\n", "} # End of function" ], "outputs": [], "metadata": { "id": "uB_0JR82HTPa" } }, { "cell_type": "markdown", "source": [ "Сада можемо користити функцију да добијемо идеју о десет најпопуларнијих састојака по кухињи. Хајде да је испробамо са `thai_df`.\n" ], "metadata": { "id": "h9794WF8HWmc" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Call create_ingredient and display popular ingredients\r\n", "thai_ingredient_df <- create_ingredient(df = thai_df)\r\n", "\r\n", "thai_ingredient_df %>% \r\n", " slice_head(n = 10)" ], "outputs": [], "metadata": { "id": "agQ-1HrcHaEA" } }, { "cell_type": "markdown", "source": [ "У претходном одељку користили смо `geom_col()`, хајде да видимо како можете користити и `geom_bar` за креирање стубичастих графикона. Користите `?geom_bar` за додатно читање.\n" ], "metadata": { "id": "kHu9ffGjHdcX" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Make a bar chart for popular thai cuisines\r\n", "thai_ingredient_df %>% \r\n", " slice_head(n = 10) %>% \r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "fb3Bx_3DHj6e" } }, { "cell_type": "markdown", "source": [ "Хајде да урадимо исто за јапанске податке\n" ], "metadata": { "id": "RHP_xgdkHnvM" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Japanese cuisines and make bar chart\r\n", "create_ingredient(df = japanese_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")\r\n" ], "outputs": [], "metadata": { "id": "019v8F0XHrRU" } }, { "cell_type": "markdown", "source": [ "Шта је са кинеском кухињом?\n" ], "metadata": { "id": "iIGM7vO8Hu3v" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Chinese cuisines and make bar chart\r\n", "create_ingredient(df = chinese_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "lHd9_gd2HyzU" } }, { "cell_type": "markdown", "source": [], "metadata": { "id": "ir8qyQbNH1c7" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Indian cuisines and make bar chart\r\n", "create_ingredient(df = indian_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "ApukQtKjH5FO" } }, { "cell_type": "markdown", "source": [], "metadata": { "id": "qv30cwY1H-FM" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Get popular ingredients for Korean cuisines and make bar chart\r\n", "create_ingredient(df = korean_df) %>% \r\n", " slice_head(n = 10) %>%\r\n", " ggplot(aes(x = n_instances, y = ingredients)) +\r\n", " geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n", " xlab(\"\") + ylab(\"\")" ], "outputs": [], "metadata": { "id": "lumgk9cHIBie" } }, { "cell_type": "markdown", "source": [ "Из визуализација података, сада можемо изоставити најчешће састојке који стварају забуну између различитих кухиња, користећи `dplyr::select()`.\n", "\n", "Сви воле пиринач, бели лук и ђумбир!\n" ], "metadata": { "id": "iO4veMXuIEta" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Drop id column, rice, garlic and ginger from our original data set\r\n", "df_select <- df %>% \r\n", " select(-c(1, rice, garlic, ginger))\r\n", "\r\n", "# Display new data set\r\n", "df_select %>% \r\n", " slice_head(n = 5)" ], "outputs": [], "metadata": { "id": "iHJPiG6rIUcK" } }, { "cell_type": "markdown", "source": [ "## Предобрада података уз помоћ рецепата 👩‍🍳👨‍🍳 - Рад са неуравнотеженим подацима ⚖️\n", "\n", "

\n", " \n", "

Илустрација: @allison_horst
\n", "\n", "С обзиром на то да је ова лекција о кухињама, морамо ставити `recipes` у контекст.\n", "\n", "Tidymodels пружа још један користан пакет: `recipes` - пакет за предобраду података.\n" ], "metadata": { "id": "kkFd-JxdIaL6" } }, { "cell_type": "markdown", "source": [ "Хајде да поново погледамо расподелу наших кухиња.\n" ], "metadata": { "id": "6l2ubtTPJAhY" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Distribution of cuisines\r\n", "old_label_count <- df_select %>% \r\n", " count(cuisine) %>% \r\n", " arrange(desc(n))\r\n", "\r\n", "old_label_count" ], "outputs": [], "metadata": { "id": "1e-E9cb7JDVi" } }, { "cell_type": "markdown", "source": [ "Као што можете видети, постоји прилично неједнака расподела у броју кухиња. Корејске кухиње су скоро три пута бројније од тајландских. Неуравнотежени подаци често имају негативан утицај на перформансе модела. Размислите о бинарној класификацији. Ако већина ваших података припада једној класи, модел машинског учења ће чешће предвиђати ту класу, једноставно зато што за њу има више података. Уравнотежавање података узима било какве искривљене податке и помаже у уклањању те неравнотеже. Многи модели најбоље функционишу када је број посматрања једнак и, самим тим, имају потешкоћа са неуравнотеженим подацима.\n", "\n", "Постоје углавном два начина за решавање проблема са неуравнотеженим скуповима података:\n", "\n", "- додавање посматрања мањинској класи: `Over-sampling`, на пример, коришћењем SMOTE алгоритма\n", "\n", "- уклањање посматрања из већинске класе: `Under-sampling`\n", "\n", "Хајде сада да покажемо како се носити са неуравнотеженим скуповима података користећи `recipe`. Рецепт се може посматрати као план који описује које кораке треба применити на скуп података како би био спреман за анализу података.\n" ], "metadata": { "id": "soAw6826JKx9" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Load themis package for dealing with imbalanced data\r\n", "library(themis)\r\n", "\r\n", "# Create a recipe for preprocessing data\r\n", "cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n", " step_smote(cuisine)\r\n", "\r\n", "cuisines_recipe" ], "outputs": [], "metadata": { "id": "HS41brUIJVJy" } }, { "cell_type": "markdown", "source": [ "Хајде да разложимо кораке претпроцесирања.\n", "\n", "- Позив функције `recipe()` са формулом говори рецепту *улоге* променљивих користећи `df_select` податке као референцу. На пример, колона `cuisine` је додељена улога `outcome`, док су остале колоне добиле улогу `predictor`.\n", "\n", "- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) креира *спецификацију* корака рецепта који синтетички генерише нове примере мањинске класе користећи најближе суседе тих случајева.\n", "\n", "Сада, ако желимо да видимо претпроцесиране податке, морамо [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) и [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) наш рецепт.\n", "\n", "`prep()`: процењује потребне параметре из тренинг скупа који се касније могу применити на друге скупове података.\n", "\n", "`bake()`: узима припремљен рецепт и примењује операције на било који скуп података.\n" ], "metadata": { "id": "Yb-7t7XcJaC8" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Prep and bake the recipe\r\n", "preprocessed_df <- cuisines_recipe %>% \r\n", " prep() %>% \r\n", " bake(new_data = NULL) %>% \r\n", " relocate(cuisine)\r\n", "\r\n", "# Display data\r\n", "preprocessed_df %>% \r\n", " slice_head(n = 5)\r\n", "\r\n", "# Quick summary stats\r\n", "preprocessed_df %>% \r\n", " introduce()" ], "outputs": [], "metadata": { "id": "9QhSgdpxJl44" } }, { "cell_type": "markdown", "source": [ "Хајде сада да проверимо расподелу наших кухиња и упоредимо их са неуравнотеженим подацима.\n" ], "metadata": { "id": "dmidELh_LdV7" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Distribution of cuisines\r\n", "new_label_count <- preprocessed_df %>% \r\n", " count(cuisine) %>% \r\n", " arrange(desc(n))\r\n", "\r\n", "list(new_label_count = new_label_count,\r\n", " old_label_count = old_label_count)" ], "outputs": [], "metadata": { "id": "aSh23klBLwDz" } }, { "cell_type": "markdown", "source": [ "Ммм! Подаци су лепо уређени, избалансирани и веома укусни 😋!\n", "\n", "> Обично се рецепт користи као претпроцесор за моделирање, где дефинише које кораке треба применити на скуп података како би био спреман за моделирање. У том случају, `workflow()` се обично користи (као што смо већ видели у претходним лекцијама) уместо ручног процењивања рецепта.\n", ">\n", "> Сходно томе, обично не морате да користите **`prep()`** и **`bake()`** рецепте када користите tidymodels, али то су корисне функције које можете имати у свом алату за потврду да рецепти раде оно што очекујете, као у нашем случају.\n", ">\n", "> Када користите **`bake()`** на припремљеном рецепту са **`new_data = NULL`**, добијате назад податке које сте дали приликом дефинисања рецепта, али који су прошли кроз кораке претпроцесирања.\n", "\n", "Хајде сада да сачувамо копију ових података за употребу у будућим лекцијама:\n" ], "metadata": { "id": "HEu80HZ8L7ae" } }, { "cell_type": "code", "execution_count": null, "source": [ "# Save preprocessed data\r\n", "write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")" ], "outputs": [], "metadata": { "id": "cBmCbIgrMOI6" } }, { "cell_type": "markdown", "source": [ "Овај нови CSV сада се налази у главном фолдеру за податке.\n", "\n", "**🚀Изазов**\n", "\n", "Овај курикулум садржи неколико занимљивих скупова података. Претражите `data` фолдере и видите да ли неки садрже скупове података који би били погодни за бинарну или мултикласну класификацију? Која питања бисте поставили о овом скупу података?\n", "\n", "## [**Квиз након предавања**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n", "\n", "## **Преглед и Самостално учење**\n", "\n", "- Погледајте [пакет themis](https://github.com/tidymodels/themis). Које друге технике можемо користити за решавање проблема са неуравнотеженим подацима?\n", "\n", "- Референтни сајт за Tidy models [вебсајт](https://www.tidymodels.org/start/).\n", "\n", "- Х. Викам и Г. Гролемунд, [*R за науку о подацима: Визуализација, Моделовање, Трансформација, Уређивање и Увоз података*](https://r4ds.had.co.nz/).\n", "\n", "#### ХВАЛА:\n", "\n", "[`Елисон Хорст`](https://twitter.com/allison_horst/) за креирање невероватних илустрација које чине R приступачнијим и занимљивијим. Пронађите више илустрација у њеној [галерији](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n", "\n", "[Кеси Бревиу](https://www.twitter.com/cassieview) и [Џен Лупер](https://www.twitter.com/jenlooper) за креирање оригиналне Python верзије овог модула ♥️\n", "\n", "

\n", " \n", "

Илустрација од @allison_horst
\n" ], "metadata": { "id": "WQs5621pMGwf" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**Одрицање од одговорности**: \nОвај документ је преведен коришћењем услуге за превођење помоћу вештачке интелигенције [Co-op Translator](https://github.com/Azure/co-op-translator). Иако тежимо тачности, молимо вас да имате у виду да аутоматски преводи могу садржати грешке или нетачности. Оригинални документ на изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не сносимо одговорност за било каква неспоразумевања или погрешна тумачења која могу произаћи из коришћења овог превода.\n" ] } ] }