{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "lesson_12-R.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "fab50046ca413a38939d579f8432274f", "translation_date": "2025-08-29T15:27:11+00:00", "source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb", "language_code": "ar" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "jsFutf_ygqSx" }, "source": [ "# بناء نموذج تصنيف: المأكولات الآسيوية والهندية اللذيذة\n" ] }, { "cell_type": "markdown", "metadata": { "id": "HD54bEefgtNO" }, "source": [ "## مصنفات المأكولات 2\n", "\n", "في درس التصنيف الثاني هذا، سنستكشف `طرق إضافية` لتصنيف البيانات الفئوية. كما سنتعلم عن العواقب الناتجة عن اختيار مصنف معين بدلاً من الآخر.\n", "\n", "### [**اختبار ما قبل المحاضرة**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)\n", "\n", "### **المتطلبات الأساسية**\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", "- `themis`: حزمة [themis](https://themis.tidymodels.org/) توفر خطوات إضافية للوصفات للتعامل مع البيانات غير المتوازنة.\n", "\n", "يمكنك تثبيتها باستخدام:\n", "\n", "`install.packages(c(\"tidyverse\", \"tidymodels\", \"kernlab\", \"themis\", \"ranger\", \"xgboost\", \"kknn\"))`\n", "\n", "بدلاً من ذلك، يقوم السكربت أدناه بالتحقق مما إذا كانت الحزم المطلوبة لإكمال هذا الوحدة موجودة ويقوم بتثبيتها إذا كانت مفقودة.\n" ] }, { "cell_type": "code", "metadata": { "id": "vZ57IuUxgyQt" }, "source": [ "suppressWarnings(if (!require(\"pacman\"))install.packages(\"pacman\"))\n", "\n", "pacman::p_load(tidyverse, tidymodels, themis, kernlab, ranger, xgboost, kknn)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "z22M-pj4g07x" }, "source": [ "## **1. خريطة التصنيف**\n", "\n", "في [الدرس السابق](https://github.com/microsoft/ML-For-Beginners/tree/main/4-Classification/2-Classifiers-1)، حاولنا الإجابة على السؤال: كيف نختار بين نماذج متعددة؟ إلى حد كبير، يعتمد ذلك على خصائص البيانات ونوع المشكلة التي نريد حلها (على سبيل المثال التصنيف أو الانحدار؟)\n", "\n", "سابقًا، تعلمنا عن الخيارات المختلفة المتاحة لتصنيف البيانات باستخدام ورقة الغش الخاصة بمايكروسوفت. إطار عمل التعلم الآلي في Python، Scikit-learn، يقدم ورقة غش مشابهة ولكن أكثر تفصيلًا يمكن أن تساعدك بشكل أكبر في تضييق نطاق اختيارك للمقدّرين (مصطلح آخر للمصنفات):\n", "\n", "

\n", " \n", "

\n" ] }, { "cell_type": "markdown", "metadata": { "id": "u1i3xRIVg7vG" }, "source": [ "> نصيحة: [قم بزيارة هذه الخريطة عبر الإنترنت](https://scikit-learn.org/stable/tutorial/machine_learning_map/) وانقر على المسار لقراءة الوثائق.\n", ">\n", "> يوفر [موقع مرجع Tidymodels](https://www.tidymodels.org/find/parsnip/#models) أيضًا وثائق ممتازة حول الأنواع المختلفة من النماذج.\n", "\n", "### **الخطة** 🗺️\n", "\n", "هذه الخريطة مفيدة جدًا بمجرد أن تكون لديك فهم واضح لبياناتك، حيث يمكنك \"السير\" على طول مساراتها لاتخاذ قرار:\n", "\n", "- لدينا أكثر من 50 عينة\n", "\n", "- نريد التنبؤ بفئة معينة\n", "\n", "- لدينا بيانات معنونة\n", "\n", "- لدينا أقل من 100 ألف عينة\n", "\n", "- ✨ يمكننا اختيار Linear SVC\n", "\n", "- إذا لم ينجح ذلك، وبما أن لدينا بيانات رقمية\n", "\n", " - يمكننا تجربة ✨ KNeighbors Classifier\n", "\n", " - إذا لم ينجح ذلك، جرب ✨ SVC و ✨ Ensemble Classifiers\n", "\n", "هذا مسار مفيد جدًا للاتباع. الآن، دعونا نبدأ باستخدام إطار عمل النمذجة [tidymodels](https://www.tidymodels.org/): مجموعة متناسقة ومرنة من حزم R تم تطويرها لتشجيع الممارسات الإحصائية الجيدة 😊.\n", "\n", "## 2. تقسيم البيانات والتعامل مع مجموعة بيانات غير متوازنة.\n", "\n", "من دروسنا السابقة، تعلمنا أن هناك مجموعة من المكونات المشتركة عبر مطابخنا. أيضًا، كان هناك توزيع غير متساوٍ إلى حد كبير في عدد المطابخ.\n", "\n", "سنتعامل مع هذه الأمور من خلال:\n", "\n", "- حذف المكونات الأكثر شيوعًا التي تسبب ارتباكًا بين المطابخ المختلفة، باستخدام `dplyr::select()`.\n", "\n", "- استخدام `recipe` لمعالجة البيانات وتجهيزها للنمذجة من خلال تطبيق خوارزمية `over-sampling`.\n", "\n", "لقد تناولنا ما سبق في الدرس السابق، لذا يجب أن يكون هذا سهلًا جدًا 🥳!\n" ] }, { "cell_type": "code", "metadata": { "id": "6tj_rN00hClA" }, "source": [ "# Load the core Tidyverse and Tidymodels packages\n", "library(tidyverse)\n", "library(tidymodels)\n", "\n", "# Load the original cuisines data\n", "df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/4-Classification/data/cuisines.csv\")\n", "\n", "# Drop id column, rice, garlic and ginger from our original data set\n", "df_select <- df %>% \n", " select(-c(1, rice, garlic, ginger)) %>%\n", " # Encode cuisine column as categorical\n", " mutate(cuisine = factor(cuisine))\n", "\n", "\n", "# Create data split specification\n", "set.seed(2056)\n", "cuisines_split <- initial_split(data = df_select,\n", " strata = cuisine,\n", " prop = 0.7)\n", "\n", "# Extract the data in each split\n", "cuisines_train <- training(cuisines_split)\n", "cuisines_test <- testing(cuisines_split)\n", "\n", "# Display distribution of cuisines in the training set\n", "cuisines_train %>% \n", " count(cuisine) %>% \n", " arrange(desc(n))" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "zFin5yw3hHb1" }, "source": [ "### التعامل مع البيانات غير المتوازنة\n", "\n", "البيانات غير المتوازنة غالبًا ما تؤثر سلبًا على أداء النموذج. العديد من النماذج تعمل بشكل أفضل عندما يكون عدد الملاحظات متساويًا، وبالتالي تواجه صعوبة مع البيانات غير المتوازنة.\n", "\n", "هناك طريقتان رئيسيتان للتعامل مع مجموعات البيانات غير المتوازنة:\n", "\n", "- إضافة ملاحظات إلى الفئة الأقل: `الإفراط في أخذ العينات` مثل استخدام خوارزمية SMOTE التي تقوم بتوليد أمثلة جديدة للفئة الأقل بشكل اصطناعي باستخدام أقرب الجيران لهذه الحالات.\n", "\n", "- إزالة ملاحظات من الفئة الأكثر: `التقليل من أخذ العينات`\n", "\n", "في درسنا السابق، قمنا بتوضيح كيفية التعامل مع مجموعات البيانات غير المتوازنة باستخدام `وصفة`. يمكن اعتبار الوصفة بمثابة مخطط يصف الخطوات التي يجب تطبيقها على مجموعة البيانات لجعلها جاهزة لتحليل البيانات. في حالتنا، نريد أن يكون لدينا توزيع متساوٍ في عدد أنواع المأكولات في مجموعة `التدريب`. لنبدأ مباشرة.\n" ] }, { "cell_type": "code", "metadata": { "id": "cRzTnHolhLWd" }, "source": [ "# Load themis package for dealing with imbalanced data\n", "library(themis)\n", "\n", "# Create a recipe for preprocessing training data\n", "cuisines_recipe <- recipe(cuisine ~ ., data = cuisines_train) %>%\n", " step_smote(cuisine) \n", "\n", "# Print recipe\n", "cuisines_recipe" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KxOQ2ORhhO81" }, "source": [ "الآن نحن جاهزون لتدريب النماذج 👩‍💻👨‍💻!\n", "\n", "## 3. ما بعد نماذج الانحدار متعدد الحدود\n", "\n", "في درسنا السابق، تناولنا نماذج الانحدار متعدد الحدود. دعونا نستكشف بعض النماذج الأكثر مرونة للتصنيف.\n", "\n", "### آلات الدعم المتجهة\n", "\n", "في سياق التصنيف، تعد `آلات الدعم المتجهة` تقنية تعلم آلي تهدف إلى إيجاد *مستوى فائق* يفصل بين الفئات \"بأفضل\" طريقة ممكنة. دعونا نلقي نظرة على مثال بسيط:\n", "\n", "

\n", " \n", "

https://commons.wikimedia.org/w/index.php?curid=22877598
\n" ] }, { "cell_type": "markdown", "metadata": { "id": "C4Wsd0vZhXYu" }, "source": [ "H1~ لا تفصل بين الفئات. H2~ تفصل بينها ولكن بهامش صغير فقط. H3~ تفصل بينها بأكبر هامش ممكن.\n", "\n", "#### المصنف الخطي لدعم المتجهات\n", "\n", "التجميع باستخدام دعم المتجهات (SVC) هو أحد أفراد عائلة تقنيات تعلم الآلة الخاصة بدعم المتجهات. في SVC، يتم اختيار المستوى الفاصل بحيث يفصل بشكل صحيح بين `معظم` ملاحظات التدريب، ولكنه `قد يخطئ` في تصنيف بعض الملاحظات. من خلال السماح لبعض النقاط بأن تكون على الجانب الخطأ، يصبح SVM أكثر قوة في مواجهة القيم الشاذة وبالتالي يقدم تعميمًا أفضل للبيانات الجديدة. يُطلق على المعامل الذي ينظم هذا الانتهاك اسم `التكلفة`، والذي تكون قيمته الافتراضية 1 (راجع `help(\"svm_poly\")`).\n", "\n", "لنقم بإنشاء SVC خطي عن طريق ضبط `degree = 1` في نموذج SVM متعدد الحدود.\n" ] }, { "cell_type": "code", "metadata": { "id": "vJpp6nuChlBz" }, "source": [ "# Make a linear SVC specification\n", "svc_linear_spec <- svm_poly(degree = 1) %>% \n", " set_engine(\"kernlab\") %>% \n", " set_mode(\"classification\")\n", "\n", "# Bundle specification and recipe into a worklow\n", "svc_linear_wf <- workflow() %>% \n", " add_recipe(cuisines_recipe) %>% \n", " add_model(svc_linear_spec)\n", "\n", "# Print out workflow\n", "svc_linear_wf" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "rDs8cWNkhoqu" }, "source": [ "الآن بعد أن قمنا بتجميع خطوات المعالجة المسبقة وتحديد النموذج في *سير العمل*، يمكننا المضي قدمًا وتدريب SVC الخطي وتقييم النتائج أثناء ذلك. بالنسبة لمقاييس الأداء، دعونا ننشئ مجموعة مقاييس لتقييم: `accuracy`، `sensitivity`، `Positive Predicted Value` و `F Measure`.\n", "\n", "> `augment()` سيضيف عمودًا (أعمدة) للتنبؤات إلى البيانات المقدمة.\n" ] }, { "cell_type": "code", "metadata": { "id": "81wiqcwuhrnq" }, "source": [ "# Train a linear SVC model\n", "svc_linear_fit <- svc_linear_wf %>% \n", " fit(data = cuisines_train)\n", "\n", "# Create a metric set\n", "eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n", "\n", "\n", "# Make predictions and Evaluate model performance\n", "svc_linear_fit %>% \n", " augment(new_data = cuisines_test) %>% \n", " eval_metrics(truth = cuisine, estimate = .pred_class)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "0UFQvHf-huo3" }, "source": [ "#### آلة المتجهات الداعمة\n", "\n", "آلة المتجهات الداعمة (SVM) هي امتداد لمصنف المتجهات الداعمة لتتمكن من التعامل مع الحدود غير الخطية بين الفئات. في جوهرها، تستخدم SVMs *حيلة النواة* لتوسيع مساحة الميزات لتتكيف مع العلاقات غير الخطية بين الفئات. إحدى وظائف النواة الشهيرة والمرنة للغاية التي تستخدمها SVMs هي *وظيفة الأساس الشعاعي.* دعونا نرى كيف ستؤدي على بياناتنا.\n" ] }, { "cell_type": "code", "metadata": { "id": "-KX4S8mzhzmp" }, "source": [ "set.seed(2056)\n", "\n", "# Make an RBF SVM specification\n", "svm_rbf_spec <- svm_rbf() %>% \n", " set_engine(\"kernlab\") %>% \n", " set_mode(\"classification\")\n", "\n", "# Bundle specification and recipe into a worklow\n", "svm_rbf_wf <- workflow() %>% \n", " add_recipe(cuisines_recipe) %>% \n", " add_model(svm_rbf_spec)\n", "\n", "\n", "# Train an RBF model\n", "svm_rbf_fit <- svm_rbf_wf %>% \n", " fit(data = cuisines_train)\n", "\n", "\n", "# Make predictions and Evaluate model performance\n", "svm_rbf_fit %>% \n", " augment(new_data = cuisines_test) %>% \n", " eval_metrics(truth = cuisine, estimate = .pred_class)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "QBFSa7WSh4HQ" }, "source": [ "أفضل بكثير 🤩!\n", "\n", "> ✅ يرجى الاطلاع على:\n", ">\n", "> - [*Support Vector Machines*](https://bradleyboehmke.github.io/HOML/svm.html)، التعلم الآلي العملي باستخدام R\n", ">\n", "> - [*Support Vector Machines*](https://www.statlearning.com/)، مقدمة في التعلم الإحصائي مع تطبيقات باستخدام R\n", ">\n", "> لمزيد من القراءة.\n", "\n", "### مصنفات أقرب الجيران\n", "\n", "*K*-أقرب الجيران (KNN) هو خوارزمية يتم فيها التنبؤ بكل ملاحظة بناءً على *تشابهها* مع الملاحظات الأخرى.\n", "\n", "دعونا نقوم بتطبيقها على بياناتنا.\n" ] }, { "cell_type": "code", "metadata": { "id": "k4BxxBcdh9Ka" }, "source": [ "# Make a KNN specification\n", "knn_spec <- nearest_neighbor() %>% \n", " set_engine(\"kknn\") %>% \n", " set_mode(\"classification\")\n", "\n", "# Bundle recipe and model specification into a workflow\n", "knn_wf <- workflow() %>% \n", " add_recipe(cuisines_recipe) %>% \n", " add_model(knn_spec)\n", "\n", "# Train a boosted tree model\n", "knn_wf_fit <- knn_wf %>% \n", " fit(data = cuisines_train)\n", "\n", "\n", "# Make predictions and Evaluate model performance\n", "knn_wf_fit %>% \n", " augment(new_data = cuisines_test) %>% \n", " eval_metrics(truth = cuisine, estimate = .pred_class)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "HaegQseriAcj" }, "source": [ "يبدو أن هذا النموذج لا يعمل بشكل جيد. ربما تغيير معايير النموذج (راجع `help(\"nearest_neighbor\")`) سيحسن أداء النموذج. تأكد من تجربته.\n", "\n", "> ✅ يرجى الاطلاع على:\n", ">\n", "> - [Hands-on Machine Learning with R](https://bradleyboehmke.github.io/HOML/)\n", ">\n", "> - [An Introduction to Statistical Learning with Applications in R](https://www.statlearning.com/)\n", ">\n", "> للتعرف أكثر على مصنفات *K*-Nearest Neighbors.\n", "\n", "### المصنفات التجميعية\n", "\n", "تعمل خوارزميات التجميع عن طريق دمج عدة نماذج أساسية لإنتاج نموذج مثالي إما عن طريق:\n", "\n", "`bagging`: تطبيق *دالة متوسط* على مجموعة من النماذج الأساسية.\n", "\n", "`boosting`: بناء سلسلة من النماذج التي تعتمد على بعضها البعض لتحسين الأداء التنبؤي.\n", "\n", "لنبدأ بتجربة نموذج الغابة العشوائية (Random Forest)، الذي يقوم ببناء مجموعة كبيرة من أشجار القرار ثم يطبق دالة متوسط للحصول على نموذج أفضل بشكل عام.\n" ] }, { "cell_type": "code", "metadata": { "id": "49DPoVs6iK1M" }, "source": [ "# Make a random forest specification\n", "rf_spec <- rand_forest() %>% \n", " set_engine(\"ranger\") %>% \n", " set_mode(\"classification\")\n", "\n", "# Bundle recipe and model specification into a workflow\n", "rf_wf <- workflow() %>% \n", " add_recipe(cuisines_recipe) %>% \n", " add_model(rf_spec)\n", "\n", "# Train a random forest model\n", "rf_wf_fit <- rf_wf %>% \n", " fit(data = cuisines_train)\n", "\n", "\n", "# Make predictions and Evaluate model performance\n", "rf_wf_fit %>% \n", " augment(new_data = cuisines_test) %>% \n", " eval_metrics(truth = cuisine, estimate = .pred_class)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "RGVYwC_aiUWc" }, "source": [ "عمل رائع 👏!\n", "\n", "دعونا نجرب أيضًا نموذج الشجرة المعززة.\n", "\n", "تعرف الشجرة المعززة بأنها طريقة تجميعية تقوم بإنشاء سلسلة من أشجار القرار المتتابعة، حيث تعتمد كل شجرة على نتائج الأشجار السابقة في محاولة لتقليل الخطأ تدريجيًا. تركز على أوزان العناصر التي تم تصنيفها بشكل غير صحيح وتقوم بتعديل التناسب للمصنف التالي لتصحيحها.\n", "\n", "هناك طرق مختلفة لتطبيق هذا النموذج (راجع `help(\"boost_tree\")`). في هذا المثال، سنقوم بتطبيق الأشجار المعززة باستخدام محرك `xgboost`.\n" ] }, { "cell_type": "code", "metadata": { "id": "Py1YWo-micWs" }, "source": [ "# Make a boosted tree specification\n", "boost_spec <- boost_tree(trees = 200) %>% \n", " set_engine(\"xgboost\") %>% \n", " set_mode(\"classification\")\n", "\n", "# Bundle recipe and model specification into a workflow\n", "boost_wf <- workflow() %>% \n", " add_recipe(cuisines_recipe) %>% \n", " add_model(boost_spec)\n", "\n", "# Train a boosted tree model\n", "boost_wf_fit <- boost_wf %>% \n", " fit(data = cuisines_train)\n", "\n", "\n", "# Make predictions and Evaluate model performance\n", "boost_wf_fit %>% \n", " augment(new_data = cuisines_test) %>% \n", " eval_metrics(truth = cuisine, estimate = .pred_class)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "zNQnbuejigZM" }, "source": [ "> ✅ يرجى الاطلاع على:\n", ">\n", "> - [التعلم الآلي للعلماء الاجتماعيين](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\n", ">\n", "> - [التعلم الآلي العملي باستخدام R](https://bradleyboehmke.github.io/HOML/)\n", ">\n", "> - [مقدمة في التعلم الإحصائي مع تطبيقات في R](https://www.statlearning.com/)\n", ">\n", "> - - يستعرض نموذج AdaBoost الذي يُعد بديلاً جيدًا لـ xgboost.\n", ">\n", "> لمعرفة المزيد عن المصنفات المجمعة.\n", "\n", "## 4. إضافي - مقارنة نماذج متعددة\n", "\n", "قمنا بتطبيق عدد كبير من النماذج في هذا المختبر 🙌. قد يصبح من الممل أو المرهق إنشاء العديد من سير العمل من مجموعات مختلفة من المعالجات المسبقة و/أو مواصفات النماذج، ثم حساب مقاييس الأداء واحدًا تلو الآخر.\n", "\n", "دعونا نرى ما إذا كان بإمكاننا معالجة هذا الأمر عن طريق إنشاء دالة تقوم بتطبيق قائمة من سير العمل على مجموعة التدريب، ثم تعيد مقاييس الأداء بناءً على مجموعة الاختبار. سنستخدم `map()` و `map_dfr()` من حزمة [purrr](https://purrr.tidyverse.org/) لتطبيق الدوال على كل عنصر في القائمة.\n", "\n", "> دوال [`map()`](https://purrr.tidyverse.org/reference/map.html) تتيح لك استبدال العديد من الحلقات التكرارية بكود أكثر اختصارًا وأسهل قراءة. أفضل مكان لتعلم المزيد عن دوال [`map()`](https://purrr.tidyverse.org/reference/map.html) هو [فصل التكرار](http://r4ds.had.co.nz/iteration.html) في كتاب R for Data Science.\n" ] }, { "cell_type": "code", "metadata": { "id": "Qzb7LyZnimd2" }, "source": [ "set.seed(2056)\n", "\n", "# Create a metric set\n", "eval_metrics <- metric_set(ppv, sens, accuracy, f_meas)\n", "\n", "# Define a function that returns performance metrics\n", "compare_models <- function(workflow_list, train_set, test_set){\n", " \n", " suppressWarnings(\n", " # Fit each model to the train_set\n", " map(workflow_list, fit, data = train_set) %>% \n", " # Make predictions on the test set\n", " map_dfr(augment, new_data = test_set, .id = \"model\") %>%\n", " # Select desired columns\n", " select(model, cuisine, .pred_class) %>% \n", " # Evaluate model performance\n", " group_by(model) %>% \n", " eval_metrics(truth = cuisine, estimate = .pred_class) %>% \n", " ungroup()\n", " )\n", " \n", "} # End of function" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Fwa712sNisDA" }, "source": [] }, { "cell_type": "code", "metadata": { "id": "3i4VJOi2iu-a" }, "source": [ "# Make a list of workflows\n", "workflow_list <- list(\n", " \"svc\" = svc_linear_wf,\n", " \"svm\" = svm_rbf_wf,\n", " \"knn\" = knn_wf,\n", " \"random_forest\" = rf_wf,\n", " \"xgboost\" = boost_wf)\n", "\n", "# Call the function\n", "set.seed(2056)\n", "perf_metrics <- compare_models(workflow_list = workflow_list, train_set = cuisines_train, test_set = cuisines_test)\n", "\n", "# Print out performance metrics\n", "perf_metrics %>% \n", " group_by(.metric) %>% \n", " arrange(desc(.estimate)) %>% \n", " slice_head(n=7)\n", "\n", "# Compare accuracy\n", "perf_metrics %>% \n", " filter(.metric == \"accuracy\") %>% \n", " arrange(desc(.estimate))\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KuWK_lEli4nW" }, "source": [ "[**workflowset**](https://workflowsets.tidymodels.org/) تتيح للمستخدمين إنشاء وتطبيق عدد كبير من النماذج بسهولة، لكنها مصممة بشكل أساسي للعمل مع تقنيات إعادة أخذ العينات مثل `cross-validation`، وهي طريقة لم نتناولها بعد.\n", "\n", "## **🚀التحدي**\n", "\n", "كل واحدة من هذه التقنيات تحتوي على عدد كبير من المعاملات التي يمكنك تعديلها، مثل `cost` في SVMs، و`neighbors` في KNN، و`mtry` (المتنبئات المختارة عشوائيًا) في Random Forest.\n", "\n", "ابحث عن القيم الافتراضية لكل واحدة وفكر في ما يعنيه تعديل هذه القيم بالنسبة لجودة النموذج.\n", "\n", "للتعرف على المزيد حول نموذج معين ومعاملاته، استخدم: `help(\"model\")` مثلًا `help(\"rand_forest\")`.\n", "\n", "> في الممارسة العملية، نقوم عادةً *بتقدير* *أفضل القيم* لهذه المعاملات عن طريق تدريب العديد من النماذج على `مجموعة بيانات محاكاة` وقياس مدى أداء هذه النماذج. تُعرف هذه العملية باسم **الضبط**.\n", "\n", "### [**اختبار ما بعد المحاضرة**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)\n", "\n", "### **المراجعة والدراسة الذاتية**\n", "\n", "هناك الكثير من المصطلحات في هذه الدروس، لذا خذ دقيقة لمراجعة [هذه القائمة](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) من المصطلحات المفيدة!\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", "[Eric](https://twitter.com/ericntay)، سفير طلاب Microsoft Learn الذهبي.\n", "\n", "

\n", " \n", "

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