{ "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", "
\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",
"حالا که یک مدل آموزش دادهایم، میتوانیم از آن برای پیشبینی پیشرفت بیماری 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"
]
}
]
}