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/1-Introduction/solution/R/lesson_10-R.ipynb

721 lines
27 KiB

{
"nbformat": 4,
"nbformat_minor": 2,
"metadata": {
"colab": {
"name": "lesson_10-R.ipynb",
"provenance": [],
"collapsed_sections": []
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "2621e24705e8100893c9bf84e0fc8aef",
"translation_date": "2025-09-06T12:39:43+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "no"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Introduksjon til klassifisering: Rens, forbered og visualiser dataene dine\n",
"\n",
"I disse fire leksjonene vil du utforske et grunnleggende fokus innen klassisk maskinlæring - *klassifisering*. Vi skal gå gjennom bruken av ulike klassifiseringsalgoritmer med et datasett om alle de fantastiske kjøkkenene i Asia og India. Håper du er sulten!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Feir pan-asiatiske kjøkken i disse leksjonene! Bilde av Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Feir pan-asiatiske kjøkken i disse leksjonene! Bilde av Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"Klassifisering er en form for [supervised learning](https://wikipedia.org/wiki/Supervised_learning) som har mye til felles med regresjonsteknikker. I klassifisering trener du en modell til å forutsi hvilken `kategori` et element tilhører. Hvis maskinlæring handler om å forutsi verdier eller navn på ting ved hjelp av datasett, faller klassifisering generelt inn i to grupper: *binær klassifisering* og *multiklassifisering*.\n",
"\n",
"Husk:\n",
"\n",
"- **Lineær regresjon** hjalp deg med å forutsi forholdet mellom variabler og lage nøyaktige spådommer om hvor et nytt datapunkt ville falle i forhold til den linjen. For eksempel kunne du forutsi numeriske verdier som *hva prisen på et gresskar ville være i september vs. desember*.\n",
"\n",
"- **Logistisk regresjon** hjalp deg med å oppdage \"binære kategorier\": ved dette prisnivået, *er dette gresskaret oransje eller ikke-oransje*?\n",
"\n",
"Klassifisering bruker ulike algoritmer for å bestemme andre måter å avgjøre en datapunkts etikett eller klasse. La oss jobbe med dette kjøkkendatasettet for å se om vi, ved å observere en gruppe ingredienser, kan bestemme opprinnelsen til kjøkkenet.\n",
"\n",
"### [**Quiz før leksjonen**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Introduksjon**\n",
"\n",
"Klassifisering er en av de grunnleggende aktivitetene for maskinlæringsforskere og dataforskere. Fra enkel klassifisering av en binær verdi (\"er denne e-posten spam eller ikke?\") til kompleks bildeklassifisering og segmentering ved hjelp av datamaskinsyn, er det alltid nyttig å kunne sortere data i klasser og stille spørsmål om dem.\n",
"\n",
"For å formulere prosessen på en mer vitenskapelig måte, skaper klassifiseringsmetoden din en prediktiv modell som gjør det mulig å kartlegge forholdet mellom inputvariabler og outputvariabler.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Binære vs. multiklasseproblemer som klassifiseringsalgoritmer kan håndtere. Infografikk av Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"Før vi starter prosessen med å rense dataene våre, visualisere dem og forberede dem for våre ML-oppgaver, la oss lære litt om de ulike måtene maskinlæring kan brukes til å klassifisere data.\n",
"\n",
"Avledet fra [statistikk](https://wikipedia.org/wiki/Statistical_classification), bruker klassifisering med klassisk maskinlæring funksjoner som `røyker`, `vekt` og `alder` for å bestemme *sannsynligheten for å utvikle X sykdom*. Som en supervised learning-teknikk, lik de regresjonsøvelsene du utførte tidligere, er dataene dine merket, og ML-algoritmene bruker disse etikettene til å klassifisere og forutsi klasser (eller 'funksjoner') i et datasett og tilordne dem til en gruppe eller et utfall.\n",
"\n",
"✅ Ta et øyeblikk til å forestille deg et datasett om kjøkken. Hva ville en multiklassemodell kunne svare på? Hva ville en binær modell kunne svare på? Hva om du ønsket å avgjøre om et gitt kjøkken sannsynligvis bruker bukkehornkløver? Hva om du ville se om du, gitt en pose med stjerneanis, artisjokker, blomkål og pepperrot, kunne lage en typisk indisk rett?\n",
"\n",
"### **Hei 'klassifikator'**\n",
"\n",
"Spørsmålet vi ønsker å stille om dette kjøkkendatasettet er faktisk et **multiklasse-spørsmål**, ettersom vi har flere potensielle nasjonale kjøkken å jobbe med. Gitt en gruppe ingredienser, hvilken av disse mange klassene passer dataene inn i?\n",
"\n",
"Tidymodels tilbyr flere ulike algoritmer for å klassifisere data, avhengig av hvilken type problem du ønsker å løse. I de neste to leksjonene vil du lære om flere av disse algoritmene.\n",
"\n",
"#### **Forutsetning**\n",
"\n",
"For denne leksjonen trenger vi følgende pakker for å rense, forberede og visualisere dataene våre:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) er en [samling av R-pakker](https://www.tidyverse.org/packages) designet for å gjøre dataanalyse raskere, enklere og morsommere!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) rammeverket er en [samling av pakker](https://www.tidymodels.org/packages/) for modellering og maskinlæring.\n",
"\n",
"- `DataExplorer`: [DataExplorer-pakken](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) er ment å forenkle og automatisere EDA-prosessen og rapportgenerering.\n",
"\n",
"- `themis`: [themis-pakken](https://themis.tidymodels.org/) gir ekstra oppskritt for å håndtere ubalanserte data.\n",
"\n",
"Du kan installere dem som:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Alternativt sjekker skriptet nedenfor om du har de nødvendige pakkene for å fullføre dette modulen og installerer dem for deg hvis de mangler.\n"
],
"metadata": {
"id": "ri5bQxZ-Fz_0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load(tidyverse, tidymodels, DataExplorer, themis, here)"
],
"outputs": [],
"metadata": {
"id": "KIPxa4elGAPI"
}
},
{
"cell_type": "markdown",
"source": [
"Vi vil senere laste inn disse fantastiske pakkene og gjøre dem tilgjengelige i vår nåværende R-økt. (Dette er kun for illustrasjon, `pacman::p_load()` har allerede gjort det for deg)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Øvelse - rengjør og balanser dataene dine\n",
"\n",
"Den første oppgaven før du starter dette prosjektet, er å rengjøre og **balansere** dataene dine for å oppnå bedre resultater.\n",
"\n",
"La oss bli kjent med dataene! 🕵️\n"
],
"metadata": {
"id": "PFkQDlk0GN5O"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import data\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\r\n",
"\r\n",
"# View the first 5 rows\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {
"id": "Qccw7okxGT0S"
}
},
{
"cell_type": "markdown",
"source": [
"Interessant! Ut fra utseendet ser det ut til at den første kolonnen er en slags `id`-kolonne. La oss få litt mer informasjon om dataene.\n"
],
"metadata": {
"id": "XrWnlgSrGVmR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Basic information about the data\r\n",
"df %>%\r\n",
" introduce()\r\n",
"\r\n",
"# Visualize basic information above\r\n",
"df %>% \r\n",
" plot_intro(ggtheme = theme_light())"
],
"outputs": [],
"metadata": {
"id": "4UcGmxRxGieA"
}
},
{
"cell_type": "markdown",
"source": [
"Fra resultatet kan vi umiddelbart se at vi har `2448` rader og `385` kolonner og `0` manglende verdier. Vi har også 1 diskret kolonne, *cuisine*.\n",
"\n",
"## Øvelse - lære om matretter\n",
"\n",
"Nå begynner arbeidet å bli mer interessant. La oss utforske fordelingen av data, per matrett.\n"
],
"metadata": {
"id": "AaPubl__GmH5"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Count observations per cuisine\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(n)\r\n",
"\r\n",
"# Plot the distribution\r\n",
"theme_set(theme_light())\r\n",
"df %>% \r\n",
" count(cuisine) %>% \r\n",
" ggplot(mapping = aes(x = n, y = reorder(cuisine, -n))) +\r\n",
" geom_col(fill = \"midnightblue\", alpha = 0.7) +\r\n",
" ylab(\"cuisine\")"
],
"outputs": [],
"metadata": {
"id": "FRsBVy5eGrrv"
}
},
{
"cell_type": "markdown",
"source": [
"Det finnes et begrenset antall kjøkken, men fordelingen av data er ujevn. Det kan du fikse! Før du gjør det, utforsk litt mer.\n",
"\n",
"La oss deretter tilordne hvert kjøkken til sin egen tibble og finne ut hvor mye data som er tilgjengelig (rader, kolonner) per kjøkken.\n",
"\n",
"> En [tibble](https://tibble.tidyverse.org/) er en moderne data frame.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Kunstverk av @allison_horst</figcaption>\n"
],
"metadata": {
"id": "vVvyDb1kG2in"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create individual tibble for the cuisines\r\n",
"thai_df <- df %>% \r\n",
" filter(cuisine == \"thai\")\r\n",
"japanese_df <- df %>% \r\n",
" filter(cuisine == \"japanese\")\r\n",
"chinese_df <- df %>% \r\n",
" filter(cuisine == \"chinese\")\r\n",
"indian_df <- df %>% \r\n",
" filter(cuisine == \"indian\")\r\n",
"korean_df <- df %>% \r\n",
" filter(cuisine == \"korean\")\r\n",
"\r\n",
"\r\n",
"# Find out how much data is available per cuisine\r\n",
"cat(\" thai df:\", dim(thai_df), \"\\n\",\r\n",
" \"japanese df:\", dim(japanese_df), \"\\n\",\r\n",
" \"chinese_df:\", dim(chinese_df), \"\\n\",\r\n",
" \"indian_df:\", dim(indian_df), \"\\n\",\r\n",
" \"korean_df:\", dim(korean_df))"
],
"outputs": [],
"metadata": {
"id": "0TvXUxD3G8Bk"
}
},
{
"cell_type": "markdown",
"source": [
"## **Øvelse - Oppdage toppingredienser per kjøkken ved hjelp av dplyr**\n",
"\n",
"Nå kan du dykke dypere inn i dataene og finne ut hvilke ingredienser som er typiske for hvert kjøkken. Du bør fjerne gjentakende data som skaper forvirring mellom kjøkken, så la oss lære mer om dette problemet.\n",
"\n",
"Lag en funksjon `create_ingredient()` i R som returnerer et ingrediens-datasett. Denne funksjonen vil starte med å fjerne en unyttig kolonne og sortere ingrediensene etter antall.\n",
"\n",
"Den grunnleggende strukturen til en funksjon i R er:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"En ryddig introduksjon til R-funksjoner finner du [her](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"La oss komme i gang! Vi skal bruke [dplyr-verb](https://dplyr.tidyverse.org/) som vi har lært i tidligere leksjoner. Som en oppsummering:\n",
"\n",
"- `dplyr::select()`: hjelper deg med å velge hvilke **kolonner** du vil beholde eller ekskludere.\n",
"\n",
"- `dplyr::pivot_longer()`: hjelper deg med å \"forlenge\" data, øke antall rader og redusere antall kolonner.\n",
"\n",
"- `dplyr::group_by()` og `dplyr::summarise()`: hjelper deg med å finne sammendragsstatistikk for ulike grupper og sette dem i en oversiktlig tabell.\n",
"\n",
"- `dplyr::filter()`: lager et datasett som kun inneholder rader som oppfyller dine betingelser.\n",
"\n",
"- `dplyr::mutate()`: hjelper deg med å lage eller endre kolonner.\n",
"\n",
"Sjekk ut denne [*kunst*-fylte learnr-veiledningen](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) av Allison Horst, som introduserer noen nyttige datahåndteringsfunksjoner i dplyr *(en del av Tidyverse)*.\n"
],
"metadata": {
"id": "K3RF5bSCHC76"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Creates a functions that returns the top ingredients by class\r\n",
"\r\n",
"create_ingredient <- function(df){\r\n",
" \r\n",
" # Drop the id column which is the first colum\r\n",
" ingredient_df = df %>% select(-1) %>% \r\n",
" # Transpose data to a long format\r\n",
" pivot_longer(!cuisine, names_to = \"ingredients\", values_to = \"count\") %>% \r\n",
" # Find the top most ingredients for a particular cuisine\r\n",
" group_by(ingredients) %>% \r\n",
" summarise(n_instances = sum(count)) %>% \r\n",
" filter(n_instances != 0) %>% \r\n",
" # Arrange by descending order\r\n",
" arrange(desc(n_instances)) %>% \r\n",
" mutate(ingredients = factor(ingredients) %>% fct_inorder())\r\n",
" \r\n",
" \r\n",
" return(ingredient_df)\r\n",
"} # End of function"
],
"outputs": [],
"metadata": {
"id": "uB_0JR82HTPa"
}
},
{
"cell_type": "markdown",
"source": [
"Nå kan vi bruke funksjonen for å få en idé om de ti mest populære ingrediensene etter kjøkken. La oss teste den med `thai_df`.\n"
],
"metadata": {
"id": "h9794WF8HWmc"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Call create_ingredient and display popular ingredients\r\n",
"thai_ingredient_df <- create_ingredient(df = thai_df)\r\n",
"\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "agQ-1HrcHaEA"
}
},
{
"cell_type": "markdown",
"source": [
"I forrige seksjon brukte vi `geom_col()`, la oss se hvordan du også kan bruke `geom_bar` til å lage stolpediagrammer. Bruk `?geom_bar` for videre lesing.\n"
],
"metadata": {
"id": "kHu9ffGjHdcX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a bar chart for popular thai cuisines\r\n",
"thai_ingredient_df %>% \r\n",
" slice_head(n = 10) %>% \r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"steelblue\") +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "fb3Bx_3DHj6e"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "RHP_xgdkHnvM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Japanese cuisines and make bar chart\r\n",
"create_ingredient(df = japanese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"darkorange\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")\r\n"
],
"outputs": [],
"metadata": {
"id": "019v8F0XHrRU"
}
},
{
"cell_type": "markdown",
"source": [
"Hva med de kinesiske kjøkkenene?\n"
],
"metadata": {
"id": "iIGM7vO8Hu3v"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Chinese cuisines and make bar chart\r\n",
"create_ingredient(df = chinese_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"cyan4\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lHd9_gd2HyzU"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "ir8qyQbNH1c7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Indian cuisines and make bar chart\r\n",
"create_ingredient(df = indian_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#041E42FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "ApukQtKjH5FO"
}
},
{
"cell_type": "markdown",
"source": [],
"metadata": {
"id": "qv30cwY1H-FM"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Get popular ingredients for Korean cuisines and make bar chart\r\n",
"create_ingredient(df = korean_df) %>% \r\n",
" slice_head(n = 10) %>%\r\n",
" ggplot(aes(x = n_instances, y = ingredients)) +\r\n",
" geom_bar(stat = \"identity\", width = 0.5, fill = \"#852419FF\", alpha = 0.8) +\r\n",
" xlab(\"\") + ylab(\"\")"
],
"outputs": [],
"metadata": {
"id": "lumgk9cHIBie"
}
},
{
"cell_type": "markdown",
"source": [
"Fra datavisualiseringene kan vi nå fjerne de vanligste ingrediensene som skaper forvirring mellom ulike kjøkken, ved å bruke `dplyr::select()`.\n",
"\n",
"Alle elsker ris, hvitløk og ingefær!\n"
],
"metadata": {
"id": "iO4veMXuIEta"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Drop id column, rice, garlic and ginger from our original data set\r\n",
"df_select <- df %>% \r\n",
" select(-c(1, rice, garlic, ginger))\r\n",
"\r\n",
"# Display new data set\r\n",
"df_select %>% \r\n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "iHJPiG6rIUcK"
}
},
{
"cell_type": "markdown",
"source": [
"## Forhåndsbehandling av data med oppskrifter 👩‍🍳👨‍🍳 - Håndtering av ubalanserte data ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Kunstverk av @allison_horst</figcaption>\n",
"\n",
"Siden denne leksjonen handler om matretter, må vi sette `recipes` i kontekst.\n",
"\n",
"Tidymodels tilbyr nok en praktisk pakke: `recipes` - en pakke for forhåndsbehandling av data.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"La oss se på fordelingen av våre kjøkken igjen.\n"
],
"metadata": {
"id": "6l2ubtTPJAhY"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"old_label_count <- df_select %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"old_label_count"
],
"outputs": [],
"metadata": {
"id": "1e-E9cb7JDVi"
}
},
{
"cell_type": "markdown",
"source": [
"Som du kan se, er det en ganske ujevn fordeling i antall kjøkken. Koreanske kjøkken er nesten tre ganger så mange som thailandske kjøkken. Ubalanserte data har ofte negative effekter på modellens ytelse. Tenk på en binær klassifisering. Hvis mesteparten av dataene dine tilhører én klasse, vil en ML-modell ofte forutsi denne klassen oftere, bare fordi det finnes mer data for den. Å balansere dataene tar skjevheten i datasettet og bidrar til å fjerne denne ubalansen. Mange modeller presterer best når antall 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`, f.eks. ved bruk av en SMOTE-algoritme\n",
"\n",
"- fjerne observasjoner fra majoritetsklassen: `Under-sampling`\n",
"\n",
"La oss nå demonstrere hvordan man kan håndtere ubalanserte datasett ved hjelp av en `recipe`. En recipe kan sees på som en oppskrift som beskriver hvilke steg som skal brukes på et datasett for å gjøre det klart for dataanalyse.\n"
],
"metadata": {
"id": "soAw6826JKx9"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load themis package for dealing with imbalanced data\r\n",
"library(themis)\r\n",
"\r\n",
"# Create a recipe for preprocessing data\r\n",
"cuisines_recipe <- recipe(cuisine ~ ., data = df_select) %>% \r\n",
" step_smote(cuisine)\r\n",
"\r\n",
"cuisines_recipe"
],
"outputs": [],
"metadata": {
"id": "HS41brUIJVJy"
}
},
{
"cell_type": "markdown",
"source": [
"La oss bryte ned våre forhåndsprosesseringssteg.\n",
"\n",
"- Kallet til `recipe()` med en formel forteller oppskriften *rollene* til variablene ved å bruke `df_select`-data som referanse. For eksempel har `cuisine`-kolonnen blitt tildelt rollen som `outcome`, mens de andre kolonnene har blitt tildelt rollen som `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) lager en *spesifikasjon* av et oppskriftssteg som syntetisk genererer nye eksempler av minoritetsklassen ved hjelp av nærmeste naboer til disse tilfellene.\n",
"\n",
"Nå, hvis vi ønsket å se de forhåndsprosesserte dataene, måtte vi [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) og [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) oppskriften vår.\n",
"\n",
"`prep()`: estimerer de nødvendige parameterne fra et treningssett som senere kan brukes på andre datasett.\n",
"\n",
"`bake()`: tar en ferdigbehandlet oppskrift og anvender operasjonene på et hvilket som helst datasett.\n"
],
"metadata": {
"id": "Yb-7t7XcJaC8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep and bake the recipe\r\n",
"preprocessed_df <- cuisines_recipe %>% \r\n",
" prep() %>% \r\n",
" bake(new_data = NULL) %>% \r\n",
" relocate(cuisine)\r\n",
"\r\n",
"# Display data\r\n",
"preprocessed_df %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"# Quick summary stats\r\n",
"preprocessed_df %>% \r\n",
" introduce()"
],
"outputs": [],
"metadata": {
"id": "9QhSgdpxJl44"
}
},
{
"cell_type": "markdown",
"source": [
"La oss nå sjekke fordelingen av våre kjøkken og sammenligne dem med de ubalanserte dataene.\n"
],
"metadata": {
"id": "dmidELh_LdV7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Distribution of cuisines\r\n",
"new_label_count <- preprocessed_df %>% \r\n",
" count(cuisine) %>% \r\n",
" arrange(desc(n))\r\n",
"\r\n",
"list(new_label_count = new_label_count,\r\n",
" old_label_count = old_label_count)"
],
"outputs": [],
"metadata": {
"id": "aSh23klBLwDz"
}
},
{
"cell_type": "markdown",
"source": [
"Nam! Dataen er fin og ren, balansert, og veldig deilig 😋!\n",
"\n",
"> Vanligvis brukes en oppskrift som en forprosessering for modellering, hvor den definerer hvilke steg som skal brukes på et datasett for å gjøre det klart for modellering. I så fall brukes vanligvis en `workflow()` (som vi allerede har sett i tidligere leksjoner) i stedet for å manuelt estimere en oppskrift.\n",
">\n",
"> Derfor trenger du vanligvis ikke å **`prep()`** og **`bake()`** oppskrifter når du bruker tidymodels, men de er nyttige funksjoner å ha i verktøykassen for å bekrefte at oppskriftene gjør det du forventer, som i vårt tilfelle.\n",
">\n",
"> Når du **`bake()`** en forberedt oppskrift med **`new_data = NULL`**, får du tilbake dataene du ga da du definerte oppskriften, men med de forprosesseringstrinnene som er utført.\n",
"\n",
"La oss nå lagre en kopi av disse dataene for bruk i fremtidige leksjoner:\n"
],
"metadata": {
"id": "HEu80HZ8L7ae"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Save preprocessed data\r\n",
"write_csv(preprocessed_df, \"../../../data/cleaned_cuisines_R.csv\")"
],
"outputs": [],
"metadata": {
"id": "cBmCbIgrMOI6"
}
},
{
"cell_type": "markdown",
"source": [
"Denne nye CSV-filen kan nå finnes i rotmappen for data.\n",
"\n",
"**🚀Utfordring**\n",
"\n",
"Denne læreplanen inneholder flere interessante datasett. Gå gjennom `data`-mappene og se om noen inneholder datasett som kan være egnet for binær eller flervalgsklassifisering. Hvilke spørsmål ville du stille til dette datasettet?\n",
"\n",
"## [**Quiz etter forelesning**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Gjennomgang og selvstudium**\n",
"\n",
"- Sjekk ut [pakken themis](https://github.com/tidymodels/themis). Hvilke andre teknikker kan vi bruke for å håndtere ubalanserte data?\n",
"\n",
"- Tidy models [referansenettsted](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham og G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\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 å ha laget den originale Python-versjonen av denne modulen ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Kunstverk av @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"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"
]
}
]
}