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/fa/2-Regression/1-Tools/solution/R/lesson_1-R.ipynb

449 lines
22 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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-09-04T01:35:21+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "fa"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# ساخت یک مدل رگرسیون: شروع به کار با R و Tidymodels برای مدل‌های رگرسیون\n"
],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## مقدمه‌ای بر رگرسیون - درس ۱\n",
"\n",
"#### قرار دادن در چشم‌انداز\n",
"\n",
"✅ روش‌های مختلفی برای رگرسیون وجود دارد و انتخاب روش مناسب به نوع پاسخی که به دنبال آن هستید بستگی دارد. اگر بخواهید ارتفاع احتمالی یک فرد با سن مشخص را پیش‌بینی کنید، از `رگرسیون خطی` استفاده می‌کنید، زیرا به دنبال یک **مقدار عددی** هستید. اگر بخواهید بررسی کنید که آیا یک نوع غذا باید به عنوان وگان در نظر گرفته شود یا نه، به دنبال **تخصیص دسته‌بندی** هستید، بنابراین از `رگرسیون لجستیک` استفاده می‌کنید. در ادامه بیشتر درباره رگرسیون لجستیک خواهید آموخت. کمی به سوالاتی که می‌توانید از داده‌ها بپرسید فکر کنید و ببینید کدام یک از این روش‌ها مناسب‌تر است.\n",
"\n",
"در این بخش، شما با [یک مجموعه داده کوچک درباره دیابت](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html) کار خواهید کرد. تصور کنید که می‌خواهید یک درمان برای بیماران دیابتی آزمایش کنید. مدل‌های یادگیری ماشین ممکن است به شما کمک کنند تا تعیین کنید کدام بیماران بهتر به درمان پاسخ می‌دهند، بر اساس ترکیب متغیرها. حتی یک مدل رگرسیون بسیار ساده، وقتی به صورت بصری نمایش داده شود، ممکن است اطلاعاتی درباره متغیرهایی ارائه دهد که به شما در سازماندهی آزمایش‌های بالینی نظری کمک کند.\n",
"\n",
"با این توضیحات، بیایید این کار را شروع کنیم!\n",
"\n",
"<p >\n",
" <img src=\"../../images/encouRage.jpg\"\n",
" width=\"630\"/>\n",
" <figcaption>اثر هنری از @allison_horst</figcaption>\n",
"\n",
"<!--![اثر هنری از \\@allison_horst](../../../../../../translated_images/encouRage.e75d5fe0367fb9136b78104baf4e2032a7622bc42a2bc34c0ad36c294eeb83f5.fa.jpg)<br>اثر هنری از @allison_horst-->\n"
],
"metadata": {
"id": "LWNNzfqd6feZ"
}
},
{
"cell_type": "markdown",
"source": [
"## 1. بارگذاری ابزارهای مورد نیاز\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",
"می‌توانید آنها را با دستور زیر نصب کنید:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\"))`\n",
"\n",
"اسکریپت زیر بررسی می‌کند که آیا بسته‌های مورد نیاز برای تکمیل این ماژول را دارید یا خیر و در صورتی که برخی از آنها موجود نباشند، آنها را برای شما نصب می‌کند.\n"
],
"metadata": {
"id": "FIo2YhO26wI9"
}
},
{
"cell_type": "code",
"execution_count": 2,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\n",
"pacman::p_load(tidyverse, tidymodels)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Loading required package: pacman\n",
"\n"
]
}
],
"metadata": {
"id": "cIA9fz9v7Dss",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "2df7073b-86b2-4b32-cb86-0da605a0dc11"
}
},
{
"cell_type": "markdown",
"source": [
"حالا، بیایید این بسته‌های فوق‌العاده را بارگذاری کنیم و در جلسه فعلی R خود در دسترس قرار دهیم. (این فقط برای توضیح است، `pacman::p_load()` قبلاً این کار را برای شما انجام داده است)\n"
],
"metadata": {
"id": "gpO_P_6f9WUG"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# load the core Tidyverse packages\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# load the core Tidymodels packages\r\n",
"library(tidymodels)\r\n"
],
"outputs": [],
"metadata": {
"id": "NLMycgG-9ezO"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. مجموعه داده دیابت\n",
"\n",
"در این تمرین، مهارت‌های رگرسیون خود را با پیش‌بینی روی یک مجموعه داده دیابت به نمایش می‌گذاریم. [مجموعه داده دیابت](https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt) شامل `442 نمونه` داده مرتبط با دیابت است که دارای 10 متغیر ویژگی پیش‌بینی‌کننده شامل `سن`، `جنسیت`، `شاخص توده بدنی`، `فشار خون متوسط` و `شش اندازه‌گیری سرم خون` و همچنین یک متغیر خروجی `y` است: یک معیار کمی از پیشرفت بیماری یک سال پس از خط پایه.\n",
"\n",
"|تعداد مشاهدات|442|\n",
"|----------------------|:---|\n",
"|تعداد پیش‌بینی‌کننده‌ها|10 ستون اول عددی و پیش‌بینی‌کننده هستند|\n",
"|خروجی/هدف|ستون 11 یک معیار کمی از پیشرفت بیماری یک سال پس از خط پایه است|\n",
"|اطلاعات پیش‌بینی‌کننده|- سن به سال\n",
"||- جنسیت\n",
"||- bmi شاخص توده بدنی\n",
"||- bp فشار خون متوسط\n",
"||- s1 tc، کلسترول سرم کل\n",
"||- s2 ldl، لیپوپروتئین‌های با چگالی کم\n",
"||- s3 hdl، لیپوپروتئین‌های با چگالی بالا\n",
"||- s4 tch، کلسترول کل / HDL\n",
"||- s5 ltg، احتمالاً لگاریتم سطح تری‌گلیسرید سرم\n",
"||- s6 glu، سطح قند خون|\n",
"\n",
"> 🎓 به یاد داشته باشید، این یادگیری نظارت‌شده است و ما به یک هدف به نام 'y' نیاز داریم.\n",
"\n",
"قبل از اینکه بتوانید داده‌ها را با R دستکاری کنید، باید داده‌ها را به حافظه R وارد کنید یا یک اتصال به داده‌ها ایجاد کنید که R بتواند از آن برای دسترسی به داده‌ها به صورت از راه دور استفاده کند.\n",
"\n",
"> بسته [readr](https://readr.tidyverse.org/) که بخشی از Tidyverse است، یک روش سریع و کاربرپسند برای خواندن داده‌های مستطیلی به داخل R ارائه می‌دهد.\n",
"\n",
"حالا، بیایید مجموعه داده دیابت را از این آدرس منبع بارگذاری کنیم: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"همچنین، یک بررسی اولیه روی داده‌های خود با استفاده از `glimpse()` انجام می‌دهیم و 5 ردیف اول را با استفاده از `slice()` نمایش می‌دهیم.\n",
"\n",
"قبل از اینکه جلوتر برویم، بیایید چیزی را معرفی کنیم که اغلب در کد R با آن مواجه خواهید شد 🥁🥁: عملگر پایپ `%>%`\n",
"\n",
"عملگر پایپ (`%>%`) عملیات را به ترتیب منطقی انجام می‌دهد و یک شیء را به جلو به یک تابع یا عبارت فراخوانی منتقل می‌کند. می‌توانید عملگر پایپ را به‌عنوان گفتن \"و سپس\" در کد خود تصور کنید.\n"
],
"metadata": {
"id": "KM6iXLH996Cl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Import the data set\r\n",
"diabetes <- read_table2(file = \"https://www4.stat.ncsu.edu/~boos/var.select/diabetes.rwrite1.txt\")\r\n",
"\r\n",
"\r\n",
"# Get a glimpse and dimensions of the data\r\n",
"glimpse(diabetes)\r\n",
"\r\n",
"\r\n",
"# Select the first 5 rows of the data\r\n",
"diabetes %>% \r\n",
" slice(1:5)"
],
"outputs": [],
"metadata": {
"id": "Z1geAMhM-bSP"
}
},
{
"cell_type": "markdown",
"source": [
"`glimpse()` به ما نشان می‌دهد که این داده شامل ۴۴۲ ردیف و ۱۱ ستون است و تمام ستون‌ها از نوع داده‌ای `double` هستند.\n",
"\n",
"<br>\n",
"\n",
"> `glimpse()` و `slice()` توابعی در [`dplyr`](https://dplyr.tidyverse.org/) هستند. Dplyr که بخشی از Tidyverse است، یک دستور زبان برای دستکاری داده‌ها ارائه می‌دهد که مجموعه‌ای منسجم از افعال را فراهم می‌کند تا به شما در حل رایج‌ترین چالش‌های دستکاری داده کمک کند.\n",
"\n",
"<br>\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",
"<br>\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/داده‌فریم از نتایج با نام‌های استاندارد برای ستون‌ها تولید شود. این کار ترکیب داده‌های اصلی و پیش‌بینی‌ها را در قالبی قابل استفاده برای عملیات بعدی مانند رسم نمودار آسان می‌کند.\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": [
"## 6. نمایش نتایج مدل‌سازی\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این سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما برای دقت تلاش می‌کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادقتی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما هیچ مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
]
}
]
}