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

449 lines
19 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-04T07:07:16+00:00",
"source_file": "2-Regression/1-Tools/solution/R/lesson_1-R.ipynb",
"language_code": "he"
}
},
"cells": [
{
"cell_type": "markdown",
"source": [
"# בנה מודל רגרסיה: התחל עם R ו-Tidymodels עבור מודלים של רגרסיה\n"
],
"metadata": {
"id": "YJUHCXqK57yz"
}
},
{
"cell_type": "markdown",
"source": [
"## מבוא לרגרסיה - שיעור 1\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](../../../../../../2-Regression/1-Tools/images/encouRage.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",
"עכשיו, בואו נטען את מערך הנתונים של סוכרת מה-URL המקור הזה: <https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html>\n",
"\n",
"בנוסף, נבצע בדיקת תקינות על הנתונים שלנו באמצעות `glimpse()` ונציג את חמש השורות הראשונות באמצעות `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()` מראה לנו שלנתונים אלו יש 442 שורות ו-11 עמודות, כאשר כל העמודות הן מסוג הנתונים `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": [
"## 3. נתוני אימון ובדיקה\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",
"## 5. חיזוי על קבוצת הבדיקה\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"
]
}
]
}