{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_1-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "c18d3bd0bd8ae3878597e89dcd1fa5c1", "translation_date": "2025-08-29T19:01:26+00:00", "source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb", "language_code": "ne" } }, "cells": [ { "cell_type": "markdown", "source": [], "metadata": { "id": "YJUHCXqK57yz" } }, { "cell_type": "markdown", "source": [ "## रिग्रेशनको परिचय - पाठ १\n", "\n", "#### परिप्रेक्ष्यमा राख्दै\n", "\n", "✅ रिग्रेशनका धेरै प्रकारका विधिहरू छन्, र तपाईंले कुन विधि चयन गर्नुहुन्छ भन्ने कुरा तपाईंले खोजिरहेको उत्तरमा निर्भर गर्दछ। यदि तपाईंलाई कुनै निश्चित उमेरको व्यक्तिको सम्भावित उचाइ अनुमान गर्न चाहनुहुन्छ भने, तपाईं `linear regression` प्रयोग गर्नुहुनेछ, किनभने तपाईं **संख्यात्मक मान** खोज्दै हुनुहुन्छ। यदि तपाईंलाई थाहा पाउन चाहनुहुन्छ कि कुनै प्रकारको खाना शाकाहारी मान्नुपर्छ कि हुँदैन, तपाईं **श्रेणी निर्धारण** खोज्दै हुनुहुन्छ, त्यसैले तपाईं `logistic regression` प्रयोग गर्नुहुनेछ। तपाईंले logistic regression को बारेमा पछि थप जान्नुहुनेछ। डेटा सम्बन्धी केही प्रश्नहरू सोच्नुहोस्, र यी विधिहरूमध्ये कुन उपयुक्त हुनेछ भनेर विचार गर्नुहोस्।\n", "\n", "यस खण्डमा, तपाईं [मधुमेह सम्बन्धी सानो डेटासेट](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html) सँग काम गर्नुहुनेछ। कल्पना गर्नुहोस् कि तपाईं मधुमेहका बिरामीहरूको उपचार परीक्षण गर्न चाहनुहुन्छ। मेशिन लर्निङ मोडेलहरूले तपाईंलाई विभिन्न चरहरूको संयोजनको आधारमा कुन बिरामीहरूले उपचारमा राम्रो प्रतिक्रिया दिनेछन् भनेर निर्धारण गर्न मद्दत गर्न सक्छ। एउटा धेरै आधारभूत रिग्रेशन मोडेलले पनि, जब दृश्यात्मक रूपमा प्रस्तुत गरिन्छ, चरहरूको बारेमा जानकारी देखाउन सक्छ जसले तपाईंलाई सैद्धान्तिक क्लिनिकल परीक्षणहरू व्यवस्थित गर्न मद्दत गर्न सक्छ।\n", "\n", "त्यसोभए, यो कार्य सुरु गरौं!\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> glimpse() र slice() [`dplyr`](https://dplyr.tidyverse.org/) का फङ्क्सनहरू हुन्। Dplyr, जुन Tidyverse को हिस्सा हो, डाटा हेरफेरको व्याकरण हो जसले तपाईंलाई सबैभन्दा सामान्य डाटा हेरफेर चुनौतीहरू समाधान गर्न मद्दत गर्ने एकरूप क्रियाहरूको सेट प्रदान गर्दछ।\n",
"\n",
"
\n",
"\n",
"अब हामीसँग डाटा छ, यस अभ्यासका लागि एउटा विशेषता (`bmi`) मा केन्द्रित गरौं। यसका लागि, हामीले चाहिएको स्तम्भहरू चयन गर्नुपर्नेछ। त्यसो भए, हामी यो कसरी गर्ने?\n",
"\n",
"[`dplyr::select()`](https://dplyr.tidyverse.org/reference/select.html) ले हामीलाई डाटा फ्रेममा स्तम्भहरू *चयन* (र वैकल्पिक रूपमा पुनः नामकरण) गर्न अनुमति दिन्छ।\n"
],
"metadata": {
"id": "UwjVT1Hz-c3Z"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select predictor feature `bmi` and outcome `y`\r\n",
"diabetes_select <- diabetes %>% \r\n",
" select(c(bmi, y))\r\n",
"\r\n",
"# Print the first 5 rows\r\n",
"diabetes_select %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "RDY1oAKI-m80"
}
},