{ "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-08-29T15:32:11+00:00", "source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb", "language_code": "ar" } }, "cells": [ { "cell_type": "markdown", "source": [ "# بناء نموذج تصنيف: المأكولات الآسيوية والهندية اللذيذة\n" ], "metadata": { "id": "ItETB4tSFprR" } }, { "cell_type": "markdown", "source": [ "## مقدمة إلى التصنيف: تنظيف البيانات، تجهيزها، وتصويرها\n", "\n", "في هذه الدروس الأربعة، ستستكشف أحد الجوانب الأساسية لتعلم الآلة الكلاسيكي - *التصنيف*. سنقوم باستعراض استخدام خوارزميات التصنيف المختلفة مع مجموعة بيانات حول جميع المأكولات الرائعة في آسيا والهند. نأمل أن تكون جائعًا!\n", "\n", "

\n", " \n", "

احتفل بالمأكولات الآسيوية في هذه الدروس! الصورة بواسطة Jen Looper
\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", "التصنيف هو أحد الأنشطة الأساسية للباحث في تعلم الآلة وعالم البيانات. من التصنيف الأساسي لقيمة ثنائية (\"هل هذا البريد الإلكتروني مزعج أم لا؟\")، إلى التصنيف المعقد للصور وتقسيمها باستخدام رؤية الكمبيوتر، من المفيد دائمًا أن تكون قادرًا على تصنيف البيانات إلى فئات وطرح الأسئلة عليها.\n", "\n", "لصياغة العملية بطريقة أكثر علمية، فإن طريقة التصنيف الخاصة بك تنشئ نموذجًا تنبؤيًا يمكّنك من رسم العلاقة بين المتغيرات المدخلة والمتغيرات الناتجة.\n", "\n", "

\n", " \n", "

مشاكل التصنيف الثنائي مقابل متعدد الفئات التي تتعامل معها خوارزميات التصنيف. الرسم البياني بواسطة Jen Looper
\n", "\n", "قبل البدء في عملية تنظيف بياناتنا، تصويرها، وتجهيزها لمهام تعلم الآلة، دعونا نتعلم قليلاً عن الطرق المختلفة التي يمكن من خلالها استخدام تعلم الآلة لتصنيف البيانات.\n", "\n", "مستمدة من [الإحصائيات](https://wikipedia.org/wiki/Statistical_classification)، يستخدم التصنيف في تعلم الآلة الكلاسيكي ميزات مثل `smoker`، `weight`، و `age` لتحديد *احتمالية الإصابة بمرض معين*. كطريقة تعلم موجّهة مشابهة لتمارين الانحدار التي قمت بها سابقًا، تكون بياناتك مُعلمة وتستخدم خوارزميات تعلم الآلة هذه العلامات لتصنيف وتوقع الفئات (أو \"الميزات\") لمجموعة البيانات وتعيينها إلى مجموعة أو نتيجة.\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) تهدف إلى تبسيط وأتمتة عملية تحليل البيانات وإنشاء التقارير.\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` قيم مفقودة. لدينا أيضًا عمود واحد منفصل، *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", "

\n", " \n", "

عمل فني بواسطة @allison_horst
\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 التي تُرجع إطار بيانات للمكونات. ستبدأ هذه الدالة بإزالة عمود غير مفيد وفرز المكونات حسب عددها.\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](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", "اطلع على هذا [*الدرس الفني*](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) بواسطة أليسون هورست، الذي يقدم بعض وظائف معالجة البيانات المفيدة في 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": [ "دعونا نلقي نظرة على المأكولات الهندية 🌶️.\n" ], "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", "

\n", " \n", "

عمل فني من @allison_horst
\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 [الموقع المرجعي](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) على إنشاء النسخة الأصلية من هذا الوحدة بلغة Python ♥️\n", "\n", "

\n", " \n", "

عمل فني بواسطة @allison_horst
\n" ], "metadata": { "id": "WQs5621pMGwf" } }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n---\n\n**إخلاء المسؤولية**: \nتمت ترجمة هذه الوثيقة باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار الوثيقة الأصلية بلغتها الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.\n" ] } ] }