{ "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-29T19:36:15+00:00", "source_file": "4-Classification/1-Introduction/solution/R/lesson_10-R.ipynb", "language_code": "ne" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "ItETB4tSFprR" } }, { "cell_type": "markdown", "source": [ "## वर्गीकरणको परिचय: आफ्नो डाटा सफा गर्नुहोस्, तयार गर्नुहोस्, र दृश्यात्मक बनाउनुहोस्\n", "\n", "यी चार पाठहरूमा, तपाईं क्लासिक मेसिन लर्निङको एक आधारभूत ध्यान केन्द्रित गर्नेछौं - *वर्गीकरण*। हामी विभिन्न वर्गीकरण एल्गोरिदमहरू प्रयोग गर्दै एशिया र भारतका सबै अद्भुत परिकारहरूको डाटासेटसँग काम गर्नेछौं। आशा छ तपाईं भोकाउनु भएको छ!\n", "\n", "

\n", " \n", "

यी पाठहरूमा प्यान-एशियाली परिकारहरूको उत्सव मनाउनुहोस्! छवि: जेन लूपर
\n", "\n", "\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", "

वर्गीकरण एल्गोरिदमहरूले सामना गर्ने बाइनरी बनाम मल्टिक्लास समस्या। इन्फोग्राफिक: जेन लूपर
\n", "\n", "डाटालाई सफा गर्ने, दृश्यात्मक बनाउने, र यसलाई हाम्रो एमएल कार्यहरूको लागि तयार गर्ने प्रक्रियाको सुरुवात गर्नु अघि, मेसिन लर्निङले डाटालाई वर्गीकृत गर्न प्रयोग गर्न सक्ने विभिन्न तरिकाहरूको बारेमा थोरै सिकौं।\n", "\n", "[सांख्यिकी](https://wikipedia.org/wiki/Statistical_classification) बाट व्युत्पन्न, क्लासिक मेसिन लर्निङ प्रयोग गरेर वर्गीकरणले `स्मोकर`, `वजन`, र `उमेर` जस्ता विशेषताहरू प्रयोग गरेर *X रोग विकासको सम्भावना* निर्धारण गर्दछ। तपाईंले पहिले गरेका रिग्रेसन अभ्यासहरू जस्तै सुपरभाइज्ड लर्निङ प्रविधिको रूपमा, तपाईंको डाटा लेबल गरिएको हुन्छ र एमएल एल्गोरिदमहरूले ती लेबलहरू प्रयोग गरेर डाटासेटको वर्गहरू (वा 'विशेषताहरू') वर्गीकृत र भविष्यवाणी गर्छन् र तिनीहरूलाई समूह वा परिणाममा असाइन गर्छन्।\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", "

\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", "R मा `create_ingredient()` नामको एउटा function बनाउनुहोस् जसले सामग्रीको dataframe फिर्ता गर्छ। यो function ले एउटा अनुपयोगी स्तम्भ हटाएर सामग्रीलाई तिनीहरूको गणनाका आधारमा क्रमबद्ध गर्न सुरु गर्नेछ।\n", "\n", "R मा function को आधारभूत संरचना यस्तो छ:\n", "\n", "`myFunction <- function(arglist){`\n", "\n", "**`...`**\n", "\n", "**`return`**`(value)`\n", "\n", "`}`\n", "\n", "R functions को बारेमा व्यवस्थित परिचय [यहाँ](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", "Allison Horst द्वारा तयार गरिएको [*art*-ले भरिएको learnr tutorial](https://allisonhorst.shinyapps.io/dplyr-learnr/#section-welcome) हेर्नुहोस्, जसले dplyr *(Tidyverse को भाग)* मा केही उपयोगी डाटा व्यवस्थापन functions प्रस्तुत गर्दछ।\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": [], "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": [], "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", "यो पाठ खानाका प्रकारहरूबारे भएकाले, हामीले `recipes` लाई सन्दर्भमा राख्नुपर्छ।\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": [ "जस्तो देखिन्छ, यहाँ परिकारहरूको संख्यामा धेरै असमान वितरण छ। कोरियन परिकारहरू थाई परिकारहरूको लगभग तीन गुणा छन्। असन्तुलित डाटाले प्रायः मोडेलको प्रदर्शनमा नकारात्मक प्रभाव पार्छ। एउटा बाइनरी वर्गीकरणको बारेमा सोच्नुहोस्। यदि तपाईंको अधिकांश डाटा एउटै वर्गको हो भने, एउटा ML मोडेलले त्यो वर्गलाई बढी बारम्बार भविष्यवाणी गर्नेछ, किनभने त्यस वर्गको लागि बढी डाटा उपलब्ध छ। डाटालाई सन्तुलित बनाउनुले कुनै पनि असमान डाटालाई हटाउँछ र यो असन्तुलनलाई सुधार गर्न मद्दत गर्दछ। धेरै मोडेलहरू तब राम्रो प्रदर्शन गर्छन् जब अवलोकनहरूको संख्या समान हुन्छ, र त्यसैले असन्तुलित डाटासँग संघर्ष गर्न सक्छन्।\n", "\n", "असन्तुलित डाटा सेटहरूलाई व्यवस्थापन गर्ने दुई मुख्य तरिका छन्:\n", "\n", "- अल्पसंख्यक वर्गमा अवलोकनहरू थप्ने: `ओभर-स्याम्पलिङ`, जस्तै SMOTE एल्गोरिदम प्रयोग गरेर\n", "\n", "- बहुसंख्यक वर्गबाट अवलोकनहरू हटाउने: `अन्डर-स्याम्पलिङ`\n", "\n", "अब हामी `recipe` प्रयोग गरेर असन्तुलित डाटा सेटहरूलाई कसरी व्यवस्थापन गर्ने भनेर प्रदर्शन गर्नेछौं। एउटा recipe लाई एउटा ब्लूप्रिन्टको रूपमा सोच्न सकिन्छ, जसले डाटा सेटलाई डाटा विश्लेषणको लागि तयार पार्न के कदमहरू लागू गर्नुपर्छ भनेर वर्णन गर्दछ।\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", "> त्यसैले, tidymodels प्रयोग गर्दा तपाईंलाई सामान्यतया **`prep()`** र **`bake()`** रेसिपीहरू आवश्यक पर्दैन, तर यी तपाईंको टूलकिटमा उपयोगी फङ्सनहरू हुन्, जसले रेसिपीहरूले तपाईंले अपेक्षा गरेजस्तै काम गरिरहेको छ कि छैन भनेर पुष्टि गर्न मद्दत गर्छ, जस्तै हाम्रो केसमा।\n", ">\n", "> जब तपाईं **`new_data = NULL`** को साथमा प्रिप गरिएको रेसिपीलाई **`bake()`** गर्नुहुन्छ, तपाईंले रेसिपी परिभाषा गर्दा दिएको डाटा फिर्ता पाउनुहुन्छ, तर यसले प्रिप्रोसेसिङ चरणहरू पार गरिसकेको हुन्छ।\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", "- एच. विकह्याम र जी. ग्रोलमन्ड, [*R for Data Science: Visualize, Model, Transform, Tidy, and Import Data*](https://r4ds.had.co.nz/)।\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", "

@allison_horst द्वारा कलाकृति
\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" ] } ] }