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/mr/4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb

648 lines
38 KiB

{
"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-29T19:29:52+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
"language_code": "mr"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "jsFutf_ygqSx"
},
"source": []
},
{
"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",
"यापूर्वी, आपण Microsoft च्या चीट शीटचा वापर करून डेटा वर्गीकृत करण्यासाठी असलेल्या विविध पर्यायांबद्दल शिकलो. Python च्या मशीन लर्निंग फ्रेमवर्क, Scikit-learn, एक समान पण अधिक तपशीलवार चीट शीट प्रदान करते जी तुमच्या वर्गीकरणासाठी (क्लासिफायर्ससाठी आणखी एक शब्द) पर्याय निवडण्यात मदत करू शकते:\n",
"\n",
"<p >\n",
" <img src=\"../../images/map.png\"\n",
" width=\"700\"/>\n",
" <figcaption></figcaption>\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",
"- आमच्याकडे 100K पेक्षा कमी नमुने आहेत\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",
"- अल्पसंख्याक वर्गामध्ये निरीक्षणे वाढवणे: `Over-sampling` उदा. SMOTE अल्गोरिदम वापरून, जो अल्पसंख्याक वर्गाचे नवीन उदाहरणे त्यांच्या जवळच्या शेजाऱ्यांचा वापर करून कृत्रिमरीत्या तयार करतो.\n",
"\n",
"- बहुसंख्य वर्गामधून निरीक्षणे काढून टाकणे: `Under-sampling`\n",
"\n",
"आमच्या मागील धड्यात, आम्ही `recipe` वापरून असंतुलित डेटासेट्स कसे हाताळायचे ते दाखवले. `recipe` म्हणजे एक प्रकारचा आराखडा जो डेटासेटवर कोणते पायऱ्या लागू करायच्या आहेत हे वर्णन करतो, जेणेकरून डेटा विश्लेषणासाठी तयार होईल. आमच्या बाबतीत, आम्हाला आमच्या `training set` साठी आमच्या खाद्यपदार्थांच्या संख्येचे समान वितरण हवे आहे. चला सुरुवात करूया.\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",
"<p >\n",
" <img src=\"../../images/svm.png\"\n",
" width=\"300\"/>\n",
" <figcaption>https://commons.wikimedia.org/w/index.php?curid=22877598</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "C4Wsd0vZhXYu"
},
"source": [
"H1~ वर्ग वेगळे करत नाही. H2~ वेगळे करते, पण फक्त थोड्या अंतराने. H3~ त्यांना जास्तीत जास्त अंतराने वेगळे करते.\n",
"\n",
"#### रेखीय सपोर्ट व्हेक्टर वर्गीकरणकर्ता\n",
"\n",
"सपोर्ट-व्हेक्टर क्लस्टरिंग (SVC) ही मशीन लर्निंग तंत्रांच्या सपोर्ट-व्हेक्टर मशीन कुटुंबातील एक शाखा आहे. SVC मध्ये, हायपरप्लेन अशा प्रकारे निवडले जाते की ते `बहुतेक` प्रशिक्षण निरीक्षणे योग्यरित्या वेगळी करते, परंतु काही निरीक्षणे `चुकीची वर्गीकृत` होऊ शकतात. काही बिंदूंना चुकीच्या बाजूला जाऊ देऊन, SVM बाहेरच्या डेटाप्रती अधिक मजबूत बनते आणि त्यामुळे नवीन डेटावर चांगले सामान्यीकरण करते. या उल्लंघनाचे नियमन करणाऱ्या पॅरामीटरला `cost` म्हणतात, ज्याची डीफॉल्ट किंमत 1 आहे (`help(\"svm_poly\")` पहा).\n",
"\n",
"आता, `degree = 1` सेट करून बहुपदीय SVM मॉडेलमध्ये एक रेखीय SVC तयार करूया.\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": [
"आता आपण *workflow* मध्ये पूर्वप्रक्रिया पद्धती आणि मॉडेल तपशील समाविष्ट केला आहे, त्यामुळे आपण linear 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), Hands-on Machine Learning with R\n",
">\n",
"> - [*Support Vector Machines*](https://www.statlearning.com/), An Introduction to Statistical Learning with Applications in 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": [
"असे दिसते की हा मॉडेल अपेक्षेप्रमाणे कार्य करत नाही. कदाचित मॉडेलचे arguments बदलल्याने (पहा `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 classifiers बद्दल अधिक जाणून घेण्यासाठी.\n",
"\n",
"### Ensemble classifiers\n",
"\n",
"Ensemble अल्गोरिदम्स अनेक बेस estimators एकत्र करून एक उत्कृष्ट मॉडेल तयार करतात, जे खालीलपैकी एका पद्धतीने कार्य करते:\n",
"\n",
"`bagging`: बेस मॉडेल्सच्या संग्रहावर *average function* लागू करणे\n",
"\n",
"`boosting`: एकमेकांवर आधारित मॉडेल्सची मालिका तयार करणे जे predictive performance सुधारण्यासाठी मदत करते.\n",
"\n",
"चला Random Forest मॉडेल वापरून सुरुवात करूया, जे अनेक निर्णय वृक्ष तयार करते आणि नंतर एक average function लागू करून एक चांगले एकत्रित मॉडेल तयार करते.\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",
"चला Boosted Tree मॉडेलसह प्रयोग करूया.\n",
"\n",
"Boosted Tree एक ensemble पद्धत परिभाषित करते ज्यामध्ये अनुक्रमिक निर्णय वृक्षांची मालिका तयार केली जाते, जिथे प्रत्येक वृक्ष मागील वृक्षांच्या निकालांवर अवलंबून असतो, त्रुटी हळूहळू कमी करण्याचा प्रयत्न केला जातो. हे चुकीच्या वर्गीकृत आयटम्सच्या वजनांवर लक्ष केंद्रित करते आणि पुढील वर्गीकर्त्यासाठी फिट समायोजित करते जेणेकरून दुरुस्ती करता येईल.\n",
"\n",
"हा मॉडेल फिट करण्याचे वेगवेगळे मार्ग आहेत (पहा `help(\"boost_tree\")`). या उदाहरणात, आपण Boosted trees `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",
"> - [Machine Learning for Social Scientists](https://cimentadaj.github.io/ml_socsci/tree-based-methods.html#random-forests)\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",
"> - <https://algotech.netlify.app/blog/xgboost/> - AdaBoost मॉडेलचा अभ्यास करते, जो xgboost साठी एक चांगला पर्याय आहे.\n",
">\n",
"> Ensemble classifiers बद्दल अधिक जाणून घेण्यासाठी.\n",
"\n",
"## 4. अतिरिक्त - अनेक मॉडेल्सची तुलना करणे\n",
"\n",
"या प्रयोगशाळेत आपण बऱ्याच मॉडेल्स फिट केले आहेत 🙌. वेगवेगळ्या preprocessors आणि/किंवा मॉडेल स्पेसिफिकेशन्सच्या सेट्समधून अनेक workflows तयार करणे आणि नंतर एक-एक करून performance metrics मोजणे हे कंटाळवाणे किंवा कठीण होऊ शकते.\n",
"\n",
"चला पाहूया की आपण प्रशिक्षण सेटवर workflows च्या यादीला फिट करणारी आणि चाचणी सेटवर आधारित performance metrics परत करणारी एक फंक्शन तयार करून हे सोडवू शकतो का. यासाठी आपण [purrr](https://purrr.tidyverse.org/) पॅकेजमधील `map()` आणि `map_dfr()` वापरणार आहोत, ज्यामुळे यादीतील प्रत्येक घटकावर फंक्शन्स लागू करता येतील.\n",
"\n",
"> [`map()`](https://purrr.tidyverse.org/reference/map.html) फंक्शन्स तुम्हाला अनेक for loops बदलून कोड अधिक संक्षिप्त आणि वाचायला सोपा बनवण्याची परवानगी देतात. [`map()`](https://purrr.tidyverse.org/reference/map.html) फंक्शन्सबद्दल शिकण्यासाठी सर्वोत्तम जागा म्हणजे R for data science मधील [iteration chapter](http://r4ds.had.co.nz/iteration.html) आहे.\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",
"प्रत्येक तंत्रामध्ये अनेक पॅरामीटर्स असतात ज्यामध्ये तुम्ही बदल करू शकता, उदाहरणार्थ SVM मध्ये `cost`, KNN मध्ये `neighbors`, Random Forest मध्ये `mtry` (Randomly Selected Predictors).\n",
"\n",
"प्रत्येक मॉडेलचे डिफॉल्ट पॅरामीटर्स शोधा आणि या पॅरामीटर्समध्ये बदल केल्याने मॉडेलच्या गुणवत्तेसाठी काय परिणाम होईल याचा विचार करा.\n",
"\n",
"एखाद्या विशिष्ट मॉडेल आणि त्याच्या पॅरामीटर्सबद्दल अधिक जाणून घेण्यासाठी, वापरा: `help(\"model\")` उदा. `help(\"rand_forest\")`\n",
"\n",
"> प्रत्यक्षात, आपण सहसा *सर्वोत्तम मूल्ये* *अंदाज* लावतो, यासाठी अनेक मॉडेल्स `simulated data set` वर प्रशिक्षण देतो आणि या सर्व मॉडेल्सची कामगिरी कशी आहे हे मोजतो. या प्रक्रियेला **tuning** म्हणतात.\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 अधिक स्वागतार्ह आणि आकर्षक बनवणाऱ्या अप्रतिम चित्रणांसाठी. तिच्या [gallery](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), Gold Microsoft Learn Student Ambassador.\n",
"\n",
"<p >\n",
" <img src=\"../../images/r_learners_sm.jpeg\"\n",
" width=\"569\"/>\n",
" <figcaption>चित्र @allison_horst यांनी तयार केले</figcaption>\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**अस्वीकरण**: \nहा दस्तऐवज AI भाषांतर सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) वापरून भाषांतरित करण्यात आला आहे. आम्ही अचूकतेसाठी प्रयत्नशील असलो तरी कृपया लक्षात ठेवा की स्वयंचलित भाषांतरांमध्ये त्रुटी किंवा अचूकतेचा अभाव असू शकतो. मूळ भाषेतील दस्तऐवज हा अधिकृत स्रोत मानला जावा. महत्त्वाच्या माहितीसाठी व्यावसायिक मानवी भाषांतराची शिफारस केली जाते. या भाषांतराचा वापर करून उद्भवलेल्या कोणत्याही गैरसमज किंवा चुकीच्या अर्थासाठी आम्ही जबाबदार राहणार नाही.\n"
]
}
]
}