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.
686 lines
31 KiB
686 lines
31 KiB
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Vytvorenie modelu logistickej regresie - Lekcia 4\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"#### **[Kvíz pred prednáškou](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)**\n",
|
|
"\n",
|
|
"#### Úvod\n",
|
|
"\n",
|
|
"V tejto záverečnej lekcii o regresii, jednej zo základných *klasických* techník strojového učenia, sa pozrieme na logistickú regresiu. Túto techniku by ste použili na objavenie vzorcov na predpovedanie binárnych kategórií. Je táto cukrovinka čokoláda alebo nie? Je táto choroba nákazlivá alebo nie? Vyberie si tento zákazník tento produkt alebo nie?\n",
|
|
"\n",
|
|
"V tejto lekcii sa naučíte:\n",
|
|
"\n",
|
|
"- Techniky logistickej regresie\n",
|
|
"\n",
|
|
"✅ Prehĺbte si svoje porozumenie práce s týmto typom regresie v tomto [učebnom module](https://learn.microsoft.com/training/modules/introduction-classification-models/?WT.mc_id=academic-77952-leestott)\n",
|
|
"\n",
|
|
"## Predpoklady\n",
|
|
"\n",
|
|
"Keďže sme pracovali s údajmi o tekviciach, sme už dostatočne oboznámení s tým, že existuje jedna binárna kategória, s ktorou môžeme pracovať: `Color`.\n",
|
|
"\n",
|
|
"Vytvorme model logistickej regresie na predpovedanie toho, *akú farbu bude mať daná tekvica* (oranžová 🎃 alebo biela 👻).\n",
|
|
"\n",
|
|
"> Prečo hovoríme o binárnej klasifikácii v lekcii zameranej na regresiu? Len z jazykového pohodlia, keďže logistická regresia je [v skutočnosti metóda klasifikácie](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), hoci založená na lineárnom prístupe. O ďalších spôsoboch klasifikácie údajov sa dozviete v nasledujúcej skupine lekcií.\n",
|
|
"\n",
|
|
"Pre túto lekciu budeme potrebovať nasledujúce balíky:\n",
|
|
"\n",
|
|
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [kolekcia balíkov pre R](https://www.tidyverse.org/packages), ktorá robí dátovú vedu rýchlejšou, jednoduchšou a zábavnejšou!\n",
|
|
"\n",
|
|
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) je rámec [kolekcie balíkov](https://www.tidymodels.org/packages/) na modelovanie a strojové učenie.\n",
|
|
"\n",
|
|
"- `janitor`: Balík [janitor](https://github.com/sfirke/janitor) poskytuje jednoduché nástroje na skúmanie a čistenie nečistých údajov.\n",
|
|
"\n",
|
|
"- `ggbeeswarm`: Balík [ggbeeswarm](https://github.com/eclarke/ggbeeswarm) poskytuje metódy na vytváranie grafov v štýle \"beeswarm\" pomocou ggplot2.\n",
|
|
"\n",
|
|
"Môžete ich nainštalovať pomocou:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"ggbeeswarm\"))`\n",
|
|
"\n",
|
|
"Alternatívne, skript nižšie skontroluje, či máte balíky potrebné na dokončenie tohto modulu, a nainštaluje ich za vás, ak chýbajú.\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": [
|
|
"## **Definovanie otázky**\n",
|
|
"\n",
|
|
"Pre naše účely vyjadríme otázku ako binárnu: 'Biela' alebo 'Nie biela'. V našej dátovej sade sa nachádza aj kategória 'pruhovaná', ale má len málo záznamov, takže ju nebudeme používať. Táto kategória aj tak zmizne, keď odstránime nulové hodnoty z dátovej sady.\n",
|
|
"\n",
|
|
"> 🎃 Zaujímavosť: biele tekvice niekedy nazývame 'duchové' tekvice. Nie sú veľmi ľahké na vyrezávanie, takže nie sú také populárne ako oranžové, ale vyzerajú zaujímavo! Mohli by sme teda našu otázku preformulovať ako: 'Duch' alebo 'Nie duch'. 👻\n",
|
|
"\n",
|
|
"## **O logistickej regresii**\n",
|
|
"\n",
|
|
"Logistická regresia sa v niekoľkých dôležitých aspektoch líši od lineárnej regresie, ktorú ste sa učili predtým.\n",
|
|
"\n",
|
|
"#### **Binárna klasifikácia**\n",
|
|
"\n",
|
|
"Logistická regresia neponúka rovnaké funkcie ako lineárna regresia. Prvá ponúka predikciu o `binárnej kategórii` (\"oranžová alebo nie oranžová\"), zatiaľ čo druhá dokáže predpovedať `kontinuálne hodnoty`, napríklad na základe pôvodu tekvice a času zberu *o koľko sa zvýši jej cena*.\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"### Iné typy klasifikácií\n",
|
|
"\n",
|
|
"Existujú aj iné typy logistickej regresie, vrátane multinomiálnej a ordinálnej:\n",
|
|
"\n",
|
|
"- **Multinomiálna**, ktorá zahŕňa viac ako jednu kategóriu - \"Oranžová, Biela a Pruhovaná\".\n",
|
|
"\n",
|
|
"- **Ordinálna**, ktorá zahŕňa usporiadané kategórie, užitočné, ak chceme logicky zoradiť naše výsledky, napríklad naše tekvice zoradené podľa konečného počtu veľkostí (mini, malá, stredná, veľká, XL, XXL).\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"#### **Premenné NEMUSIA korelovať**\n",
|
|
"\n",
|
|
"Pamätáte si, ako lineárna regresia fungovala lepšie s viac korelovanými premennými? Logistická regresia je opakom - premenné nemusia byť v súlade. To je výhodné pre tieto dáta, ktoré majú pomerne slabé korelácie.\n",
|
|
"\n",
|
|
"#### **Potrebujete veľa čistých dát**\n",
|
|
"\n",
|
|
"Logistická regresia poskytne presnejšie výsledky, ak použijete viac dát; naša malá dátová sada nie je pre túto úlohu optimálna, takže to majte na pamäti.\n",
|
|
"\n",
|
|
"✅ Zamyslite sa nad typmi dát, ktoré by sa dobre hodili na logistickú regresiu.\n",
|
|
"\n",
|
|
"## Cvičenie - upravte dáta\n",
|
|
"\n",
|
|
"Najprv trochu upravte dáta, odstráňte nulové hodnoty a vyberte len niektoré stĺpce:\n",
|
|
"\n",
|
|
"1. Pridajte nasledujúci kód:\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": [
|
|
"Vždy sa môžete pozrieť na svoj nový dataframe pomocou funkcie [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html), ako je uvedené nižšie:\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"vscode": {
|
|
"languageId": "r"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"pumpkins_select %>% \n",
|
|
" glimpse()\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Poďme si potvrdiť, že sa skutočne budeme zaoberať problémom binárnej klasifikácie:\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": [
|
|
"### Vizualizácia - kategóriálny graf\n",
|
|
"Teraz ste znova načítali údaje o tekviciach a vyčistili ich tak, aby ste zachovali dataset obsahujúci niekoľko premenných, vrátane farby (Color). Poďme si vizualizovať dataframe v notebooku pomocou knižnice ggplot.\n",
|
|
"\n",
|
|
"Knižnica ggplot ponúka niekoľko skvelých spôsobov, ako vizualizovať vaše údaje. Napríklad môžete porovnať rozdelenia údajov pre každú odrodu (Variety) a farbu (Color) v kategóriálnom grafe.\n",
|
|
"\n",
|
|
"1. Vytvorte takýto graf pomocou funkcie geombar, pričom použijete naše údaje o tekviciach a špecifikujete farebné mapovanie pre každú kategóriu tekvíc (oranžová alebo biela):\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": [
|
|
"Pozorovaním údajov môžete vidieť, ako sa údaje o Farbe vzťahujú k Odrode.\n",
|
|
"\n",
|
|
"✅ Na základe tohto kategóriálneho grafu, aké zaujímavé skúmania si dokážete predstaviť?\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Predspracovanie údajov: kódovanie vlastností\n",
|
|
"\n",
|
|
"Náš dataset tekvíc obsahuje textové hodnoty vo všetkých svojich stĺpcoch. Práca s kategorizovanými údajmi je pre ľudí intuitívna, ale pre stroje nie. Algoritmy strojového učenia pracujú dobre s číslami. Preto je kódovanie veľmi dôležitým krokom vo fáze predspracovania údajov, pretože nám umožňuje premeniť kategorizované údaje na číselné údaje bez straty informácií. Dobré kódovanie vedie k vytvoreniu dobrého modelu.\n",
|
|
"\n",
|
|
"Pre kódovanie vlastností existujú dva hlavné typy kóderov:\n",
|
|
"\n",
|
|
"1. Ordinálny kóder: je vhodný pre ordinálne premenné, čo sú kategorizované premenné, kde ich údaje nasledujú logické poradie, ako napríklad stĺpec `item_size` v našom datasete. Vytvára mapovanie, kde každá kategória je reprezentovaná číslom, ktoré zodpovedá poradiu kategórie v stĺpci.\n",
|
|
"\n",
|
|
"2. Kategorizovaný kóder: je vhodný pre nominálne premenné, čo sú kategorizované premenné, kde ich údaje nenasledujú logické poradie, ako všetky vlastnosti okrem `item_size` v našom datasete. Ide o kódovanie typu one-hot, čo znamená, že každá kategória je reprezentovaná binárnym stĺpcom: kódovaná premenná je rovná 1, ak tekvica patrí do danej Variety, a 0 v opačnom prípade.\n",
|
|
"\n",
|
|
"Tidymodels poskytuje ďalší šikovný balík: [recipes](https://recipes.tidymodels.org/) - balík na predspracovanie údajov. Definujeme `recipe`, ktorý špecifikuje, že všetky stĺpce prediktorov by mali byť kódované do množiny celých čísel, `prep` na odhad potrebných množstiev a štatistík potrebných pre akékoľvek operácie a nakoniec `bake` na aplikáciu výpočtov na nové údaje.\n",
|
|
"\n",
|
|
"> Bežne sa recipes zvyčajne používa ako predspracovateľ pre modelovanie, kde definuje, aké kroky by sa mali aplikovať na dataset, aby bol pripravený na modelovanie. V takom prípade je **veľmi odporúčané**, aby ste použili `workflow()` namiesto manuálneho odhadu receptu pomocou prep a bake. Všetko toto si ukážeme už čoskoro.\n",
|
|
">\n",
|
|
"> Avšak momentálne používame recipes + prep + bake na špecifikáciu krokov, ktoré by sa mali aplikovať na dataset, aby bol pripravený na analýzu údajov, a následne extrahujeme predspracované údaje s aplikovanými krokmi.\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": [
|
|
"✅ Aké sú výhody použitia ordinálneho enkodéra pre stĺpec Item Size?\n",
|
|
"\n",
|
|
"### Analyzujte vzťahy medzi premennými\n",
|
|
"\n",
|
|
"Teraz, keď sme predspracovali naše údaje, môžeme analyzovať vzťahy medzi vlastnosťami a štítkom, aby sme získali predstavu o tom, ako dobre bude model schopný predpovedať štítok na základe vlastností. Najlepší spôsob, ako vykonať tento typ analýzy, je vizualizácia údajov. \n",
|
|
"Opäť použijeme funkciu ggplot geom_boxplot_, aby sme zobrazili vzťahy medzi Item Size, Variety a Color v kategóriálnom grafe. Na lepšiu vizualizáciu údajov použijeme enkódovaný stĺpec Item Size a neenkódovaný stĺpec Variety.\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": [
|
|
"#### Použitie swarm grafu\n",
|
|
"\n",
|
|
"Keďže Color je binárna kategória (Biela alebo Nie), vyžaduje si '[špeciálny prístup](https://github.com/rstudio/cheatsheets/blob/main/data-visualization.pdf)' k vizualizácii.\n",
|
|
"\n",
|
|
"Vyskúšajte `swarm graf`, aby ste zobrazili rozloženie farby vo vzťahu k item_size.\n",
|
|
"\n",
|
|
"Použijeme balík [ggbeeswarm](https://github.com/eclarke/ggbeeswarm), ktorý poskytuje metódy na vytváranie grafov v štýle beeswarm pomocou ggplot2. Beeswarm grafy sú spôsob, ako zobrazovať body, ktoré by sa za normálnych okolností prekrývali, tak, aby boli vedľa seba.\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": [
|
|
"Teraz, keď máme predstavu o vzťahu medzi binárnymi kategóriami farieb a väčšou skupinou veľkostí, poďme preskúmať logistickú regresiu na určenie pravdepodobnej farby danej tekvice.\n",
|
|
"\n",
|
|
"## Vytvorte svoj model\n",
|
|
"\n",
|
|
"Vyberte premenné, ktoré chcete použiť vo svojom klasifikačnom modeli, a rozdeľte údaje na tréningovú a testovaciu množinu. [rsample](https://rsample.tidymodels.org/), balík v rámci Tidymodels, poskytuje infraštruktúru na efektívne delenie a resamplovanie údajov:\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": [
|
|
"🙌 Teraz sme pripravení trénovať model prispôsobením tréningových vlastností tréningovej značke (farba).\n",
|
|
"\n",
|
|
"Začneme vytvorením receptu, ktorý špecifikuje kroky predspracovania, ktoré by sa mali vykonať na našich údajoch, aby boli pripravené na modelovanie, t.j. kódovanie kategóriálnych premenných na množinu celých čísel. Rovnako ako `baked_pumpkins`, vytvoríme `pumpkins_recipe`, ale nebudeme používať `prep` a `bake`, pretože to bude zahrnuté do pracovného toku, čo uvidíte o pár krokov neskôr.\n",
|
|
"\n",
|
|
"Existuje pomerne veľa spôsobov, ako špecifikovať logistickú regresiu v Tidymodels. Pozrite si `?logistic_reg()`. Zatiaľ špecifikujeme logistickú regresiu prostredníctvom predvoleného enginu `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": [
|
|
"Teraz, keď máme recept a špecifikáciu modelu, musíme nájsť spôsob, ako ich spojiť do objektu, ktorý najskôr predspracuje údaje (príprava + pečenie na pozadí), prispôsobí model na predspracovaných údajoch a zároveň umožní potenciálne aktivity po spracovaní.\n",
|
|
"\n",
|
|
"V Tidymodels sa tento praktický objekt nazýva [`workflow`](https://workflows.tidymodels.org/) a pohodlne uchováva vaše modelovacie komponenty.\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": [
|
|
"Po definovaní *pracovného postupu* môže byť model `natrénovaný` pomocou funkcie [`fit()`](https://tidymodels.github.io/parsnip/reference/fit.html). Pracovný postup odhadne recept a pred spracovaním údajov ich predpripraví, takže to nebudeme musieť robiť manuálne pomocou funkcií prep a 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": [
|
|
"Model vytlačí koeficienty naučené počas tréningu.\n",
|
|
"\n",
|
|
"Teraz, keď sme model natrénovali pomocou tréningových dát, môžeme robiť predpovede na testovacích dátach pomocou [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html). Začnime tým, že použijeme model na predpovedanie štítkov pre náš testovací súbor a pravdepodobností pre každý štítok. Keď je pravdepodobnosť vyššia ako 0.5, predpovedaná trieda je `WHITE`, inak `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": [
|
|
"Veľmi pekné! Toto poskytuje ďalší pohľad na to, ako funguje logistická regresia.\n",
|
|
"\n",
|
|
"### Lepšie pochopenie pomocou matice zámien\n",
|
|
"\n",
|
|
"Porovnávanie každej predikcie s jej zodpovedajúcou „skutočnou hodnotou“ nie je veľmi efektívny spôsob, ako určiť, ako dobre model predikuje. Našťastie má Tidymodels v rukáve ešte niekoľko trikov: [`yardstick`](https://yardstick.tidymodels.org/) - balík používaný na meranie efektívnosti modelov pomocou metrík výkonnosti.\n",
|
|
"\n",
|
|
"Jednou z metrík výkonnosti spojených s klasifikačnými problémami je [`matica zámien`](https://wikipedia.org/wiki/Confusion_matrix). Matica zámien opisuje, ako dobre klasifikačný model funguje. Matica zámien zaznamenáva, koľko príkladov v každej triede bolo modelom správne klasifikovaných. V našom prípade vám ukáže, koľko oranžových tekvíc bolo klasifikovaných ako oranžové a koľko bielych tekvíc bolo klasifikovaných ako biele; matica zámien vám tiež ukáže, koľko ich bolo klasifikovaných do **nesprávnych** kategórií.\n",
|
|
"\n",
|
|
"Funkcia [**`conf_mat()`**](https://tidymodels.github.io/yardstick/reference/conf_mat.html) z yardstick vypočíta túto krížovú tabuľku pozorovaných a predikovaných tried.\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": [
|
|
"Poďme interpretovať maticu zámien. Náš model má za úlohu klasifikovať tekvice do dvoch binárnych kategórií, kategórie `biela` a kategórie `nie-biela`.\n",
|
|
"\n",
|
|
"- Ak váš model predpovedá tekvicu ako bielu a v skutočnosti patrí do kategórie 'biela', nazývame to `pravý pozitívny`, čo je znázornené číslom v ľavom hornom rohu.\n",
|
|
"\n",
|
|
"- Ak váš model predpovedá tekvicu ako nie-bielu a v skutočnosti patrí do kategórie 'biela', nazývame to `falošný negatívny`, čo je znázornené číslom v ľavom dolnom rohu.\n",
|
|
"\n",
|
|
"- Ak váš model predpovedá tekvicu ako bielu a v skutočnosti patrí do kategórie 'nie-biela', nazývame to `falošný pozitívny`, čo je znázornené číslom v pravom hornom rohu.\n",
|
|
"\n",
|
|
"- Ak váš model predpovedá tekvicu ako nie-bielu a v skutočnosti patrí do kategórie 'nie-biela', nazývame to `pravý negatívny`, čo je znázornené číslom v pravom dolnom rohu.\n",
|
|
"\n",
|
|
"| Pravda |\n",
|
|
"|:-----:|\n",
|
|
"\n",
|
|
"\n",
|
|
"| | | |\n",
|
|
"|---------------|--------|-------|\n",
|
|
"| **Predikcia** | BIELA | ORANŽOVÁ |\n",
|
|
"| BIELA | TP | FP |\n",
|
|
"| ORANŽOVÁ | FN | TN |\n",
|
|
"\n",
|
|
"Ako ste možno uhádli, je preferované mať vyšší počet pravých pozitívnych a pravých negatívnych a nižší počet falošných pozitívnych a falošných negatívnych, čo naznačuje, že model funguje lepšie.\n",
|
|
"\n",
|
|
"Matica zámien je užitočná, pretože umožňuje odvodiť ďalšie metriky, ktoré nám môžu pomôcť lepšie vyhodnotiť výkon klasifikačného modelu. Poďme si ich prejsť:\n",
|
|
"\n",
|
|
"🎓 Presnosť: `TP/(TP + FP)` definovaná ako podiel predpokladaných pozitívnych, ktoré sú skutočne pozitívne. Tiež nazývaná [pozitívna prediktívna hodnota](https://en.wikipedia.org/wiki/Positive_predictive_value \"Positive predictive value\").\n",
|
|
"\n",
|
|
"🎓 Návratnosť: `TP/(TP + FN)` definovaná ako podiel pozitívnych výsledkov z počtu vzoriek, ktoré boli skutočne pozitívne. Tiež známa ako `citlivosť`.\n",
|
|
"\n",
|
|
"🎓 Špecifickosť: `TN/(TN + FP)` definovaná ako podiel negatívnych výsledkov z počtu vzoriek, ktoré boli skutočne negatívne.\n",
|
|
"\n",
|
|
"🎓 Presnosť modelu: `TP + TN/(TP + TN + FP + FN)` Percento správne predpovedaných označení pre vzorku.\n",
|
|
"\n",
|
|
"🎓 F Miera: Vážený priemer presnosti a návratnosti, pričom najlepšia hodnota je 1 a najhoršia je 0.\n",
|
|
"\n",
|
|
"Poďme vypočítať tieto metriky!\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": [
|
|
"## Vizualizácia ROC krivky tohto modelu\n",
|
|
"\n",
|
|
"Urobme ešte jednu vizualizáciu, aby sme si pozreli tzv. [`ROC krivku`](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 krivky sa často používajú na zobrazenie výstupu klasifikátora z hľadiska jeho skutočných vs. falošných pozitívnych výsledkov. ROC krivky zvyčajne zobrazujú `True Positive Rate`/citlivosť na osi Y a `False Positive Rate`/1-špecifickosť na osi X. Preto je dôležitá strmosť krivky a priestor medzi stredovou čiarou a krivkou: chcete krivku, ktorá rýchlo stúpa a prechádza nad čiaru. V našom prípade sú na začiatku falošné pozitívne výsledky, a potom krivka správne stúpa a prechádza nad čiaru.\n",
|
|
"\n",
|
|
"Nakoniec použime `yardstick::roc_auc()` na výpočet skutočnej plochy pod krivkou (Area Under the Curve). Jedným zo spôsobov interpretácie AUC je pravdepodobnosť, že model hodnotí náhodný pozitívny príklad vyššie ako náhodný negatívny príklad.\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": [
|
|
"Výsledok je približne `0.975`. Keďže AUC sa pohybuje v rozmedzí od 0 do 1, chcete dosiahnuť vysoké skóre, pretože model, ktorý je na 100 % presný vo svojich predpovediach, bude mať AUC rovné 1; v tomto prípade je model *celkom dobrý*.\n",
|
|
"\n",
|
|
"V budúcich lekciách o klasifikáciách sa naučíte, ako zlepšiť skóre vášho modelu (napríklad riešením problémov s nevyváženými údajmi, ako v tomto prípade).\n",
|
|
"\n",
|
|
"## 🚀Výzva\n",
|
|
"\n",
|
|
"Logistická regresia ponúka veľa možností na preskúmanie! Najlepší spôsob, ako sa ju naučiť, je experimentovať. Nájdite dataset, ktorý sa hodí na tento typ analýzy, a vytvorte s ním model. Čo ste sa naučili? tip: skúste [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) pre zaujímavé datasety.\n",
|
|
"\n",
|
|
"## Prehľad a samostatné štúdium\n",
|
|
"\n",
|
|
"Prečítajte si prvé strany [tohto článku zo Stanfordu](https://web.stanford.edu/~jurafsky/slp3/5.pdf) o niektorých praktických využitiach logistickej regresie. Zamyslite sa nad úlohami, ktoré sú lepšie prispôsobené jednému alebo druhému typu regresných úloh, ktoré sme doteraz študovali. Čo by fungovalo najlepšie?\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\n---\n\n**Upozornenie**: \nTento dokument bol preložený pomocou služby na automatický preklad [Co-op Translator](https://github.com/Azure/co-op-translator). Aj keď sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za autoritatívny zdroj. Pre dôležité informácie sa odporúča profesionálny ľudský preklad. Nezodpovedáme za žiadne nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\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:29:46+00:00",
|
|
"source_file": "2-Regression/4-Logistic/solution/R/lesson_4-R.ipynb",
|
|
"language_code": "sk"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
} |