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

727 lines
39 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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-04T08:53:25+00:00",
"source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb",
"language_code": "el"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# Δημιουργήστε ένα μοντέλο ταξινόμησης: Νόστιμες Ασιατικές και Ινδικές Κουζίνες\n"
],
"metadata": {
"id": "ItETB4tSFprR"
}
},
{
"cell_type": "markdown",
"source": [
"## Εισαγωγή στην ταξινόμηση: Καθαρισμός, προετοιμασία και οπτικοποίηση δεδομένων\n",
"\n",
"Σε αυτά τα τέσσερα μαθήματα, θα εξερευνήσετε μια βασική πτυχή της κλασικής μηχανικής μάθησης - *την ταξινόμηση*. Θα δούμε πώς να χρησιμοποιούμε διάφορους αλγορίθμους ταξινόμησης με ένα σύνολο δεδομένων που αφορά όλες τις υπέροχες κουζίνες της Ασίας και της Ινδίας. Ελπίζω να πεινάτε!\n",
"\n",
"<p >\n",
" <img src=\"../../images/pinch.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Γιορτάστε τις πανασιατικές κουζίνες σε αυτά τα μαθήματα! Εικόνα από την Jen Looper</figcaption>\n",
"\n",
"\n",
"<!--![Γιορτάστε τις πανασιατικές κουζίνες σε αυτά τα μαθήματα! Εικόνα από την Jen Looper](../../../../../../4-Classification/1-Introduction/solution/R/images/pinch.png)-->\n",
"\n",
"Η ταξινόμηση είναι μια μορφή [επιβλεπόμενης μάθησης](https://wikipedia.org/wiki/Supervised_learning) που έχει πολλά κοινά με τις τεχνικές παλινδρόμησης. Στην ταξινόμηση, εκπαιδεύετε ένα μοντέλο για να προβλέψει σε ποια `κατηγορία` ανήκει ένα αντικείμενο. Αν η μηχανική μάθηση αφορά την πρόβλεψη τιμών ή ονομάτων χρησιμοποιώντας σύνολα δεδομένων, τότε η ταξινόμηση γενικά χωρίζεται σε δύο ομάδες: *δυαδική ταξινόμηση* και *πολυκατηγορική ταξινόμηση*.\n",
"\n",
"Θυμηθείτε:\n",
"\n",
"- **Η γραμμική παλινδρόμηση** σας βοήθησε να προβλέψετε σχέσεις μεταξύ μεταβλητών και να κάνετε ακριβείς προβλέψεις για το πού θα πέσει ένα νέο σημείο δεδομένων σε σχέση με αυτή τη γραμμή. Για παράδειγμα, θα μπορούσατε να προβλέψετε αριθμητικές τιμές όπως *ποια θα είναι η τιμή μιας κολοκύθας τον Σεπτέμβριο σε σύγκριση με τον Δεκέμβριο*.\n",
"\n",
"- **Η λογιστική παλινδρόμηση** σας βοήθησε να ανακαλύψετε \"δυαδικές κατηγορίες\": σε αυτό το σημείο τιμής, *είναι αυτή η κολοκύθα πορτοκαλί ή όχι-πορτοκαλί*;\n",
"\n",
"Η ταξινόμηση χρησιμοποιεί διάφορους αλγορίθμους για να καθορίσει άλλους τρόπους προσδιορισμού της ετικέτας ή της κατηγορίας ενός σημείου δεδομένων. Ας δουλέψουμε με αυτά τα δεδομένα κουζίνας για να δούμε αν, παρατηρώντας μια ομάδα συστατικών, μπορούμε να προσδιορίσουμε την κουζίνα προέλευσής τους.\n",
"\n",
"### [**Κουίζ πριν το μάθημα**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)\n",
"\n",
"### **Εισαγωγή**\n",
"\n",
"Η ταξινόμηση είναι μία από τις βασικές δραστηριότητες του ερευνητή μηχανικής μάθησης και του επιστήμονα δεδομένων. Από τη βασική ταξινόμηση μιας δυαδικής τιμής (\"είναι αυτό το email ανεπιθύμητο ή όχι;\"), μέχρι την πολύπλοκη ταξινόμηση και τμηματοποίηση εικόνων χρησιμοποιώντας υπολογιστική όραση, είναι πάντα χρήσιμο να μπορούμε να ταξινομούμε δεδομένα σε κατηγορίες και να θέτουμε ερωτήματα σχετικά με αυτά.\n",
"\n",
"Για να διατυπώσουμε τη διαδικασία με πιο επιστημονικό τρόπο, η μέθοδος ταξινόμησής σας δημιουργεί ένα προγνωστικό μοντέλο που σας επιτρέπει να χαρτογραφήσετε τη σχέση μεταξύ των εισόδων και των εξόδων.\n",
"\n",
"<p >\n",
" <img src=\"../../images/binary-multiclass.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Δυαδικά έναντι πολυκατηγορικών προβλημάτων για αλγορίθμους ταξινόμησης. Γράφημα από την Jen Looper</figcaption>\n",
"\n",
"\n",
"\n",
"Πριν ξεκινήσουμε τη διαδικασία καθαρισμού των δεδομένων μας, την οπτικοποίησή τους και την προετοιμασία τους για τις εργασίες μηχανικής μάθησης, ας μάθουμε λίγα πράγματα για τους διάφορους τρόπους με τους οποίους η μηχανική μάθηση μπορεί να χρησιμοποιηθεί για την ταξινόμηση δεδομένων.\n",
"\n",
"Προερχόμενη από [στατιστική](https://wikipedia.org/wiki/Statistical_classification), η ταξινόμηση χρησιμοποιώντας κλασική μηχανική μάθηση χρησιμοποιεί χαρακτηριστικά, όπως `καπνιστής`, `βάρος` και `ηλικία` για να καθορίσει *την πιθανότητα ανάπτυξης Χ ασθένειας*. Ως τεχνική επιβλεπόμενης μάθησης, παρόμοια με τις ασκήσεις παλινδρόμησης που κάνατε νωρίτερα, τα δεδομένα σας είναι επισημασμένα και οι αλγόριθμοι μηχανικής μάθησης χρησιμοποιούν αυτές τις ετικέτες για να ταξινομήσουν και να προβλέψουν κατηγορίες (ή 'χαρακτηριστικά') ενός συνόλου δεδομένων και να τα αναθέσουν σε μια ομάδα ή αποτέλεσμα.\n",
"\n",
"✅ Αφιερώστε λίγο χρόνο για να φανταστείτε ένα σύνολο δεδομένων για κουζίνες. Τι θα μπορούσε να απαντήσει ένα πολυκατηγορικό μοντέλο; Τι θα μπορούσε να απαντήσει ένα δυαδικό μοντέλο; Τι θα γινόταν αν θέλατε να προσδιορίσετε αν μια δεδομένη κουζίνα είναι πιθανό να χρησιμοποιεί τριγωνέλλα; Τι θα γινόταν αν θέλατε να δείτε αν, δεδομένου ενός δώρου με μια σακούλα παντοπωλείου γεμάτη με αστεροειδή γλυκάνισο, αγκινάρες, κουνουπίδι και χρένο, θα μπορούσατε να δημιουργήσετε ένα τυπικό ινδικό πιάτο;\n",
"\n",
"### **Γεια σου 'ταξινομητή'**\n",
"\n",
"Η ερώτηση που θέλουμε να κάνουμε για αυτό το σύνολο δεδομένων κουζίνας είναι στην πραγματικότητα μια **πολυκατηγορική ερώτηση**, καθώς έχουμε πολλές πιθανές εθνικές κουζίνες για να δουλέψουμε. Δεδομένης μιας ομάδας συστατικών, σε ποια από αυτές τις πολλές κατηγορίες θα ανήκουν τα δεδομένα;\n",
"\n",
"Το Tidymodels προσφέρει διάφορους αλγορίθμους για την ταξινόμηση δεδομένων, ανάλογα με το είδος του προβλήματος που θέλετε να λύσετε. Στα επόμενα δύο μαθήματα, θα μάθετε για αρκετούς από αυτούς τους αλγορίθμους.\n",
"\n",
"#### **Προαπαιτούμενα**\n",
"\n",
"Για αυτό το μάθημα, θα χρειαστούμε τα παρακάτω πακέτα για να καθαρίσουμε, να προετοιμάσουμε και να οπτικοποιήσουμε τα δεδομένα μας:\n",
"\n",
"- `tidyverse`: Το [tidyverse](https://www.tidyverse.org/) είναι μια [συλλογή πακέτων R](https://www.tidyverse.org/packages) που έχει σχεδιαστεί για να κάνει την επιστήμη δεδομένων ταχύτερη, ευκολότερη και πιο διασκεδαστική!\n",
"\n",
"- `tidymodels`: Το [tidymodels](https://www.tidymodels.org/) είναι ένα [πλαίσιο συλλογής πακέτων](https://www.tidymodels.org/packages/) για μοντελοποίηση και μηχανική μάθηση.\n",
"\n",
"- `DataExplorer`: Το [πακέτο DataExplorer](https://cran.r-project.org/web/packages/DataExplorer/vignettes/dataexplorer-intro.html) έχει σχεδιαστεί για να απλοποιεί και να αυτοματοποιεί τη διαδικασία Εξερευνητικής Ανάλυσης Δεδομένων (EDA) και τη δημιουργία αναφορών.\n",
"\n",
"- `themis`: Το [πακέτο themis](https://themis.tidymodels.org/) παρέχει επιπλέον βήματα συνταγών για την αντιμετώπιση μη ισορροπημένων δεδομένων.\n",
"\n",
"Μπορείτε να τα εγκαταστήσετε ως εξής:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"DataExplorer\", \"here\"))`\n",
"\n",
"Εναλλακτικά, το παρακάτω σενάριο ελέγχει αν έχετε τα πακέτα που απαιτούνται για την ολοκλήρωση αυτής της ενότητας και τα εγκαθιστά για εσάς σε περίπτωση που λείπουν.\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": [
"Αργότερα θα φορτώσουμε αυτά τα καταπληκτικά πακέτα και θα τα κάνουμε διαθέσιμα στην τρέχουσα συνεδρία R. (Αυτό είναι απλώς για παράδειγμα, το `pacman::p_load()` το έχει ήδη κάνει για εσάς)\n"
],
"metadata": {
"id": "YkKAxOJvGD4C"
}
},
{
"cell_type": "markdown",
"source": [
"## Άσκηση - καθαρίστε και ισορροπήστε τα δεδομένα σας\n",
"\n",
"Η πρώτη εργασία που πρέπει να κάνετε, πριν ξεκινήσετε αυτό το έργο, είναι να καθαρίσετε και να **ισορροπήσετε** τα δεδομένα σας για να έχετε καλύτερα αποτελέσματα.\n",
"\n",
"Ας γνωρίσουμε τα δεδομένα!🕵️\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": [
"Ενδιαφέρον! Από ό,τι φαίνεται, η πρώτη στήλη είναι ένα είδος στήλης `id`. Ας πάρουμε λίγες περισσότερες πληροφορίες για τα δεδομένα.\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": [
"Από τα αποτελέσματα, μπορούμε να δούμε αμέσως ότι έχουμε `2448` σειρές και `385` στήλες και `0` ελλείποντα δεδομένα. Έχουμε επίσης 1 διακριτή στήλη, *cuisine*.\n",
"\n",
"## Άσκηση - μαθαίνοντας για τις κουζίνες\n",
"\n",
"Τώρα η εργασία αρχίζει να γίνεται πιο ενδιαφέρουσα. Ας ανακαλύψουμε την κατανομή των δεδομένων, ανά κουζίνα.\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": [
"Υπάρχουν πεπερασμένος αριθμός κουζινών, αλλά η κατανομή των δεδομένων είναι άνιση. Μπορείς να το διορθώσεις! Πριν το κάνεις, εξερεύνησε λίγο περισσότερο.\n",
"\n",
"Στη συνέχεια, ας αντιστοιχίσουμε κάθε κουζίνα στο δικό της tibble και ας δούμε πόσα δεδομένα είναι διαθέσιμα (γραμμές, στήλες) ανά κουζίνα.\n",
"\n",
"> Ένα [tibble](https://tibble.tidyverse.org/) είναι ένα σύγχρονο πλαίσιο δεδομένων.\n",
"\n",
"<p >\n",
" <img src=\"../../images/dplyr_filter.jpg\"\n",
" width=\"600\"/>\n",
" <figcaption>Έργο τέχνης από @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": [
"## **Άσκηση - Ανακάλυψη κορυφαίων συστατικών ανά κουζίνα χρησιμοποιώντας dplyr**\n",
"\n",
"Τώρα μπορείτε να εμβαθύνετε στα δεδομένα και να μάθετε ποια είναι τα τυπικά συστατικά ανά κουζίνα. Θα πρέπει να καθαρίσετε επαναλαμβανόμενα δεδομένα που δημιουργούν σύγχυση μεταξύ των κουζινών, οπότε ας μάθουμε για αυτό το πρόβλημα.\n",
"\n",
"Δημιουργήστε μια συνάρτηση `create_ingredient()` στη γλώσσα R που επιστρέφει ένα dataframe συστατικών. Αυτή η συνάρτηση θα ξεκινήσει αφαιρώντας μια μη χρήσιμη στήλη και θα ταξινομήσει τα συστατικά με βάση την καταμέτρησή τους.\n",
"\n",
"Η βασική δομή μιας συνάρτησης στη R είναι:\n",
"\n",
"`myFunction <- function(arglist){`\n",
"\n",
"**`...`**\n",
"\n",
"**`return`**`(value)`\n",
"\n",
"`}`\n",
"\n",
"Μια περιεκτική εισαγωγή στις συναρτήσεις της R μπορείτε να βρείτε [εδώ](https://skirmer.github.io/presentations/functions_with_r.html#1).\n",
"\n",
"Ας ξεκινήσουμε! Θα χρησιμοποιήσουμε [dplyr verbs](https://dplyr.tidyverse.org/) που έχουμε μάθει στα προηγούμενα μαθήματα. Ως υπενθύμιση:\n",
"\n",
"- `dplyr::select()`: σας βοηθά να επιλέξετε ποιες **στήλες** να κρατήσετε ή να αποκλείσετε.\n",
"\n",
"- `dplyr::pivot_longer()`: σας βοηθά να \"επεκτείνετε\" τα δεδομένα, αυξάνοντας τον αριθμό των γραμμών και μειώνοντας τον αριθμό των στηλών.\n",
"\n",
"- `dplyr::group_by()` και `dplyr::summarise()`: σας βοηθούν να βρείτε στατιστικά στοιχεία για διαφορετικές ομάδες και να τα παρουσιάσετε σε έναν ωραίο πίνακα.\n",
"\n",
"- `dplyr::filter()`: δημιουργεί ένα υποσύνολο των δεδομένων που περιέχει μόνο γραμμές που ικανοποιούν τις συνθήκες σας.\n",
"\n",
"- `dplyr::mutate()`: σας βοηθά να δημιουργήσετε ή να τροποποιήσετε στήλες.\n",
"\n",
"Δείτε αυτό το [*art*-γεμάτο learnr tutorial](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) από την Allison Horst, που εισάγει μερικές χρήσιμες συναρτήσεις επεξεργασίας δεδομένων στο dplyr *(μέρος του 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": [
"Τώρα μπορούμε να χρησιμοποιήσουμε τη συνάρτηση για να πάρουμε μια ιδέα για τα δέκα πιο δημοφιλή συστατικά ανά κουζίνα. Ας τη δοκιμάσουμε με το `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": [
"Στην προηγούμενη ενότητα, χρησιμοποιήσαμε `geom_col()`, ας δούμε πώς μπορείτε να χρησιμοποιήσετε και το `geom_bar` για να δημιουργήσετε ραβδογράμματα. Χρησιμοποιήστε το `?geom_bar` για περαιτέρω ανάγνωση.\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": [
"Ας κάνουμε το ίδιο για τα ιαπωνικά δεδομένα\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": [
"Τι γίνεται με την κινέζικη κουζίνα;\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": [
"Τέλος, σχεδιάστε τα κορεατικά συστατικά.\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": [
"Από τις απεικονίσεις δεδομένων, μπορούμε τώρα να αφαιρέσουμε τα πιο κοινά συστατικά που προκαλούν σύγχυση μεταξύ διαφορετικών κουζινών, χρησιμοποιώντας `dplyr::select()`.\n",
"\n",
"Όλοι αγαπούν το ρύζι, το σκόρδο και το τζίντζερ!\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": [
"## Προεπεξεργασία δεδομένων με συνταγές 👩‍🍳👨‍🍳 - Αντιμετώπιση μη ισορροπημένων δεδομένων ⚖️\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Έργο τέχνης από @allison_horst</figcaption>\n",
"\n",
"Δεδομένου ότι αυτό το μάθημα αφορά κουζίνες, πρέπει να βάλουμε τις `συνταγές` στο σωστό πλαίσιο.\n",
"\n",
"Το Tidymodels προσφέρει ένα ακόμη χρήσιμο πακέτο: το `recipes` - ένα πακέτο για την προεπεξεργασία δεδομένων.\n"
],
"metadata": {
"id": "kkFd-JxdIaL6"
}
},
{
"cell_type": "markdown",
"source": [
"Ας ρίξουμε μια ματιά ξανά στην κατανομή των κουζινών μας.\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": [
"Όπως μπορείτε να δείτε, υπάρχει αρκετά άνιση κατανομή στον αριθμό των κουζινών. Οι κορεάτικες κουζίνες είναι σχεδόν τρεις φορές περισσότερες από τις ταϊλανδέζικες κουζίνες. Τα μη ισορροπημένα δεδομένα συχνά έχουν αρνητικές επιπτώσεις στην απόδοση του μοντέλου. Σκεφτείτε μια δυαδική ταξινόμηση. Εάν τα περισσότερα από τα δεδομένα σας ανήκουν σε μία κατηγορία, ένα μοντέλο μηχανικής μάθησης θα προβλέπει αυτήν την κατηγορία πιο συχνά, απλώς επειδή υπάρχουν περισσότερα δεδομένα για αυτήν. Η εξισορρόπηση των δεδομένων διορθώνει οποιαδήποτε ανισορροπία και βοηθά στην απομάκρυνση αυτής της ασυμμετρίας. Πολλά μοντέλα αποδίδουν καλύτερα όταν ο αριθμός των παρατηρήσεων είναι ίσος και, επομένως, δυσκολεύονται με μη ισορροπημένα δεδομένα.\n",
"\n",
"Υπάρχουν κυρίως δύο τρόποι αντιμετώπισης μη ισορροπημένων συνόλων δεδομένων:\n",
"\n",
"- προσθήκη παρατηρήσεων στην μειονοτική κατηγορία: `Υπερδειγματοληψία` π.χ. χρήση του αλγορίθμου SMOTE\n",
"\n",
"- αφαίρεση παρατηρήσεων από την πλειοψηφική κατηγορία: `Υποδειγματοληψία`\n",
"\n",
"Ας δείξουμε τώρα πώς να αντιμετωπίσουμε μη ισορροπημένα σύνολα δεδομένων χρησιμοποιώντας μια `συνταγή`. Μια συνταγή μπορεί να θεωρηθεί ως ένα σχέδιο που περιγράφει ποια βήματα πρέπει να εφαρμοστούν σε ένα σύνολο δεδομένων για να είναι έτοιμο για ανάλυση δεδομένων.\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": [
"Ας αναλύσουμε τα βήματα της προεπεξεργασίας μας.\n",
"\n",
"- Η κλήση της `recipe()` με έναν τύπο ενημερώνει τη συνταγή για τους *ρόλους* των μεταβλητών χρησιμοποιώντας τα δεδομένα του `df_select` ως αναφορά. Για παράδειγμα, η στήλη `cuisine` έχει οριστεί με ρόλο `outcome`, ενώ οι υπόλοιπες στήλες έχουν οριστεί με ρόλο `predictor`.\n",
"\n",
"- Η [`step_smote(cuisine)`](https://themis.tidymodels.org/reference/step_smote.html) δημιουργεί μια *προδιαγραφή* ενός βήματος συνταγής που συνθετικά παράγει νέα παραδείγματα της μειονοτικής κατηγορίας χρησιμοποιώντας τους πλησιέστερους γείτονες αυτών των περιπτώσεων.\n",
"\n",
"Τώρα, αν θέλαμε να δούμε τα προεπεξεργασμένα δεδομένα, θα έπρεπε να [**`prep()`**](https://recipes.tidymodels.org/reference/prep.html) και [**`bake()`**](https://recipes.tidymodels.org/reference/bake.html) τη συνταγή μας.\n",
"\n",
"`prep()`: εκτιμά τις απαιτούμενες παραμέτρους από ένα σύνολο εκπαίδευσης που μπορούν να εφαρμοστούν αργότερα σε άλλα σύνολα δεδομένων.\n",
"\n",
"`bake()`: παίρνει μια προετοιμασμένη συνταγή και εφαρμόζει τις λειτουργίες σε οποιοδήποτε σύνολο δεδομένων.\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": [
"Ας ελέγξουμε τώρα την κατανομή των κουζινών μας και να τις συγκρίνουμε με τα μη ισορροπημένα δεδομένα.\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": [
"Μμμ! Τα δεδομένα είναι ωραία και καθαρά, ισορροπημένα και πολύ νόστιμα 😋!\n",
"\n",
"> Συνήθως, μια συνταγή χρησιμοποιείται ως προεπεξεργαστής για τη μοντελοποίηση, όπου καθορίζει ποια βήματα πρέπει να εφαρμοστούν σε ένα σύνολο δεδομένων ώστε να είναι έτοιμο για μοντελοποίηση. Σε αυτήν την περίπτωση, χρησιμοποιείται συνήθως ένα `workflow()` (όπως έχουμε ήδη δει στα προηγούμενα μαθήματα) αντί να εκτιμάται χειροκίνητα μια συνταγή.\n",
">\n",
"> Έτσι, δεν χρειάζεται συνήθως να χρησιμοποιείτε **`prep()`** και **`bake()`** συνταγές όταν χρησιμοποιείτε tidymodels, αλλά είναι χρήσιμες συναρτήσεις για να επιβεβαιώνετε ότι οι συνταγές λειτουργούν όπως περιμένετε, όπως στην περίπτωσή μας.\n",
">\n",
"> Όταν χρησιμοποιείτε **`bake()`** σε μια προετοιμασμένη συνταγή με **`new_data = NULL`**, λαμβάνετε πίσω τα δεδομένα που παρέχατε κατά τον ορισμό της συνταγής, αλλά έχοντας υποστεί τα βήματα προεπεξεργασίας.\n",
"\n",
"Ας αποθηκεύσουμε τώρα ένα αντίγραφο αυτών των δεδομένων για χρήση σε μελλοντικά μαθήματα:\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": [
"Αυτό το νέο CSV μπορεί τώρα να βρεθεί στον κύριο φάκελο δεδομένων.\n",
"\n",
"**🚀Πρόκληση**\n",
"\n",
"Αυτό το πρόγραμμα σπουδών περιέχει αρκετά ενδιαφέροντα σύνολα δεδομένων. Εξερευνήστε τους φακέλους `data` και δείτε αν περιέχουν σύνολα δεδομένων που θα ήταν κατάλληλα για δυαδική ή πολυκατηγορική ταξινόμηση. Τι ερωτήσεις θα κάνατε για αυτό το σύνολο δεδομένων;\n",
"\n",
"## [**Κουίζ μετά τη διάλεξη**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)\n",
"\n",
"## **Ανασκόπηση & Αυτομελέτη**\n",
"\n",
"- Ρίξτε μια ματιά στο [πακέτο themis](https://github.com/tidymodels/themis). Ποιες άλλες τεχνικές θα μπορούσαμε να χρησιμοποιήσουμε για να αντιμετωπίσουμε μη ισορροπημένα δεδομένα;\n",
"\n",
"- Ιστοσελίδα αναφοράς για τα Tidy models [εδώ](https://www.tidymodels.org/start/).\n",
"\n",
"- H. Wickham και G. Grolemund, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/).\n",
"\n",
"#### ΕΥΧΑΡΙΣΤΙΕΣ ΣΕ:\n",
"\n",
"[`Allison Horst`](https://twitter.com/allison_horst/) για τη δημιουργία των καταπληκτικών εικονογραφήσεων που κάνουν τη γλώσσα R πιο φιλόξενη και ενδιαφέρουσα. Βρείτε περισσότερες εικονογραφήσεις στη [συλλογή της](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) και [Jen Looper](https://www.twitter.com/jenlooper) για τη δημιουργία της αρχικής έκδοσης αυτού του module σε Python ♥️\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"600\"/>\n",
" <figcaption>Εικονογράφηση από @allison_horst</figcaption>\n"
],
"metadata": {
"id": "WQs5621pMGwf"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Αποποίηση Ευθύνης**: \nΑυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης AI [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.\n"
]
}
]
}