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/no/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb

648 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-06T12:32:33+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "no"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "HD54bEefgtNO"
},
"source": [
"## Klassifisering av matretter 2\n",
"\n",
"I denne andre leksjonen om klassifisering skal vi utforske `flere måter` å klassifisere kategoriske data på. Vi skal også lære om konsekvensene ved å velge én klassifikator fremfor en annen.\n",
"\n",
"### [**Quiz før forelesning**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n",
"\n",
"### **Forutsetninger**\n",
"\n",
"Vi antar at du har fullført de tidligere leksjonene, siden vi vil bygge videre på noen konsepter vi lærte tidligere.\n",
"\n",
"For denne leksjonen trenger vi følgende pakker:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) er en [samling av R-pakker](https://www.tidyverse.org/packages) som er designet for å gjøre dataanalyse raskere, enklere og mer morsomt!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) er et [rammeverk med pakker](https://www.tidymodels.org/packages/) for modellering og maskinlæring.\n",
"\n",
"- `themis`: [themis-pakken](https://themis.tidymodels.org/) gir ekstra oppskritt for å håndtere ubalanserte data.\n",
"\n",
"Du kan installere dem slik:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n",
"\n",
"Alternativt kan skriptet nedenfor sjekke om du har de nødvendige pakkene for å fullføre dette modulen, og installere dem for deg hvis de mangler.\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. Et klassifiseringskart**\n",
"\n",
"I vår [forrige leksjon](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1) forsøkte vi å besvare spørsmålet: hvordan velger vi mellom flere modeller? I stor grad avhenger det av egenskapene til dataene og typen problem vi ønsker å løse (for eksempel klassifisering eller regresjon).\n",
"\n",
"Tidligere lærte vi om de ulike alternativene du har når du klassifiserer data ved hjelp av Microsofts jukselapp. Python sitt maskinlæringsrammeverk, Scikit-learn, tilbyr en lignende, men mer detaljert jukselapp som kan hjelpe deg med å snevre inn dine estimators (et annet begrep for klassifikatorer):\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "u1i3xRIVg7vG"
},
"source": [
"> Tips: [besøk dette kartet online](https://scikit-learn.org/stable/tutorial/machine_learning_map/) og klikk langs stien for å lese dokumentasjonen.\n",
">\n",
"> Referansesiden for [Tidymodels](https://www.tidymodels.org/find/parsnip/#models) gir også utmerket dokumentasjon om ulike typer modeller.\n",
"\n",
"### **Planen** 🗺️\n",
"\n",
"Dette kartet er veldig nyttig når du har en klar forståelse av dataene dine, da du kan 'gå' langs stiene til en beslutning:\n",
"\n",
"- Vi har \\>50 prøver\n",
"\n",
"- Vi ønsker å forutsi en kategori\n",
"\n",
"- Vi har merket data\n",
"\n",
"- Vi har færre enn 100K prøver\n",
"\n",
"- ✨ Vi kan velge en Linear SVC\n",
"\n",
"- Hvis det ikke fungerer, siden vi har numeriske data\n",
"\n",
" - Vi kan prøve en ✨ KNeighbors Classifier\n",
"\n",
" - Hvis det ikke fungerer, prøv ✨ SVC og ✨ Ensemble Classifiers\n",
"\n",
"Dette er en veldig nyttig sti å følge. Nå, la oss komme i gang med [tidymodels](https://www.tidymodels.org/) modelleringsrammeverket: en konsistent og fleksibel samling av R-pakker utviklet for å oppmuntre til god statistisk praksis 😊.\n",
"\n",
"## 2. Del opp dataene og håndter ubalanserte datasett.\n",
"\n",
"Fra våre tidligere leksjoner lærte vi at det var et sett med vanlige ingredienser på tvers av våre kjøkken. Det var også en ganske ujevn fordeling i antall kjøkken.\n",
"\n",
"Vi vil håndtere dette ved å\n",
"\n",
"- Fjerne de vanligste ingrediensene som skaper forvirring mellom ulike kjøkken, ved å bruke `dplyr::select()`.\n",
"\n",
"- Bruke en `recipe` som forhåndsprosesserer dataene for å gjøre dem klare for modellering ved å bruke en `over-sampling`-algoritme.\n",
"\n",
"Vi har allerede sett på dette i den forrige leksjonen, så dette bør gå som en lek 🥳!\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": [
"### Håndtering av ubalanserte data\n",
"\n",
"Ubalanserte data har ofte negative effekter på modellens ytelse. Mange modeller fungerer best når antallet observasjoner er likt, og har derfor en tendens til å slite med ubalanserte data.\n",
"\n",
"Det finnes hovedsakelig to måter å håndtere ubalanserte datasett på:\n",
"\n",
"- legge til observasjoner i minoritetsklassen: `Over-sampling`, for eksempel ved å bruke en SMOTE-algoritme som syntetisk genererer nye eksempler av minoritetsklassen ved hjelp av nærmeste naboer til disse tilfellene.\n",
"\n",
"- fjerne observasjoner fra majoritetsklassen: `Under-sampling`\n",
"\n",
"I vår forrige leksjon demonstrerte vi hvordan man kan håndtere ubalanserte datasett ved hjelp av en `recipe`. En recipe kan betraktes som en plan som beskriver hvilke steg som skal brukes på et datasett for å gjøre det klart for dataanalyse. I vårt tilfelle ønsker vi å ha en lik fordeling i antallet av våre matretter for vårt `training set`. La oss sette i gang.\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": [
"Nå er vi klare til å trene modeller 👩‍💻👨‍💻!\n",
"\n",
"## 3. Utover multinomiale regresjonsmodeller\n",
"\n",
"I vår forrige leksjon så vi på multinomiale regresjonsmodeller. La oss utforske noen mer fleksible modeller for klassifisering.\n",
"\n",
"### Support Vector Machines\n",
"\n",
"I sammenheng med klassifisering er `Support Vector Machines` en maskinlæringsteknikk som prøver å finne et *hyperplan* som \"best\" skiller klassene. La oss se på et enkelt eksempel:\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~ skiller ikke klassene. H2~ gjør det, men bare med en liten margin. H3~ skiller dem med maksimal margin.\n",
"\n",
"#### Lineær Support Vector Classifier\n",
"\n",
"Support-Vector clustering (SVC) er en del av Support-Vector-maskiner-familien av ML-teknikker. I SVC velges hyperplanet for å korrekt skille `de fleste` av treningsobservasjonene, men `kan feilkategorisere` noen observasjoner. Ved å tillate at noen punkter er på feil side, blir SVM mer robust mot uteliggere og dermed bedre til å generalisere til nye data. Parameteren som regulerer denne bruddgrensen kalles `cost`, som har en standardverdi på 1 (se `help(\"svm_poly\")`).\n",
"\n",
"La oss lage en lineær SVC ved å sette `degree = 1` i en polynomisk SVM-modell.\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": [
"Nå som vi har samlet forhåndsprosesseringsstegene og modellspesifikasjonen i en *arbeidsflyt*, kan vi gå videre og trene den lineære SVC og evaluere resultatene samtidig. For ytelsesmålinger, la oss lage et målesett som vil evaluere: `accuracy`, `sensitivity`, `Positive Predicted Value` og `F Measure`.\n",
"\n",
"> `augment()` vil legge til kolonne(r) for prediksjoner til de gitte dataene.\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": [
"#### Støttevektormaskin\n",
"\n",
"Støttevektormaskinen (SVM) er en utvidelse av støttevektor-klassifiseringen for å kunne håndtere en ikke-lineær grense mellom klassene. I hovedsak bruker SVM-er *kernel-trikset* for å utvide funksjonsrommet og tilpasse seg ikke-lineære relasjoner mellom klassene. En populær og svært fleksibel kjernefunksjon som brukes av SVM-er er *Radial basis function.* La oss se hvordan den vil prestere på våre data.\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": [
"Mye bedre 🤩!\n",
"\n",
"> ✅ Vennligst se:\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",
"> for videre lesing.\n",
"\n",
"### Klassifisering med nærmeste nabo\n",
"\n",
"*K*-nærmeste nabo (KNN) er en algoritme der hver observasjon blir forutsagt basert på dens *likhet* med andre observasjoner.\n",
"\n",
"La oss tilpasse en til dataene våre.\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": [
"Det ser ut til at denne modellen ikke presterer så bra. Sannsynligvis vil det å endre modellens argumenter (se `help(\"nearest_neighbor\")`) forbedre modellens ytelse. Sørg for å teste det ut.\n",
"\n",
"> ✅ Vennligst se:\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",
"> for å lære mer om *K*-Nearest Neighbors klassifikatorer.\n",
"\n",
"### Ensemble-klassifikatorer\n",
"\n",
"Ensemble-algoritmer fungerer ved å kombinere flere grunnmodeller for å produsere en optimal modell enten ved:\n",
"\n",
"`bagging`: å bruke en *gjennomsnittsfunksjon* på en samling av grunnmodeller\n",
"\n",
"`boosting`: å bygge en sekvens av modeller som bygger på hverandre for å forbedre prediktiv ytelse.\n",
"\n",
"La oss starte med å prøve ut en Random Forest-modell, som bygger en stor samling beslutningstrær og deretter bruker en gjennomsnittsfunksjon for å skape en bedre helhetlig modell.\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": [
"Godt jobbet 👏!\n",
"\n",
"La oss også eksperimentere med en Boosted Tree-modell.\n",
"\n",
"Boosted Tree definerer en ensemblemetode som lager en serie av sekvensielle beslutningstrær der hvert tre avhenger av resultatene fra tidligere trær i et forsøk på å gradvis redusere feilen. Den fokuserer på vektene til feilklassifiserte elementer og justerer tilpasningen for neste klassifikator for å rette opp.\n",
"\n",
"Det finnes forskjellige måter å tilpasse denne modellen på (se `help(\"boost_tree\")`). I dette eksempelet skal vi tilpasse Boosted trees via `xgboost`-motoren.\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": [
"> ✅ Vennligst se:\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/> - Utforsker AdaBoost-modellen, som er et godt alternativ til xgboost.\n",
">\n",
"> for å lære mer om Ensemble-klassifikatorer.\n",
"\n",
"## 4. Ekstra - sammenligne flere modeller\n",
"\n",
"Vi har tilpasset ganske mange modeller i denne labben 🙌. Det kan bli tidkrevende eller tungvint å lage mange arbeidsflyter fra ulike sett med forbehandlingsmetoder og/eller spesifikasjoner for modeller, og deretter beregne ytelsesmål én etter én.\n",
"\n",
"La oss se om vi kan løse dette ved å lage en funksjon som tilpasser en liste med arbeidsflyter på treningssettet og deretter returnerer ytelsesmål basert på testsettet. Vi skal bruke `map()` og `map_dfr()` fra [purrr](https://purrr.tidyverse.org/) pakken for å anvende funksjoner på hvert element i en liste.\n",
"\n",
"> [`map()`](https://purrr.tidyverse.org/reference/map.html)-funksjoner lar deg erstatte mange for-løkker med kode som både er mer kortfattet og lettere å lese. Det beste stedet å lære om [`map()`](https://purrr.tidyverse.org/reference/map.html)-funksjoner er [iterasjonskapitlet](http://r4ds.had.co.nz/iteration.html) i 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/) pakken lar brukere lage og enkelt tilpasse et stort antall modeller, men er hovedsakelig designet for å fungere med resamplingsteknikker som `cross-validation`, en tilnærming vi ennå ikke har dekket.\n",
"\n",
"## **🚀Utfordring**\n",
"\n",
"Hver av disse teknikkene har et stort antall parametere som du kan justere, for eksempel `cost` i SVMs, `neighbors` i KNN, `mtry` (Tilfeldig Valgte Prediktorer) i Random Forest.\n",
"\n",
"Undersøk standardparametrene for hver av dem og tenk over hva det å justere disse parameterne vil bety for modellens kvalitet.\n",
"\n",
"For å finne ut mer om en bestemt modell og dens parametere, bruk: `help(\"model\")` f.eks. `help(\"rand_forest\")`\n",
"\n",
"> I praksis *estimerer* vi vanligvis de *beste verdiene* for disse ved å trene mange modeller på et `simulert datasett` og måle hvor godt alle disse modellene presterer. Denne prosessen kalles **tuning**.\n",
"\n",
"### [**Quiz etter forelesning**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n",
"\n",
"### **Gjennomgang & Selvstudium**\n",
"\n",
"Det er mye fagterminologi i disse leksjonene, så ta et øyeblikk til å gå gjennom [denne listen](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) med nyttige begreper!\n",
"\n",
"#### TAKK TIL:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) for å lage de fantastiske illustrasjonene som gjør R mer innbydende og engasjerende. Finn flere illustrasjoner i hennes [galleri](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) og [Jen Looper](https://www.twitter.com/jenlooper) for å lage den originale Python-versjonen av dette modulen ♥️\n",
"\n",
"Lykke til med læringen,\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>Kunstverk av @allison_horst</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfraskrivelse**: \nDette dokumentet er oversatt ved hjelp av AI-oversettelsestjenesten [Co-op Translator](https://github.com/Azure/co-op-translator). Selv om vi tilstreber nøyaktighet, vennligst vær oppmerksom på at automatiske oversettelser kan inneholde feil eller unøyaktigheter. Det originale dokumentet på sitt opprinnelige språk bør anses som den autoritative kilden. For kritisk informasjon anbefales profesjonell menneskelig oversettelse. Vi er ikke ansvarlige for eventuelle misforståelser eller feiltolkninger som oppstår ved bruk av denne oversettelsen.\n"
]
}
]
}