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.
ML-For-Beginners/translations/hr/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb

650 lines
25 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-04T08:40:52+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "hr"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": [
"# Izgradite model klasifikacije: Ukusne azijske i indijske kuhinje\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## Klasifikatori kuhinja 2\n",
"\n",
"U ovoj drugoj lekciji o klasifikaciji, istražit ćemo `više načina` za klasifikaciju kategorijskih podataka. Također ćemo naučiti o posljedicama odabira jednog klasifikatora u odnosu na drugi.\n",
"\n",
"### [**Kviz prije predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **Preduvjeti**\n",
"\n",
"Pretpostavljamo da ste završili prethodne lekcije jer ćemo nastaviti s nekim konceptima koje smo ranije naučili.\n",
"\n",
"Za ovu lekciju trebat će nam sljedeći paketi:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) je [zbirka R paketa](https://www.tidyverse.org/packages) dizajnirana da učini znanost o podacima bržom, lakšom i zabavnijom!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) okvir je [zbirka paketa](https://www.tidymodels.org/packages/) za modeliranje i strojno učenje.\n",
"\n",
"- `themis`: [themis paket](https://themis.tidymodels.org/) pruža dodatne korake za recepte za rad s neuravnoteženim podacima.\n",
"\n",
"Možete ih instalirati pomoću:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"Alternativno, skripta ispod provjerava imate li potrebne pakete za dovršavanje ovog modula i instalira ih za vas ako nedostaju.\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. Karta klasifikacije**\n",
"\n",
"U našoj [prethodnoj lekciji](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1), pokušali smo odgovoriti na pitanje: kako odabrati između više modela? U velikoj mjeri, to ovisi o karakteristikama podataka i vrsti problema koji želimo riješiti (na primjer, klasifikacija ili regresija?).\n",
"\n",
"Ranije smo naučili o raznim opcijama koje imate pri klasifikaciji podataka koristeći Microsoftov vodič. Pythonov okvir za strojno učenje, Scikit-learn, nudi sličan, ali detaljniji vodič koji može dodatno pomoći u sužavanju izbora vaših procjenitelja (drugi izraz za klasifikatore):\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> Savjet: [posjetite ovu kartu online](https://scikit-learn.org/stable/tutorial/machine_learning_map/) i kliknite na stazu kako biste pročitali dokumentaciju.\n",
">\n",
"> [Referentna stranica Tidymodels](https://www.tidymodels.org/find/parsnip/#models) također pruža izvrsnu dokumentaciju o različitim vrstama modela.\n",
"\n",
"### **Plan** 🗺️\n",
"\n",
"Ova karta je vrlo korisna kada imate jasno razumijevanje svojih podataka, jer možete 'prošetati' njenim stazama do odluke:\n",
"\n",
"- Imamo \\>50 uzoraka\n",
"\n",
"- Želimo predvidjeti kategoriju\n",
"\n",
"- Imamo označene podatke\n",
"\n",
"- Imamo manje od 100K uzoraka\n",
"\n",
"- ✨ Možemo odabrati Linear SVC\n",
"\n",
"- Ako to ne uspije, budući da imamo numeričke podatke\n",
"\n",
" - Možemo pokušati ✨ KNeighbors Classifier\n",
"\n",
" - Ako to ne uspije, pokušajte ✨ SVC i ✨ Ensemble Classifiers\n",
"\n",
"Ovo je vrlo koristan put za slijediti. Sada, krenimo odmah koristeći [tidymodels](https://www.tidymodels.org/) okvir za modeliranje: dosljednu i fleksibilnu kolekciju R paketa razvijenih za poticanje dobre statističke prakse 😊.\n",
"\n",
"## 2. Podijelite podatke i riješite problem neuravnoteženog skupa podataka.\n",
"\n",
"Iz naših prethodnih lekcija naučili smo da postoji skup zajedničkih sastojaka među našim kuhinjama. Također, postojala je prilično nejednaka distribucija u broju kuhinja.\n",
"\n",
"S ovim ćemo se nositi tako što ćemo:\n",
"\n",
"- Izbaciti najčešće sastojke koji stvaraju zabunu između različitih kuhinja, koristeći `dplyr::select()`.\n",
"\n",
"- Koristiti `recipe` koji unaprijed obrađuje podatke kako bi ih pripremio za modeliranje primjenom algoritma `over-sampling`.\n",
"\n",
"Već smo pogledali gore navedeno u prethodnoj lekciji, tako da bi ovo trebalo biti jednostavno 🥳!\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": [
"### Rješavanje neuravnoteženih podataka\n",
"\n",
"Neuravnoteženi podaci često negativno utječu na performanse modela. Mnogi modeli najbolje funkcioniraju kada je broj opažanja jednak i, stoga, imaju poteškoća s neuravnoteženim podacima.\n",
"\n",
"Postoje dva glavna načina za rješavanje neuravnoteženih skupova podataka:\n",
"\n",
"- dodavanje opažanja manjinskoj klasi: `Over-sampling`, npr. korištenjem SMOTE algoritma koji sintetički generira nove primjere manjinske klase koristeći najbliže susjede tih slučajeva.\n",
"\n",
"- uklanjanje opažanja iz većinske klase: `Under-sampling`\n",
"\n",
"U našoj prethodnoj lekciji pokazali smo kako se nositi s neuravnoteženim skupovima podataka koristeći `recipe`. Recipe se može smatrati nacrtom koji opisuje koje korake treba primijeniti na skup podataka kako bi bio spreman za analizu podataka. U našem slučaju, želimo postići jednaku raspodjelu broja naših kuhinja za naš `training set`. Krenimo odmah.\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": [
"Sada smo spremni za treniranje modela 👩‍💻👨‍💻!\n",
"\n",
"## 3. Izvan multinomijalnih regresijskih modela\n",
"\n",
"U prethodnoj lekciji smo proučavali multinomijalne regresijske modele. Pogledajmo neke fleksibilnije modele za klasifikaciju.\n",
"\n",
"### Strojevi za potporne vektore\n",
"\n",
"U kontekstu klasifikacije, `Strojevi za potporne vektore` su tehnika strojnog učenja koja pokušava pronaći *hiperplohu* koja \"najbolje\" razdvaja klase. Pogledajmo jednostavan primjer:\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~ ne razdvaja klase. H2~ razdvaja, ali samo s malim razmakom. H3~ razdvaja s maksimalnim razmakom.\n",
"\n",
"#### Linearni Support Vector Classifier\n",
"\n",
"Support-Vector clustering (SVC) je dio obitelji Support-Vector strojeva (SVM) u tehnikama strojnog učenja. U SVC-u, hiperplana se odabire tako da ispravno razdvoji `većinu` promatranja u skupu za treniranje, ali `može pogrešno klasificirati` neka promatranja. Dopuštanjem da neke točke budu na pogrešnoj strani, SVM postaje otporniji na iznimke, čime se poboljšava generalizacija na nove podatke. Parametar koji regulira ovo odstupanje naziva se `cost`, a njegova zadana vrijednost je 1 (vidi `help(\"svm_poly\")`).\n",
"\n",
"Kreirajmo linearni SVC postavljanjem `degree = 1` u polinomni SVM model.\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": [
"Sada kada smo obuhvatili korake predobrade i specifikaciju modela u *workflow*, možemo krenuti s treniranjem linearne SVC i procjenom rezultata u isto vrijeme. Za metrike izvedbe, kreirajmo skup metrika koji će procjenjivati: `točnost`, `osjetljivost`, `Pozitivnu prediktivnu vrijednost` i `F mjeru`.\n",
"\n",
"> `augment()` će dodati stupac(e) za predikcije u dane podatke.\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": [
"#### Strojevi potpornih vektora\n",
"\n",
"Stroj potpornih vektora (SVM) je proširenje klasifikatora potpornih vektora kako bi se omogućila nelinearna granica između klasa. U suštini, SVM-ovi koriste *kernel trik* za proširenje prostora značajki kako bi se prilagodili nelinearnim odnosima između klasa. Jedna popularna i izuzetno fleksibilna kernel funkcija koju SVM-ovi koriste je *Radijalna bazna funkcija.* Pogledajmo kako će se ponašati na našim podacima.\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": [
"Mnogo bolje 🤩!\n",
"\n",
"> ✅ Molimo pogledajte:\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",
"> za dodatno čitanje.\n",
"\n",
"### Klasifikatori najbližeg susjeda\n",
"\n",
"*K*-najbliži susjed (KNN) je algoritam u kojem se svaka opažanja predviđa na temelju njezine *sličnosti* s drugim opažanjima.\n",
"\n",
"Hajdemo ga primijeniti na naše podatke.\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": [
"Čini se da ovaj model ne daje najbolje rezultate. Vjerojatno će promjena argumenata modela (pogledajte `help(\"nearest_neighbor\")`) poboljšati performanse modela. Svakako isprobajte.\n",
"\n",
"> ✅ Molimo pogledajte:\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",
"> kako biste saznali više o *K*-Nearest Neighbors klasifikatorima.\n",
"\n",
"### Ansambl klasifikatori\n",
"\n",
"Ansambl algoritmi rade tako da kombiniraju više osnovnih procjenitelja kako bi proizveli optimalan model, bilo:\n",
"\n",
"`bagging`: primjenom *funkcije prosjeka* na zbirku osnovnih modela\n",
"\n",
"`boosting`: izgradnjom niza modela koji se nadovezuju jedan na drugi kako bi poboljšali prediktivnu učinkovitost.\n",
"\n",
"Počnimo s isprobavanjem modela Random Forest, koji gradi veliku zbirku stabala odluke, a zatim primjenjuje funkciju prosjeka za bolji ukupni model.\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": [
"Dobar posao 👏!\n",
"\n",
"Hajdemo također eksperimentirati s modelom Boosted Tree.\n",
"\n",
"Boosted Tree definira ansambl metodu koja stvara niz sekvencijalnih stabala odluke gdje svako stablo ovisi o rezultatima prethodnih stabala u pokušaju da se postupno smanji pogreška. Fokusira se na težine pogrešno klasificiranih stavki i prilagođava model za sljedeći klasifikator kako bi ispravio.\n",
"\n",
"Postoje različiti načini za prilagodbu ovog modela (vidi `help(\"boost_tree\")`). U ovom primjeru, prilagodit ćemo Boosted Tree putem `xgboost` motora.\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": [
"> ✅ Molimo pogledajte:\n",
">\n",
"> - [Strojno učenje za društvene znanstvenike](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n",
">\n",
"> - [Praktično strojno učenje s R-om](https://bradleyboehmke.github.io/HOML/)\n",
">\n",
"> - [Uvod u statističko učenje s primjenama u R-u](https://www.statlearning.com/)\n",
">\n",
"> - <https://algotech.netlify.app/blog/xgboost/> - Istražuje model AdaBoost koji je dobra alternativa xgboostu.\n",
">\n",
"> za više informacija o Ensemble klasifikatorima.\n",
"\n",
"## 4. Dodatno - usporedba više modela\n",
"\n",
"U ovom laboratoriju smo prilagodili priličan broj modela 🙌. Može postati zamorno ili zahtjevno kreirati mnogo radnih tijekova iz različitih skupova preprocesora i/ili specifikacija modela, a zatim pojedinačno izračunavati metrike izvedbe.\n",
"\n",
"Pogledajmo možemo li to riješiti kreiranjem funkcije koja prilagođava popis radnih tijekova na skupu za treniranje, a zatim vraća metrike izvedbe na temelju skupa za testiranje. Koristit ćemo `map()` i `map_dfr()` iz paketa [purrr](https://purrr.tidyverse.org/) za primjenu funkcija na svaki element u popisu.\n",
"\n",
"> [`map()`](https://purrr.tidyverse.org/reference/map.html) funkcije omogućuju zamjenu mnogih for petlji kodom koji je sažetiji i lakši za čitanje. Najbolje mjesto za učenje o [`map()`](https://purrr.tidyverse.org/reference/map.html) funkcijama je [poglavlje o iteraciji](http://r4ds.had.co.nz/iteration.html) u R za znanost o podacima.\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/) paket omogućuje korisnicima kreiranje i jednostavno prilagođavanje velikog broja modela, ali je uglavnom dizajniran za rad s tehnikama uzorkovanja poput `križne validacije`, pristupa koji tek trebamo obraditi.\n",
"\n",
"## **🚀Izazov**\n",
"\n",
"Svaka od ovih tehnika ima veliki broj parametara koje možete prilagoditi, na primjer `cost` u SVM-ovima, `neighbors` u KNN-u, `mtry` (nasumično odabrani prediktori) u Random Forestu.\n",
"\n",
"Istražite zadane parametre za svaki od njih i razmislite što bi prilagodba tih parametara značila za kvalitetu modela.\n",
"\n",
"Da biste saznali više o određenom modelu i njegovim parametrima, koristite: `help(\"model\")`, npr. `help(\"rand_forest\")`\n",
"\n",
"> U praksi obično *procjenjujemo* *najbolje vrijednosti* za ove parametre treniranjem mnogih modela na `simuliranom skupu podataka` i mjerenjem koliko dobro ti modeli rade. Ovaj proces se naziva **podešavanje**.\n",
"\n",
"### [**Kviz nakon predavanja**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **Pregled i samostalno učenje**\n",
"\n",
"U ovim lekcijama ima puno stručnih izraza, pa odvojite trenutak da pregledate [ovaj popis](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) korisne terminologije!\n",
"\n",
"#### ZAHVALA:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) za stvaranje nevjerojatnih ilustracija koje čine R pristupačnijim i zanimljivijim. Više ilustracija možete pronaći u njezinoj [galeriji](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) i [Jen Looper](https://www.twitter.com/jenlooper) za stvaranje originalne Python verzije ovog modula ♥️\n",
"\n",
"Sretno u učenju,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Student Ambassador.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"569\"/>\n",
" <figcaption>Ilustracija @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Odricanje od odgovornosti**: \nOvaj dokument je preveden korištenjem AI usluge za prevođenje [Co-op Translator](https://github.com/Azure/co-op-translator). Iako nastojimo osigurati točnost, imajte na umu da automatski prijevodi mogu sadržavati pogreške ili netočnosti. Izvorni dokument na izvornom jeziku treba smatrati mjerodavnim izvorom. Za ključne informacije preporučuje se profesionalni prijevod od strane stručnjaka. Ne preuzimamo odgovornost za bilo kakve nesporazume ili pogrešne interpretacije proizašle iz korištenja ovog prijevoda.\n"
]
}
]
}