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

727 lines
28 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-06T14:57:53+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "sv"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Bygg en klassificeringsmodell: Utsökta asiatiska och indiska rätter\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Introduktion till klassificering: Rensa, förbered och visualisera din data\n",
"\n",
"I dessa fyra lektioner kommer du att utforska ett grundläggande fokus inom klassisk maskininlärning - *klassificering*. Vi kommer att gå igenom hur man använder olika klassificeringsalgoritmer med en dataset om alla de fantastiska köken i Asien och Indien. Hoppas du är hungrig!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Fira pan-asiatiska kök i dessa lektioner! Bild av Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Fira pan-asiatiska kök i dessa lektioner! Bild av Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"Klassificering är en form av [övervakad inlärning](https://wikipedia.org/wiki/Supervised_learning) som har mycket gemensamt med regressionstekniker. Vid klassificering tränar du en modell för att förutsäga vilken `kategori` ett objekt tillhör. Om maskininlärning handlar om att förutsäga värden eller namn på saker med hjälp av datasets, så faller klassificering generellt sett in i två grupper: *binär klassificering* och *multiklassklassificering*.\n",
"\n",
"Kom ihåg:\n",
"\n",
"- **Linjär regression** hjälpte dig att förutsäga relationer mellan variabler och göra exakta förutsägelser om var en ny datapunkt skulle hamna i förhållande till den linjen. Så du kunde förutsäga numeriska värden, som *vad priset på en pumpa skulle vara i september jämfört med december*, till exempel.\n",
"\n",
"- **Logistisk regression** hjälpte dig att upptäcka \"binära kategorier\": vid denna prisnivå, *är denna pumpa orange eller inte-orange*?\n",
"\n",
"Klassificering använder olika algoritmer för att avgöra andra sätt att bestämma en datapunkts etikett eller klass. Låt oss arbeta med denna matlagningsdata för att se om vi, genom att observera en grupp ingredienser, kan avgöra dess ursprungskök.\n",
"\n",
"### [**Quiz före föreläsningen**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Introduktion**\n",
"\n",
"Klassificering är en av de grundläggande aktiviteterna för forskare inom maskininlärning och dataanalytiker. Från grundläggande klassificering av ett binärt värde (\"är detta e-postmeddelande skräppost eller inte?\") till komplex bildklassificering och segmentering med hjälp av datorseende, är det alltid användbart att kunna sortera data i klasser och ställa frågor om den.\n",
"\n",
"För att uttrycka processen på ett mer vetenskapligt sätt skapar din klassificeringsmetod en prediktiv modell som gör det möjligt att kartlägga relationen mellan indata och utdata.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Binära vs. multiklassproblem för klassificeringsalgoritmer att hantera. Infografik av Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"Innan vi börjar processen med att rensa vår data, visualisera den och förbereda den för våra ML-uppgifter, låt oss lära oss lite om de olika sätt som maskininlärning kan användas för att klassificera data.\n",
"\n",
"Härledd från [statistik](https://wikipedia.org/wiki/Statistical_classification), klassificering med klassisk maskininlärning använder egenskaper, såsom `rökare`, `vikt` och `ålder` för att avgöra *sannolikheten att utveckla X sjukdom*. Som en övervakad inlärningsteknik liknande de regressionsexempel du utförde tidigare, är din data märkt och ML-algoritmerna använder dessa etiketter för att klassificera och förutsäga klasser (eller 'egenskaper') i en dataset och tilldela dem till en grupp eller ett resultat.\n",
"\n",
"✅ Ta en stund och föreställ dig en dataset om matlagning. Vad skulle en multiklassmodell kunna svara på? Vad skulle en binär modell kunna svara på? Vad händer om du ville avgöra om ett visst kök sannolikt använder bockhornsklöver? Vad händer om du ville se om du, med en present av en matkasse full av stjärnanis, kronärtskockor, blomkål och pepparrot, kunde skapa en typisk indisk maträtt?\n",
"\n",
"### **Hej 'klassificerare'**\n",
"\n",
"Frågan vi vill ställa om denna matlagningsdataset är faktiskt en **multiklassfråga**, eftersom vi har flera potentiella nationella kök att arbeta med. Givet en grupp ingredienser, vilken av dessa många klasser passar datan in i?\n",
"\n",
"Tidymodels erbjuder flera olika algoritmer att använda för att klassificera data, beroende på vilken typ av problem du vill lösa. Under de kommande två lektionerna kommer du att lära dig om flera av dessa algoritmer.\n",
"\n",
"#### **Förkunskaper**\n",
"\n",
"För denna lektion behöver vi följande paket för att rensa, förbereda och visualisera vår data:\n",
"\n",
"- `tidyverse`: [tidyverse](https://www.tidyverse.org/) är en [samling av R-paket](https://www.tidyverse.org/packages) designade för att göra dataanalys snabbare, enklare och roligare!\n",
"\n",
"- `tidymodels`: [tidymodels](https://www.tidymodels.org/) är ett [ramverk av paket](https://www.tidymodels.org/packages/) för modellering och maskininlärning.\n",
"\n",
"- `DataExplorer`: [DataExplorer-paketet](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) är avsett att förenkla och automatisera EDA-processen och rapportgenerering.\n",
"\n",
"- `themis`: [themis-paketet](https://themis.tidymodels.org/) erbjuder extra receptsteg för att hantera obalanserad data.\n",
"\n",
"Du kan installera dem med:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Alternativt kontrollerar skriptet nedan om du har de paket som krävs för att slutföra denna modul och installerar dem åt dig om de saknas.\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 kommer senare att ladda dessa fantastiska paket och göra dem tillgängliga i vår nuvarande R-session. (Detta är bara för illustration, `pacman::p_load()` har redan gjort det åt dig)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Övning - rensa och balansera din data\n",
"\n",
"Den första uppgiften, innan du börjar med detta projekt, är att rensa och **balansera** din data för att få bättre resultat.\n",
"\n",
"Låt oss bekanta oss med datan!🕵️\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": [
"Intressant! Det verkar som att den första kolumnen är en slags `id`-kolumn. Låt oss ta reda på lite mer information om data.\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": [
"Från resultatet kan vi direkt se att vi har `2448` rader och `385` kolumner samt `0` saknade värden. Vi har också 1 diskret kolumn, *cuisine*.\n",
"\n",
"## Övning - lära känna kökstyper\n",
"\n",
"Nu börjar arbetet bli mer intressant. Låt oss utforska datafördelningen per kökstyp.\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 finns ett begränsat antal kök, men fördelningen av data är ojämn. Du kan fixa det! Utforska lite mer innan du gör det.\n",
"\n",
"Låt oss nu tilldela varje kök till sin egen tibble och ta reda på hur mycket data som finns tillgängligt (rader, kolumner) per kök.\n",
"\n",
"> En [tibble](https://tibble.tidyverse.org/) är en modern dataram.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Konstverk 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": [
"## **Övning - Upptäcka toppingredienser per kök med hjälp av dplyr**\n",
"\n",
"Nu kan du gräva djupare i datan och ta reda på vilka som är de typiska ingredienserna för varje kök. Du bör rensa bort återkommande data som skapar förvirring mellan köken, så låt oss lära oss mer om detta problem.\n",
"\n",
"Skapa en funktion `create_ingredient()` i R som returnerar en ingrediens-dataram. Denna funktion börjar med att ta bort en oanvändbar kolumn och sortera ingredienser baserat på deras antal.\n",
"\n",
"Den grundläggande strukturen för en funktion i R är:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"En enkel introduktion till R-funktioner finns [här](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Låt oss sätta igång! Vi kommer att använda [dplyr-verb](https://dplyr.tidyverse.org/) som vi har lärt oss i våra tidigare lektioner. Som en sammanfattning:\n",
"\n",
"- `dplyr::select()`: hjälper dig att välja vilka **kolumner** du vill behålla eller utesluta.\n",
"\n",
"- `dplyr::pivot_longer()`: hjälper dig att \"förlänga\" data, vilket ökar antalet rader och minskar antalet kolumner.\n",
"\n",
"- `dplyr::group_by()` och `dplyr::summarise()`: hjälper dig att hitta sammanfattande statistik för olika grupper och presentera dem i en snygg tabell.\n",
"\n",
"- `dplyr::filter()`: skapar en delmängd av datan som endast innehåller rader som uppfyller dina villkor.\n",
"\n",
"- `dplyr::mutate()`: hjälper dig att skapa eller ändra kolumner.\n",
"\n",
"Kolla in denna [*konst*-fyllda learnr-tutorial](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) av Allison Horst, som introducerar några användbara datahanteringsfunktioner 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": [
"Nu kan vi använda funktionen för att få en uppfattning om de tio mest populära ingredienserna per kök. Låt oss testa 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 föregående avsnitt använde vi `geom_col()`, låt oss se hur du också kan använda `geom_bar` för att skapa stapeldiagram. Använd `?geom_bar` för vidare läsning.\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": [
"Låt oss göra samma sak för de japanska uppgifterna\n"
],
"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": [
"Vad sägs om de kinesiska köken?\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": [
"Slutligen, plotta de koreanska ingredienserna.\n"
],
"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": [
"Från datavisualiseringarna kan vi nu ta bort de vanligaste ingredienserna som skapar förvirring mellan olika kök, med hjälp av `dplyr::select()`.\n",
"\n",
"Alla älskar ris, vitlök och ingefära!\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": [
"## Förbehandling av data med recept 👩‍🍳👨‍🍳 - Hantera obalanserad data ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Konstverk av @allison_horst</figcaption>\n",
"\n",
"Eftersom den här lektionen handlar om kök, måste vi sätta `recept` i rätt sammanhang.\n",
"\n",
"Tidymodels erbjuder ännu ett smidigt paket: `recipes` - ett paket för förbehandling av data.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Låt oss titta på fördelningen av våra kök igen.\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, finns det en ganska ojämn fördelning i antalet kök. Koreanska kök är nästan tre gånger fler än thailändska kök. Obalanserad data har ofta negativa effekter på modellens prestanda. Tänk på en binär klassificering. Om majoriteten av din data tillhör en klass, kommer en ML-modell att förutsäga den klassen oftare, bara för att det finns mer data för den. Att balansera data tar bort snedvridningar och hjälper till att eliminera denna obalans. Många modeller presterar bäst när antalet observationer är lika och har därför svårt med obalanserad data.\n",
"\n",
"Det finns huvudsakligen två sätt att hantera obalanserade datasätt:\n",
"\n",
"- lägga till observationer till minoritetsklassen: `Över-sampling`, t.ex. med hjälp av en SMOTE-algoritm\n",
"\n",
"- ta bort observationer från majoritetsklassen: `Under-sampling`\n",
"\n",
"Låt oss nu demonstrera hur man hanterar obalanserade datasätt med hjälp av ett `recept`. Ett recept kan ses som en ritning som beskriver vilka steg som ska tillämpas på ett datasätt för att göra det redo för dataanalys.\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": [
"Låt oss gå igenom våra förbehandlingssteg.\n",
"\n",
"- Anropet till `recipe()` med en formel talar om för receptet vilka *roller* variablerna har, med hjälp av `df_select`-data som referens. Till exempel har kolumnen `cuisine` tilldelats rollen `outcome`, medan resten av kolumnerna har tilldelats rollen `predictor`.\n",
"\n",
"- [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) skapar en *specifikation* för ett receptsteg som syntetiskt genererar nya exempel för minoritetsklassen med hjälp av närmaste grannar till dessa fall.\n",
"\n",
"Nu, om vi vill se den förbehandlade datan, måste vi [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) och [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) vårt recept.\n",
"\n",
"`prep()`: uppskattar de nödvändiga parametrarna från en träningsuppsättning som senare kan tillämpas på andra dataset.\n",
"\n",
"`bake()`: tar ett förberett recept och tillämpar operationerna på valfritt dataset.\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": [
"Låt oss nu kontrollera fördelningen av våra kök och jämföra dem med den obalanserade datan.\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": [
"Mums! Datan är ren, balanserad och väldigt läcker 😋!\n",
"\n",
"> Vanligtvis används ett recept som en förprocessor för modellering där det definierar vilka steg som ska tillämpas på en dataset för att göra den redo för modellering. I sådana fall används vanligtvis en `workflow()` (som vi redan har sett i våra tidigare lektioner) istället för att manuellt uppskatta ett recept.\n",
">\n",
"> Därför behöver du vanligtvis inte **`prep()`** och **`bake()`** recept när du använder tidymodels, men de är användbara funktioner att ha i din verktygslåda för att bekräfta att recepten gör det du förväntar dig, som i vårt fall.\n",
">\n",
"> När du **`bake()`** ett förberett recept med **`new_data = NULL`**, får du tillbaka den data som du angav när du definierade receptet, men som har genomgått förbearbetningsstegen.\n",
"\n",
"Låt oss nu spara en kopia av denna data för användning i framtida lektioner:\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": [
"Denna nya CSV-fil finns nu i rotmappen för data.\n",
"\n",
"**🚀Utmaning**\n",
"\n",
"Detta kursmaterial innehåller flera intressanta dataset. Gå igenom `data`-mapparna och se om någon innehåller dataset som skulle passa för binär eller multi-klassklassificering? Vilka frågor skulle du ställa till detta dataset?\n",
"\n",
"## [**Quiz efter föreläsningen**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Granskning & Självstudier**\n",
"\n",
"- Kolla in [paketet themis](https://github.com/tidymodels/themis). Vilka andra tekniker kan vi använda för att hantera obalanserad data?\n",
"\n",
"- Tidy models [referenswebbplats](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham och G. Grolemund, [*R för Data Science: Visualisera, Modellera, Transformera, Städa och Importera Data*](https://r4ds.had.co.nz/).\n",
"\n",
"#### TACK TILL:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) för att ha skapat de fantastiska illustrationerna som gör R mer välkomnande och engagerande. Hitta fler illustrationer 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) och [Jen Looper](https://www.twitter.com/jenlooper) för att ha skapat den ursprungliga Python-versionen av denna modul ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Konstverk av @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Ansvarsfriskrivning**: \nDetta dokument har översatts med hjälp av AI-översättningstjänsten [Co-op Translator](https://github.com/Azure/co-op-translator). Även om vi strävar efter noggrannhet, vänligen notera att automatiska översättningar kan innehålla fel eller felaktigheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.\n"
]
}
]
}