
{
"cell_type": "markdown",
"source": [
"## ३. प्रशिक्षण र परीक्षण डेटा\n",
"\n",
"सुपरभाइज्ड लर्निङमा डेटा दुई उपसमूहमा *विभाजन* गर्नु सामान्य अभ्यास हो; एउटा (सामान्यतया ठूलो) सेट जसको प्रयोग गरेर मोडेललाई प्रशिक्षण गरिन्छ, र सानो \"पछाडि राखिएको\" सेट जसको प्रयोग गरेर मोडेलले कस्तो प्रदर्शन गर्यो भनेर हेर्ने गरिन्छ।\n",
"\n",
"अब हामीसँग डेटा तयार छ, हामी हेर्न सक्छौं कि यो डेटासेटमा संख्याहरूको बीचमा तार्किक विभाजन निर्धारण गर्न मेशिनले सहयोग गर्न सक्छ कि सक्दैन। हामी [rsample](https://tidymodels.github.io/rsample/) प्याकेज प्रयोग गर्न सक्छौं, जुन Tidymodels फ्रेमवर्कको भाग हो, डेटा *कसरी* विभाजन गर्ने जानकारी समावेश गर्ने वस्तु सिर्जना गर्न, र त्यसपछि दुई थप rsample फङ्सनहरू प्रयोग गरेर सिर्जना गरिएको प्रशिक्षण र परीक्षण सेटहरू निकाल्न:\n"
],
"metadata": {
"id": "SDk668xK-tc3"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\r\n",
"# Split 67% of the data for training and the rest for tesing\r\n",
"diabetes_split <- diabetes_select %>% \r\n",
" initial_split(prop = 0.67)\r\n",
"\r\n",
"# Extract the resulting train and test sets\r\n",
"diabetes_train <- training(diabetes_split)\r\n",
"diabetes_test <- testing(diabetes_split)\r\n",
"\r\n",
"# Print the first 3 rows of the training set\r\n",
"diabetes_train %>% \r\n",
" slice(1:10)"
],
"outputs": [],
"metadata": {
"id": "EqtHx129-1h-"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. Tidymodels प्रयोग गरेर रेखीय प्रतिगमन मोडेल प्रशिक्षण गर्नुहोस्\n",
"\n",
"अब हामी हाम्रो मोडेल प्रशिक्षण गर्न तयार छौं!\n",
"\n",
"Tidymodels मा, तपाईंले `parsnip()` प्रयोग गरेर तीन अवधारणाहरू निर्दिष्ट गरेर मोडेलहरू परिभाषित गर्नुहुन्छ:\n",
"\n",
"- मोडेल **प्रकार**ले रेखीय प्रतिगमन, लजिस्टिक प्रतिगमन, निर्णय वृक्ष मोडेलहरू, र यस्तै अन्य मोडेलहरू बीच भिन्नता देखाउँछ।\n",
"\n",
"- मोडेल **मोड**ले सामान्य विकल्पहरू जस्तै प्रतिगमन र वर्गीकरण समावेश गर्दछ; केही मोडेल प्रकारहरूले यीमध्ये कुनै पनि समर्थन गर्छन् भने केहीले मात्र एक मोड समर्थन गर्छन्।\n",
"\n",
"- मोडेल **इन्जिन** भनेको मोडेल फिट गर्न प्रयोग गरिने कम्प्युटेशनल उपकरण हो। प्रायः यी R प्याकेजहरू हुन्, जस्तै **`\"lm\"`** वा **`\"ranger\"`**\n",
"\n",
"यो मोडेलिङ जानकारी मोडेल निर्दिष्टीकरणमा समेटिएको हुन्छ, त्यसैले अब एउटा निर्माण गरौं!\n"
],
"metadata": {
"id": "sBOS-XhB-6v7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- \r\n",
" # Type\r\n",
" linear_reg() %>% \r\n",
" # Engine\r\n",
" set_engine(\"lm\") %>% \r\n",
" # Mode\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Print the model specification\r\n",
"lm_spec"
],
"outputs": [],
"metadata": {
"id": "20OwEw20--t3"
}
},