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/fi/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:38:27+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "fi"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": [
"# Rakenna luokittelumalli: Herkulliset aasialaiset ja intialaiset keittiöt\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## Keittiöluokittelijat 2\n",
"\n",
"Tässä toisessa luokittelutunnissa tutkimme `lisätapoja` kategorisen datan luokitteluun. Opimme myös, mitä seurauksia on, kun valitsemme yhden luokittelijan toisen sijaan.\n",
"\n",
"### [**Esiluennon kysely**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **Edellytykset**\n",
"\n",
"Oletamme, että olet suorittanut aiemmat oppitunnit, sillä jatkamme joitakin aiemmin opittuja käsitteitä.\n",
"\n",
"Tätä oppituntia varten tarvitsemme seuraavat paketit:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) on [R-pakettien kokoelma](https://www.tidyverse.org/packages), joka tekee datatieteestä nopeampaa, helpompaa ja hauskempaa!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) -kehys on [pakettien kokoelma](https://www.tidymodels.org/packages/) mallinnukseen ja koneoppimiseen.\n",
"\n",
"- `themis`: [themis-paketti](https://themis.tidymodels.org/) tarjoaa lisäreseptivaiheita epätasapainoisen datan käsittelyyn.\n",
"\n",
"Voit asentaa ne seuraavasti:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"Vaihtoehtoisesti alla oleva skripti tarkistaa, onko sinulla tarvittavat paketit tämän moduulin suorittamiseen, ja asentaa ne puolestasi, jos ne puuttuvat.\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. Luokittelukartta**\n",
"\n",
"Edellisessä [oppitunnissamme](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) yritimme vastata kysymykseen: kuinka valitsemme useiden mallien välillä? Suurelta osin se riippuu datan ominaisuuksista ja ongelman tyypistä, jonka haluamme ratkaista (esimerkiksi luokittelu tai regressio).\n",
"\n",
"Aiemmin opimme eri vaihtoehdoista, joita sinulla on datan luokittelussa Microsoftin huijauslistan avulla. Pythonin koneoppimisen kehys, Scikit-learn, tarjoaa vastaavan mutta tarkemman huijauslistan, joka voi auttaa kaventamaan valintaa estimointien (toinen termi luokittelijoille) välillä:\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> Vinkki: [katso tämä kartta verkossa](https://scikit-learn.org/stable/tutorial/machine_learning_map/) ja klikkaa polkua pitkin lukeaksesi dokumentaatiota. \n",
"> \n",
"> [Tidymodels-viitesivusto](https://www.tidymodels.org/find/parsnip/#models) tarjoaa myös erinomaista dokumentaatiota eri mallityypeistä.\n",
"\n",
"### **Suunnitelma** 🗺️\n",
"\n",
"Tämä kartta on erittäin hyödyllinen, kun sinulla on selkeä käsitys datastasi, sillä voit \"kulkea\" sen polkuja pitkin päätökseen:\n",
"\n",
"- Meillä on \\>50 näytettä\n",
"\n",
"- Haluamme ennustaa kategorian\n",
"\n",
"- Meillä on merkittyä dataa\n",
"\n",
"- Meillä on alle 100 000 näytettä\n",
"\n",
"- ✨ Voimme valita Linear SVC:n\n",
"\n",
"- Jos se ei toimi, koska meillä on numeerista dataa\n",
"\n",
" - Voimme kokeilla ✨ KNeighbors Classifieria\n",
"\n",
" - Jos sekään ei toimi, kokeile ✨ SVC:tä ja ✨ Ensemble Classifiers -malleja\n",
"\n",
"Tämä on erittäin hyödyllinen polku seurattavaksi. Nyt sukelletaan suoraan asiaan käyttämällä [tidymodels](https://www.tidymodels.org/) -mallinnuskehystä: johdonmukainen ja joustava kokoelma R-paketteja, jotka on kehitetty edistämään hyviä tilastollisia käytäntöjä 😊.\n",
"\n",
"## 2. Jaa data ja käsittele epätasapainoista aineistoa.\n",
"\n",
"Aiemmista oppitunneistamme opimme, että keittiöissämme oli joukko yhteisiä ainesosia. Lisäksi keittiöiden määrässä oli melko epätasainen jakauma.\n",
"\n",
"Käsittelemme nämä seuraavasti:\n",
"\n",
"- Poistamme yleisimmät ainesosat, jotka aiheuttavat sekaannusta eri keittiöiden välillä, käyttämällä `dplyr::select()`-funktiota.\n",
"\n",
"- Käytämme `recipe`-objektia, joka esikäsittelee datan mallinnusta varten soveltamalla `over-sampling`-algoritmia.\n",
"\n",
"Kävimme yllä olevan jo läpi edellisessä oppitunnissa, joten tämän pitäisi olla helppoa 🥳!\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": [
"### Käsittele epätasapainoista dataa\n",
"\n",
"Epätasapainoinen data vaikuttaa usein negatiivisesti mallin suorituskykyyn. Monet mallit toimivat parhaiten, kun havaintojen määrä on tasainen, ja siksi ne voivat kohdata haasteita epätasapainoisen datan kanssa.\n",
"\n",
"Epätasapainoisten datajoukkojen käsittelyyn on pääasiassa kaksi tapaa:\n",
"\n",
"- lisätä havaintoja vähemmistöluokkaan: `Yliotanta` esimerkiksi käyttämällä SMOTE-algoritmia, joka synteettisesti luo uusia vähemmistöluokan esimerkkejä näiden tapausten lähimpien naapureiden avulla.\n",
"\n",
"- poistaa havaintoja enemmistöluokasta: `Aliotanta`\n",
"\n",
"Edellisessä oppitunnissamme näytimme, kuinka epätasapainoisia datajoukkoja voidaan käsitellä käyttämällä `reseptiä`. Reseptiä voidaan ajatella suunnitelmana, joka kuvaa, mitä vaiheita datajoukolle tulisi soveltaa, jotta se olisi valmis data-analyysiin. Meidän tapauksessamme haluamme saada tasaisen jakauman keittiötyyppien määrässä `opetusjoukkoamme` varten. Mennään suoraan asiaan.\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": [
"Nyt olemme valmiita kouluttamaan malleja 👩‍💻👨‍💻!\n",
"\n",
"## 3. Monitermi-regressiomallien ulkopuolella\n",
"\n",
"Edellisessä oppitunnissa tarkastelimme monitermi-regressiomalleja. Tutkitaan nyt joustavampia luokittelumalleja.\n",
"\n",
"### Tukivektorikoneet\n",
"\n",
"Luokittelun yhteydessä `Tukivektorikoneet` ovat koneoppimistekniikka, joka pyrkii löytämään *hyper-tason*, joka \"parhaiten\" erottaa luokat toisistaan. Katsotaanpa yksinkertaista esimerkkiä:\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~ ei erota luokkia. H2~ erottaa, mutta vain pienellä marginaalilla. H3~ erottaa ne suurimmalla mahdollisella marginaalilla.\n",
"\n",
"#### Lineaarinen tukivektoriluokitin\n",
"\n",
"Tukivektoriklusterointi (SVC) kuuluu tukivektoriautomaattien (Support-Vector Machines) koneoppimistekniikoiden perheeseen. SVC:ssä hypertaso valitaan siten, että se erottaa `suurimman osan` harjoitusaineiston havainnoista oikein, mutta `saattaa luokitella väärin` joitakin havaintoja. Sallimalla joidenkin pisteiden olla väärällä puolella, SVM:stä tulee kestävämpi poikkeamille ja se yleistyy paremmin uuteen dataan. Parametri, joka säätelee tätä poikkeamaa, tunnetaan nimellä `cost`, jonka oletusarvo on 1 (katso `help(\"svm_poly\")`).\n",
"\n",
"Luodaan lineaarinen SVC asettamalla `degree = 1` polynomiseen SVM-malliin.\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": [
"Nyt kun olemme tallentaneet esikäsittelyvaiheet ja mallin määrittelyn *työnkulkuun*, voimme jatkaa lineaarisen SVC:n kouluttamista ja samalla arvioida tuloksia. Suorituskykymittareita varten luodaan mittaristo, joka arvioi: `accuracy` (tarkkuus), `sensitivity` (herkkyys), `Positive Predicted Value` (positiivinen ennustearvo) ja `F Measure` (F-mittari).\n",
"\n",
"> `augment()` lisää sarakkeen/sarakkeita ennusteille annettuun dataan.\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": [
"#### Tukivektorikone\n",
"\n",
"Tukivektorikone (SVM) on tukivektoriluokittelijan laajennus, joka mahdollistaa epälineaarisen rajan luokkien välillä. Pohjimmiltaan SVM:t käyttävät *ydintemppua* laajentaakseen piirretilaa, jotta ne voivat mukautua epälineaarisiin suhteisiin luokkien välillä. Yksi suosittu ja erittäin joustava ydinfunktio, jota SVM:t käyttävät, on *radiaalinen basisfunktio.* Katsotaan, miten se suoriutuu datassamme.\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": [
"Paljon parempi 🤩!\n",
"\n",
"> ✅ Katso:\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",
"> lisälukemista varten.\n",
"\n",
"### Lähimmän naapurin luokittelijat\n",
"\n",
"*K*-lähimmän naapurin (KNN) algoritmi ennustaa jokaisen havainnon sen *samankaltaisuuden* perusteella muihin havaintoihin.\n",
"\n",
"Sovitetaan yksi algoritmi dataamme.\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": [
"Näyttää siltä, että tämä malli ei suoriudu kovin hyvin. Todennäköisesti mallin argumenttien muuttaminen (katso `help(\"nearest_neighbor\")`) parantaa mallin suorituskykyä. Muista kokeilla tätä.\n",
"\n",
"> ✅ Katso:\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",
"> saadaksesi lisätietoa *K*-lähimpien naapureiden luokittelijoista.\n",
"\n",
"### Yhdistelmäluokittelijat\n",
"\n",
"Yhdistelmäalgoritmit toimivat yhdistämällä useita perusestimaattoreita optimaalisen mallin tuottamiseksi joko:\n",
"\n",
"`bagging`: käyttämällä *keskiarvoistavaa funktiota* kokoelmaan perusmalleja\n",
"\n",
"`boosting`: rakentamalla mallisarjan, jossa mallit parantavat toistensa ennustustarkkuutta.\n",
"\n",
"Aloitetaan kokeilemalla Random Forest -mallia, joka rakentaa suuren joukon päätöspuita ja käyttää keskiarvoistavaa funktiota paremman kokonaismallin luomiseksi.\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": [
"Hyvää työtä 👏!\n",
"\n",
"Kokeillaan myös Boosted Tree -mallia.\n",
"\n",
"Boosted Tree määrittelee ensemble-menetelmän, joka luo sarjan peräkkäisiä päätöspuita, joissa jokainen puu perustuu edellisten puiden tuloksiin pyrkien vähentämään virhettä asteittain. Se keskittyy väärin luokiteltujen kohteiden painoihin ja säätää seuraavan luokittelijan sovitusta korjatakseen virheet.\n",
"\n",
"Tämän mallin sovittamiseen on erilaisia tapoja (katso `help(\"boost_tree\")`). Tässä esimerkissä sovitamme Boosted Tree -mallin `xgboost`-moottorin avulla.\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": [
"> ✅ Katso:\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/> - Tutkii AdaBoost-mallia, joka on hyvä vaihtoehto xgboostille.\n",
">\n",
"> oppiaksesi lisää Ensemble-luokittelijoista.\n",
"\n",
"## 4. Lisäosa - useiden mallien vertailu\n",
"\n",
"Olemme sovittaneet melko monta mallia tässä laboratoriossa 🙌. Useiden työnkulkujen luominen eri esikäsittelyjen ja/tai mallimääritysten pohjalta ja suorituskykymittareiden laskeminen yksi kerrallaan voi käydä työlääksi.\n",
"\n",
"Katsotaan, voimmeko ratkaista tämän luomalla funktion, joka sovittaa listan työnkulkuja harjoitusaineistoon ja palauttaa suorituskykymittarit testiaineiston perusteella. Käytämme `map()` ja `map_dfr()` -funktioita [purrr](https://purrr.tidyverse.org/) -paketista soveltaaksemme funktioita listan jokaiseen elementtiin.\n",
"\n",
"> [`map()`](https://purrr.tidyverse.org/reference/map.html) -funktiot mahdollistavat monien for-silmukoiden korvaamisen koodilla, joka on sekä tiiviimpää että helpommin luettavaa. Paras paikka oppia [`map()`](https://purrr.tidyverse.org/reference/map.html) -funktioista on [iteraatio-luku](http://r4ds.had.co.nz/iteration.html) kirjassa 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/) -paketti mahdollistaa käyttäjille suuren määrän mallien luomisen ja helpon sovittamisen, mutta se on pääasiassa suunniteltu toimimaan uudelleennäytteistystekniikoiden, kuten `ristivahvistuksen`, kanssa. Tätä lähestymistapaa emme ole vielä käsitelleet.\n",
"\n",
"## **🚀Haaste**\n",
"\n",
"Jokaisella näistä tekniikoista on suuri määrä parametreja, joita voit säätää, esimerkiksi `cost` SVM:ssä, `neighbors` KNN:ssä, `mtry` (satunnaisesti valitut ennustajat) Random Forestissa.\n",
"\n",
"Tutki kunkin oletusparametreja ja pohdi, mitä näiden parametrien säätäminen tarkoittaisi mallin laadulle.\n",
"\n",
"Lisätietoja tietystä mallista ja sen parametreista saat käyttämällä: `help(\"model\")`, esim. `help(\"rand_forest\")`.\n",
"\n",
"> Käytännössä *arvioimme* yleensä *parhaat arvot* näille kouluttamalla useita malleja `simuloidulla aineistolla` ja mittaamalla, kuinka hyvin nämä mallit suoriutuvat. Tätä prosessia kutsutaan **virittämiseksi**.\n",
"\n",
"### [**Luennon jälkeinen kysely**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **Kertaus & Itseopiskelu**\n",
"\n",
"Näissä oppitunneissa on paljon ammattikieltä, joten käytä hetki aikaa tutustuaksesi [tähän sanastoon](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott), joka sisältää hyödyllisiä termejä!\n",
"\n",
"#### KIITOS:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) upeista kuvituksista, jotka tekevät R:stä kutsuvamman ja innostavamman. Löydät lisää kuvituksia hänen [galleriastaan](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) ja [Jen Looper](https://www.twitter.com/jenlooper) alkuperäisen Python-version luomisesta ♥️\n",
"\n",
"Mukavia oppimishetkiä,\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>Taide: @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Vastuuvapauslauseke**: \nTämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua [Co-op Translator](https://github.com/Azure/co-op-translator). Pyrimme tarkkuuteen, mutta huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäistä asiakirjaa sen alkuperäisellä kielellä tulee pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskääntämistä. Emme ole vastuussa tämän käännöksen käytöstä aiheutuvista väärinkäsityksistä tai virhetulkinnoista.\n"
]
}
]
}