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.
648 lines
39 KiB
648 lines
39 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-09-04T02:39:47+00:00",
|
|
"source_file": "4-Classification/3-Classifiers-2/solution/R/lesson_12-R.ipynb",
|
|
"language_code": "hi"
|
|
}
|
|
},
|
|
"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",
|
|
"पहले, हमने माइक्रोसॉफ्ट के चीट शीट का उपयोग करके डेटा को वर्गीकृत करने के विभिन्न विकल्पों के बारे में सीखा। पायथन के मशीन लर्निंग फ्रेमवर्क, Scikit-learn, एक समान लेकिन अधिक विस्तृत चीट शीट प्रदान करता है, जो आपके अनुमानों (classifiers का एक और नाम) को और अधिक सीमित करने में मदद कर सकता है:\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",
|
|
"- अल्पसंख्यक वर्ग में अवलोकन जोड़ना: `ओवर-सैंपलिंग`, जैसे SMOTE एल्गोरिदम का उपयोग करना, जो इन मामलों के निकटतम पड़ोसियों का उपयोग करके अल्पसंख्यक वर्ग के नए उदाहरण कृत्रिम रूप से उत्पन्न करता है।\n",
|
|
"\n",
|
|
"- बहुसंख्यक वर्ग से अवलोकन हटाना: `अंडर-सैंपलिंग`\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 बाहरी मूल्यों (outliers) के प्रति अधिक मजबूत बन जाता है और इस प्रकार नए डेटा पर बेहतर सामान्यीकरण करता है। इस उल्लंघन को नियंत्रित करने वाले पैरामीटर को `cost` कहा जाता है, जिसकी डिफ़ॉल्ट मान 1 होती है (देखें `help(\"svm_poly\")`)।\n",
|
|
"\n",
|
|
"आइए एक रेखीय SVC बनाएं, इसके लिए बहुपद SVM मॉडल में `degree = 1` सेट करें।\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*-nearest neighbor (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 classifiers के बारे में।\n",
|
|
"\n",
|
|
"### Ensemble classifiers\n",
|
|
"\n",
|
|
"Ensemble एल्गोरिदम कई बेस अनुमानों को मिलाकर एक बेहतर मॉडल बनाने का काम करते हैं, जो निम्नलिखित तरीकों से किया जा सकता है:\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",
|
|
"आइए अब Boosted Tree मॉडल के साथ भी प्रयोग करें।\n",
|
|
"\n",
|
|
"Boosted Tree एक ensemble विधि को परिभाषित करता है, जो एक श्रृंखला में क्रमिक निर्णय पेड़ों का निर्माण करता है, जहां प्रत्येक पेड़ पिछले पेड़ों के परिणामों पर निर्भर करता है ताकि त्रुटि को धीरे-धीरे कम किया जा सके। यह गलत वर्गीकृत वस्तुओं के वज़न पर ध्यान केंद्रित करता है और अगले classifier के लिए फिट को समायोजित करता है ताकि सुधार किया जा सके।\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",
|
|
"हमने इस लैब में काफी सारे मॉडल फिट किए हैं 🙌। अलग-अलग प्रीप्रोसेसर और/या मॉडल स्पेसिफिकेशन के सेट से कई वर्कफ़्लो बनाना और फिर प्रदर्शन मेट्रिक्स को एक-एक करके गणना करना थकाऊ या कठिन हो सकता है।\n",
|
|
"\n",
|
|
"आइए देखें कि क्या हम इसे एक फ़ंक्शन बनाकर हल कर सकते हैं, जो ट्रेनिंग सेट पर वर्कफ़्लो की एक सूची फिट करता है और फिर टेस्ट सेट के आधार पर प्रदर्शन मेट्रिक्स लौटाता है। हम [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",
|
|
"इन तकनीकों में से प्रत्येक में कई पैरामीटर होते हैं जिन्हें आप समायोजित कर सकते हैं, जैसे कि SVMs में `cost`, KNN में `neighbors`, और रैंडम फॉरेस्ट में `mtry` (रैंडमली चुने गए प्रेडिक्टर्स)।\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",
|
|
"[`एलिसन हॉर्स्ट`](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), गोल्ड माइक्रोसॉफ्ट लर्न स्टूडेंट एंबेसडर।\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"
|
|
]
|
|
}
|
|
]
|
|
} |