
{
"cell_type": "markdown",
"source": [
"एक पटक मोडेल *निर्दिष्ट* भएपछि, मोडेललाई [`fit()`](https://parsnip.tidymodels.org/reference/fit.html) फङ्सन प्रयोग गरेर `अनुमानित` वा `प्रशिक्षित` गर्न सकिन्छ, सामान्यतया कुनै सूत्र र केही डाटाको प्रयोग गरेर।\n",
"\n",
"`y ~ .` को अर्थ हो हामीले `y` लाई पूर्वानुमानित मात्रा/लक्ष्यको रूपमा फिट गर्नेछौं, जुन सबै भविष्यवक्ता/विशेषताहरू अर्थात् `.` द्वारा व्याख्या गरिन्छ (यस अवस्थामा, हामीसँग केवल एक भविष्यवक्ता छ: `bmi`)।\n"
],
"metadata": {
"id": "_oDHs89k_CJj"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Build a linear model specification\r\n",
"lm_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>%\r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Train a linear regression model\r\n",
"lm_mod <- lm_spec %>% \r\n",
" fit(y ~ ., data = diabetes_train)\r\n",
"\r\n",
"# Print the model\r\n",
"lm_mod"
],
"outputs": [],
"metadata": {
"id": "YlsHqd-q_GJQ"
}
},
{
"cell_type": "markdown",
"source": [
"मोडेलको आउटपुटबाट, हामीले प्रशिक्षणको क्रममा सिकेका गुणांकहरू देख्न सक्छौं। यी गुणांकहरूले सबैभन्दा कम समग्र त्रुटि दिने वास्तविक र अनुमानित चरको बीचको उत्तम फिटको रेखाको प्रतिनिधित्व गर्छन्।\n",
"\n",
"
\n",
"\n",
"## ५. परीक्षण सेटमा भविष्यवाणी गर्नुहोस्\n",
"\n",
"अब हामीले मोडेल प्रशिक्षण गरिसकेपछि, हामी यसलाई परीक्षण डेटासेटको लागि रोगको प्रगति y को भविष्यवाणी गर्न प्रयोग गर्न सक्छौं [parsnip::predict()](https://parsnip.tidymodels.org/reference/predict.model_fit.html) प्रयोग गरेर। यसले डेटा समूहहरू बीचको रेखा कोर्न प्रयोग गरिनेछ।\n"
],
"metadata": {
"id": "kGZ22RQj_Olu"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\r\n",
"predictions <- lm_mod %>% \r\n",
" predict(new_data = diabetes_test)\r\n",
"\r\n",
"# Print out some of the predictions\r\n",
"predictions %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "nXHbY7M2_aao"
}
},
{
"cell_type": "markdown",
"source": [
"वाह! 💃🕺 हामीले भर्खरै एउटा मोडेल प्रशिक्षण गर्यौं र यसलाई प्रयोग गरेर भविष्यवाणी गर्यौं!\n",
"\n",
"भविष्यवाणी गर्दा, tidymodels को परम्परा सधैं परिणामहरूको लागि मानकीकृत स्तम्भ नामहरू भएको tibble/data frame उत्पादन गर्नु हो। यसले मूल डेटा र भविष्यवाणीहरूलाई प्रयोगयोग्य स्वरूपमा संयोजन गर्न सजिलो बनाउँछ, जस्तै प्लटिङ जस्ता पछिल्ला कार्यहरूको लागि।\n",
"\n",
"`dplyr::bind_cols()` ले धेरै डेटा फ्रेमहरूलाई स्तम्भहरूमा प्रभावकारी रूपमा बाँध्छ।\n"
],
"metadata": {
"id": "R_JstwUY_bIs"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Combine the predictions and the original test set\r\n",
"results <- diabetes_test %>% \r\n",
" bind_cols(predictions)\r\n",
"\r\n",
"\r\n",
"results %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "RybsMJR7_iI8"
}
},