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/3-Linear/solution/R/lesson_3-R.ipynb

1080 lines
55 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_3-R.ipynb",
"provenance": [],
"collapsed_sections": [],
"toc_visible": true
},
"kernelspec": {
"name": "ir",
"display_name": "R"
},
"language_info": {
"name": "R"
},
"coopTranslator": {
"original_hash": "5015d65d61ba75a223bfc56c273aa174",
"translation_date": "2025-09-04T01:15:44+00:00",
"source_file": "2-Regression/3-Linear/solution/R/lesson_3-R.ipynb",
"language_code": "fa"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"ساخت یک مدل رگرسیون: مدل‌های رگرسیون خطی و چندجمله‌ای\n"
],
"metadata": {
"id": "EgQw8osnsUV-"
}
},
{
"cell_type": "markdown",
"source": [
"## رگرسیون خطی و چندجمله‌ای برای قیمت‌گذاری کدو تنبل - درس ۳\n",
"\n",
"<p>\n",
" <img src=\"../../images/linear-polynomial.png\"\n",
" width=\"800\"/>\n",
" <figcaption>اینفوگرافیک از داسانی مدیپالی</figcaption>\n",
"\n",
"#### مقدمه\n",
"\n",
"تا اینجا شما با مفهوم رگرسیون آشنا شده‌اید و داده‌های نمونه‌ای را که از مجموعه داده قیمت‌گذاری کدو تنبل جمع‌آوری شده است بررسی کرده‌اید. همچنین این داده‌ها را با استفاده از `ggplot2` تجسم کرده‌اید. 💪\n",
"\n",
"اکنون آماده‌اید تا عمیق‌تر به موضوع رگرسیون در یادگیری ماشین بپردازید. در این درس، شما با دو نوع رگرسیون آشنا خواهید شد: *رگرسیون خطی ساده* و *رگرسیون چندجمله‌ای*، به همراه برخی از مفاهیم ریاضی مرتبط با این تکنیک‌ها.\n",
"\n",
"> در طول این دوره آموزشی، فرض بر این است که دانش ریاضی شما حداقلی است و تلاش می‌شود که مفاهیم به گونه‌ای ارائه شوند که برای دانشجویانی که از رشته‌های دیگر می‌آیند قابل درک باشد. بنابراین به یادداشت‌ها، 🧮 نکات، نمودارها و ابزارهای آموزشی دیگر برای کمک به درک بهتر توجه کنید.\n",
"\n",
"#### آماده‌سازی\n",
"\n",
"یادآوری می‌شود که شما این داده‌ها را بارگذاری می‌کنید تا بتوانید سوالاتی از آن بپرسید.\n",
"\n",
"- بهترین زمان برای خرید کدو تنبل چه زمانی است؟\n",
"\n",
"- چه قیمتی می‌توانم برای یک جعبه کدو تنبل مینیاتوری انتظار داشته باشم؟\n",
"\n",
"- آیا بهتر است آن‌ها را در سبدهای نیم‌بوشل بخرم یا در جعبه‌های ۱ و ۱/۹ بوشل؟ بیایید به کاوش در این داده‌ها ادامه دهیم.\n",
"\n",
"در درس قبلی، شما یک `tibble` (نسخه مدرن و بازنگری‌شده از فریم داده) ایجاد کردید و آن را با بخشی از مجموعه داده اصلی پر کردید و قیمت‌ها را بر اساس بوشل استانداردسازی کردید. با این کار، شما فقط توانستید حدود ۴۰۰ نقطه داده جمع‌آوری کنید و آن هم فقط برای ماه‌های پاییز. شاید بتوانیم با پاکسازی بیشتر داده‌ها، جزئیات بیشتری درباره ماهیت داده‌ها به دست آوریم؟ خواهیم دید... 🕵️‍♀️\n",
"\n",
"برای این کار، به بسته‌های زیر نیاز خواهیم داشت:\n",
"\n",
"- `tidyverse`: [تایدی‌ورس](https://www.tidyverse.org/) یک [مجموعه از بسته‌های R](https://www.tidyverse.org/packages) است که برای سریع‌تر، آسان‌تر و لذت‌بخش‌تر کردن علم داده طراحی شده است!\n",
"\n",
"- `tidymodels`: چارچوب [تایدی‌مدلز](https://www.tidymodels.org/) یک [مجموعه از بسته‌ها](https://www.tidymodels.org/packages/) برای مدل‌سازی و یادگیری ماشین است.\n",
"\n",
"- `janitor`: بسته [جانیتور](https://github.com/sfirke/janitor) ابزارهای ساده‌ای برای بررسی و پاکسازی داده‌های کثیف ارائه می‌دهد.\n",
"\n",
"- `corrplot`: بسته [کورپلات](https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html) یک ابزار بصری برای بررسی ماتریس همبستگی ارائه می‌دهد که از مرتب‌سازی خودکار متغیرها برای کمک به کشف الگوهای پنهان بین متغیرها پشتیبانی می‌کند.\n",
"\n",
"می‌توانید این بسته‌ها را به این صورت نصب کنید:\n",
"\n",
"`install.packages(c(\"tidyverse\", \"tidymodels\", \"janitor\", \"corrplot\"))`\n",
"\n",
"اسکریپت زیر بررسی می‌کند که آیا بسته‌های مورد نیاز برای تکمیل این ماژول در سیستم شما نصب شده‌اند یا خیر و در صورت عدم وجود، آن‌ها را برای شما نصب می‌کند.\n"
],
"metadata": {
"id": "WqQPS1OAsg3H"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if (!require(\"pacman\")) install.packages(\"pacman\"))\n",
"\n",
"pacman::p_load(tidyverse, tidymodels, janitor, corrplot)"
],
"outputs": [],
"metadata": {
"id": "tA4C2WN3skCf",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "c06cd805-5534-4edc-f72b-d0d1dab96ac0"
}
},
{
"cell_type": "markdown",
"source": [
"ما بعداً این بسته‌های فوق‌العاده را بارگذاری کرده و در جلسه فعلی R خود در دسترس قرار می‌دهیم. (این فقط برای نمایش است، `pacman::p_load()` قبلاً این کار را برای شما انجام داده است)\n",
"\n",
"## 1. یک خط رگرسیون خطی\n",
"\n",
"همان‌طور که در درس ۱ یاد گرفتید، هدف از یک تمرین رگرسیون خطی این است که بتوانیم یک *خط* *برازش* *بهینه* را رسم کنیم تا:\n",
"\n",
"- **روابط متغیرها را نشان دهیم**. رابطه بین متغیرها را نشان دهیم.\n",
"\n",
"- **پیش‌بینی کنیم**. پیش‌بینی‌های دقیقی درباره مکان قرارگیری یک نقطه داده جدید نسبت به آن خط انجام دهیم.\n",
"\n",
"برای رسم این نوع خط، از یک تکنیک آماری به نام **رگرسیون کمترین مربعات** استفاده می‌کنیم. اصطلاح `کمترین مربعات` به این معناست که تمام نقاط داده اطراف خط رگرسیون مربع شده و سپس جمع می‌شوند. ایده‌آل این است که این مجموع نهایی تا حد ممکن کوچک باشد، زیرا ما می‌خواهیم تعداد خطاها یا `کمترین مربعات` کم باشد. بنابراین، خط برازش بهینه خطی است که کمترین مقدار را برای مجموع مربعات خطاها به ما می‌دهد - به همین دلیل به آن *رگرسیون کمترین مربعات* می‌گویند.\n",
"\n",
"این کار را انجام می‌دهیم زیرا می‌خواهیم مدلی از یک خط داشته باشیم که کمترین فاصله تجمعی از تمام نقاط داده ما را داشته باشد. همچنین قبل از جمع کردن، مقادیر را مربع می‌کنیم زیرا به بزرگی آن‌ها اهمیت می‌دهیم نه جهت آن‌ها.\n",
"\n",
"> **🧮 ریاضیات را به من نشان بده**\n",
">\n",
"> این خط، که به آن *خط برازش بهینه* می‌گویند، می‌تواند با [یک معادله](https://en.wikipedia.org/wiki/Simple_linear_regression) بیان شود:\n",
">\n",
"> Y = a + bX\n",
">\n",
"> `X` متغیر `توضیحی` یا `پیش‌بینی‌کننده` است. `Y` متغیر `وابسته` یا `نتیجه` است. شیب خط `b` است و `a` عرض از مبدأ است که به مقدار `Y` زمانی که `X = 0` اشاره دارد.\n",
">\n",
"\n",
"> ![](../../../../../../2-Regression/3-Linear/solution/images/slope.png \"شیب = $y/x$\")\n",
" اینفوگرافیک از جن لوپر\n",
">\n",
"> ابتدا، شیب `b` را محاسبه کنید.\n",
">\n",
"> به عبارت دیگر، و با اشاره به سوال اصلی داده‌های کدو تنبل ما: \"پیش‌بینی قیمت یک بوشل کدو تنبل بر اساس ماه\"، `X` به قیمت و `Y` به ماه فروش اشاره می‌کند.\n",
">\n",
"> ![](../../../../../../translated_images/calculation.989aa7822020d9d0ba9fc781f1ab5192f3421be86ebb88026528aef33c37b0d8.fa.png)\n",
" اینفوگرافیک از جن لوپر\n",
"> \n",
"> مقدار Y را محاسبه کنید. اگر حدود ۴ دلار پرداخت می‌کنید، احتمالاً ماه آوریل است!\n",
">\n",
"> ریاضیات مربوط به محاسبه خط باید شیب خط را نشان دهد که همچنین به عرض از مبدأ وابسته است، یا جایی که `Y` زمانی که `X = 0` قرار دارد.\n",
">\n",
"> می‌توانید روش محاسبه این مقادیر را در وب‌سایت [ریاضیات سرگرم‌کننده](https://www.mathsisfun.com/data/least-squares-regression.html) مشاهده کنید. همچنین به [این ماشین‌حساب کمترین مربعات](https://www.mathsisfun.com/data/least-squares-calculator.html) مراجعه کنید تا ببینید چگونه مقادیر اعداد بر خط تأثیر می‌گذارند.\n",
"\n",
"خیلی ترسناک نیست، نه؟ 🤓\n",
"\n",
"#### همبستگی\n",
"\n",
"یک اصطلاح دیگر که باید درک کنید **ضریب همبستگی** بین متغیرهای X و Y داده شده است. با استفاده از یک نمودار پراکندگی، می‌توانید به سرعت این ضریب را تجسم کنید. نموداری با نقاط داده که به صورت یک خط مرتب پراکنده شده‌اند، همبستگی بالایی دارد، اما نموداری با نقاط داده که به صورت پراکنده در همه جا بین X و Y قرار دارند، همبستگی پایینی دارد.\n",
"\n",
"یک مدل رگرسیون خطی خوب مدلی است که با استفاده از روش رگرسیون کمترین مربعات و یک خط رگرسیون، ضریب همبستگی بالایی (نزدیک به ۱ نسبت به ۰) داشته باشد.\n"
],
"metadata": {
"id": "cdX5FRpvsoP5"
}
},
{
"cell_type": "markdown",
"source": [
"## **۲. رقص با داده‌ها: ایجاد یک دیتافریم برای مدل‌سازی**\n",
"\n",
"<p >\n",
" <img src=\"../../images/janitor.jpg\"\n",
" width=\"700\"/>\n",
" <figcaption>اثر هنری از @allison_horst</figcaption>\n",
"\n",
"\n",
"<!--![اثر هنری از \\@allison_horst](../../../../../../translated_images/janitor.e4a77dd3d3e6a32e25327090b8a9c00dc7cf459c44fa9f184c5ecb0d48ce3794.fa.jpg){width=\"700\"}-->\n"
],
"metadata": {
"id": "WdUKXk7Bs8-V"
}
},
{
"cell_type": "markdown",
"source": [
"کتابخانه‌ها و مجموعه داده‌های مورد نیاز را بارگذاری کنید. داده‌ها را به یک DataFrame تبدیل کنید که شامل زیرمجموعه‌ای از داده‌ها باشد:\n",
"\n",
"- فقط کدوهایی را دریافت کنید که به صورت بوشل قیمت‌گذاری شده‌اند.\n",
"\n",
"- تاریخ را به ماه تبدیل کنید.\n",
"\n",
"- قیمت را به صورت میانگین قیمت‌های بالا و پایین محاسبه کنید.\n",
"\n",
"- قیمت را به گونه‌ای تبدیل کنید که منعکس‌کننده قیمت‌گذاری بر اساس مقدار بوشل باشد.\n",
"\n",
"> ما این مراحل را در [درس قبلی](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/2-Data/solution/lesson_2-R.ipynb) پوشش دادیم.\n"
],
"metadata": {
"id": "fMCtu2G2s-p8"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core Tidyverse packages\n",
"library(tidyverse)\n",
"library(lubridate)\n",
"\n",
"# Import the pumpkins data\n",
"pumpkins <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/2-Regression/data/US-pumpkins.csv\")\n",
"\n",
"\n",
"# Get a glimpse and dimensions of the data\n",
"glimpse(pumpkins)\n",
"\n",
"\n",
"# Print the first 50 rows of the data set\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "ryMVZEEPtERn"
}
},
{
"cell_type": "markdown",
"source": [
"در روح ماجراجویی خالص، بیایید بسته [`janitor`](../../../../../../2-Regression/3-Linear/solution/R/github.com/sfirke/janitor) را بررسی کنیم که توابع ساده‌ای برای بررسی و پاکسازی داده‌های نامرتب ارائه می‌دهد. به عنوان مثال، بیایید نگاهی به نام ستون‌های داده‌های خود بیندازیم:\n"
],
"metadata": {
"id": "xcNxM70EtJjb"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Return column names\n",
"pumpkins %>% \n",
" names()"
],
"outputs": [],
"metadata": {
"id": "5XtpaIigtPfW"
}
},
{
"cell_type": "markdown",
"source": [
"🤔 ما می‌توانیم بهتر عمل کنیم. بیایید این نام ستون‌ها را با تبدیل آن‌ها به قرارداد [snake_case](https://en.wikipedia.org/wiki/Snake_case) به `friendR` تبدیل کنیم، با استفاده از `janitor::clean_names`. برای اطلاعات بیشتر درباره این تابع: `?clean_names`\n"
],
"metadata": {
"id": "IbIqrMINtSHe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Clean names to the snake_case convention\n",
"pumpkins <- pumpkins %>% \n",
" clean_names(case = \"snake\")\n",
"\n",
"# Return column names\n",
"pumpkins %>% \n",
" names()"
],
"outputs": [],
"metadata": {
"id": "a2uYvclYtWvX"
}
},
{
"cell_type": "markdown",
"source": [
"خیلی مرتب‌کننده 🧹! حالا، یک رقص با داده‌ها با استفاده از `dplyr` مثل درس قبلی! 💃\n"
],
"metadata": {
"id": "HfhnuzDDtaDd"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select desired columns\n",
"pumpkins <- pumpkins %>% \n",
" select(variety, city_name, package, low_price, high_price, date)\n",
"\n",
"\n",
"\n",
"# Extract the month from the dates to a new column\n",
"pumpkins <- pumpkins %>%\n",
" mutate(date = mdy(date),\n",
" month = month(date)) %>% \n",
" select(-date)\n",
"\n",
"\n",
"\n",
"# Create a new column for average Price\n",
"pumpkins <- pumpkins %>% \n",
" mutate(price = (low_price + high_price)/2)\n",
"\n",
"\n",
"# Retain only pumpkins with the string \"bushel\"\n",
"new_pumpkins <- pumpkins %>% \n",
" filter(str_detect(string = package, pattern = \"bushel\"))\n",
"\n",
"\n",
"# Normalize the pricing so that you show the pricing per bushel, not per 1 1/9 or 1/2 bushel\n",
"new_pumpkins <- new_pumpkins %>% \n",
" mutate(price = case_when(\n",
" str_detect(package, \"1 1/9\") ~ price/(1.1),\n",
" str_detect(package, \"1/2\") ~ price*2,\n",
" TRUE ~ price))\n",
"\n",
"# Relocate column positions\n",
"new_pumpkins <- new_pumpkins %>% \n",
" relocate(month, .before = variety)\n",
"\n",
"\n",
"# Display the first 5 rows\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "X0wU3gQvtd9f"
}
},
{
"cell_type": "markdown",
"source": [
"آفرین! 👌 حالا یک مجموعه داده تمیز و مرتب دارید که می‌توانید مدل رگرسیون جدید خود را بر اساس آن بسازید!\n",
"\n",
"حوصله یک نمودار پراکندگی دارید؟\n"
],
"metadata": {
"id": "UpaIwaxqth82"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Set theme\n",
"theme_set(theme_light())\n",
"\n",
"# Make a scatter plot of month and price\n",
"new_pumpkins %>% \n",
" ggplot(mapping = aes(x = month, y = price)) +\n",
" geom_point(size = 1.6)\n"
],
"outputs": [],
"metadata": {
"id": "DXgU-j37tl5K"
}
},
{
"cell_type": "markdown",
"source": [
"یک نمودار پراکندگی به ما یادآوری می‌کند که فقط داده‌های ماه‌های مرداد تا آذر را داریم. احتمالاً به داده‌های بیشتری نیاز داریم تا بتوانیم به صورت خطی نتیجه‌گیری کنیم.\n",
"\n",
"بیایید دوباره به داده‌های مدل‌سازی خود نگاهی بیندازیم:\n"
],
"metadata": {
"id": "Ve64wVbwtobI"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Display first 5 rows\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "HFQX2ng1tuSJ"
}
},
{
"cell_type": "markdown",
"source": [
"اگر بخواهیم قیمت یک کدو تنبل را بر اساس ستون‌های `شهر` یا `بسته‌بندی` که از نوع کاراکتری هستند پیش‌بینی کنیم، چه باید کرد؟ یا حتی ساده‌تر، چگونه می‌توانیم همبستگی (که نیاز دارد هر دو ورودی آن عددی باشند) بین مثلاً `بسته‌بندی` و `قیمت` را پیدا کنیم؟ 🤷🤷\n",
"\n",
"مدل‌های یادگیری ماشین با ویژگی‌های عددی بهتر کار می‌کنند تا مقادیر متنی، بنابراین معمولاً باید ویژگی‌های دسته‌بندی را به نمایش‌های عددی تبدیل کنید.\n",
"\n",
"این بدان معناست که باید راهی پیدا کنیم تا پیش‌بینی‌کننده‌های خود را به شکلی تغییر دهیم که مدل بتواند به طور مؤثر از آنها استفاده کند، فرآیندی که به عنوان `مهندسی ویژگی` شناخته می‌شود.\n"
],
"metadata": {
"id": "7hsHoxsStyjJ"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. آماده‌سازی داده‌ها برای مدل‌سازی با استفاده از دستورالعمل‌ها 👩‍🍳👨‍🍳\n",
"\n",
"فعالیت‌هایی که مقادیر پیش‌بینی‌کننده را بازفرمت می‌کنند تا استفاده از آن‌ها برای مدل مؤثرتر شود، به عنوان `مهندسی ویژگی` شناخته می‌شوند.\n",
"\n",
"مدل‌های مختلف نیازهای پیش‌پردازش متفاوتی دارند. به عنوان مثال، روش حداقل مربعات نیاز به `کدگذاری متغیرهای دسته‌ای` مانند ماه، نوع و نام شهر دارد. این فرآیند شامل `ترجمه` یک ستون با `مقادیر دسته‌ای` به یک یا چند `ستون عددی` است که جایگزین ستون اصلی می‌شوند.\n",
"\n",
"برای مثال، فرض کنید داده‌های شما شامل ویژگی دسته‌ای زیر است:\n",
"\n",
"| شهر |\n",
"|:-------:|\n",
"| دنور |\n",
"| نایروبی |\n",
"| توکیو |\n",
"\n",
"می‌توانید از *کدگذاری ترتیبی* استفاده کنید تا یک مقدار عددی منحصر به فرد را جایگزین هر دسته کنید، مانند این:\n",
"\n",
"| شهر |\n",
"|:----:|\n",
"| 0 |\n",
"| 1 |\n",
"| 2 |\n",
"\n",
"و این همان کاری است که با داده‌های خود انجام خواهیم داد!\n",
"\n",
"در این بخش، یک بسته شگفت‌انگیز دیگر از Tidymodels را بررسی خواهیم کرد: [recipes](https://tidymodels.github.io/recipes/) - که برای کمک به پیش‌پردازش داده‌ها **قبل از** آموزش مدل طراحی شده است. در اصل، یک دستورالعمل یک شیء است که تعریف می‌کند چه مراحلی باید بر روی یک مجموعه داده اعمال شود تا برای مدل‌سازی آماده شود.\n",
"\n",
"حالا، بیایید یک دستورالعمل ایجاد کنیم که داده‌های ما را برای مدل‌سازی آماده کند، با جایگزینی یک عدد منحصر به فرد برای تمام مشاهدات در ستون‌های پیش‌بینی‌کننده:\n"
],
"metadata": {
"id": "AD5kQbcvt3Xl"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Specify a recipe\n",
"pumpkins_recipe <- recipe(price ~ ., data = new_pumpkins) %>% \n",
" step_integer(all_predictors(), zero_based = TRUE)\n",
"\n",
"\n",
"# Print out the recipe\n",
"pumpkins_recipe"
],
"outputs": [],
"metadata": {
"id": "BNaFKXfRt9TU"
}
},
{
"cell_type": "markdown",
"source": [
"عالیه! 👏 ما به‌تازگی اولین دستورالعمل خود را ایجاد کردیم که یک نتیجه (قیمت) و پیش‌بینی‌کننده‌های مربوطه را مشخص می‌کند و همچنین تمام ستون‌های پیش‌بینی‌کننده باید به مجموعه‌ای از اعداد صحیح تبدیل شوند 🙌! بیایید سریع آن را بررسی کنیم:\n",
"\n",
"- فراخوانی `recipe()` با یک فرمول به دستورالعمل می‌گوید که *نقش‌ها*ی متغیرها را با استفاده از داده‌های `new_pumpkins` به‌عنوان مرجع مشخص کند. به‌عنوان مثال، ستون `price` نقش `نتیجه` را دریافت کرده است، در حالی که بقیه ستون‌ها نقش `پیش‌بینی‌کننده` را دریافت کرده‌اند.\n",
"\n",
"- `step_integer(all_predictors(), zero_based = TRUE)` مشخص می‌کند که تمام پیش‌بینی‌کننده‌ها باید به مجموعه‌ای از اعداد صحیح تبدیل شوند که شماره‌گذاری از ۰ شروع می‌شود.\n",
"\n",
"ما مطمئنیم که ممکن است به این فکر کنید: \"این خیلی جالب است!! اما اگر بخواهم مطمئن شوم که دستورالعمل‌ها دقیقاً همان کاری را انجام می‌دهند که انتظارش را دارم، چه؟ 🤔\"\n",
"\n",
"این فکر فوق‌العاده‌ای است! ببینید، وقتی دستورالعمل شما تعریف شد، می‌توانید پارامترهای موردنیاز برای پیش‌پردازش داده‌ها را تخمین بزنید و سپس داده‌های پردازش‌شده را استخراج کنید. معمولاً نیازی به انجام این کار ندارید وقتی از Tidymodels استفاده می‌کنید (در یک دقیقه روش معمول را خواهیم دید -> `workflows`) اما این می‌تواند زمانی مفید باشد که بخواهید نوعی بررسی صحت انجام دهید تا مطمئن شوید دستورالعمل‌ها همان چیزی را که انتظار دارید انجام می‌دهند.\n",
"\n",
"برای این کار، به دو فعل دیگر نیاز دارید: `prep()` و `bake()` و همان‌طور که همیشه، دوستان کوچک R ما توسط [`Allison Horst`](https://github.com/allisonhorst/stats-illustrations) به شما کمک می‌کنند تا این موضوع را بهتر درک کنید!\n",
"\n",
"<p >\n",
" <img src=\"../../images/recipes.png\"\n",
" width=\"550\"/>\n",
" <figcaption>اثر هنری از @allison_horst</figcaption>\n"
],
"metadata": {
"id": "KEiO0v7kuC9O"
}
},
{
"cell_type": "markdown",
"source": [
"[`prep()`](https://recipes.tidymodels.org/reference/prep.html): پارامترهای مورد نیاز را از مجموعه داده‌های آموزشی تخمین می‌زند که بعداً می‌توان آن‌ها را به مجموعه داده‌های دیگر اعمال کرد. به عنوان مثال، برای یک ستون پیش‌بینی‌کننده مشخص، کدام مشاهده به عدد صحیح ۰ یا ۱ یا ۲ و غیره اختصاص داده می‌شود.\n",
"\n",
"[`bake()`](https://recipes.tidymodels.org/reference/bake.html): یک دستور آماده‌شده را می‌گیرد و عملیات را بر روی هر مجموعه داده‌ای اعمال می‌کند.\n",
"\n",
"با این توضیحات، بیایید دستورات خود را آماده کنیم و اجرا کنیم تا واقعاً تأیید کنیم که در پشت صحنه، ستون‌های پیش‌بینی‌کننده ابتدا کدگذاری می‌شوند قبل از اینکه مدل اجرا شود.\n"
],
"metadata": {
"id": "Q1xtzebuuTCP"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Prep the recipe\n",
"pumpkins_prep <- prep(pumpkins_recipe)\n",
"\n",
"# Bake the recipe to extract a preprocessed new_pumpkins data\n",
"baked_pumpkins <- bake(pumpkins_prep, new_data = NULL)\n",
"\n",
"# Print out the baked data set\n",
"baked_pumpkins %>% \n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "FGBbJbP_uUUn"
}
},
{
"cell_type": "markdown",
"source": [
"هورا! 🥳 داده‌های پردازش‌شده `baked_pumpkins` تمام پیش‌بینی‌کننده‌های خود را کدگذاری کرده‌اند، که تأیید می‌کند مراحل پیش‌پردازشی که به عنوان دستورالعمل ما تعریف شده‌اند، همان‌طور که انتظار می‌رفت کار می‌کنند. این ممکن است خواندن را برای شما دشوارتر کند، اما برای Tidymodels بسیار قابل فهم‌تر خواهد بود! کمی وقت بگذارید تا ببینید کدام مشاهده به یک عدد صحیح متناظر نگاشت شده است.\n",
"\n",
"همچنین شایان ذکر است که `baked_pumpkins` یک فریم داده است که می‌توانیم محاسباتی روی آن انجام دهیم.\n",
"\n",
"برای مثال، بیایید سعی کنیم یک همبستگی خوب بین دو نقطه از داده‌های شما پیدا کنیم تا شاید بتوانیم یک مدل پیش‌بینی خوب بسازیم. برای این کار از تابع `cor()` استفاده خواهیم کرد. دستور `?cor()` را تایپ کنید تا اطلاعات بیشتری درباره این تابع پیدا کنید.\n"
],
"metadata": {
"id": "1dvP0LBUueAW"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Find the correlation between the city_name and the price\n",
"cor(baked_pumpkins$city_name, baked_pumpkins$price)\n",
"\n",
"# Find the correlation between the package and the price\n",
"cor(baked_pumpkins$package, baked_pumpkins$price)\n"
],
"outputs": [],
"metadata": {
"id": "3bQzXCjFuiSV"
}
},
{
"cell_type": "markdown",
"source": [
"همان‌طور که مشخص است، ارتباط ضعیفی بین شهر و قیمت وجود دارد. با این حال، ارتباط بهتری بین بسته و قیمت آن مشاهده می‌شود. منطقی به نظر می‌رسد، درست است؟ معمولاً هرچه جعبه محصول بزرگ‌تر باشد، قیمت بالاتر است.\n",
"\n",
"حالا که در این مرحله هستیم، بیایید سعی کنیم ماتریس همبستگی تمام ستون‌ها را با استفاده از بسته `corrplot` به تصویر بکشیم.\n"
],
"metadata": {
"id": "BToPWbgjuoZw"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the corrplot package\n",
"library(corrplot)\n",
"\n",
"# Obtain correlation matrix\n",
"corr_mat <- cor(baked_pumpkins %>% \n",
" # Drop columns that are not really informative\n",
" select(-c(low_price, high_price)))\n",
"\n",
"# Make a correlation plot between the variables\n",
"corrplot(corr_mat, method = \"shade\", shade.col = NA, tl.col = \"black\", tl.srt = 45, addCoef.col = \"black\", cl.pos = \"n\", order = \"original\")"
],
"outputs": [],
"metadata": {
"id": "ZwAL3ksmutVR"
}
},
{
"cell_type": "markdown",
"source": [
"🤩🤩 خیلی بهتر.\n",
"\n",
"یک سوال خوب که اکنون می‌توان از این داده‌ها پرسید این است: '`چه قیمتی می‌توانم برای یک بسته کدو تنبل انتظار داشته باشم؟`' بیایید مستقیم به موضوع بپردازیم!\n",
"\n",
"> توجه: وقتی دستور **`bake()`** را برای دستور آماده‌شده **`pumpkins_prep`** با **`new_data = NULL`** اجرا می‌کنید، داده‌های پردازش‌شده (یعنی کدگذاری‌شده) آموزشی را استخراج می‌کنید. اگر مجموعه داده دیگری داشتید، مثلاً یک مجموعه آزمایشی، و می‌خواستید ببینید که یک دستور چگونه آن را پیش‌پردازش می‌کند، کافی بود دستور **`pumpkins_prep`** را با **`new_data = test_set`** اجرا کنید.\n",
"\n",
"## 4. ساخت یک مدل رگرسیون خطی\n",
"\n",
"<p >\n",
" <img src=\"../../images/linear-polynomial.png\"\n",
" width=\"800\"/>\n",
" <figcaption>اینفوگرافیک توسط داسانی مادیپالی</figcaption>\n"
],
"metadata": {
"id": "YqXjLuWavNxW"
}
},
{
"cell_type": "markdown",
"source": [
"حالا که یک دستورالعمل ایجاد کرده‌ایم و تأیید کرده‌ایم که داده‌ها به‌درستی پیش‌پردازش خواهند شد، بیایید یک مدل رگرسیون بسازیم تا به این سؤال پاسخ دهیم: «چه قیمتی می‌توانم برای یک بسته کدو تنبل انتظار داشته باشم؟»\n",
"\n",
"#### آموزش یک مدل رگرسیون خطی با استفاده از مجموعه آموزشی\n",
"\n",
"همان‌طور که احتمالاً متوجه شده‌اید، ستون *price* متغیر `نتیجه` است، در حالی که ستون *package* متغیر `پیش‌بینی‌کننده` است.\n",
"\n",
"برای انجام این کار، ابتدا داده‌ها را به‌گونه‌ای تقسیم می‌کنیم که ۸۰٪ به مجموعه آموزشی و ۲۰٪ به مجموعه آزمایشی اختصاص یابد، سپس یک دستورالعمل تعریف می‌کنیم که ستون پیش‌بینی‌کننده را به مجموعه‌ای از اعداد صحیح کدگذاری کند، و سپس مشخصات مدل را ایجاد می‌کنیم. دستورالعمل را آماده و اجرا نمی‌کنیم، زیرا قبلاً می‌دانیم که داده‌ها را همان‌طور که انتظار می‌رود پیش‌پردازش خواهد کرد.\n"
],
"metadata": {
"id": "Pq0bSzCevW-h"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"set.seed(2056)\n",
"# Split the data into training and test sets\n",
"pumpkins_split <- new_pumpkins %>% \n",
" initial_split(prop = 0.8)\n",
"\n",
"\n",
"# Extract training and test data\n",
"pumpkins_train <- training(pumpkins_split)\n",
"pumpkins_test <- testing(pumpkins_split)\n",
"\n",
"\n",
"\n",
"# Create a recipe for preprocessing the data\n",
"lm_pumpkins_recipe <- recipe(price ~ package, data = pumpkins_train) %>% \n",
" step_integer(all_predictors(), zero_based = TRUE)\n",
"\n",
"\n",
"\n",
"# Create a linear model specification\n",
"lm_spec <- linear_reg() %>% \n",
" set_engine(\"lm\") %>% \n",
" set_mode(\"regression\")"
],
"outputs": [],
"metadata": {
"id": "CyoEh_wuvcLv"
}
},
{
"cell_type": "markdown",
"source": [
"حالا که یک دستورالعمل و مشخصات مدل داریم، باید راهی پیدا کنیم که این دو را در قالب یک شیء ترکیب کنیم. این شیء ابتدا داده‌ها را پیش‌پردازش می‌کند (پشت صحنه با prep+bake)، مدل را روی داده‌های پیش‌پردازش شده آموزش می‌دهد و همچنین امکان فعالیت‌های پس‌پردازش را فراهم می‌کند. چطور است برای آرامش خاطر شما! 🤩\n",
"\n",
"در Tidymodels، این شیء کاربردی [`workflow`](https://workflows.tidymodels.org/) نام دارد و به‌طور مناسب اجزای مدل‌سازی شما را نگه می‌دارد! چیزی که در *پایتون* به آن *pipelines* می‌گوییم.\n",
"\n",
"پس بیایید همه چیز را در یک workflow بسته‌بندی کنیم! 📦\n"
],
"metadata": {
"id": "G3zF_3DqviFJ"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Hold modelling components in a workflow\n",
"lm_wf <- workflow() %>% \n",
" add_recipe(lm_pumpkins_recipe) %>% \n",
" add_model(lm_spec)\n",
"\n",
"# Print out the workflow\n",
"lm_wf"
],
"outputs": [],
"metadata": {
"id": "T3olroU3v-WX"
}
},
{
"cell_type": "markdown",
"source": [
"علاوه بر این، یک جریان کاری می‌تواند تقریباً به همان روشی که یک مدل آموزش داده می‌شود، تنظیم یا آموزش داده شود.\n"
],
"metadata": {
"id": "zd1A5tgOwEPX"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Train the model\n",
"lm_wf_fit <- lm_wf %>% \n",
" fit(data = pumpkins_train)\n",
"\n",
"# Print the model coefficients learned \n",
"lm_wf_fit"
],
"outputs": [],
"metadata": {
"id": "NhJagFumwFHf"
}
},
{
"cell_type": "markdown",
"source": [
"از خروجی مدل می‌توانیم ضرایب یادگرفته شده در طول آموزش را مشاهده کنیم. این ضرایب نشان‌دهنده ضرایب خط بهترین برازش هستند که کمترین خطای کلی را بین متغیر واقعی و پیش‌بینی‌شده به ما می‌دهند.\n",
"\n",
"#### ارزیابی عملکرد مدل با استفاده از مجموعه تست\n",
"\n",
"وقت آن است که ببینیم مدل چگونه عمل کرده است 📏! چگونه این کار را انجام دهیم؟\n",
"\n",
"حالا که مدل را آموزش داده‌ایم، می‌توانیم از آن برای پیش‌بینی مجموعه تست با استفاده از `parsnip::predict()` استفاده کنیم. سپس می‌توانیم این پیش‌بینی‌ها را با مقادیر واقعی برچسب‌ها مقایسه کنیم تا ارزیابی کنیم که مدل چقدر خوب (یا نه!) کار می‌کند.\n",
"\n",
"بیایید با انجام پیش‌بینی برای مجموعه تست شروع کنیم و سپس ستون‌ها را به مجموعه تست متصل کنیم.\n"
],
"metadata": {
"id": "_4QkGtBTwItF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make predictions for the test set\n",
"predictions <- lm_wf_fit %>% \n",
" predict(new_data = pumpkins_test)\n",
"\n",
"\n",
"# Bind predictions to the test set\n",
"lm_results <- pumpkins_test %>% \n",
" select(c(package, price)) %>% \n",
" bind_cols(predictions)\n",
"\n",
"\n",
"# Print the first ten rows of the tibble\n",
"lm_results %>% \n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "UFZzTG0gwTs9"
}
},
{
"cell_type": "markdown",
"source": [
"بله، شما به‌تازگی یک مدل آموزش داده‌اید و از آن برای پیش‌بینی استفاده کرده‌اید! 🔮 آیا این مدل خوب است؟ بیایید عملکرد آن را ارزیابی کنیم!\n",
"\n",
"در Tidymodels، این کار را با استفاده از `yardstick::metrics()` انجام می‌دهیم! برای رگرسیون خطی، بیایید بر روی معیارهای زیر تمرکز کنیم:\n",
"\n",
"- `خطای جذر میانگین مربعات (RMSE)`: جذر [MSE](https://en.wikipedia.org/wiki/Mean_squared_error). این معیار یک مقدار مطلق در همان واحد برچسب (در اینجا، قیمت کدو تنبل) ارائه می‌دهد. هرچه مقدار کوچک‌تر باشد، مدل بهتر است (به‌طور ساده، این معیار نشان‌دهنده میانگین قیمتی است که پیش‌بینی‌ها به اشتباه انجام شده‌اند!)\n",
"\n",
"- `ضریب تعیین (معمولاً به‌عنوان R-squared یا R2 شناخته می‌شود)`: یک معیار نسبی که هرچه مقدار آن بیشتر باشد، مدل بهتر برازش شده است. به‌طور کلی، این معیار نشان می‌دهد که مدل تا چه حد توانسته است واریانس بین مقادیر پیش‌بینی‌شده و واقعی را توضیح دهد.\n"
],
"metadata": {
"id": "0A5MjzM7wW9M"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Evaluate performance of linear regression\n",
"metrics(data = lm_results,\n",
" truth = price,\n",
" estimate = .pred)"
],
"outputs": [],
"metadata": {
"id": "reJ0UIhQwcEH"
}
},
{
"cell_type": "markdown",
"source": [
"عملکرد مدل کاهش یافت. بیایید ببینیم آیا می‌توانیم با تجسم یک نمودار پراکندگی از بسته و قیمت، سپس استفاده از پیش‌بینی‌های انجام‌شده برای اضافه کردن یک خط برازش بهتر، نشانه بهتری به دست آوریم.\n",
"\n",
"این به این معناست که باید مجموعه آزمایشی را آماده و پردازش کنیم تا ستون بسته را کدگذاری کرده و سپس آن را به پیش‌بینی‌های انجام‌شده توسط مدل خود متصل کنیم.\n"
],
"metadata": {
"id": "fdgjzjkBwfWt"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Encode package column\n",
"package_encode <- lm_pumpkins_recipe %>% \n",
" prep() %>% \n",
" bake(new_data = pumpkins_test) %>% \n",
" select(package)\n",
"\n",
"\n",
"# Bind encoded package column to the results\n",
"lm_results <- lm_results %>% \n",
" bind_cols(package_encode %>% \n",
" rename(package_integer = package)) %>% \n",
" relocate(package_integer, .after = package)\n",
"\n",
"\n",
"# Print new results data frame\n",
"lm_results %>% \n",
" slice_head(n = 5)\n",
"\n",
"\n",
"# Make a scatter plot\n",
"lm_results %>% \n",
" ggplot(mapping = aes(x = package_integer, y = price)) +\n",
" geom_point(size = 1.6) +\n",
" # Overlay a line of best fit\n",
" geom_line(aes(y = .pred), color = \"orange\", size = 1.2) +\n",
" xlab(\"package\")\n",
" \n"
],
"outputs": [],
"metadata": {
"id": "R0nw719lwkHE"
}
},
{
"cell_type": "markdown",
"source": [
"عالی! همان‌طور که می‌بینید، مدل رگرسیون خطی واقعاً نمی‌تواند رابطه بین یک بسته و قیمت مربوط به آن را به‌خوبی تعمیم دهد.\n",
"\n",
"🎃 تبریک می‌گویم! شما به‌تازگی مدلی ایجاد کردید که می‌تواند به پیش‌بینی قیمت چند نوع کدو تنبل کمک کند. مزرعه کدو تنبل تعطیلات شما زیبا خواهد بود. اما احتمالاً می‌توانید مدلی بهتر بسازید!\n",
"\n",
"## ۵. ساخت یک مدل رگرسیون چندجمله‌ای\n",
"\n",
"<p >\n",
" <img src=\"../../images/linear-polynomial.png\"\n",
" width=\"800\"/>\n",
" <figcaption>اینفوگرافیک از داسانی مدیپالی</figcaption>\n"
],
"metadata": {
"id": "HOCqJXLTwtWI"
}
},
{
"cell_type": "markdown",
"source": [
"گاهی داده‌های ما ممکن است رابطه‌ای خطی نداشته باشند، اما همچنان بخواهیم نتیجه‌ای را پیش‌بینی کنیم. رگرسیون چندجمله‌ای می‌تواند به ما کمک کند تا برای روابط پیچیده‌تر و غیرخطی پیش‌بینی‌هایی انجام دهیم.\n",
"\n",
"برای مثال، رابطه بین بسته‌بندی و قیمت در مجموعه داده‌های کدو تنبل را در نظر بگیرید. در حالی که گاهی بین متغیرها رابطه‌ای خطی وجود دارد - هرچه حجم کدو تنبل بزرگ‌تر باشد، قیمت بالاتر می‌رود - گاهی این روابط نمی‌توانند به صورت یک صفحه یا خط مستقیم ترسیم شوند.\n",
"\n",
"> ✅ [اینجا چند مثال دیگر](https://online.stat.psu.edu/stat501/lesson/9/9.8) از داده‌هایی که می‌توانند از رگرسیون چندجمله‌ای استفاده کنند آورده شده است.\n",
">\n",
"> دوباره به رابطه بین نوع کدو تنبل و قیمت در نمودار قبلی نگاه کنید. آیا این نمودار پراکندگی به نظر می‌رسد که باید حتماً با یک خط مستقیم تحلیل شود؟ شاید نه. در این حالت، می‌توانید رگرسیون چندجمله‌ای را امتحان کنید.\n",
">\n",
"> ✅ چندجمله‌ای‌ها عبارت‌های ریاضی هستند که ممکن است شامل یک یا چند متغیر و ضرایب باشند.\n",
"\n",
"#### آموزش یک مدل رگرسیون چندجمله‌ای با استفاده از مجموعه آموزشی\n",
"\n",
"رگرسیون چندجمله‌ای یک *خط منحنی* ایجاد می‌کند تا داده‌های غیرخطی را بهتر تطبیق دهد.\n",
"\n",
"بیایید ببینیم آیا یک مدل چندجمله‌ای در پیش‌بینی‌ها عملکرد بهتری خواهد داشت یا خیر. ما روندی نسبتاً مشابه با قبل را دنبال خواهیم کرد:\n",
"\n",
"- ایجاد یک دستورالعمل که مراحل پیش‌پردازش داده‌ها را مشخص می‌کند تا داده‌ها برای مدل‌سازی آماده شوند، مانند: کدگذاری پیش‌بینی‌کننده‌ها و محاسبه چندجمله‌ای‌های درجه *n*\n",
"\n",
"- ساخت یک مشخصات مدل\n",
"\n",
"- ترکیب دستورالعمل و مشخصات مدل در یک جریان کاری\n",
"\n",
"- ایجاد یک مدل با برازش جریان کاری\n",
"\n",
"- ارزیابی عملکرد مدل بر روی داده‌های آزمایشی\n",
"\n",
"بیایید شروع کنیم!\n"
],
"metadata": {
"id": "VcEIpRV9wzYr"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Specify a recipe\r\n",
"poly_pumpkins_recipe <-\r\n",
" recipe(price ~ package, data = pumpkins_train) %>%\r\n",
" step_integer(all_predictors(), zero_based = TRUE) %>% \r\n",
" step_poly(all_predictors(), degree = 4)\r\n",
"\r\n",
"\r\n",
"# Create a model specification\r\n",
"poly_spec <- linear_reg() %>% \r\n",
" set_engine(\"lm\") %>% \r\n",
" set_mode(\"regression\")\r\n",
"\r\n",
"\r\n",
"# Bundle recipe and model spec into a workflow\r\n",
"poly_wf <- workflow() %>% \r\n",
" add_recipe(poly_pumpkins_recipe) %>% \r\n",
" add_model(poly_spec)\r\n",
"\r\n",
"\r\n",
"# Create a model\r\n",
"poly_wf_fit <- poly_wf %>% \r\n",
" fit(data = pumpkins_train)\r\n",
"\r\n",
"\r\n",
"# Print learned model coefficients\r\n",
"poly_wf_fit\r\n",
"\r\n",
" "
],
"outputs": [],
"metadata": {
"id": "63n_YyRXw3CC"
}
},
{
"cell_type": "markdown",
"source": [
"#### ارزیابی عملکرد مدل\n",
"\n",
"👏👏 شما یک مدل چندجمله‌ای ساخته‌اید، بیایید پیش‌بینی‌هایی روی مجموعه تست انجام دهیم!\n"
],
"metadata": {
"id": "-LHZtztSxDP0"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make price predictions on test data\r\n",
"poly_results <- poly_wf_fit %>% predict(new_data = pumpkins_test) %>% \r\n",
" bind_cols(pumpkins_test %>% select(c(package, price))) %>% \r\n",
" relocate(.pred, .after = last_col())\r\n",
"\r\n",
"\r\n",
"# Print the results\r\n",
"poly_results %>% \r\n",
" slice_head(n = 10)"
],
"outputs": [],
"metadata": {
"id": "YUFpQ_dKxJGx"
}
},
{
"cell_type": "markdown",
"source": [
"ووهو، بیایید ارزیابی کنیم که مدل چگونه بر روی test_set با استفاده از `yardstick::metrics()` عمل کرده است.\n"
],
"metadata": {
"id": "qxdyj86bxNGZ"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"metrics(data = poly_results, truth = price, estimate = .pred)"
],
"outputs": [],
"metadata": {
"id": "8AW5ltkBxXDm"
}
},
{
"cell_type": "markdown",
"source": [
"🤩🤩 عملکرد بسیار بهتر.\n",
"\n",
"`rmse` از حدود ۷ به حدود ۳ کاهش یافت، که نشان‌دهنده کاهش خطا بین قیمت واقعی و قیمت پیش‌بینی‌شده است. می‌توانید *به طور کلی* این را به این معنا تفسیر کنید که به طور میانگین، پیش‌بینی‌های نادرست حدود ۳ دلار اشتباه هستند. `rsq` از حدود ۰.۴ به ۰.۸ افزایش یافت.\n",
"\n",
"تمام این معیارها نشان می‌دهند که مدل چندجمله‌ای بسیار بهتر از مدل خطی عمل می‌کند. عالیه!\n",
"\n",
"بیایید ببینیم آیا می‌توانیم این را به صورت تصویری نشان دهیم!\n"
],
"metadata": {
"id": "6gLHNZDwxYaS"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Bind encoded package column to the results\r\n",
"poly_results <- poly_results %>% \r\n",
" bind_cols(package_encode %>% \r\n",
" rename(package_integer = package)) %>% \r\n",
" relocate(package_integer, .after = package)\r\n",
"\r\n",
"\r\n",
"# Print new results data frame\r\n",
"poly_results %>% \r\n",
" slice_head(n = 5)\r\n",
"\r\n",
"\r\n",
"# Make a scatter plot\r\n",
"poly_results %>% \r\n",
" ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
" geom_point(size = 1.6) +\r\n",
" # Overlay a line of best fit\r\n",
" geom_line(aes(y = .pred), color = \"midnightblue\", size = 1.2) +\r\n",
" xlab(\"package\")\r\n"
],
"outputs": [],
"metadata": {
"id": "A83U16frxdF1"
}
},
{
"cell_type": "markdown",
"source": [
"شما می‌توانید یک خط منحنی که بهتر با داده‌های شما مطابقت دارد ببینید! 🤩\n",
"\n",
"می‌توانید این را با استفاده از یک فرمول چندجمله‌ای به `geom_smooth` روان‌تر کنید، مانند این:\n"
],
"metadata": {
"id": "4U-7aHOVxlGU"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a scatter plot\r\n",
"poly_results %>% \r\n",
" ggplot(mapping = aes(x = package_integer, y = price)) +\r\n",
" geom_point(size = 1.6) +\r\n",
" # Overlay a line of best fit\r\n",
" geom_smooth(method = lm, formula = y ~ poly(x, degree = 4), color = \"midnightblue\", size = 1.2, se = FALSE) +\r\n",
" xlab(\"package\")"
],
"outputs": [],
"metadata": {
"id": "5vzNT0Uexm-w"
}
},
{
"cell_type": "markdown",
"source": [
"مثل یک منحنی صاف! 🤩\n",
"\n",
"در اینجا نحوه انجام یک پیش‌بینی جدید آورده شده است:\n"
],
"metadata": {
"id": "v9u-wwyLxq4G"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Make a hypothetical data frame\r\n",
"hypo_tibble <- tibble(package = \"bushel baskets\")\r\n",
"\r\n",
"# Make predictions using linear model\r\n",
"lm_pred <- lm_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
"\r\n",
"# Make predictions using polynomial model\r\n",
"poly_pred <- poly_wf_fit %>% predict(new_data = hypo_tibble)\r\n",
"\r\n",
"# Return predictions in a list\r\n",
"list(\"linear model prediction\" = lm_pred, \r\n",
" \"polynomial model prediction\" = poly_pred)\r\n"
],
"outputs": [],
"metadata": {
"id": "jRPSyfQGxuQv"
}
},
{
"cell_type": "markdown",
"source": [
"پیش‌بینی مدل `polynomial` منطقی به نظر می‌رسد، با توجه به نمودارهای پراکندگی `price` و `package`! و اگر این مدل نسبت به مدل قبلی بهتر باشد، با نگاه به همان داده‌ها، باید بودجه‌ای برای این کدوهای گران‌تر در نظر بگیرید!\n",
"\n",
"🏆 آفرین! شما دو مدل رگرسیون را در یک درس ایجاد کردید. در بخش نهایی درباره رگرسیون، یاد خواهید گرفت که چگونه از رگرسیون لجستیک برای تعیین دسته‌بندی‌ها استفاده کنید.\n",
"\n",
"## **🚀چالش**\n",
"\n",
"چندین متغیر مختلف را در این دفترچه آزمایش کنید تا ببینید چگونه همبستگی با دقت مدل ارتباط دارد.\n",
"\n",
"## [**آزمون پس از درس**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)\n",
"\n",
"## **مرور و مطالعه شخصی**\n",
"\n",
"در این درس درباره رگرسیون خطی یاد گرفتیم. انواع مهم دیگری از رگرسیون نیز وجود دارند. درباره تکنیک‌های Stepwise، Ridge، Lasso و Elasticnet مطالعه کنید. یک دوره خوب برای یادگیری بیشتر، [دوره یادگیری آماری دانشگاه استنفورد](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning) است.\n",
"\n",
"اگر می‌خواهید بیشتر درباره استفاده از چارچوب فوق‌العاده Tidymodels یاد بگیرید، لطفاً منابع زیر را بررسی کنید:\n",
"\n",
"- وب‌سایت Tidymodels: [شروع کار با Tidymodels](https://www.tidymodels.org/start/)\n",
"\n",
"- Max Kuhn و Julia Silge، [*مدل‌سازی مرتب با R*](https://www.tmwr.org/)*.*\n",
"\n",
"###### **تشکر ویژه از:**\n",
"\n",
"[Allison Horst](https://twitter.com/allison_horst?lang=en) برای خلق تصاویر فوق‌العاده‌ای که R را جذاب‌تر و دلپذیرتر می‌کنند. تصاویر بیشتر را در [گالری](https://www.google.com/url?q=https://github.com/allisonhorst/stats-illustrations&sa=D&source=editors&ust=1626380772530000&usg=AOvVaw3zcfyCizFQZpkSLzxiiQEM) او پیدا کنید.\n"
],
"metadata": {
"id": "8zOLOWqMxzk5"
}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**سلب مسئولیت**: \nاین سند با استفاده از سرویس ترجمه هوش مصنوعی [Co-op Translator](https://github.com/Azure/co-op-translator) ترجمه شده است. در حالی که ما برای دقت تلاش می‌کنیم، لطفاً توجه داشته باشید که ترجمه‌های خودکار ممکن است شامل خطاها یا نادقتی‌ها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، ترجمه حرفه‌ای انسانی توصیه می‌شود. ما هیچ مسئولیتی در قبال سوءتفاهم‌ها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.\n"
]
}
]
}