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.
648 lines
26 KiB
648 lines
26 KiB
{
|
|
"nbformat": 4,
|
|
"nbformat_minor": 0,
|
|
"metadata": {
|
|
"colab": {
|
|
"name": "lesson_12-R.ipynb",
|
|
"provenance": [],
|
|
"collapsed_sections": []
|
|
},
|
|
"kernelspec": {
|
|
"name": "ir",
|
|
"display_name": "R"
|
|
},
|
|
"language_info": {
|
|
"name": "R"
|
|
},
|
|
"coopTranslator": {
|
|
"original_hash": "fab50046ca413a38939d579f8432274f",
|
|
"translation_date": "2025-09-06T14:44:10+00:00",
|
|
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
|
|
"language_code": "sk"
|
|
}
|
|
},
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "jsFutf_ygqSx"
|
|
},
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "HD54bEefgtNO"
|
|
},
|
|
"source": [
|
|
"## Klasifikátory kuchýň 2\n",
|
|
"\n",
|
|
"V tejto druhej lekcii o klasifikácii sa pozrieme na `ďalšie spôsoby`, ako klasifikovať kategóriálne údaje. Tiež sa oboznámime s dôsledkami výberu jedného klasifikátora oproti inému.\n",
|
|
"\n",
|
|
"### [**Kvíz pred prednáškou**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
|
|
"\n",
|
|
"### **Predpoklady**\n",
|
|
"\n",
|
|
"Predpokladáme, že ste dokončili predchádzajúce lekcie, pretože budeme nadväzovať na niektoré koncepty, ktoré sme sa už naučili.\n",
|
|
"\n",
|
|
"Na 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 balíkov](https://www.tidymodels.org/packages/) určený na modelovanie a strojové učenie.\n",
|
|
"\n",
|
|
"- `themis`: [balík themis](https://themis.tidymodels.org/) poskytuje dodatočné kroky pre recepty na riešenie nevyvážených údajov.\n",
|
|
"\n",
|
|
"Môžete ich nainštalovať pomocou:\n",
|
|
"\n",
|
|
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
|
|
"\n",
|
|
"Prípadne, nasledujúci skript skontroluje, či máte nainštalované potrebné balíky na dokončenie tohto modulu, a v prípade, že chýbajú, ich nainštaluje za vás.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "vZ57IuUxgyQt"
|
|
},
|
|
"source": [
|
|
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n",
|
|
"\n",
|
|
"pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "z22M-pj4g07x"
|
|
},
|
|
"source": [
|
|
"## **1. Mapa klasifikácie**\n",
|
|
"\n",
|
|
"V našej [predchádzajúcej lekcii](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) sme sa snažili odpovedať na otázku: ako si vybrať medzi viacerými modelmi? Do veľkej miery to závisí od charakteristík údajov a typu problému, ktorý chceme vyriešiť (napríklad klasifikácia alebo regresia?).\n",
|
|
"\n",
|
|
"Predtým sme sa naučili o rôznych možnostiach, ktoré máte pri klasifikácii údajov, pomocou prehľadovej tabuľky od Microsoftu. Pythonovský rámec pre strojové učenie, Scikit-learn, ponúka podobnú, ale podrobnejšiu prehľadovú tabuľku, ktorá vám môže ďalej pomôcť zúžiť výber vašich odhadovačov (iný výraz pre klasifikátory):\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/map.png\"\n",
|
|
" width=\"700\"/>\n",
|
|
" <figcaption></figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "u1i3xRIVg7vG"
|
|
},
|
|
"source": [
|
|
"> Tip: [navštívte túto mapu online](https://scikit-learn.org/stable/tutorial/machine_learning_map/) a kliknite na cestu, aby ste si prečítali dokumentáciu.\n",
|
|
">\n",
|
|
"> [Referenčná stránka Tidymodels](https://www.tidymodels.org/find/parsnip/#models) tiež poskytuje vynikajúcu dokumentáciu o rôznych typoch modelov.\n",
|
|
"\n",
|
|
"### **Plán** 🗺️\n",
|
|
"\n",
|
|
"Táto mapa je veľmi užitočná, ak máte jasné pochopenie svojich údajov, pretože sa môžete „prejsť“ po jej cestách k rozhodnutiu:\n",
|
|
"\n",
|
|
"- Máme viac ako 50 vzoriek\n",
|
|
"\n",
|
|
"- Chceme predpovedať kategóriu\n",
|
|
"\n",
|
|
"- Máme označené údaje\n",
|
|
"\n",
|
|
"- Máme menej ako 100K vzoriek\n",
|
|
"\n",
|
|
"- ✨ Môžeme si vybrať Linear SVC\n",
|
|
"\n",
|
|
"- Ak to nefunguje, keďže máme numerické údaje\n",
|
|
"\n",
|
|
" - Môžeme skúsiť ✨ KNeighbors Classifier\n",
|
|
"\n",
|
|
" - Ak to nefunguje, skúste ✨ SVC a ✨ Ensemble Classifiers\n",
|
|
"\n",
|
|
"Toto je veľmi užitočná cesta, ktorú sa oplatí nasledovať. Teraz sa do toho pustíme pomocou [tidymodels](https://www.tidymodels.org/) frameworku na modelovanie: konzistentnej a flexibilnej kolekcie balíkov v R, vyvinutej na podporu správnej štatistickej praxe 😊.\n",
|
|
"\n",
|
|
"## 2. Rozdelenie údajov a riešenie nevyváženého dátového súboru.\n",
|
|
"\n",
|
|
"Z našich predchádzajúcich lekcií sme sa naučili, že existuje súbor spoločných ingrediencií naprieč našimi kuchyňami. Tiež sme si všimli, že rozdelenie počtu kuchýň bolo dosť nerovnomerné.\n",
|
|
"\n",
|
|
"S týmto sa vysporiadame takto:\n",
|
|
"\n",
|
|
"- Odstránime najbežnejšie ingrediencie, ktoré spôsobujú zmätok medzi odlišnými kuchyňami, pomocou `dplyr::select()`.\n",
|
|
"\n",
|
|
"- Použijeme `recipe`, ktorý predspracuje údaje, aby boli pripravené na modelovanie, aplikovaním algoritmu `over-sampling`.\n",
|
|
"\n",
|
|
"Toto sme už prešli v predchádzajúcej lekcii, takže to bude hračka 🥳!\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "6tj_rN00hClA"
|
|
},
|
|
"source": [
|
|
"# Load the core Tidyverse and Tidymodels packages\n",
|
|
"library(tidyverse)\n",
|
|
"library(tidymodels)\n",
|
|
"\n",
|
|
"# Load the original cuisines data\n",
|
|
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n",
|
|
"\n",
|
|
"# Drop id column, rice, garlic and ginger from our original data set\n",
|
|
"df_select <- df %>% \n",
|
|
" select(-c(1, rice, garlic, ginger)) %>%\n",
|
|
" # Encode cuisine column as categorical\n",
|
|
" mutate(cuisine = factor(cuisine))\n",
|
|
"\n",
|
|
"\n",
|
|
"# Create data split specification\n",
|
|
"set.seed(2056)\n",
|
|
"cuisines_split <- initial_split(data = df_select,\n",
|
|
" strata = cuisine,\n",
|
|
" prop = 0.7)\n",
|
|
"\n",
|
|
"# Extract the data in each split\n",
|
|
"cuisines_train <- training(cuisines_split)\n",
|
|
"cuisines_test <- testing(cuisines_split)\n",
|
|
"\n",
|
|
"# Display distribution of cuisines in the training set\n",
|
|
"cuisines_train %>% \n",
|
|
" count(cuisine) %>% \n",
|
|
" arrange(desc(n))"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "zFin5yw3hHb1"
|
|
},
|
|
"source": [
|
|
"### Riešenie nevyvážených údajov\n",
|
|
"\n",
|
|
"Nevyvážené údaje často negatívne ovplyvňujú výkon modelu. Mnohé modely dosahujú najlepšie výsledky, keď je počet pozorovaní rovnaký, a preto majú tendenciu zápasiť s nevyváženými údajmi.\n",
|
|
"\n",
|
|
"Existujú dva hlavné spôsoby, ako riešiť nevyvážené dátové súbory:\n",
|
|
"\n",
|
|
"- pridanie pozorovaní do minoritnej triedy: `Over-sampling`, napríklad pomocou algoritmu SMOTE, ktorý synteticky generuje nové príklady minoritnej triedy na základe najbližších susedov týchto prípadov.\n",
|
|
"\n",
|
|
"- odstránenie pozorovaní z majoritnej triedy: `Under-sampling`\n",
|
|
"\n",
|
|
"V našej predchádzajúcej lekcii sme ukázali, ako riešiť nevyvážené dátové súbory pomocou `recipe`. Recipe si môžete predstaviť ako plán, ktorý popisuje, aké kroky by sa mali aplikovať na dátový súbor, aby bol pripravený na analýzu údajov. V našom prípade chceme dosiahnuť rovnomerné rozdelenie počtu našich kuchýň pre náš `training set`. Poďme na to.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "cRzTnHolhLWd"
|
|
},
|
|
"source": [
|
|
"# Load themis package for dealing with imbalanced data\n",
|
|
"library(themis)\n",
|
|
"\n",
|
|
"# Create a recipe for preprocessing training data\n",
|
|
"cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n",
|
|
" step_smote(cuisine) \n",
|
|
"\n",
|
|
"# Print recipe\n",
|
|
"cuisines_recipe"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "KxOQ2ORhhO81"
|
|
},
|
|
"source": [
|
|
"Teraz sme pripravení trénovať modely 👩💻👨💻!\n",
|
|
"\n",
|
|
"## 3. Nad rámec multinomických regresných modelov\n",
|
|
"\n",
|
|
"V našej predchádzajúcej lekcii sme sa zaoberali multinomickými regresnými modelmi. Poďme preskúmať niektoré flexibilnejšie modely pre klasifikáciu.\n",
|
|
"\n",
|
|
"### Support Vector Machines.\n",
|
|
"\n",
|
|
"V kontexte klasifikácie je `Support Vector Machines` technika strojového učenia, ktorá sa snaží nájsť *hyperrovinu*, ktorá \"najlepšie\" oddeľuje triedy. Pozrime sa na jednoduchý príklad:\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/svm.png\"\n",
|
|
" width=\"300\"/>\n",
|
|
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "C4Wsd0vZhXYu"
|
|
},
|
|
"source": [
|
|
"H1~ neoddeľuje triedy. H2~ ich oddeľuje, ale iba s malým okrajom. H3~ ich oddeľuje s maximálnym okrajom.\n",
|
|
"\n",
|
|
"#### Lineárny Support Vector Classifier\n",
|
|
"\n",
|
|
"Support-Vector clustering (SVC) je súčasťou rodiny techník strojového učenia Support-Vector machines. V SVC je hyperplocha vybraná tak, aby správne oddelila `väčšinu` tréningových pozorovaní, ale `môže nesprávne klasifikovať` niektoré pozorovania. Tým, že umožníme niektorým bodom byť na nesprávnej strane, SVM sa stáva odolnejším voči odľahlým hodnotám, a tým lepšie generalizuje na nové dáta. Parameter, ktorý reguluje toto porušenie, sa nazýva `cost` a má predvolenú hodnotu 1 (pozri `help(\"svm_poly\")`).\n",
|
|
"\n",
|
|
"Vytvorme lineárny SVC nastavením `degree = 1` v polynomiálnom SVM modeli.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "vJpp6nuChlBz"
|
|
},
|
|
"source": [
|
|
"# Make a linear SVC specification\n",
|
|
"svc_linear_spec <- svm_poly(degree = 1) %>% \n",
|
|
" set_engine(\"kernlab\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle specification and recipe into a worklow\n",
|
|
"svc_linear_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(svc_linear_spec)\n",
|
|
"\n",
|
|
"# Print out workflow\n",
|
|
"svc_linear_wf"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "rDs8cWNkhoqu"
|
|
},
|
|
"source": [
|
|
"Teraz, keď sme zachytili kroky predspracovania a špecifikáciu modelu do *workflow*, môžeme pokračovať a natrénovať lineárny SVC a zároveň vyhodnotiť výsledky. Pre metriky výkonu vytvorme súbor metrík, ktorý bude hodnotiť: `presnosť`, `citlivosť`, `pozitívnu prediktívnu hodnotu` a `F mieru`.\n",
|
|
"\n",
|
|
"> `augment()` pridá stĺpec/stĺpce s predikciami k daným údajom.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "81wiqcwuhrnq"
|
|
},
|
|
"source": [
|
|
"# Train a linear SVC model\n",
|
|
"svc_linear_fit <- svc_linear_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"# Create a metric set\n",
|
|
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"svc_linear_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "0UFQvHf-huo3"
|
|
},
|
|
"source": [
|
|
"#### Support Vector Machine\n",
|
|
"\n",
|
|
"Support vector machine (SVM) je rozšírením klasifikátora podporných vektorov, ktoré umožňuje zohľadniť nelineárnu hranicu medzi triedami. V podstate SVM využívajú *kernel trick* na rozšírenie priestoru vlastností, aby sa prispôsobili nelineárnym vzťahom medzi triedami. Jednou z populárnych a mimoriadne flexibilných funkcií jadra, ktorú SVM využívajú, je *Radial basis function.* Pozrime sa, ako bude fungovať na našich údajoch.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "-KX4S8mzhzmp"
|
|
},
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"\n",
|
|
"# Make an RBF SVM specification\n",
|
|
"svm_rbf_spec <- svm_rbf() %>% \n",
|
|
" set_engine(\"kernlab\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle specification and recipe into a worklow\n",
|
|
"svm_rbf_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(svm_rbf_spec)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Train an RBF model\n",
|
|
"svm_rbf_fit <- svm_rbf_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"svm_rbf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "QBFSa7WSh4HQ"
|
|
},
|
|
"source": [
|
|
"Oveľa lepšie 🤩!\n",
|
|
"\n",
|
|
"> ✅ Pozrite si:\n",
|
|
">\n",
|
|
"> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html), Hands-on Machine Learning with R\n",
|
|
">\n",
|
|
"> - [*Support Vector Machines*](https://www.statlearning.com/), An Introduction to Statistical Learning with Applications in R\n",
|
|
">\n",
|
|
"> pre ďalšie čítanie.\n",
|
|
"\n",
|
|
"### Klasifikátory najbližšieho suseda\n",
|
|
"\n",
|
|
"Algoritmus *K*-najbližšieho suseda (KNN) predpovedá každé pozorovanie na základe jeho *podobnosti* s ostatnými pozorovaniami.\n",
|
|
"\n",
|
|
"Poďme ho aplikovať na naše dáta.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "k4BxxBcdh9Ka"
|
|
},
|
|
"source": [
|
|
"# Make a KNN specification\n",
|
|
"knn_spec <- nearest_neighbor() %>% \n",
|
|
" set_engine(\"kknn\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"knn_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(knn_spec)\n",
|
|
"\n",
|
|
"# Train a boosted tree model\n",
|
|
"knn_wf_fit <- knn_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"knn_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "HaegQseriAcj"
|
|
},
|
|
"source": [
|
|
"Zdá sa, že tento model nefunguje až tak dobre. Pravdepodobne zmena argumentov modelu (pozrite si `help(\"nearest_neighbor\")`) zlepší jeho výkon. Určite to vyskúšajte.\n",
|
|
"\n",
|
|
"> ✅ Pozrite si:\n",
|
|
">\n",
|
|
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
|
|
">\n",
|
|
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
|
|
">\n",
|
|
"> aby ste sa dozvedeli viac o klasifikátoroch *K*-Najbližších Susedov.\n",
|
|
"\n",
|
|
"### Ensemble klasifikátory\n",
|
|
"\n",
|
|
"Ensemble algoritmy fungujú tak, že kombinujú viacero základných odhadov, aby vytvorili optimálny model, buď:\n",
|
|
"\n",
|
|
"`bagging`: aplikáciou *priemerovacej funkcie* na kolekciu základných modelov\n",
|
|
"\n",
|
|
"`boosting`: vytváraním sekvencie modelov, ktoré na seba nadväzujú, aby zlepšili prediktívny výkon.\n",
|
|
"\n",
|
|
"Začnime tým, že vyskúšame model Random Forest, ktorý vytvára veľkú kolekciu rozhodovacích stromov a potom aplikuje priemerovaciu funkciu na vytvorenie lepšieho celkového modelu.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "49DPoVs6iK1M"
|
|
},
|
|
"source": [
|
|
"# Make a random forest specification\n",
|
|
"rf_spec <- rand_forest() %>% \n",
|
|
" set_engine(\"ranger\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"rf_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(rf_spec)\n",
|
|
"\n",
|
|
"# Train a random forest model\n",
|
|
"rf_wf_fit <- rf_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"rf_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "RGVYwC_aiUWc"
|
|
},
|
|
"source": [
|
|
"Dobrá práca 👏!\n",
|
|
"\n",
|
|
"Poďme tiež experimentovať s modelom Boosted Tree.\n",
|
|
"\n",
|
|
"Boosted Tree definuje ensemble metódu, ktorá vytvára sériu sekvenčných rozhodovacích stromov, kde každý strom závisí od výsledkov predchádzajúcich stromov v snahe postupne znižovať chybu. Zameriava sa na váhy nesprávne klasifikovaných položiek a upravuje prispôsobenie pre ďalší klasifikátor, aby ich opravil.\n",
|
|
"\n",
|
|
"Existujú rôzne spôsoby, ako tento model prispôsobiť (pozri `help(\"boost_tree\")`). V tomto príklade prispôsobíme Boosted stromy pomocou enginu `xgboost`.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Py1YWo-micWs"
|
|
},
|
|
"source": [
|
|
"# Make a boosted tree specification\n",
|
|
"boost_spec <- boost_tree(trees = 200) %>% \n",
|
|
" set_engine(\"xgboost\") %>% \n",
|
|
" set_mode(\"classification\")\n",
|
|
"\n",
|
|
"# Bundle recipe and model specification into a workflow\n",
|
|
"boost_wf <- workflow() %>% \n",
|
|
" add_recipe(cuisines_recipe) %>% \n",
|
|
" add_model(boost_spec)\n",
|
|
"\n",
|
|
"# Train a boosted tree model\n",
|
|
"boost_wf_fit <- boost_wf %>% \n",
|
|
" fit(data = cuisines_train)\n",
|
|
"\n",
|
|
"\n",
|
|
"# Make predictions and Evaluate model performance\n",
|
|
"boost_wf_fit %>% \n",
|
|
" augment(new_data = cuisines_test) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class)"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "zNQnbuejigZM"
|
|
},
|
|
"source": [
|
|
"> ✅ Pozrite si:\n",
|
|
">\n",
|
|
"> - [Machine Learning for Social Scientists](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
|
|
">\n",
|
|
"> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n",
|
|
">\n",
|
|
"> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n",
|
|
">\n",
|
|
"> - <https://algotech.netlify.app/blog/xgboost/> - Skúma model AdaBoost, ktorý je dobrou alternatívou k xgboost.\n",
|
|
">\n",
|
|
"> pre viac informácií o Ensemble klasifikátoroch.\n",
|
|
"\n",
|
|
"## 4. Extra - porovnanie viacerých modelov\n",
|
|
"\n",
|
|
"V tomto cvičení sme vytvorili pomerne veľké množstvo modelov 🙌. Môže byť únavné alebo náročné vytvárať množstvo workflowov z rôznych sád predspracovania a/alebo špecifikácií modelov a potom jeden po druhom vypočítavať metriky výkonnosti.\n",
|
|
"\n",
|
|
"Pozrime sa, či to môžeme vyriešiť vytvorením funkcie, ktorá aplikuje zoznam workflowov na tréningovú množinu a následne vráti metriky výkonnosti na základe testovacej množiny. Použijeme `map()` a `map_dfr()` z balíka [purrr](https://purrr.tidyverse.org/) na aplikáciu funkcií na každý prvok zoznamu.\n",
|
|
"\n",
|
|
"> Funkcie [`map()`](https://purrr.tidyverse.org/reference/map.html) vám umožňujú nahradiť mnoho for-cyklov kódom, ktorý je stručnejší a ľahšie čitateľný. Najlepším miestom na učenie sa o funkciách [`map()`](https://purrr.tidyverse.org/reference/map.html) je [kapitola o iterácii](http://r4ds.had.co.nz/iteration.html) v knihe R for Data Science.\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "Qzb7LyZnimd2"
|
|
},
|
|
"source": [
|
|
"set.seed(2056)\n",
|
|
"\n",
|
|
"# Create a metric set\n",
|
|
"eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n",
|
|
"\n",
|
|
"# Define a function that returns performance metrics\n",
|
|
"compare_models <- function(workflow_list, train_set, test_set){\n",
|
|
" \n",
|
|
" suppressWarnings(\n",
|
|
" # Fit each model to the train_set\n",
|
|
" map(workflow_list, fit, data = train_set) %>% \n",
|
|
" # Make predictions on the test set\n",
|
|
" map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n",
|
|
" # Select desired columns\n",
|
|
" select(model, cuisine, .pred_class) %>% \n",
|
|
" # Evaluate model performance\n",
|
|
" group_by(model) %>% \n",
|
|
" eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n",
|
|
" ungroup()\n",
|
|
" )\n",
|
|
" \n",
|
|
"} # End of function"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "Fwa712sNisDA"
|
|
},
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"metadata": {
|
|
"id": "3i4VJOi2iu-a"
|
|
},
|
|
"source": [
|
|
"# Make a list of workflows\n",
|
|
"workflow_list <- list(\n",
|
|
" \"svc\" = svc_linear_wf,\n",
|
|
" \"svm\" = svm_rbf_wf,\n",
|
|
" \"knn\" = knn_wf,\n",
|
|
" \"random_forest\" = rf_wf,\n",
|
|
" \"xgboost\" = boost_wf)\n",
|
|
"\n",
|
|
"# Call the function\n",
|
|
"set.seed(2056)\n",
|
|
"perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n",
|
|
"\n",
|
|
"# Print out performance metrics\n",
|
|
"perf_metrics %>% \n",
|
|
" group_by(.metric) %>% \n",
|
|
" arrange(desc(.estimate)) %>% \n",
|
|
" slice_head(n=7)\n",
|
|
"\n",
|
|
"# Compare accuracy\n",
|
|
"perf_metrics %>% \n",
|
|
" filter(.metric == \"accuracy\") %>% \n",
|
|
" arrange(desc(.estimate))\n"
|
|
],
|
|
"execution_count": null,
|
|
"outputs": []
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"id": "KuWK_lEli4nW"
|
|
},
|
|
"source": [
|
|
"[**workflowset**](https://workflowsets.tidymodels.org/) balík umožňuje používateľom vytvárať a jednoducho prispôsobovať veľké množstvo modelov, ale je primárne navrhnutý na prácu s technikami resamplingu, ako je `krížová validácia`, ktorú si ešte len preberieme.\n",
|
|
"\n",
|
|
"## **🚀Výzva**\n",
|
|
"\n",
|
|
"Každá z týchto techník má veľké množstvo parametrov, ktoré môžete upravovať, napríklad `cost` v SVM, `neighbors` v KNN, `mtry` (náhodne vybrané prediktory) v Random Forest.\n",
|
|
"\n",
|
|
"Preskúmajte predvolené parametre každého z nich a zamyslite sa nad tým, čo by úprava týchto parametrov znamenala pre kvalitu modelu.\n",
|
|
"\n",
|
|
"Ak chcete zistiť viac o konkrétnom modeli a jeho parametroch, použite: `help(\"model\")`, napr. `help(\"rand_forest\")`.\n",
|
|
"\n",
|
|
"> V praxi zvyčajne *odhadujeme* *najlepšie hodnoty* týchto parametrov trénovaním mnohých modelov na `simulovanom dátovom súbore` a meraním, ako dobre tieto modely fungujú. Tento proces sa nazýva **ladenie**.\n",
|
|
"\n",
|
|
"### [**Kvíz po prednáške**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
|
|
"\n",
|
|
"### **Prehľad a samostatné štúdium**\n",
|
|
"\n",
|
|
"V týchto lekciách je veľa odborných výrazov, preto si nájdite chvíľu na preštudovanie [tohto zoznamu](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) užitočnej terminológie!\n",
|
|
"\n",
|
|
"#### POĎAKOVANIE:\n",
|
|
"\n",
|
|
"[`Allison Horst`](https://twitter.com/allison_horst/) za vytvorenie úžasných ilustrácií, ktoré robia R prístupnejším a pútavejším. Viac ilustrácií nájdete v jej [galérii](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM).\n",
|
|
"\n",
|
|
"[Cassie Breviu](https://www.twitter.com/cassieview) a [Jen Looper](https://www.twitter.com/jenlooper) za vytvorenie pôvodnej verzie tohto modulu v Pythone ♥️\n",
|
|
"\n",
|
|
"Šťastné učenie,\n",
|
|
"\n",
|
|
"[Eric](https://twitter.com/ericntay), Zlatý študentský ambasádor Microsoft Learn.\n",
|
|
"\n",
|
|
"<p >\n",
|
|
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
|
|
" width=\"569\"/>\n",
|
|
" <figcaption>Ilustrácia od @allison_horst</figcaption>\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 akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.\n"
|
|
]
|
|
}
|
|
]
|
|
} |