
{
"cell_type": "markdown",
"source": [
"## ६. मोडेलिङ नतिजा प्लट गर्नुहोस्\n",
"\n",
"अब, यसलाई दृश्यात्मक रूपमा हेर्ने समय आएको छ 📈। हामी परीक्षण सेटका सबै `y` र `bmi` मानहरूको स्क्याटर प्लट बनाउनेछौं, त्यसपछि भविष्यवाणीहरू प्रयोग गरेर मोडेलको डेटा समूहहरू बीच सबैभन्दा उपयुक्त स्थानमा रेखा कोर्नेछौं।\n",
"\n",
"R मा ग्राफ बनाउने धेरै प्रणालीहरू छन्, तर `ggplot2` सबैभन्दा आकर्षक र बहुप्रयोजनयुक्त मध्ये एक हो। यसले तपाईंलाई **स्वतन्त्र घटकहरू संयोजन गरेर** ग्राफहरू बनाउने सुविधा दिन्छ।\n"
],
"metadata": {
"id": "XJbYbMZW_n_s"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set a theme for the plot\r\n",
"theme_set(theme_light())\r\n",
"# Create a scatter plot\r\n",
"results %>% \r\n",
" ggplot(aes(x = bmi)) +\r\n",
" # Add a scatter plot\r\n",
" geom_point(aes(y = y), size = 1.6) +\r\n",
" # Add a line plot\r\n",
" geom_line(aes(y = .pred), color = \"blue\", size = 1.5)"
],
"outputs": [],
"metadata": {
"id": "R9tYp3VW_sTn"
}
},
{
"cell_type": "markdown",
"source": [
"✅ यहाँ के भइरहेको छ भनेर अलिकति सोच्नुहोस्। एउटा सिधा रेखा धेरै साना डाटा बिन्दुहरूबाट हुँदै गइरहेको छ, तर यो वास्तवमा के गरिरहेको छ? के तपाईं देख्न सक्नुहुन्छ कि यो रेखा प्रयोग गरेर नयाँ, नदेखिएको डाटा बिन्दु प्लटको y अक्षसँग सम्बन्धित कहाँ फिट हुन्छ भनेर भविष्यवाणी गर्न सकिन्छ? यस मोडेलको व्यावहारिक प्रयोगलाई शब्दमा व्यक्त गर्न प्रयास गर्नुहोस्।\n",
"\n",
"बधाई छ, तपाईंले आफ्नो पहिलो रेखीय प्रतिगमन मोडेल निर्माण गर्नुभयो, यसलाई प्रयोग गरेर भविष्यवाणी गर्नुभयो, र यसलाई प्लटमा प्रदर्शन गर्नुभयो!\n"
],
"metadata": {
"id": "zrPtHIxx_tNI"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**अस्वीकरण**: \nयो दस्तावेज़ AI अनुवाद सेवा [Co-op Translator](https://github.com/Azure/co-op-translator) प्रयोग गरेर अनुवाद गरिएको हो। हामी शुद्धताको लागि प्रयास गर्छौं, तर कृपया ध्यान दिनुहोस् कि स्वचालित अनुवादमा त्रुटिहरू वा अशुद्धताहरू हुन सक्छ। यसको मूल भाषा मा रहेको मूल दस्तावेज़लाई आधिकारिक स्रोत मानिनुपर्छ। महत्वपूर्ण जानकारीको लागि, व्यावसायिक मानव अनुवाद सिफारिस गरिन्छ। यस अनुवादको प्रयोगबाट उत्पन्न हुने कुनै पनि गलतफहमी वा गलत व्याख्याको लागि हामी जिम्मेवार हुने छैनौं।\n"
]
}
]
}