Merge pull request #859 from microsoft/update-translations

🌐 Update translations via Co-op Translator
pull/860/head
Lee Stott 2 weeks ago committed by GitHub
commit ba417b877d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,159 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
"translation_date": "2025-09-05T19:38:13+00:00",
"source_file": "1-Introduction/1-intro-to-ML/README.md",
"language_code": "he"
}
-->
# מבוא ללמידת מכונה
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
---
[![למידת מכונה למתחילים - מבוא ללמידת מכונה למתחילים](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "למידת מכונה למתחילים - מבוא ללמידת מכונה למתחילים")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר שמסביר את השיעור.
ברוכים הבאים לקורס זה על למידת מכונה קלאסית למתחילים! בין אם אתם חדשים לחלוטין לנושא הזה, או מומחים בלמידת מכונה שמחפשים לרענן את הידע, אנחנו שמחים שהצטרפתם אלינו! אנו שואפים ליצור נקודת התחלה ידידותית ללימודי למידת מכונה ונשמח להעריך, להגיב ולשלב את [המשוב שלכם](https://github.com/microsoft/ML-For-Beginners/discussions).
[![מבוא ללמידת מכונה](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "מבוא ללמידת מכונה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: ג'ון גוטאג מ-MIT מציג את למידת המכונה
---
## התחלת העבודה עם למידת מכונה
לפני שמתחילים עם תוכנית הלימודים הזו, יש לוודא שהמחשב שלכם מוכן להריץ מחברות באופן מקומי.
- **הגדירו את המחשב שלכם באמצעות הסרטונים האלה**. השתמשו בקישורים הבאים כדי ללמוד [איך להתקין את Python](https://youtu.be/CXZYvNRIAKM) במערכת שלכם ו-[להגדיר עורך טקסט](https://youtu.be/EU8eayHWoZg) לפיתוח.
- **למדו Python**. מומלץ גם להבין את הבסיס של [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), שפת תכנות שימושית למדעני נתונים שבה נשתמש בקורס הזה.
- **למדו Node.js ו-JavaScript**. נשתמש גם ב-JavaScript מספר פעמים בקורס הזה כשנבנה אפליקציות ווב, ולכן תצטרכו להתקין [node](https://nodejs.org) ו-[npm](https://www.npmjs.com/), וכן [Visual Studio Code](https://code.visualstudio.com/) שיהיה זמין לפיתוח ב-Python וב-JavaScript.
- **צרו חשבון GitHub**. מכיוון שמצאתם אותנו כאן ב-[GitHub](https://github.com), ייתכן שכבר יש לכם חשבון, אבל אם לא, צרו אחד ואז עשו fork לתוכנית הלימודים הזו כדי להשתמש בה בעצמכם. (אתם מוזמנים גם לתת לנו כוכב 😊)
- **חקור את Scikit-learn**. הכירו את [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), סט ספריות למידת מכונה שנשתמש בהן בשיעורים האלה.
---
## מהי למידת מכונה?
המונח 'למידת מכונה' הוא אחד המונחים הפופולריים והשכיחים ביותר כיום. יש סיכוי לא מבוטל ששמעתם את המונח הזה לפחות פעם אחת אם יש לכם היכרות כלשהי עם טכנולוגיה, לא משנה באיזה תחום אתם עובדים. עם זאת, המכניקה של למידת מכונה היא תעלומה עבור רוב האנשים. עבור מתחילים בלמידת מכונה, הנושא יכול לעיתים להרגיש מרתיע. לכן, חשוב להבין מהי למידת מכונה באמת, וללמוד עליה צעד אחר צעד, דרך דוגמאות מעשיות.
---
## עקומת ההייפ
![עקומת ההייפ של למידת מכונה](../../../../1-Introduction/1-intro-to-ML/images/hype.png)
> Google Trends מציג את עקומת ההייפ האחרונה של המונח 'למידת מכונה'
---
## יקום מסתורי
אנחנו חיים ביקום מלא בתעלומות מרתקות. מדענים גדולים כמו סטיבן הוקינג, אלברט איינשטיין ועוד רבים הקדישו את חייהם לחיפוש מידע משמעותי שחושף את התעלומות של העולם סביבנו. זהו מצב הלמידה האנושי: ילד לומד דברים חדשים ומגלה את מבנה עולמו שנה אחר שנה כשהוא גדל לבגרות.
---
## מוחו של הילד
המוח והחושים של הילד תופסים את העובדות של סביבתו ולומדים בהדרגה את הדפוסים הנסתרים של החיים, שמסייעים לילד ליצור כללים לוגיים לזיהוי דפוסים נלמדים. תהליך הלמידה של המוח האנושי הופך את בני האדם ליצורים החיים המתוחכמים ביותר בעולם הזה. הלמידה המתמשכת על ידי גילוי דפוסים נסתרים ואז חדשנות על בסיסם מאפשרת לנו להשתפר ולהתפתח לאורך כל חיינו. יכולת הלמידה וההתפתחות הזו קשורה למושג שנקרא [פלסטיות מוחית](https://www.simplypsychology.org/brain-plasticity.html). באופן שטחי, ניתן למצוא כמה דמיון מוטיבציוני בין תהליך הלמידה של המוח האנושי לבין מושגי למידת מכונה.
---
## המוח האנושי
המוח [האנושי](https://www.livescience.com/29365-human-brain.html) תופס דברים מהעולם האמיתי, מעבד את המידע הנתפס, מקבל החלטות רציונליות ומבצע פעולות מסוימות בהתאם לנסיבות. זה מה שאנחנו מכנים התנהגות אינטליגנטית. כאשר אנו מתכנתים חיקוי של תהליך ההתנהגות האינטליגנטית למכונה, זה נקרא בינה מלאכותית (AI).
---
## כמה מונחים
למרות שהמונחים יכולים להיות מבלבלים, למידת מכונה (ML) היא תת-תחום חשוב של בינה מלאכותית. **ML עוסקת בשימוש באלגוריתמים מיוחדים כדי לחשוף מידע משמעותי ולמצוא דפוסים נסתרים מנתונים נתפסים כדי לתמוך בתהליך קבלת החלטות רציונלי**.
---
## AI, ML, למידה עמוקה
![AI, ML, למידה עמוקה, מדעי הנתונים](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png)
> דיאגרמה שמציגה את הקשרים בין AI, ML, למידה עמוקה ומדעי הנתונים. אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper) בהשראת [הגרפיקה הזו](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining)
---
## מושגים שנכסה
בתוכנית הלימודים הזו, נכסה רק את מושגי היסוד של למידת מכונה שמתחיל חייב לדעת. נכסה את מה שאנחנו מכנים 'למידת מכונה קלאסית' בעיקר באמצעות Scikit-learn, ספרייה מצוינת שרבים מהסטודנטים משתמשים בה כדי ללמוד את הבסיס. כדי להבין מושגים רחבים יותר של בינה מלאכותית או למידה עמוקה, ידע יסודי חזק בלמידת מכונה הוא הכרחי, ולכן אנו מציעים אותו כאן.
---
## בקורס הזה תלמדו:
- מושגי יסוד של למידת מכונה
- ההיסטוריה של ML
- ML והוגנות
- טכניקות רגרסיה בלמידת מכונה
- טכניקות סיווג בלמידת מכונה
- טכניקות אשכולות בלמידת מכונה
- עיבוד שפה טבעית בלמידת מכונה
- חיזוי סדרות זמן בלמידת מכונה
- למידה מחזקת
- יישומים בעולם האמיתי של ML
---
## מה לא נכסה
- למידה עמוקה
- רשתות נוירונים
- AI
כדי ליצור חוויית למידה טובה יותר, נמנע מהמורכבויות של רשתות נוירונים, 'למידה עמוקה' - בניית מודלים מרובי שכבות באמצעות רשתות נוירונים - ו-AI, שאותם נדון בתוכנית לימודים אחרת. בנוסף, נציע תוכנית לימודים עתידית במדעי הנתונים שתתמקד בהיבט הזה של התחום הרחב יותר.
---
## למה ללמוד למידת מכונה?
למידת מכונה, מנקודת מבט מערכתית, מוגדרת כיצירת מערכות אוטומטיות שיכולות ללמוד דפוסים נסתרים מנתונים כדי לסייע בקבלת החלטות אינטליגנטיות.
המוטיבציה הזו מושפעת באופן רופף מאופן שבו המוח האנושי לומד דברים מסוימים על בסיס הנתונים שהוא תופס מהעולם החיצוני.
✅ חשבו לרגע מדוע עסק ירצה להשתמש באסטרטגיות למידת מכונה במקום ליצור מנוע מבוסס כללים קשיחים.
---
## יישומים של למידת מכונה
יישומים של למידת מכונה נמצאים כיום כמעט בכל מקום, והם נפוצים כמו הנתונים שזורמים סביב החברה שלנו, שנוצרים על ידי הטלפונים החכמים שלנו, מכשירים מחוברים ומערכות אחרות. בהתחשב בפוטנציאל העצום של אלגוריתמים מתקדמים בלמידת מכונה, חוקרים בוחנים את יכולתם לפתור בעיות רב-ממדיות ורב-תחומיות בחיים האמיתיים עם תוצאות חיוביות רבות.
---
## דוגמאות ליישום ML
**ניתן להשתמש בלמידת מכונה בדרכים רבות**:
- לחזות את הסבירות למחלה על סמך ההיסטוריה הרפואית או הדוחות של מטופל.
- להשתמש בנתוני מזג אוויר כדי לחזות אירועי מזג אוויר.
- להבין את התחושה של טקסט.
- לזהות חדשות מזויפות כדי לעצור את הפצת התעמולה.
תחומים כמו פיננסים, כלכלה, מדעי כדור הארץ, חקר החלל, הנדסה ביו-רפואית, מדעי הקוגניציה ואפילו תחומים במדעי הרוח אימצו את למידת המכונה כדי לפתור את הבעיות הכבדות בעיבוד נתונים של התחום שלהם.
---
## סיכום
למידת מכונה מאוטומטת את תהליך גילוי הדפוסים על ידי מציאת תובנות משמעותיות מנתונים אמיתיים או נתונים שנוצרו. היא הוכיחה את עצמה כבעלת ערך רב בעסקים, בריאות ויישומים פיננסיים, בין היתר.
בעתיד הקרוב, הבנת היסודות של למידת מכונה תהיה הכרחית עבור אנשים מכל תחום בשל האימוץ הנרחב שלה.
---
# 🚀 אתגר
שרטטו, על נייר או באמצעות אפליקציה מקוונת כמו [Excalidraw](https://excalidraw.com/), את ההבנה שלכם לגבי ההבדלים בין AI, ML, למידה עמוקה ומדעי הנתונים. הוסיפו רעיונות לבעיות שכל אחת מהטכניקות הללו טובה בפתרונן.
# [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
---
# סקירה ולימוד עצמי
כדי ללמוד עוד על איך לעבוד עם אלגוריתמים של ML בענן, עקבו אחרי [מסלול הלמידה הזה](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott).
קחו [מסלול למידה](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) על יסודות ML.
---
# משימה
[התחילו לעבוד](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4c4698044bb8af52cfb6388a4ee0e53b",
"translation_date": "2025-09-05T19:40:29+00:00",
"source_file": "1-Introduction/1-intro-to-ML/assignment.md",
"language_code": "he"
}
-->
# להתחיל לפעול
## הוראות
במשימה זו שאינה מדורגת, עליכם לרענן את הידע שלכם ב-Python ולהכין את הסביבה שלכם כך שתוכל להריץ מחברות.
קחו את [מסלול הלמידה של Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), ולאחר מכן הכינו את המערכות שלכם על ידי צפייה בסרטוני ההיכרות הבאים:
https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,164 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
"translation_date": "2025-09-05T19:41:23+00:00",
"source_file": "1-Introduction/2-history-of-ML/README.md",
"language_code": "he"
}
-->
# ההיסטוריה של למידת מכונה
![סיכום ההיסטוריה של למידת מכונה בסקצ'נוט](../../../../sketchnotes/ml-history.png)
> סקצ'נוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
---
[![למידת מכונה למתחילים - ההיסטוריה של למידת מכונה](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "למידת מכונה למתחילים - ההיסטוריה של למידת מכונה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על השיעור הזה.
בשיעור זה נעבור על אבני הדרך המרכזיות בהיסטוריה של למידת מכונה ובינה מלאכותית.
ההיסטוריה של בינה מלאכותית (AI) כתחום קשורה קשר הדוק להיסטוריה של למידת מכונה, שכן האלגוריתמים וההתקדמות החישובית שמניעים את למידת המכונה תרמו להתפתחות הבינה המלאכותית. חשוב לזכור כי למרות שהתחומים הללו החלו להתגבש כתחומי מחקר נפרדים בשנות ה-50, [גילויים אלגוריתמיים, סטטיסטיים, מתמטיים, חישוביים וטכניים חשובים](https://wikipedia.org/wiki/Timeline_of_machine_learning) קדמו לתקופה זו ואף חפפו לה. למעשה, אנשים חשבו על שאלות אלו במשך [מאות שנים](https://wikipedia.org/wiki/History_of_artificial_intelligence): מאמר זה דן בבסיס האינטלקטואלי ההיסטורי של הרעיון של "מכונה חושבת".
---
## גילויים חשובים
- 1763, 1812 [משפט בייס](https://wikipedia.org/wiki/Bayes%27_theorem) והקדמיו. משפט זה ויישומיו מהווים בסיס להסקה, ומתארים את ההסתברות להתרחשות אירוע בהתבסס על ידע קודם.
- 1805 [תורת הריבועים הפחותים](https://wikipedia.org/wiki/Least_squares) מאת המתמטיקאי הצרפתי אדריאן-מארי לז'נדר. תיאוריה זו, שתלמדו עליה ביחידת הרגרסיה שלנו, מסייעת בהתאמת נתונים.
- 1913 [שרשראות מרקוב](https://wikipedia.org/wiki/Markov_chain), על שם המתמטיקאי הרוסי אנדריי מרקוב, משמשות לתיאור רצף של אירועים אפשריים בהתבסס על מצב קודם.
- 1957 [פרספטרון](https://wikipedia.org/wiki/Perceptron) הוא סוג של מסווג ליניארי שהומצא על ידי הפסיכולוג האמריקאי פרנק רוזנבלט ומהווה בסיס להתקדמות בלמידה עמוקה.
---
- 1967 [השכן הקרוב](https://wikipedia.org/wiki/Nearest_neighbor) הוא אלגוריתם שתוכנן במקור למיפוי מסלולים. בהקשר של למידת מכונה הוא משמש לזיהוי דפוסים.
- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) משמש לאימון [רשתות עצביות קדמיות](https://wikipedia.org/wiki/Feedforward_neural_network).
- 1982 [רשתות עצביות חוזרות](https://wikipedia.org/wiki/Recurrent_neural_network) הן רשתות עצביות מלאכותיות שמקורן ברשתות עצביות קדמיות ויוצרות גרפים זמניים.
✅ בצעו מחקר קטן. אילו תאריכים נוספים בולטים בהיסטוריה של למידת מכונה ובינה מלאכותית?
---
## 1950: מכונות שחושבות
אלן טיורינג, אדם יוצא דופן שב-2019 נבחר [על ידי הציבור](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) כמדען הגדול ביותר של המאה ה-20, נחשב כמי שסייע להניח את היסודות לרעיון של "מכונה שיכולה לחשוב". הוא התמודד עם ספקנים ועם הצורך שלו עצמו בראיות אמפיריות לרעיון זה, בין היתר על ידי יצירת [מבחן טיורינג](https://www.bbc.com/news/technology-18475646), אותו תחקור בשיעורי עיבוד השפה הטבעית שלנו.
---
## 1956: פרויקט המחקר הקיץ בדארטמות'
"פרויקט המחקר הקיץ בדארטמות' על בינה מלאכותית היה אירוע מכונן עבור תחום הבינה המלאכותית," ובו נטבע המונח 'בינה מלאכותית' ([מקור](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)).
> כל היבט של למידה או כל תכונה אחרת של אינטליגנציה ניתן לתיאור מדויק מספיק כך שניתן יהיה ליצור מכונה שתדמה אותו.
---
החוקר הראשי, פרופסור למתמטיקה ג'ון מקארתי, קיווה "להתקדם על בסיס ההשערה שכל היבט של למידה או כל תכונה אחרת של אינטליגנציה ניתן לתיאור מדויק מספיק כך שניתן יהיה ליצור מכונה שתדמה אותו." בין המשתתפים היה גם מרווין מינסקי, דמות בולטת בתחום.
הסדנה נחשבת כמי שיזמה ועודדה דיונים רבים, כולל "עליית השיטות הסמליות, מערכות שהתמקדו בתחומים מוגבלים (מערכות מומחה מוקדמות), ומערכות דדוקטיביות מול מערכות אינדוקטיביות." ([מקור](https://wikipedia.org/wiki/Dartmouth_workshop)).
---
## 1956 - 1974: "שנות הזהב"
משנות ה-50 ועד אמצע שנות ה-70, שררה אופטימיות רבה לגבי היכולת של בינה מלאכותית לפתור בעיות רבות. ב-1967, מרווין מינסקי הצהיר בביטחון ש"בתוך דור ... הבעיה של יצירת 'בינה מלאכותית' תיפתר באופן משמעותי." (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall)
מחקר עיבוד שפה טבעית פרח, חיפוש שוכלל והפך לעוצמתי יותר, ונוצר הרעיון של 'עולמות מיקרו', שבהם משימות פשוטות הושלמו באמצעות הוראות בשפה פשוטה.
---
המחקר מומן היטב על ידי סוכנויות ממשלתיות, התקדמות נעשתה בחישוב ובאלגוריתמים, ונבנו אב-טיפוס של מכונות חכמות. כמה מהמכונות הללו כוללות:
* [שייקי הרובוט](https://wikipedia.org/wiki/Shakey_the_robot), שיכול היה לתמרן ולהחליט כיצד לבצע משימות בצורה 'חכמה'.
![שייקי, רובוט חכם](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg)
> שייקי ב-1972
---
* אלייזה, 'צ'טרבוט' מוקדם, יכלה לשוחח עם אנשים ולשמש כ'מטפלת' פרימיטיבית. תלמדו עוד על אלייזה בשיעורי עיבוד השפה הטבעית.
![אלייזה, בוט](../../../../1-Introduction/2-history-of-ML/images/eliza.png)
> גרסה של אלייזה, צ'טבוט
---
* "עולם הקוביות" היה דוגמה לעולם מיקרו שבו ניתן היה לערום ולמיין קוביות, ונערכו ניסויים בלימוד מכונות לקבל החלטות. התקדמות שנעשתה עם ספריות כמו [SHRDLU](https://wikipedia.org/wiki/SHRDLU) סייעה לקדם את עיבוד השפה.
[![עולם הקוביות עם SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "עולם הקוביות עם SHRDLU")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: עולם הקוביות עם SHRDLU
---
## 1974 - 1980: "חורף הבינה המלאכותית"
עד אמצע שנות ה-70, התברר כי המורכבות של יצירת 'מכונות חכמות' הוערכה בחסר וכי ההבטחה שלה, בהתחשב בכוח החישוב הזמין, הוערכה יתר על המידה. המימון התייבש והאמון בתחום פחת. כמה בעיות שהשפיעו על האמון כוללות:
---
- **מגבלות**. כוח החישוב היה מוגבל מדי.
- **התפוצצות קומבינטורית**. כמות הפרמטרים שצריך לאמן גדלה באופן מעריכי ככל שנדרשו יותר מהמחשבים, ללא התפתחות מקבילה של כוח חישוב ויכולת.
- **מחסור בנתונים**. היה מחסור בנתונים שהקשה על תהליך הבדיקה, הפיתוח והעידון של אלגוריתמים.
- **האם אנו שואלים את השאלות הנכונות?**. עצם השאלות שנשאלו החלו להישאל מחדש. חוקרים החלו להתמודד עם ביקורת על הגישות שלהם:
- מבחני טיורינג הועמדו בסימן שאלה, בין היתר, על ידי תיאוריית "החדר הסיני" שטענה כי "תכנות מחשב דיגיטלי עשוי לגרום לו להיראות כאילו הוא מבין שפה אך לא יכול לייצר הבנה אמיתית." ([מקור](https://plato.stanford.edu/entries/chinese-room/))
- האתיקה של הכנסת אינטליגנציות מלאכותיות כמו "המטפלת" אלייזה לחברה הועמדה בסימן שאלה.
---
במקביל, החלו להיווצר אסכולות שונות בתחום הבינה המלאכותית. נוצרה דיכוטומיה בין ["בינה מלאכותית 'מבולגנת' לעומת 'מסודרת'"](https://wikipedia.org/wiki/Neats_and_scruffies). מעבדות 'מבולגנות' שיפצו תוכניות במשך שעות עד שהשיגו את התוצאות הרצויות. מעבדות 'מסודרות' "התמקדו בלוגיקה ובפתרון בעיות פורמלי". אלייזה ו-SHRDLU היו מערכות 'מבולגנות' ידועות. בשנות ה-80, עם הדרישה להפיק מערכות למידת מכונה שניתן לשחזר, הגישה ה'מסודרת' תפסה בהדרגה את הבכורה שכן תוצאותיה ניתנות להסבר טוב יותר.
---
## שנות ה-80: מערכות מומחה
ככל שהתחום גדל, היתרון שלו לעסקים הפך ברור יותר, ובשנות ה-80 כך גם התפשטותן של 'מערכות מומחה'. "מערכות מומחה היו בין הצורות הראשונות של תוכנות בינה מלאכותית (AI) שהצליחו באמת." ([מקור](https://wikipedia.org/wiki/Expert_system)).
סוג זה של מערכת הוא למעשה יברידי_, המורכב בחלקו ממנוע חוקים שמגדיר דרישות עסקיות, ובחלקו ממנוע הסקה שמנצל את מערכת החוקים כדי להסיק עובדות חדשות.
התקופה הזו גם ראתה תשומת לב גוברת לרשתות עצביות.
---
## 1987 - 1993: "הקיפאון של הבינה המלאכותית"
התפשטות החומרה המיוחדת של מערכות מומחה גרמה, למרבה הצער, להתמחות יתר. עלייתם של מחשבים אישיים גם התחרתה במערכות גדולות, מיוחדות ומרכזיות אלו. הדמוקרטיזציה של המחשוב החלה, והיא בסופו של דבר סללה את הדרך להתפוצצות המודרנית של נתונים גדולים.
---
## 1993 - 2011
תקופה זו ראתה עידן חדש שבו למידת מכונה ובינה מלאכותית יכלו לפתור חלק מהבעיות שנגרמו קודם לכן בשל מחסור בנתונים ובכוח חישוב. כמות הנתונים החלה לגדול במהירות ולהיות זמינה יותר, לטוב ולרע, במיוחד עם הופעת הסמארטפון סביב 2007. כוח החישוב התרחב באופן מעריכי, והאלגוריתמים התפתחו במקביל. התחום החל להתבגר כאשר הימים החופשיים של העבר החלו להתגבש לכדי דיסציפלינה אמיתית.
---
## היום
כיום למידת מכונה ובינה מלאכותית נוגעות כמעט בכל חלק בחיינו. תקופה זו דורשת הבנה זהירה של הסיכונים וההשפעות הפוטנציאליות של אלגוריתמים אלו על חיי אדם. כפי שבראד סמית' ממיקרוסופט אמר, "טכנולוגיית המידע מעלה סוגיות שנוגעות ללב ההגנות הבסיסיות של זכויות האדם כמו פרטיות וחופש הביטוי. סוגיות אלו מגבירות את האחריות של חברות טכנולוגיה שיוצרות את המוצרים הללו. לדעתנו, הן גם דורשות רגולציה ממשלתית מחושבת ופיתוח נורמות סביב שימושים מקובלים" ([מקור](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)).
---
נותר לראות מה צופן העתיד, אך חשוב להבין את מערכות המחשוב הללו ואת התוכנה והאלגוריתמים שהם מפעילים. אנו מקווים שתוכנית הלימודים הזו תסייע לכם להבין טוב יותר כך שתוכלו להחליט בעצמכם.
[![ההיסטוריה של למידה עמוקה](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "ההיסטוריה של למידה עמוקה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: יאן לקון מדבר על ההיסטוריה של למידה עמוקה בהרצאה זו
---
## 🚀אתגר
התעמקו באחד מהרגעים ההיסטוריים הללו ולמדו עוד על האנשים שמאחוריהם. ישנם דמויות מרתקות, ואף גילוי מדעי מעולם לא נוצר בוואקום תרבותי. מה תגלו?
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
---
## סקירה ולימוד עצמי
הנה פריטים לצפייה והאזנה:
[פודקאסט זה שבו איימי בויד דנה בהתפתחות הבינה המלאכותית](http://runasradio.com/Shows/Show/739)
[![ההיסטוריה של בינה מלאכותית מאת איימי בויד](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "ההיסטוריה של בינה מלאכותית מאת איימי בויד")
---
## משימה
[צרו ציר זמן](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "eb6e4d5afd1b21a57d2b9e6d0aac3969",
"translation_date": "2025-09-05T19:43:42+00:00",
"source_file": "1-Introduction/2-history-of-ML/assignment.md",
"language_code": "he"
}
-->
# יצירת ציר זמן
## הוראות
באמצעות [הריפו הזה](https://github.com/Digital-Humanities-Toolkit/timeline-builder), צרו ציר זמן של היבט כלשהו בהיסטוריה של אלגוריתמים, מתמטיקה, סטטיסטיקה, בינה מלאכותית או למידת מכונה, או שילוב של אלה. תוכלו להתמקד באדם אחד, רעיון אחד, או תקופת זמן ארוכה של מחשבה. הקפידו להוסיף אלמנטים מולטימדיה.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ----------------------------------------------- | ------------------------------------- | ------------------------------------------------------------- |
| | ציר זמן פרוס מוצג כעמוד GitHub | הקוד אינו שלם ולא פרוס | ציר הזמן אינו שלם, אינו מבוסס היטב ואינו פרוס |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,170 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9a6b702d1437c0467e3c5c28d763dac2",
"translation_date": "2025-09-05T19:31:10+00:00",
"source_file": "1-Introduction/3-fairness/README.md",
"language_code": "he"
}
-->
# בניית פתרונות למידת מכונה עם AI אחראי
![סיכום של AI אחראי בלמידת מכונה בסקיצה](../../../../sketchnotes/ml-fairness.png)
> סקיצה מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [שאלון לפני ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## מבוא
בתוכנית לימודים זו, תתחילו לגלות כיצד למידת מכונה משפיעה על חיי היומיום שלנו. כבר עכשיו, מערכות ומודלים מעורבים במשימות קבלת החלטות יומיומיות, כמו אבחנות רפואיות, אישורי הלוואות או זיהוי הונאות. לכן, חשוב שהמודלים הללו יפעלו בצורה טובה ויספקו תוצאות אמינות. כמו כל יישום תוכנה, מערכות AI עשויות לאכזב או להוביל לתוצאה לא רצויה. זו הסיבה שחשוב להבין ולהסביר את ההתנהגות של מודל AI.
דמיינו מה יכול לקרות כאשר הנתונים שבהם אתם משתמשים לבניית המודלים חסרים ייצוג של קבוצות דמוגרפיות מסוימות, כמו גזע, מגדר, השקפה פוליטית, דת, או מייצגים אותן באופן לא פרופורציונלי. ומה לגבי מצב שבו תוצאות המודל מפורשות כך שהן מעדיפות קבוצה דמוגרפית מסוימת? מה ההשלכות עבור היישום? בנוסף, מה קורה כאשר למודל יש תוצאה שלילית שפוגעת באנשים? מי אחראי להתנהגות של מערכות AI? אלו שאלות שנחקור בתוכנית לימודים זו.
בשיעור זה תלמדו:
- להעלות את המודעות לחשיבות ההוגנות בלמידת מכונה ולנזקים הקשורים להוגנות.
- להכיר את הפרקטיקה של חקר חריגים ותסריטים לא שגרתיים כדי להבטיח אמינות ובטיחות.
- להבין את הצורך להעצים את כולם על ידי עיצוב מערכות מכילות.
- לחקור את החשיבות של הגנה על פרטיות ואבטחת נתונים ואנשים.
- לראות את החשיבות של גישה שקופה להסבר התנהגות מודלים של AI.
- להיות מודעים לכך שאחריות היא חיונית לבניית אמון במערכות AI.
## דרישות מקדימות
כדרישה מקדימה, אנא עברו על מסלול הלמידה "עקרונות AI אחראי" וצפו בסרטון הבא בנושא:
למדו עוד על AI אחראי על ידי מעקב אחר [מסלול הלמידה](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
[![הגישה של Microsoft ל-AI אחראי](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "הגישה של Microsoft ל-AI אחראי")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: הגישה של Microsoft ל-AI אחראי
## הוגנות
מערכות AI צריכות להתייחס לכולם באופן הוגן ולהימנע מהשפעה שונה על קבוצות דומות של אנשים. לדוגמה, כאשר מערכות AI מספקות המלצות לטיפול רפואי, בקשות להלוואות או תעסוקה, עליהן להציע את אותן המלצות לכל מי שיש לו סימפטומים, נסיבות פיננסיות או כישורים מקצועיים דומים. כל אחד מאיתנו נושא עמו הטיות מובנות שמשפיעות על ההחלטות והפעולות שלנו. הטיות אלו יכולות להיות ניכרות בנתונים שבהם אנו משתמשים לאימון מערכות AI. לעיתים, מניפולציה כזו מתרחשת באופן לא מכוון. קשה לעיתים לדעת באופן מודע מתי אנו מכניסים הטיה לנתונים.
**"חוסר הוגנות"** כולל השפעות שליליות, או "נזקים", לקבוצה של אנשים, כמו אלו המוגדרים לפי גזע, מגדר, גיל או מצב נכות. הנזקים העיקריים הקשורים להוגנות יכולים להיות מסווגים כ:
- **הקצאה**, אם מגדר או אתניות, לדוגמה, מועדפים על פני אחרים.
- **איכות השירות**. אם מאמנים את הנתונים לתרחיש ספציפי אך המציאות מורכבת יותר, זה מוביל לשירות בעל ביצועים ירודים. לדוגמה, מתקן סבון ידיים שלא הצליח לזהות אנשים עם עור כהה. [מקור](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **השמצה**. ביקורת לא הוגנת ותיוג של משהו או מישהו. לדוגמה, טכנולוגיית תיוג תמונות שגתה בתיוג תמונות של אנשים כהי עור כגורילות.
- **ייצוג יתר או חסר**. הרעיון הוא שקבוצה מסוימת אינה נראית במקצוע מסוים, וכל שירות או פונקציה שממשיכים לקדם זאת תורמים לנזק.
- **סטראוטיפים**. שיוך קבוצה מסוימת לתכונות שהוקצו מראש. לדוגמה, מערכת תרגום בין אנגלית לטורקית עשויה לכלול אי דיוקים בשל מילים עם שיוך סטראוטיפי למגדר.
![תרגום לטורקית](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png)
> תרגום לטורקית
![תרגום חזרה לאנגלית](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png)
> תרגום חזרה לאנגלית
בעת עיצוב ובדיקת מערכות AI, עלינו להבטיח שה-AI יהיה הוגן ולא יתוכנת לקבל החלטות מוטות או מפלות, שאסורות גם על בני אדם. הבטחת הוגנות ב-AI ובלמידת מכונה נותרת אתגר סוציוטכני מורכב.
### אמינות ובטיחות
כדי לבנות אמון, מערכות AI צריכות להיות אמינות, בטוחות ועקביות בתנאים רגילים ולא צפויים. חשוב לדעת כיצד מערכות AI יתנהגו במגוון מצבים, במיוחד כאשר מדובר בחריגים. בעת בניית פתרונות AI, יש להתמקד באופן משמעותי בטיפול במגוון רחב של נסיבות שהפתרונות עשויים להיתקל בהן. לדוגמה, רכב אוטונומי צריך לשים את בטיחות האנשים בראש סדר העדיפויות. כתוצאה מכך, ה-AI שמפעיל את הרכב צריך לשקול את כל התרחישים האפשריים שהרכב עשוי להיתקל בהם, כמו לילה, סופות רעמים או שלגים, ילדים שרצים ברחוב, חיות מחמד, עבודות בכביש וכו'. עד כמה מערכת AI יכולה להתמודד עם מגוון רחב של תנאים בצורה אמינה ובטוחה משקף את רמת הציפייה שהמדען נתונים או מפתח ה-AI לקחו בחשבון במהלך העיצוב או הבדיקה של המערכת.
> [🎥 לחצו כאן לצפייה בסרטון: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
### הכלה
מערכות AI צריכות להיות מעוצבות כך שיתקשרו ויעצימו את כולם. בעת עיצוב ויישום מערכות AI, מדעני נתונים ומפתחי AI מזהים ומטפלים במחסומים פוטנציאליים במערכת שיכולים להוציא אנשים באופן לא מכוון. לדוגמה, ישנם מיליארד אנשים עם מוגבלויות ברחבי העולם. עם התקדמות ה-AI, הם יכולים לגשת למגוון רחב של מידע והזדמנויות בקלות רבה יותר בחיי היומיום שלהם. על ידי טיפול במחסומים, נוצרת הזדמנות לחדש ולפתח מוצרים AI עם חוויות טובות יותר שמועילות לכולם.
> [🎥 לחצו כאן לצפייה בסרטון: הכלה ב-AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
### אבטחה ופרטיות
מערכות AI צריכות להיות בטוחות ולכבד את פרטיות האנשים. אנשים נותנים פחות אמון במערכות שמסכנות את פרטיותם, המידע שלהם או חייהם. בעת אימון מודלים של למידת מכונה, אנו מסתמכים על נתונים כדי להפיק את התוצאות הטובות ביותר. תוך כדי כך, יש לקחת בחשבון את מקור הנתונים ואת שלמותם. לדוגמה, האם הנתונים הוגשו על ידי משתמשים או היו זמינים לציבור? לאחר מכן, בעת עבודה עם הנתונים, חשוב לפתח מערכות AI שיכולות להגן על מידע חסוי ולהתנגד להתקפות. ככל שה-AI הופך לנפוץ יותר, הגנה על פרטיות ואבטחת מידע אישי ועסקי חשובים הופכת לקריטית ומורכבת יותר. סוגיות פרטיות ואבטחת נתונים דורשות תשומת לב מיוחדת עבור AI מכיוון שגישה לנתונים חיונית למערכות AI כדי לבצע תחזיות והחלטות מדויקות ומושכלות על אנשים.
> [🎥 לחצו כאן לצפייה בסרטון: אבטחה ב-AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- בתעשייה עשינו התקדמות משמעותית בפרטיות ואבטחה, מונעת באופן משמעותי על ידי רגולציות כמו ה-GDPR (General Data Protection Regulation).
- עם זאת, במערכות AI עלינו להכיר במתח בין הצורך ביותר נתונים אישיים כדי להפוך את המערכות ליותר אישיות ויעילות לבין פרטיות.
- כמו עם לידת המחשבים המחוברים לאינטרנט, אנו גם רואים עלייה משמעותית במספר סוגיות האבטחה הקשורות ל-AI.
- באותו הזמן, ראינו שימוש ב-AI לשיפור האבטחה. לדוגמה, רוב סורקי האנטי-וירוס המודרניים מונעים על ידי AI היום.
- עלינו להבטיח שתהליכי מדע הנתונים שלנו ישתלבו בהרמוניה עם שיטות הפרטיות והאבטחה העדכניות ביותר.
### שקיפות
מערכות AI צריכות להיות מובנות. חלק קריטי בשקיפות הוא הסבר ההתנהגות של מערכות AI ושל רכיביהן. שיפור ההבנה של מערכות AI דורש שהגורמים המעורבים יבינו כיצד ולמה הן פועלות, כך שיוכלו לזהות בעיות ביצועים פוטנציאליות, חששות בטיחות ופרטיות, הטיות, פרקטיקות מפלות או תוצאות לא מכוונות. אנו גם מאמינים שמי שמשתמש במערכות AI צריך להיות כנה וגלוי לגבי מתי, למה ואיך הוא בוחר להפעיל אותן, כמו גם לגבי המגבלות של המערכות שהוא משתמש בהן. לדוגמה, אם בנק משתמש במערכת AI כדי לתמוך בהחלטות הלוואה לצרכנים, חשוב לבחון את התוצאות ולהבין אילו נתונים משפיעים על ההמלצות של המערכת. ממשלות מתחילות להסדיר את ה-AI בתעשיות שונות, ולכן מדעני נתונים וארגונים חייבים להסביר אם מערכת AI עומדת בדרישות הרגולציה, במיוחד כאשר יש תוצאה לא רצויה.
> [🎥 לחצו כאן לצפייה בסרטון: שקיפות ב-AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- מכיוון שמערכות AI כל כך מורכבות, קשה להבין כיצד הן פועלות ולפרש את התוצאות.
- חוסר הבנה זה משפיע על האופן שבו מערכות אלו מנוהלות, מופעלות ומתועדות.
- חוסר הבנה זה משפיע יותר מכל על ההחלטות שמתקבלות באמצעות התוצאות שמערכות אלו מפיקות.
### אחריות
האנשים שמעצבים ומפעילים מערכות AI חייבים להיות אחראים לאופן שבו המערכות שלהם פועלות. הצורך באחריות הוא קריטי במיוחד בטכנולוגיות רגישות כמו זיהוי פנים. לאחרונה, ישנה דרישה גוברת לטכנולוגיית זיהוי פנים, במיוחד מארגוני אכיפת חוק שרואים את הפוטנציאל של הטכנולוגיה בשימושים כמו מציאת ילדים נעדרים. עם זאת, טכנולוגיות אלו עשויות לשמש ממשלות כדי לסכן את חירויות היסוד של אזרחיהן, למשל, על ידי הפעלת מעקב מתמשך על אנשים מסוימים. לכן, מדעני נתונים וארגונים צריכים להיות אחראים לאופן שבו מערכת ה-AI שלהם משפיעה על אנשים או על החברה.
[![חוקר AI מוביל מזהיר מפני מעקב המוני באמצעות זיהוי פנים](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "הגישה של Microsoft ל-AI אחראי")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: אזהרות מפני מעקב המוני באמצעות זיהוי פנים
בסופו של דבר, אחת השאלות הגדולות ביותר לדור שלנו, כראשון שמביא את ה-AI לחברה, היא כיצד להבטיח שמחשבים יישארו אחראים לאנשים וכיצד להבטיח שהאנשים שמעצבים מחשבים יישארו אחראים לכל השאר.
## הערכת השפעה
לפני אימון מודל למידת מכונה, חשוב לבצע הערכת השפעה כדי להבין את מטרת מערכת ה-AI; מה השימוש המיועד; היכן היא תופעל; ומי יתקשר עם המערכת. אלו מועילים לבוחנים או למבקרים שמעריכים את המערכת לדעת אילו גורמים יש לקחת בחשבון בעת זיהוי סיכונים פוטנציאליים ותוצאות צפויות.
התחומים הבאים הם מוקדי תשומת לב בעת ביצוע הערכת השפעה:
* **השפעה שלילית על אנשים**. מודעות לכל מגבלה או דרישה, שימוש לא נתמך או כל מגבלה ידועה שמפריעה לביצועי המערכת היא חיונית כדי להבטיח שהמערכת לא תופעל באופן שעלול לגרום נזק לאנשים.
* **דרישות נתונים**. הבנת האופן והיכן המערכת תשתמש בנתונים מאפשרת למבקרים לחקור כל דרישות נתונים שיש לקחת בחשבון (למשל, תקנות GDPR או HIPPA). בנוסף, יש לבחון האם מקור או כמות הנתונים מספקים לאימון.
* **סיכום השפעה**. איסוף רשימה של נזקים פוטנציאליים שעלולים להתעורר משימוש במערכת. לאורך מחזור החיים של למידת מכונה, יש לבדוק אם הבעיות שזוהו טופלו או נפתרו.
* **מטרות ישימות** לכל אחד מששת העקרונות המרכזיים. יש להעריך אם המטרות מכל אחד מהעקרונות הושגו ואם יש פערים.
## איתור באגים עם AI אחראי
בדומה לאיתור באגים ביישום תוכנה, איתור באגים במערכת AI הוא תהליך הכרחי לזיהוי ופתרון בעיות במערכת. ישנם גורמים רבים שיכולים להשפיע על כך שמודל לא יפעל כמצופה או באופן אחראי. רוב מדדי הביצועים המסורתיים של מודלים הם אגרגטים כמותיים של ביצועי המודל, שאינם מספיקים לניתוח כיצד מודל מפר את עקרונות ה-AI האחראי. יתרה מכך, מודל למידת מכונה הוא "קופסה שחורה" שמקשה להבין מה מניע את תוצאותיו או לספק הסבר כאשר הוא טועה. בהמשך הקורס, נלמד כיצד להשתמש בלוח המחוונים של AI אחראי כדי לעזור באיתור באגים במערכות AI. לוח המחוונים מספק כלי הוליסטי למדעני נתונים ומפתחי AI לבצע:
* **ניתוח שגיאות**. לזהות את התפלגות השגיאות של המודל שיכולה להשפיע על ההוגנות או האמינות של המערכת.
* **סקירת מודל**. לגלות היכן יש פערים בביצועי המודל בין קבוצות נתונים שונות.
* **ניתוח נתונים**. להבין את התפלגות הנתונים ולזהות כל הטיה פוטנציאלית בנתונים שעלולה להוביל לבעיות הוגנות, הכלה ואמינות.
* **הבנת מודל**. להבין מה משפיע או משפיע על תחזיות המודל. זה עוזר להסביר את התנהגות המודל, שחשובה לשקיפות ואחריות.
## 🚀 אתגר
כדי למנוע נזקים מלהיות מוכנסים מלכתחילה, עלינו:
- לכלול מגוון של רקעים ופרספקטיבות בקרב האנשים שעובדים על מערכות
- להשקיע במאגרי נתונים שמייצגים את המגוון של החברה שלנו
- לפתח שיטות טובות יותר לאורך מחזור החיים של למידת מכונה לזיהוי ותיקון AI אחראי כאשר הוא מתרחש
חשבו על תרחישים אמיתיים שבהם חוסר אמינות של מודל ניכר בבנייה ובשימוש במודל. מה עוד כדאי לקחת בחשבון?
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
בשיעור זה, למדתם כמה יסודות של מושגי הוגנות וחוסר הוגנות בלמידת מכונה.
צפו בסדנה זו כדי להעמיק בנושאים:
- במרדף אחר בינה מלאכותית אחראית: יישום עקרונות בפועל מאת בסמירה נושי, מהרנוש סמקי ואמיט שארמה
[![Responsible AI Toolbox: מסגרת קוד פתוח לבניית בינה מלאכותית אחראית](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: מסגרת קוד פתוח לבניית בינה מלאכותית אחראית")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: RAI Toolbox: מסגרת קוד פתוח לבניית בינה מלאכותית אחראית מאת בסמירה נושי, מהרנוש סמקי ואמיט שארמה
בנוסף, קראו:
- מרכז המשאבים של Microsoft בנושא בינה מלאכותית אחראית: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- קבוצת המחקר FATE של Microsoft: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
RAI Toolbox:
- [מאגר GitHub של Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox)
קראו על הכלים של Azure Machine Learning להבטחת הוגנות:
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
## משימה
[חקור את RAI Toolbox](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "dbda60e7b1fe5f18974e7858eff0004e",
"translation_date": "2025-09-05T19:34:13+00:00",
"source_file": "1-Introduction/3-fairness/assignment.md",
"language_code": "he"
}
-->
# חקור את ערכת הכלים של AI אחראי
## הוראות
בשיעור זה למדתם על ערכת הכלים של AI אחראי, פרויקט "קוד פתוח, מונע על ידי הקהילה, שנועד לעזור למדעני נתונים לנתח ולשפר מערכות AI." למשימה זו, חקרו אחד מהמחברות של RAI Toolbox [notebooks](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) ודווחו על הממצאים שלכם במאמר או מצגת.
## קריטריונים להערכה
| קריטריונים | מצטיין | מספק | דורש שיפור |
| ----------- | ------- | ----- | ----------- |
| | מאמר או מצגת פאוורפוינט מוצגים, דנים במערכות של Fairlearn, המחברת שהורצה והמסקנות שהוסקו מהרצתה | מאמר מוצג ללא מסקנות | לא מוצג מאמר |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס AI [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,132 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
"translation_date": "2025-09-05T19:35:07+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
"language_code": "he"
}
-->
# טכניקות בלמידת מכונה
תהליך הבנייה, השימוש והתחזוקה של מודלים בלמידת מכונה והנתונים שהם משתמשים בהם שונה מאוד מתהליכי פיתוח אחרים. בשיעור זה, נבאר את התהליך ונפרט את הטכניקות המרכזיות שעליכם להכיר. אתם תלמדו:
- להבין את התהליכים שמניעים למידת מכונה ברמה גבוהה.
- לחקור מושגים בסיסיים כמו 'מודלים', 'תחזיות' ו'נתוני אימון'.
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
[![ML למתחילים - טכניקות בלמידת מכונה](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML למתחילים - טכניקות בלמידת מכונה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר שמסביר את השיעור.
## מבוא
ברמה גבוהה, מלאכת יצירת תהליכי למידת מכונה (ML) מורכבת ממספר שלבים:
1. **הגדרת השאלה**. רוב תהליכי ML מתחילים בשאלה שלא ניתן לענות עליה באמצעות תוכנית מותנית פשוטה או מנוע מבוסס חוקים. שאלות אלו לרוב עוסקות בתחזיות המבוססות על אוסף נתונים.
2. **איסוף והכנת נתונים**. כדי לענות על השאלה שלכם, אתם זקוקים לנתונים. איכות ולעיתים גם כמות הנתונים שלכם יקבעו עד כמה תוכלו לענות על השאלה הראשונית שלכם. ויזואליזציה של נתונים היא חלק חשוב בשלב זה. שלב זה כולל גם חלוקת הנתונים לקבוצת אימון ובדיקה לצורך בניית מודל.
3. **בחירת שיטת אימון**. בהתאם לשאלה שלכם ולאופי הנתונים, עליכם לבחור כיצד לאמן מודל שייצג בצורה הטובה ביותר את הנתונים ויבצע תחזיות מדויקות. זהו החלק בתהליך ML שדורש מומחיות ספציפית ולעיתים ניסוי רב.
4. **אימון המודל**. באמצעות נתוני האימון שלכם, תשתמשו באלגוריתמים שונים כדי לאמן מודל שיזהה דפוסים בנתונים. המודל עשוי להשתמש במשקלים פנימיים שניתן להתאים כדי להעדיף חלקים מסוימים של הנתונים על פני אחרים לצורך בניית מודל טוב יותר.
5. **הערכת המודל**. תשתמשו בנתונים שלא נראו בעבר (נתוני הבדיקה שלכם) מתוך הסט שנאסף כדי לראות כיצד המודל מתפקד.
6. **כיוונון פרמטרים**. בהתבסס על ביצועי המודל שלכם, תוכלו לחזור על התהליך עם פרמטרים או משתנים שונים שמכוונים את התנהגות האלגוריתמים ששימשו לאימון המודל.
7. **תחזית**. השתמשו בקלט חדש כדי לבדוק את דיוק המודל שלכם.
## איזו שאלה לשאול
מחשבים מצטיינים במיוחד בגילוי דפוסים נסתרים בנתונים. יכולת זו מועילה מאוד לחוקרים שיש להם שאלות בתחום מסוים שלא ניתן לענות עליהן בקלות באמצעות יצירת מנוע חוקים מותנה. לדוגמה, במשימה אקטוארית, מדען נתונים עשוי להיות מסוגל לבנות חוקים מותאמים אישית סביב תמותת מעשנים לעומת לא מעשנים.
כאשר משתנים רבים נוספים למשוואה, מודל ML עשוי להיות יעיל יותר בתחזית שיעורי תמותה עתידיים בהתבסס על היסטוריית בריאות קודמת. דוגמה משמחת יותר עשויה להיות תחזיות מזג אוויר לחודש אפריל במיקום מסוים בהתבסס על נתונים הכוללים קו רוחב, קו אורך, שינויי אקלים, קרבה לים, דפוסי זרם סילון ועוד.
✅ מצגת זו [מצגת](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) על מודלים של מזג אוויר מציעה פרספקטיבה היסטורית לשימוש ב-ML בניתוח מזג אוויר.
## משימות לפני בנייה
לפני שתתחילו לבנות את המודל שלכם, ישנם מספר משימות שעליכם להשלים. כדי לבדוק את השאלה שלכם ולגבש השערה המבוססת על תחזיות המודל, עליכם לזהות ולהגדיר מספר אלמנטים.
### נתונים
כדי לענות על השאלה שלכם בוודאות כלשהי, אתם זקוקים לכמות מספקת של נתונים מהסוג הנכון. ישנם שני דברים שעליכם לעשות בשלב זה:
- **איסוף נתונים**. תוך שמירה על השיעור הקודם בנושא הוגנות בניתוח נתונים, אספו את הנתונים שלכם בזהירות. היו מודעים למקורות הנתונים, להטיות מובנות שהם עשויים להכיל, ותעדו את מקורם.
- **הכנת נתונים**. ישנם מספר שלבים בתהליך הכנת הנתונים. ייתכן שתצטרכו לאחד נתונים ולנרמל אותם אם הם מגיעים ממקורות מגוונים. תוכלו לשפר את איכות וכמות הנתונים באמצעות שיטות שונות כמו המרת מחרוזות למספרים (כפי שעשינו ב[Clustering](../../5-Clustering/1-Visualize/README.md)). ייתכן שתייצרו נתונים חדשים בהתבסס על המקור (כפי שעשינו ב[Classification](../../4-Classification/1-Introduction/README.md)). תוכלו לנקות ולערוך את הנתונים (כפי שנעשה לפני השיעור על [אפליקציות אינטרנט](../../3-Web-App/README.md)). לבסוף, ייתכן שתצטרכו גם לערבב ולשנות את סדר הנתונים, בהתאם לטכניקות האימון שלכם.
✅ לאחר איסוף ועיבוד הנתונים, הקדישו רגע לבדוק אם הצורה שלהם תאפשר לכם להתמודד עם השאלה המיועדת. ייתכן שהנתונים לא יתפקדו היטב במשימה שלכם, כפי שגילינו בשיעורי [Clustering](../../5-Clustering/1-Visualize/README.md)!
### מאפיינים ומטרה
[מאפיין](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) הוא תכונה מדידה של הנתונים שלכם. בהרבה מערכי נתונים הוא מתבטא ככותרת עמודה כמו 'תאריך', 'גודל' או 'צבע'. משתנה המאפיין שלכם, שמיוצג בדרך כלל כ-`X` בקוד, מייצג את משתנה הקלט שישמש לאימון המודל.
מטרה היא הדבר שאתם מנסים לחזות. המטרה, שמיוצגת בדרך כלל כ-`y` בקוד, מייצגת את התשובה לשאלה שאתם מנסים לשאול מהנתונים שלכם: בחודש דצמבר, איזה **צבע** דלעות יהיה הזול ביותר? בסן פרנסיסקו, אילו שכונות יהיו בעלות **מחיר** הנדל"ן הטוב ביותר? לעיתים המטרה מכונה גם תכונת תווית.
### בחירת משתנה המאפיין שלכם
🎓 **בחירת מאפיינים והפקת מאפיינים** איך תדעו איזה משתנה לבחור בעת בניית מודל? סביר להניח שתעברו תהליך של בחירת מאפיינים או הפקת מאפיינים כדי לבחור את המשתנים הנכונים למודל הביצועי ביותר. עם זאת, הם אינם אותו הדבר: "הפקת מאפיינים יוצרת מאפיינים חדשים מפונקציות של המאפיינים המקוריים, בעוד שבחירת מאפיינים מחזירה תת-קבוצה של המאפיינים." ([מקור](https://wikipedia.org/wiki/Feature_selection))
### ויזואליזציה של הנתונים שלכם
היבט חשוב בארגז הכלים של מדען הנתונים הוא היכולת לייצג נתונים באופן חזותי באמצעות ספריות מצוינות כמו Seaborn או MatPlotLib. ייצוג הנתונים שלכם באופן חזותי עשוי לאפשר לכם לחשוף קשרים נסתרים שתוכלו לנצל. הוויזואליזציות שלכם עשויות גם לעזור לכם לחשוף הטיות או נתונים לא מאוזנים (כפי שגילינו ב[Classification](../../4-Classification/2-Classifiers-1/README.md)).
### חלוקת מערך הנתונים שלכם
לפני האימון, עליכם לחלק את מערך הנתונים שלכם לשני חלקים או יותר בגודל לא שווה שעדיין מייצגים את הנתונים היטב.
- **אימון**. חלק זה של מערך הנתונים מותאם למודל שלכם כדי לאמן אותו. סט זה מהווה את רוב מערך הנתונים המקורי.
- **בדיקה**. מערך בדיקה הוא קבוצה עצמאית של נתונים, לעיתים נאספת מהנתונים המקוריים, שבה אתם משתמשים כדי לאשר את ביצועי המודל שנבנה.
- **אימות**. סט אימות הוא קבוצה עצמאית קטנה יותר של דוגמאות שבה אתם משתמשים לכוונון ההיפר-פרמטרים של המודל או הארכיטקטורה שלו כדי לשפר את המודל. בהתאם לגודל הנתונים שלכם ולשאלה שאתם שואלים, ייתכן שלא תצטרכו לבנות את הסט השלישי הזה (כפי שאנו מציינים ב[תחזיות סדרות זמן](../../7-TimeSeries/1-Introduction/README.md)).
## בניית מודל
באמצעות נתוני האימון שלכם, המטרה שלכם היא לבנות מודל, או ייצוג סטטיסטי של הנתונים שלכם, באמצעות אלגוריתמים שונים כדי **לאמן** אותו. אימון מודל חושף אותו לנתונים ומאפשר לו לבצע הנחות לגבי דפוסים שהוא מגלה, מאמת ומקבל או דוחה.
### החלטה על שיטת אימון
בהתאם לשאלה שלכם ולאופי הנתונים, תבחרו שיטה לאמן אותם. מעבר על [התיעוד של Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - שבו אנו משתמשים בקורס זה - תוכלו לחקור דרכים רבות לאמן מודל. בהתאם לניסיונכם, ייתכן שתצטרכו לנסות מספר שיטות שונות כדי לבנות את המודל הטוב ביותר. סביר להניח שתעברו תהליך שבו מדעני נתונים מעריכים את ביצועי המודל על ידי הזנת נתונים שלא נראו בעבר, בדיקת דיוק, הטיה ונושאים אחרים שמפחיתים את האיכות, ובחירת שיטת האימון המתאימה ביותר למשימה.
### אימון מודל
מצוידים בנתוני האימון שלכם, אתם מוכנים 'להתאים' אותם כדי ליצור מודל. תבחינו שבספריות ML רבות תמצאו את הקוד 'model.fit' - זהו הזמן שבו אתם שולחים את משתנה המאפיין שלכם כמערך ערכים (בדרך כלל 'X') ומשתנה מטרה (בדרך כלל 'y').
### הערכת המודל
לאחר שתהליך האימון הושלם (זה יכול לקחת מספר איטרציות, או 'epochs', כדי לאמן מודל גדול), תוכלו להעריך את איכות המודל באמצעות נתוני בדיקה כדי למדוד את ביצועיו. נתונים אלו הם תת-קבוצה של הנתונים המקוריים שהמודל לא ניתח בעבר. תוכלו להדפיס טבלה של מדדים על איכות המודל שלכם.
🎓 **התאמת מודל**
בהקשר של למידת מכונה, התאמת מודל מתייחסת לדיוק הפונקציה הבסיסית של המודל כשהוא מנסה לנתח נתונים שאינם מוכרים לו.
🎓 **התאמה חסרה** ו**התאמה יתרה** הן בעיות נפוצות שמפחיתות את איכות המודל, כאשר המודל מתאים או לא מספיק טוב או יותר מדי טוב. זה גורם למודל לבצע תחזיות שמותאמות או קרובות מדי או רחוקות מדי לנתוני האימון שלו. מודל מותאם יתר על המידה חוזה נתוני אימון טוב מדי מכיוון שהוא למד את הפרטים והרעש של הנתונים טוב מדי. מודל מותאם חסר אינו מדויק מכיוון שהוא לא יכול לנתח בצורה מדויקת את נתוני האימון שלו או נתונים שהוא עדיין לא 'ראה'.
![מודל מותאם יתר](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png)
> אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
## כיוונון פרמטרים
לאחר שהאימון הראשוני שלכם הושלם, התבוננו באיכות המודל ושקלו לשפר אותו על ידי כיוונון 'היפר-פרמטרים' שלו. קראו עוד על התהליך [בתיעוד](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott).
## תחזית
זהו הרגע שבו תוכלו להשתמש בנתונים חדשים לחלוטין כדי לבדוק את דיוק המודל שלכם. בהקשר של ML 'מופעל', שבו אתם בונים נכסי אינטרנט לשימוש המודל בייצור, תהליך זה עשוי לכלול איסוף קלט משתמש (לחיצה על כפתור, למשל) כדי להגדיר משתנה ולשלוח אותו למודל לצורך הסקה או הערכה.
בשיעורים אלו, תגלו כיצד להשתמש בשלבים אלו כדי להכין, לבנות, לבדוק, להעריך ולחזות - כל המחוות של מדען נתונים ועוד, ככל שתתקדמו במסע שלכם להפוך ל'מהנדס ML מלא'.
---
## 🚀אתגר
ציירו תרשים זרימה שמייצג את שלבי העבודה של מומחה ML. היכן אתם רואים את עצמכם כרגע בתהליך? היכן אתם צופים שתתקלו בקשיים? מה נראה לכם קל?
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
חפשו באינטרנט ראיונות עם מדעני נתונים שמדברים על עבודתם היומיומית. הנה [אחד](https://www.youtube.com/watch?v=Z3IjgbbCEfs).
## משימה
[ראיינו מדען נתונים](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "70d65aeddc06170bc1aed5b27805f930",
"translation_date": "2025-09-05T19:37:26+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/assignment.md",
"language_code": "he"
}
-->
# ראיון עם מדען נתונים
## הוראות
בחברה שלכם, בקבוצת משתמשים, או בין חברים או עמיתים ללימודים, שוחחו עם מישהו שעובד באופן מקצועי כמדען נתונים. כתבו מאמר קצר (500 מילים) על העיסוקים היומיומיים שלהם. האם הם מתמחים בתחום מסוים, או שהם עובדים בגישה של 'מלא ערימה'?
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| --------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------- | --------------------- |
| | מאמר באורך הנדרש, עם מקורות מצוינים, מוגש כקובץ .doc | המאמר עם ייחוס לקוי או קצר מהאורך הנדרש | לא הוגש מאמר |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,37 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "cf8ecc83f28e5b98051d2179eca08e08",
"translation_date": "2025-09-05T19:29:56+00:00",
"source_file": "1-Introduction/README.md",
"language_code": "he"
}
-->
# מבוא ללמידת מכונה
בחלק זה של תוכנית הלימודים, תכירו את המושגים הבסיסיים שמאחורי תחום הלמידת המכונה, מה זה בעצם, ותלמדו על ההיסטוריה שלו ועל הטכניקות שהחוקרים משתמשים בהן כדי לעבוד איתו. בואו נחקור יחד את העולם החדש הזה של למידת מכונה!
![globe](../../../1-Introduction/images/globe.jpg)
> צילום על ידי <a href="https://unsplash.com/@bill_oxford?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Bill Oxford</a> ב-<a href="https://unsplash.com/s/photos/globe?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
### שיעורים
1. [מבוא ללמידת מכונה](1-intro-to-ML/README.md)
1. [ההיסטוריה של למידת מכונה ובינה מלאכותית](2-history-of-ML/README.md)
1. [הוגנות בלמידת מכונה](3-fairness/README.md)
1. [טכניקות בלמידת מכונה](4-techniques-of-ML/README.md)
### קרדיטים
"מבוא ללמידת מכונה" נכתב באהבה על ידי צוות אנשים כולל [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan), [Ornella Altunyan](https://twitter.com/ornelladotcom) ו-[Jen Looper](https://twitter.com/jenlooper)
"ההיסטוריה של למידת מכונה" נכתב באהבה על ידי [Jen Looper](https://twitter.com/jenlooper) ו-[Amy Boyd](https://twitter.com/AmyKateNicho)
"הוגנות בלמידת מכונה" נכתב באהבה על ידי [Tomomi Imura](https://twitter.com/girliemac)
"טכניקות בלמידת מכונה" נכתב באהבה על ידי [Jen Looper](https://twitter.com/jenlooper) ו-[Chris Noring](https://twitter.com/softchris)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,239 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
"translation_date": "2025-09-05T18:50:40+00:00",
"source_file": "2-Regression/1-Tools/README.md",
"language_code": "he"
}
-->
# התחילו עם Python ו-Scikit-learn עבור מודלים של רגרסיה
![סיכום של רגרסיות בסקצ'נוט](../../../../sketchnotes/ml-regression.png)
> סקצ'נוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
> ### [השיעור הזה זמין גם ב-R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
## מבוא
בארבעת השיעורים הללו, תלמדו כיצד לבנות מודלים של רגרסיה. נדון במה הם משמשים בקרוב. אבל לפני שתתחילו, ודאו שיש לכם את הכלים הנכונים כדי להתחיל את התהליך!
בשיעור הזה תלמדו:
- להגדיר את המחשב שלכם למשימות למידת מכונה מקומיות.
- לעבוד עם מחברות Jupyter.
- להשתמש ב-Scikit-learn, כולל התקנה.
- לחקור רגרסיה ליניארית באמצעות תרגיל מעשי.
## התקנות והגדרות
[![ML למתחילים - הגדרת הכלים שלכם לבניית מודלים של למידת מכונה](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML למתחילים - הגדרת הכלים שלכם לבניית מודלים של למידת מכונה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על הגדרת המחשב שלכם ללמידת מכונה.
1. **התקינו Python**. ודאו ש-[Python](https://www.python.org/downloads/) מותקן במחשב שלכם. תשתמשו ב-Python עבור משימות רבות במדעי הנתונים ולמידת מכונה. רוב מערכות המחשב כבר כוללות התקנה של Python. ישנם [חבילות קוד Python](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) שימושיות שיכולות להקל על ההגדרה עבור חלק מהמשתמשים.
עם זאת, שימושים מסוימים ב-Python דורשים גרסה אחת של התוכנה, בעוד אחרים דורשים גרסה שונה. לכן, כדאי לעבוד בתוך [סביבה וירטואלית](https://docs.python.org/3/library/venv.html).
2. **התקינו Visual Studio Code**. ודאו ש-Visual Studio Code מותקן במחשב שלכם. עקבו אחר ההוראות הללו ל-[התקנת Visual Studio Code](https://code.visualstudio.com/) עבור התקנה בסיסית. אתם הולכים להשתמש ב-Python בתוך Visual Studio Code בקורס הזה, אז אולי תרצו ללמוד כיצד [להגדיר את Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) לפיתוח ב-Python.
> תרגישו בנוח עם Python על ידי עבודה עם אוסף זה של [מודולי למידה](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott)
>
> [![הגדרת Python עם Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "הגדרת Python עם Visual Studio Code")
>
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: שימוש ב-Python בתוך VS Code.
3. **התקינו Scikit-learn**, על ידי מעקב אחר [ההוראות הללו](https://scikit-learn.org/stable/install.html). מכיוון שאתם צריכים לוודא שאתם משתמשים ב-Python 3, מומלץ להשתמש בסביבה וירטואלית. שימו לב, אם אתם מתקינים את הספרייה הזו על Mac עם M1, יש הוראות מיוחדות בעמוד המקושר למעלה.
4. **התקינו Jupyter Notebook**. תצטרכו [להתקין את חבילת Jupyter](https://pypi.org/project/jupyter/).
## סביבת העבודה שלכם ללמידת מכונה
אתם הולכים להשתמש ב-**מחברות** כדי לפתח את קוד ה-Python שלכם וליצור מודלים של למידת מכונה. סוג קובץ זה הוא כלי נפוץ עבור מדעני נתונים, וניתן לזהות אותו לפי הסיומת `.ipynb`.
מחברות הן סביבה אינטראקטיבית שמאפשרת למפתח גם לקודד וגם להוסיף הערות ולכתוב תיעוד סביב הקוד, מה שמאוד מועיל עבור פרויקטים ניסיוניים או מחקריים.
[![ML למתחילים - הגדרת מחברות Jupyter כדי להתחיל לבנות מודלים של רגרסיה](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML למתחילים - הגדרת מחברות Jupyter כדי להתחיל לבנות מודלים של רגרסיה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על ביצוע התרגיל הזה.
### תרגיל - עבודה עם מחברת
בתיקייה הזו, תמצאו את הקובץ _notebook.ipynb_.
1. פתחו את _notebook.ipynb_ ב-Visual Studio Code.
שרת Jupyter יתחיל עם Python 3+. תמצאו אזורים במחברת שניתן `להריץ`, חלקי קוד. תוכלו להריץ בלוק קוד על ידי בחירת האייקון שנראה כמו כפתור הפעלה.
2. בחרו את האייקון `md` והוסיפו קצת Markdown, ואת הטקסט הבא **# ברוכים הבאים למחברת שלכם**.
לאחר מכן, הוסיפו קצת קוד Python.
3. הקלידו **print('hello notebook')** בבלוק הקוד.
4. בחרו את החץ כדי להריץ את הקוד.
אתם אמורים לראות את ההצהרה המודפסת:
```output
hello notebook
```
![VS Code עם מחברת פתוחה](../../../../2-Regression/1-Tools/images/notebook.jpg)
אתם יכולים לשלב את הקוד שלכם עם הערות כדי לתעד את המחברת בעצמכם.
✅ חשבו לרגע כמה שונה סביבת העבודה של מפתחי אתרים מזו של מדעני נתונים.
## התחלה עם Scikit-learn
עכשיו ש-Python מוגדר בסביבה המקומית שלכם, ואתם מרגישים בנוח עם מחברות Jupyter, בואו נרגיש בנוח גם עם Scikit-learn (יש להגות `sci` כמו `science`). Scikit-learn מספקת [API נרחב](https://scikit-learn.org/stable/modules/classes.html#api-ref) שיעזור לכם לבצע משימות למידת מכונה.
לפי [האתר שלהם](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn היא ספריית למידת מכונה בקוד פתוח שתומכת בלמידה מונחית ולמידה לא מונחית. היא גם מספקת כלים שונים להתאמת מודלים, עיבוד נתונים, בחירת מודלים והערכה, ועוד הרבה כלי עזר."
בקורס הזה, תשתמשו ב-Scikit-learn ובכלים נוספים כדי לבנות מודלים של למידת מכונה לביצוע מה שאנחנו מכנים 'למידת מכונה מסורתית'. נמנענו בכוונה מרשתות נוירונים ולמידה עמוקה, שכן הם מכוסים טוב יותר בתוכנית הלימודים שלנו 'AI למתחילים' שתצא בקרוב.
Scikit-learn הופכת את בניית המודלים והערכתם לשימוש לפשוטה. היא מתמקדת בעיקר בשימוש בנתונים מספריים וכוללת כמה מערכי נתונים מוכנים לשימוש ככלי למידה. היא גם כוללת מודלים מוכנים לסטודנטים לנסות. בואו נחקור את תהליך טעינת הנתונים המובנים מראש ושימוש באומדן מובנה למודל למידת מכונה הראשון עם Scikit-learn באמצעות נתונים בסיסיים.
## תרגיל - המחברת הראשונה שלכם עם Scikit-learn
> מדריך זה נוצר בהשראת [דוגמת הרגרסיה הליניארית](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) באתר של Scikit-learn.
[![ML למתחילים - פרויקט הרגרסיה הליניארית הראשון שלכם ב-Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML למתחילים - פרויקט הרגרסיה הליניארית הראשון שלכם ב-Python")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על ביצוע התרגיל הזה.
בקובץ _notebook.ipynb_ המשויך לשיעור הזה, נקו את כל התאים על ידי לחיצה על אייקון 'פח האשפה'.
בקטע הזה, תעבדו עם מערך נתונים קטן על סוכרת שמובנה ב-Scikit-learn לצורכי למידה. דמיינו שאתם רוצים לבדוק טיפול עבור חולי סוכרת. מודלים של למידת מכונה עשויים לעזור לכם לקבוע אילו חולים יגיבו טוב יותר לטיפול, בהתבסס על שילובים של משתנים. אפילו מודל רגרסיה בסיסי מאוד, כאשר הוא מוצג בצורה חזותית, עשוי להראות מידע על משתנים שיעזרו לכם לארגן את הניסויים הקליניים התיאורטיים שלכם.
✅ ישנם סוגים רבים של שיטות רגרסיה, והבחירה תלויה בשאלה שאתם מחפשים תשובה עליה. אם אתם רוצים לחזות את הגובה הסביר של אדם בגיל מסוים, תשתמשו ברגרסיה ליניארית, שכן אתם מחפשים **ערך מספרי**. אם אתם מעוניינים לגלות האם סוג מסוים של מטבח צריך להיחשב טבעוני או לא, אתם מחפשים **שיוך קטגוריה**, ולכן תשתמשו ברגרסיה לוגיסטית. תלמדו יותר על רגרסיה לוגיסטית בהמשך. חשבו קצת על שאלות שתוכלו לשאול את הנתונים, ואיזו משיטה זו תהיה המתאימה יותר.
בואו נתחיל במשימה הזו.
### ייבוא ספריות
למשימה הזו נייבא כמה ספריות:
- **matplotlib**. זהו [כלי גרפי](https://matplotlib.org/) שימושי, ונשתמש בו ליצירת גרף קו.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) היא ספרייה שימושית לטיפול בנתונים מספריים ב-Python.
- **sklearn**. זו הספרייה [Scikit-learn](https://scikit-learn.org/stable/user_guide.html).
ייבאו כמה ספריות שיעזרו לכם במשימות.
1. הוסיפו ייבוא על ידי הקלדת הקוד הבא:
```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection
```
למעלה אתם מייבאים `matplotlib`, `numpy`, ואתם מייבאים `datasets`, `linear_model` ו-`model_selection` מ-`sklearn`. `model_selection` משמש לפיצול נתונים לסטי אימון ובדיקה.
### מערך הנתונים של סוכרת
מערך הנתונים המובנה [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) כולל 442 דגימות נתונים על סוכרת, עם 10 משתנים תכונה, שחלקם כוללים:
- גיל: גיל בשנים
- BMI: מדד מסת גוף
- BP: לחץ דם ממוצע
- S1 TC: תאי T (סוג של תאי דם לבנים)
✅ מערך הנתונים הזה כולל את מושג 'מין' כמשתנה תכונה חשוב למחקר על סוכרת. מערכי נתונים רפואיים רבים כוללים סוג זה של סיווג בינארי. חשבו קצת על איך סיווגים כאלה עשויים להוציא חלקים מסוימים מהאוכלוסייה מטיפולים.
עכשיו, טענו את נתוני X ו-y.
> 🎓 זכרו, זו למידה מונחית, ואנחנו צריכים מטרה בשם 'y'.
בתא קוד חדש, טענו את מערך הנתונים של סוכרת על ידי קריאה ל-`load_diabetes()`. הקלט `return_X_y=True` מסמן ש-`X` יהיה מטריצת נתונים, ו-`y` יהיה יעד הרגרסיה.
1. הוסיפו כמה פקודות הדפסה כדי להציג את הצורה של מטריצת הנתונים והאלמנט הראשון שלה:
```python
X, y = datasets.load_diabetes(return_X_y=True)
print(X.shape)
print(X[0])
```
מה שאתם מקבלים בתגובה הוא טופל. מה שאתם עושים הוא להקצות את שני הערכים הראשונים של הטופל ל-`X` ו-`y` בהתאמה. למדו יותר [על טופלים](https://wikipedia.org/wiki/Tuple).
אתם יכולים לראות שלנתונים האלה יש 442 פריטים בצורת מערכים של 10 אלמנטים:
```text
(442, 10)
[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ חשבו קצת על הקשר בין הנתונים ליעד הרגרסיה. רגרסיה ליניארית חוזה קשרים בין תכונה X למשתנה יעד y. האם תוכלו למצוא את [היעד](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) עבור מערך הנתונים של סוכרת בתיעוד? מה מערך הנתונים הזה מדגים, בהתחשב ביעד?
2. לאחר מכן, בחרו חלק ממערך הנתונים הזה כדי לשרטט על ידי בחירת העמודה השלישית של מערך הנתונים. תוכלו לעשות זאת על ידי שימוש באופרטור `:` כדי לבחור את כל השורות, ואז לבחור את העמודה השלישית באמצעות האינדקס (2). תוכלו גם לשנות את צורת הנתונים להיות מערך דו-ממדי - כפי שנדרש לשרטוט - על ידי שימוש ב-`reshape(n_rows, n_columns)`. אם אחד הפרמטרים הוא -1, הממד המתאים מחושב אוטומטית.
```python
X = X[:, 2]
X = X.reshape((-1,1))
```
✅ בכל זמן, הדפיסו את הנתונים כדי לבדוק את צורתם.
3. עכשיו כשיש לכם נתונים מוכנים לשרטוט, תוכלו לראות אם מכונה יכולה לעזור לקבוע חלוקה הגיונית בין המספרים במערך הנתונים הזה. כדי לעשות זאת, עליכם לפצל גם את הנתונים (X) וגם את היעד (y) לסטי בדיקה ואימון. ל-Scikit-learn יש דרך פשוטה לעשות זאת; תוכלו לפצל את נתוני הבדיקה שלכם בנקודה נתונה.
```python
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
```
4. עכשיו אתם מוכנים לאמן את המודל שלכם! טענו את מודל הרגרסיה הליניארית ואמנו אותו עם סטי האימון של X ו-y באמצעות `model.fit()`:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` היא פונקציה שתראו בהרבה ספריות למידת מכונה כמו TensorFlow.
5. לאחר מכן, צרו תחזית באמצעות נתוני הבדיקה, באמצעות הפונקציה `predict()`. זה ישמש לציור הקו בין קבוצות הנתונים של המודל.
```python
y_pred = model.predict(X_test)
```
6. עכשיו הגיע הזמן להציג את הנתונים בגרף. Matplotlib הוא כלי מאוד שימושי למשימה הזו. צרו גרף פיזור של כל נתוני הבדיקה של X ו-y, והשתמשו בתחזית כדי לצייר קו במקום המתאים ביותר, בין קבוצות הנתונים של המודל.
```python
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.xlabel('Scaled BMIs')
plt.ylabel('Disease Progression')
plt.title('A Graph Plot Showing Diabetes Progression Against BMI')
plt.show()
```
![גרף פיזור שמציג נקודות נתונים סביב סוכרת](../../../../2-Regression/1-Tools/images/scatterplot.png)
✅ תחשבו קצת על מה שקורה כאן. קו ישר עובר דרך הרבה נקודות קטנות של נתונים, אבל מה הוא עושה בדיוק? האם אתם יכולים לראות איך אפשר להשתמש בקו הזה כדי לחזות איפה נקודת נתונים חדשה ולא מוכרת צריכה להתאים ביחס לציר ה-y של הגרף? נסו לנסח במילים את השימוש המעשי של המודל הזה.
מזל טוב, יצרתם את מודל הרגרסיה הליניארית הראשון שלכם, ביצעתם תחזית באמצעותו, והצגתם אותה בגרף!
---
## 🚀אתגר
צרו גרף עבור משתנה אחר מתוך מערך הנתונים הזה. רמז: ערכו את השורה הזו: `X = X[:,2]`. בהתחשב במטרת מערך הנתונים הזה, מה אתם יכולים לגלות על התקדמות מחלת הסוכרת?
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
במדריך הזה עבדתם עם רגרסיה ליניארית פשוטה, ולא עם רגרסיה חד-משתנית או רגרסיה מרובת משתנים. קראו מעט על ההבדלים בין השיטות הללו, או צפו ב-[סרטון הזה](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef).
קראו עוד על מושג הרגרסיה וחשבו אילו סוגי שאלות ניתן לענות באמצעות הטכניקה הזו. קחו את [המדריך הזה](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) כדי להעמיק את ההבנה שלכם.
## משימה
[מערך נתונים אחר](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "74a5cf83e4ebc302afbcbc4f418afd0a",
"translation_date": "2025-09-05T18:53:28+00:00",
"source_file": "2-Regression/1-Tools/assignment.md",
"language_code": "he"
}
-->
# רגרסיה עם Scikit-learn
## הוראות
עיינו ב-[מערך הנתונים של Linnerud](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) ב-Scikit-learn. מערך נתונים זה כולל מספר [יעדים](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): 'הוא מורכב משלושה משתנים של פעילות גופנית (נתונים) ושלושה משתנים פיזיולוגיים (יעדים) שנאספו מעשרים גברים בגיל העמידה במועדון כושר'.
במילים שלכם, תארו כיצד ליצור מודל רגרסיה שימפה את הקשר בין היקף המותניים לבין מספר כפיפות הבטן שבוצעו. עשו את אותו הדבר עבור נקודות הנתונים האחרות במערך נתונים זה.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| ----------------------------- | --------------------------------- | --------------------------- | ------------------------- |
| הגשת פסקה תיאורית | פסקה כתובה היטב מוגשת | כמה משפטים מוגשים | לא נמסרה תיאור כלשהו |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T18:53:56+00:00",
"source_file": "2-Regression/1-Tools/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,226 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7c077988328ebfe33b24d07945f16eca",
"translation_date": "2025-09-05T18:54:41+00:00",
"source_file": "2-Regression/2-Data/README.md",
"language_code": "he"
}
-->
# בניית מודל רגרסיה באמצעות Scikit-learn: הכנת ויזואליזציה של נתונים
![אינפוגרפיקה של ויזואליזציה של נתונים](../../../../2-Regression/2-Data/images/data-visualization.png)
אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
> ### [השיעור הזה זמין גם ב-R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
## מבוא
עכשיו, כשיש לך את הכלים הדרושים כדי להתחיל לבנות מודלים של למידת מכונה באמצעות Scikit-learn, אתה מוכן להתחיל לשאול שאלות על הנתונים שלך. כשאתה עובד עם נתונים ומיישם פתרונות ML, חשוב מאוד להבין איך לשאול את השאלה הנכונה כדי למצות את הפוטנציאל של מערך הנתונים שלך.
בשיעור זה תלמד:
- איך להכין את הנתונים שלך לבניית מודלים.
- איך להשתמש ב-Matplotlib לויזואליזציה של נתונים.
## לשאול את השאלה הנכונה על הנתונים שלך
השאלה שאתה רוצה לענות עליה תקבע איזה סוג של אלגוריתמים ML תשתמש. איכות התשובה שתקבל תהיה תלויה מאוד באופי הנתונים שלך.
תסתכל על [הנתונים](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) שסופקו לשיעור הזה. אתה יכול לפתוח את קובץ ה-.csv הזה ב-VS Code. מבט מהיר מראה מיד שיש בו ערכים חסרים ותערובת של נתונים טקסטואליים ומספריים. יש גם עמודה מוזרה בשם 'Package' שבה הנתונים הם תערובת של 'sacks', 'bins' וערכים אחרים. למעשה, הנתונים די מבולגנים.
[![ML למתחילים - איך לנתח ולנקות מערך נתונים](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML למתחילים - איך לנתח ולנקות מערך נתונים")
> 🎥 לחץ על התמונה למעלה לצפייה בסרטון קצר שמסביר איך להכין את הנתונים לשיעור הזה.
למעשה, זה לא מאוד נפוץ לקבל מערך נתונים שמוכן לחלוטין לשימוש ליצירת מודל ML ישר מהקופסה. בשיעור הזה תלמד איך להכין מערך נתונים גולמי באמצעות ספריות Python סטנדרטיות. תלמד גם טכניקות שונות לויזואליזציה של הנתונים.
## מחקר מקרה: 'שוק הדלעות'
בתיקייה זו תמצא קובץ .csv בתיקיית השורש `data` בשם [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) שמכיל 1757 שורות של נתונים על שוק הדלעות, מסודרות לפי ערים. אלו נתונים גולמיים שנלקחו מתוך [דוחות שוקי היבולים המיוחדים](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) שמופצים על ידי משרד החקלאות של ארצות הברית.
### הכנת נתונים
הנתונים האלה הם נחלת הכלל. ניתן להוריד אותם בקבצים נפרדים רבים, לפי עיר, מאתר ה-USDA. כדי להימנע ממספר רב של קבצים נפרדים, איחדנו את כל נתוני הערים לגיליון אלקטרוני אחד, כך שכבר _הכנו_ את הנתונים מעט. עכשיו, בואו נסתכל מקרוב על הנתונים.
### נתוני הדלעות - מסקנות ראשוניות
מה אתה שם לב לגבי הנתונים האלה? כבר ראית שיש תערובת של טקסטים, מספרים, ערכים חסרים וערכים מוזרים שצריך להבין.
איזו שאלה אפשר לשאול על הנתונים האלה, באמצעות טכניקת רגרסיה? מה דעתך על "לחזות את המחיר של דלעת למכירה במהלך חודש נתון". מבט נוסף על הנתונים מראה שיש כמה שינויים שצריך לעשות כדי ליצור את מבנה הנתונים הדרוש למשימה.
## תרגיל - ניתוח נתוני הדלעות
בואו נשתמש ב-[Pandas](https://pandas.pydata.org/) (השם הוא קיצור של `Python Data Analysis`), כלי מאוד שימושי לעיצוב נתונים, כדי לנתח ולהכין את נתוני הדלעות.
### קודם כל, בדוק אם יש תאריכים חסרים
קודם כל תצטרך לנקוט צעדים כדי לבדוק אם יש תאריכים חסרים:
1. המרה של התאריכים לפורמט חודשי (אלו תאריכים אמריקאים, כך שהפורמט הוא `MM/DD/YYYY`).
2. חילוץ החודש לעמודה חדשה.
פתח את הקובץ _notebook.ipynb_ ב-Visual Studio Code וייבא את הגיליון האלקטרוני ל-DataFrame חדש של Pandas.
1. השתמש בפונקציה `head()` כדי לצפות בחמש השורות הראשונות.
```python
import pandas as pd
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
pumpkins.head()
```
✅ באיזו פונקציה היית משתמש כדי לצפות בחמש השורות האחרונות?
1. בדוק אם יש נתונים חסרים ב-DataFrame הנוכחי:
```python
pumpkins.isnull().sum()
```
יש נתונים חסרים, אבל אולי זה לא משנה למשימה הנוכחית.
1. כדי להפוך את ה-DataFrame שלך לקל יותר לעבודה, בחר רק את העמודות שאתה צריך, באמצעות פונקציית `loc` שמחלצת מה-DataFrame המקורי קבוצת שורות (שנמסרות כפרמטר ראשון) ועמודות (שנמסרות כפרמטר שני). הביטוי `:` במקרה הזה אומר "כל השורות".
```python
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.loc[:, columns_to_select]
```
### שנית, קבע את המחיר הממוצע של דלעת
חשוב איך לקבוע את המחיר הממוצע של דלעת בחודש נתון. אילו עמודות היית בוחר למשימה הזו? רמז: תצטרך 3 עמודות.
פתרון: קח את הממוצע של העמודות `Low Price` ו-`High Price` כדי למלא את עמודת המחיר החדשה, והמר את עמודת התאריך כך שתציג רק את החודש. למרבה המזל, לפי הבדיקה לעיל, אין נתונים חסרים עבור תאריכים או מחירים.
1. כדי לחשב את הממוצע, הוסף את הקוד הבא:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
month = pd.DatetimeIndex(pumpkins['Date']).month
```
✅ אתה מוזמן להדפיס כל נתון שתרצה לבדוק באמצעות `print(month)`.
2. עכשיו, העתק את הנתונים שהומרו ל-DataFrame חדש של Pandas:
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
הדפסת ה-DataFrame שלך תראה לך מערך נתונים נקי ומסודר שעליו תוכל לבנות את מודל הרגרסיה החדש שלך.
### אבל רגע! יש כאן משהו מוזר
אם תסתכל על עמודת `Package`, דלעות נמכרות בהרבה תצורות שונות. חלקן נמכרות במידות של '1 1/9 bushel', חלקן ב-'1/2 bushel', חלקן לפי דלעת, חלקן לפי פאונד, וחלקן בקופסאות גדולות עם רוחבים משתנים.
> נראה שדלעות מאוד קשה לשקול באופן עקבי
כשחוקרים את הנתונים המקוריים, מעניין שכל דבר עם `Unit of Sale` השווה ל-'EACH' או 'PER BIN' גם יש לו סוג `Package` לפי אינץ', לפי bin, או 'each'. נראה שדלעות מאוד קשה לשקול באופן עקבי, אז בואו נסנן אותן על ידי בחירת דלעות בלבד עם המחרוזת 'bushel' בעמודת `Package`.
1. הוסף מסנן בראש הקובץ, מתחת לייבוא הראשוני של ה-.csv:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
אם תדפיס את הנתונים עכשיו, תוכל לראות שאתה מקבל רק את 415 השורות בערך שמכילות דלעות לפי bushel.
### אבל רגע! יש עוד משהו שצריך לעשות
שמת לב שהכמות של bushel משתנה לפי שורה? אתה צריך לנרמל את התמחור כך שתראה את התמחור לפי bushel, אז תעשה קצת חישובים כדי לסטנדרט אותו.
1. הוסף את השורות האלה אחרי הבלוק שיוצר את ה-DataFrame החדש של הדלעות:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
```
✅ לפי [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), המשקל של bushel תלוי בסוג התוצרת, מכיוון שמדובר במדידת נפח. "bushel של עגבניות, למשל, אמור לשקול 56 פאונד... עלים וירוקים תופסים יותר מקום עם פחות משקל, כך ש-bushel של תרד שוקל רק 20 פאונד." זה די מסובך! בואו לא נטרח עם המרה של bushel לפאונד, ובמקום זאת נתמחר לפי bushel. כל המחקר הזה על bushels של דלעות, עם זאת, מראה כמה חשוב להבין את אופי הנתונים שלך!
עכשיו, אתה יכול לנתח את התמחור ליחידה בהתבסס על מדידת ה-bushel שלהם. אם תדפיס את הנתונים פעם נוספת, תוכל לראות איך הם סטנדרטיים.
✅ שמת לב שדלעות שנמכרות לפי חצי bushel הן מאוד יקרות? האם תוכל להבין למה? רמז: דלעות קטנות יקרות הרבה יותר מדלעות גדולות, כנראה בגלל שיש הרבה יותר מהן בכל bushel, בהתחשב במקום הלא מנוצל שנלקח על ידי דלעת פאי גדולה וחלולה אחת.
## אסטרטגיות ויזואליזציה
חלק מתפקידו של מדען הנתונים הוא להציג את האיכות והאופי של הנתונים שהוא עובד איתם. לשם כך, הם לעיתים קרובות יוצרים ויזואליזציות מעניינות, כמו גרפים, תרשימים ומפות, שמציגים היבטים שונים של הנתונים. בדרך זו, הם יכולים להראות באופן חזותי קשרים ופערים שקשה לחשוף בדרך אחרת.
[![ML למתחילים - איך לויזואליזציה של נתונים עם Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML למתחילים - איך לויזואליזציה של נתונים עם Matplotlib")
> 🎥 לחץ על התמונה למעלה לצפייה בסרטון קצר שמסביר איך לויזואליזציה של הנתונים לשיעור הזה.
ויזואליזציות יכולות גם לעזור לקבוע את טכניקת הלמידת מכונה המתאימה ביותר לנתונים. למשל, תרשים פיזור שנראה כמו קו יכול להצביע על כך שהנתונים מתאימים לתרגיל רגרסיה ליניארית.
אחת מספריות הויזואליזציה שעובדות היטב במחברות Jupyter היא [Matplotlib](https://matplotlib.org/) (שגם ראית בשיעור הקודם).
> קבל עוד ניסיון עם ויזואליזציה של נתונים ב-[המדריכים האלה](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
## תרגיל - להתנסות עם Matplotlib
נסה ליצור כמה גרפים בסיסיים כדי להציג את ה-DataFrame החדש שיצרת. מה יראה גרף קו בסיסי?
1. ייבא את Matplotlib בראש הקובץ, מתחת לייבוא של Pandas:
```python
import matplotlib.pyplot as plt
```
1. הרץ מחדש את כל המחברת כדי לרענן.
1. בתחתית המחברת, הוסף תא כדי לשרטט את הנתונים כקופסה:
```python
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(price, month)
plt.show()
```
![תרשים פיזור שמראה את הקשר בין מחיר לחודש](../../../../2-Regression/2-Data/images/scatterplot.png)
האם זה גרף שימושי? האם משהו בו מפתיע אותך?
זה לא מאוד שימושי מכיוון שכל מה שהוא עושה זה להציג את הנתונים שלך כפריסה של נקודות בחודש נתון.
### להפוך את זה לשימושי
כדי לקבל גרפים שמציגים נתונים שימושיים, בדרך כלל צריך לקבץ את הנתונים בצורה כלשהי. בואו ננסה ליצור גרף שבו ציר ה-y מציג את החודשים והנתונים מדגימים את התפלגות הנתונים.
1. הוסף תא ליצירת תרשים עמודות מקובץ:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![תרשים עמודות שמראה את הקשר בין מחיר לחודש](../../../../2-Regression/2-Data/images/barchart.png)
זהו ויזואליזציה נתונים שימושית יותר! נראה שהיא מצביעה על כך שהמחיר הגבוה ביותר לדלעות מתרחש בספטמבר ובאוקטובר. האם זה תואם את הציפיות שלך? למה או למה לא?
---
## 🚀אתגר
חקור את סוגי הויזואליזציה השונים ש-Matplotlib מציעה. אילו סוגים הם המתאימים ביותר לבעיות רגרסיה?
## [שאלון אחרי השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
תסתכל על הדרכים הרבות לויזואליזציה של נתונים. צור רשימה של הספריות השונות הזמינות וציין אילו מהן מתאימות לסוגי משימות מסוימים, למשל ויזואליזציות דו-ממדיות לעומת תלת-ממדיות. מה אתה מגלה?
## משימה
[חקירת ויזואליזציה](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4485a1ed4dd1b5647365e3d87456515d",
"translation_date": "2025-09-05T18:56:57+00:00",
"source_file": "2-Regression/2-Data/assignment.md",
"language_code": "he"
}
-->
# חקר ויזואליזציות
ישנן מספר ספריות שונות זמינות ליצירת ויזואליזציות של נתונים. צרו כמה ויזואליזציות באמצעות נתוני הדלעת בשיעור זה עם matplotlib ו-seaborn במחברת לדוגמה. אילו ספריות קלות יותר לשימוש?
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | --------- | -------- | ----------------- |
| | מחברת מוגשת עם שתי חקירות/ויזואליזציות | מחברת מוגשת עם חקירה/ויזואליזציה אחת | מחברת לא מוגשת |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T18:57:21+00:00",
"source_file": "2-Regression/2-Data/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,380 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "40e64f004f3cb50aa1d8661672d3cd92",
"translation_date": "2025-09-05T18:39:01+00:00",
"source_file": "2-Regression/3-Linear/README.md",
"language_code": "he"
}
-->
# בניית מודל רגרסיה באמצעות Scikit-learn: רגרסיה בארבע דרכים
![אינפוגרפיקה של רגרסיה לינארית מול פולינומית](../../../../2-Regression/3-Linear/images/linear-polynomial.png)
> אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [מבחן מקדים להרצאה](https://ff-quizzes.netlify.app/en/ml/)
> ### [השיעור הזה זמין גם ב-R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### הקדמה
עד כה חקרתם מהי רגרסיה עם נתוני דוגמה שנאספו ממאגר נתוני מחירי דלעת, אותו נשתמש לאורך השיעור הזה. כמו כן, ביצעתם ויזואליזציה של הנתונים באמצעות Matplotlib.
עכשיו אתם מוכנים לצלול לעומק הרגרסיה עבור למידת מכונה. בעוד שויזואליזציה מאפשרת להבין את הנתונים, הכוח האמיתי של למידת מכונה מגיע מ_אימון מודלים_. מודלים מאומנים על נתונים היסטוריים כדי ללכוד באופן אוטומטי תלות בין נתונים, ומאפשרים לכם לחזות תוצאות עבור נתונים חדשים שהמודל לא ראה קודם.
בשיעור הזה תלמדו יותר על שני סוגי רגרסיה: _רגרסיה לינארית בסיסית_ ו_רגרסיה פולינומית_, יחד עם מעט מתמטיקה שמאחורי הטכניקות הללו. מודלים אלו יאפשרו לנו לחזות מחירי דלעת בהתאם לנתוני קלט שונים.
[![למידת מכונה למתחילים - הבנת רגרסיה לינארית](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "למידת מכונה למתחילים - הבנת רגרסיה לינארית")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על רגרסיה לינארית.
> לאורך הקורס הזה, אנו מניחים ידע מתמטי מינימלי, ושואפים להפוך אותו לנגיש לסטודנטים שמגיעים מתחומים אחרים. שימו לב להערות, 🧮 קריאות, דיאגרמות וכלים אחרים שיעזרו בהבנה.
### דרישות מקדימות
כעת אתם אמורים להיות מוכנים עם מבנה נתוני הדלעת שאנו בוחנים. תוכלו למצוא אותו טעון מראש ומנוקה בקובץ _notebook.ipynb_ של השיעור הזה. בקובץ, מחיר הדלעת מוצג לפי יחידת bushel במסגרת נתונים חדשה. ודאו שאתם יכולים להריץ את המחברות הללו ב-kernels ב-Visual Studio Code.
### הכנה
כתזכורת, אתם טוענים את הנתונים הללו כדי לשאול שאלות לגביהם.
- מתי הזמן הטוב ביותר לקנות דלעות?
- איזה מחיר אני יכול לצפות עבור מארז של דלעות מיניאטוריות?
- האם כדאי לי לקנות אותן בסלים של חצי bushel או בקופסאות של 1 1/9 bushel?
בואו נמשיך לחקור את הנתונים הללו.
בשיעור הקודם יצרתם מסגרת נתונים של Pandas ומילאתם אותה עם חלק ממאגר הנתונים המקורי, תוך סטנדרטיזציה של המחירים לפי bushel. עם זאת, על ידי כך הצלחתם לאסוף רק כ-400 נקודות נתונים ורק עבור חודשי הסתיו.
הסתכלו על הנתונים שטעונים מראש במחברת המצורפת לשיעור הזה. הנתונים טעונים מראש וגרף פיזור ראשוני מוצג כדי להראות נתוני חודשים. אולי נוכל לקבל מעט יותר פרטים על טיב הנתונים על ידי ניקוי נוסף שלהם.
## קו רגרסיה לינארית
כפי שלמדתם בשיעור הראשון, המטרה של תרגיל רגרסיה לינארית היא להיות מסוגלים לשרטט קו כדי:
- **להראות קשרים בין משתנים**. להראות את הקשר בין משתנים
- **לבצע תחזיות**. לבצע תחזיות מדויקות על מיקום נקודת נתונים חדשה ביחס לקו הזה.
זה אופייני ל**רגרסיית ריבועים קטנים** לשרטט סוג כזה של קו. המונח 'ריבועים קטנים' מתייחס לכך שכל נקודות הנתונים שמסביב לקו הרגרסיה מרובעות ואז מסוכמות. באופן אידיאלי, הסכום הסופי הזה הוא קטן ככל האפשר, מכיוון שאנו רוצים מספר נמוך של שגיאות, או `ריבועים קטנים`.
אנו עושים זאת מכיוון שאנו רוצים לדגם קו שיש לו את המרחק המצטבר הקטן ביותר מכל נקודות הנתונים שלנו. אנו גם מרבעים את המונחים לפני הסכימה מכיוון שאנו מתמקדים בגודל שלהם ולא בכיוונם.
> **🧮 תראו לי את המתמטיקה**
>
> הקו הזה, שנקרא ו ההתאמה הטוב ביותר_, יכול להיות מבוטא על ידי [משוואה](https://en.wikipedia.org/wiki/Simple_linear_regression):
>
> ```
> Y = a + bX
> ```
>
> `X` הוא המשתנה המסביר. `Y` הוא המשתנה התלוי. השיפוע של הקו הוא `b` ו-`a` הוא נקודת החיתוך עם ציר ה-Y, שמתייחסת לערך של `Y` כאשר `X = 0`.
>
>![חישוב השיפוע](../../../../2-Regression/3-Linear/images/slope.png)
>
> ראשית, חשבו את השיפוע `b`. אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
>
> במילים אחרות, בהתייחס לשאלת הנתונים המקורית שלנו על דלעות: "חיזוי מחיר דלעת לפי bushel לפי חודש", `X` יתייחס למחיר ו-`Y` יתייחס לחודש המכירה.
>
>![השלמת המשוואה](../../../../2-Regression/3-Linear/images/calculation.png)
>
> חשבו את הערך של Y. אם אתם משלמים בסביבות $4, זה חייב להיות אפריל! אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
>
> המתמטיקה שמחשבת את הקו חייבת להראות את השיפוע של הקו, שתלוי גם בנקודת החיתוך, או היכן ש-`Y` ממוקם כאשר `X = 0`.
>
> תוכלו לצפות בשיטת החישוב לערכים הללו באתר [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). כמו כן, בקרו ב[מחשבון ריבועים קטנים](https://www.mathsisfun.com/data/least-squares-calculator.html) כדי לראות כיצד ערכי המספרים משפיעים על הקו.
## מתאם
מונח נוסף שחשוב להבין הוא **מקדם המתאם** בין משתני X ו-Y נתונים. באמצעות גרף פיזור, תוכלו לראות במהירות את מקדם המתאם. גרף עם נקודות נתונים מפוזרות בקו מסודר יש לו מתאם גבוה, אבל גרף עם נקודות נתונים מפוזרות בכל מקום בין X ל-Y יש לו מתאם נמוך.
מודל רגרסיה לינארית טוב יהיה כזה שיש לו מקדם מתאם גבוה (קרוב יותר ל-1 מאשר ל-0) באמצעות שיטת רגרסיית ריבועים קטנים עם קו רגרסיה.
✅ הריצו את המחברת המצורפת לשיעור הזה והסתכלו על גרף הפיזור של חודש מול מחיר. האם הנתונים שמקשרים בין חודש למחיר עבור מכירות דלעת נראים בעלי מתאם גבוה או נמוך, לפי הפרשנות הוויזואלית שלכם לגרף הפיזור? האם זה משתנה אם אתם משתמשים במדד מדויק יותר במקום `חודש`, למשל *יום בשנה* (כלומר מספר הימים מתחילת השנה)?
בקוד למטה, נניח שניקינו את הנתונים וקיבלנו מסגרת נתונים בשם `new_pumpkins`, דומה לזו הבאה:
ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Price
---|-------|-----------|---------|------|---------|-----------|------------|-------
70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 18.0 | 18.0 | 16.363636
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
> הקוד לניקוי הנתונים זמין ב-[`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). ביצענו את אותם שלבי ניקוי כמו בשיעור הקודם, וחישבנו את עמודת `DayOfYear` באמצעות הביטוי הבא:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
עכשיו כשיש לכם הבנה של המתמטיקה שמאחורי רגרסיה לינארית, בואו ניצור מודל רגרסיה כדי לראות אם נוכל לחזות איזה מארז דלעות יציע את המחירים הטובים ביותר. מישהו שקונה דלעות עבור חוות דלעות לחג עשוי לרצות את המידע הזה כדי לייעל את רכישותיו של מארזי דלעות לחווה.
## חיפוש מתאם
[![למידת מכונה למתחילים - חיפוש מתאם: המפתח לרגרסיה לינארית](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "למידת מכונה למתחילים - חיפוש מתאם: המפתח לרגרסיה לינארית")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על מתאם.
מהשיעור הקודם כנראה ראיתם שהמחיר הממוצע עבור חודשים שונים נראה כך:
<img alt="מחיר ממוצע לפי חודש" src="../2-Data/images/barchart.png" width="50%"/>
זה מציע שיכול להיות מתאם, ואנו יכולים לנסות לאמן מודל רגרסיה לינארית כדי לחזות את הקשר בין `Month` ל-`Price`, או בין `DayOfYear` ל-`Price`. הנה גרף הפיזור שמראה את הקשר האחרון:
<img alt="גרף פיזור של מחיר מול יום בשנה" src="images/scatter-dayofyear.png" width="50%" />
בואו נראה אם יש מתאם באמצעות פונקציית `corr`:
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
נראה שהמתאם די קטן, -0.15 לפי `Month` ו- -0.17 לפי `DayOfMonth`, אבל יכול להיות קשר חשוב אחר. נראה שיש קבוצות שונות של מחירים שמקבילות לזני דלעות שונים. כדי לאשר את ההשערה הזו, בואו נשרטט כל קטגוריית דלעות בצבע שונה. על ידי העברת פרמטר `ax` לפונקציית גרף הפיזור, נוכל לשרטט את כל הנקודות על אותו גרף:
```python
ax=None
colors = ['red','blue','green','yellow']
for i,var in enumerate(new_pumpkins['Variety'].unique()):
df = new_pumpkins[new_pumpkins['Variety']==var]
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="גרף פיזור של מחיר מול יום בשנה" src="images/scatter-dayofyear-color.png" width="50%" />
החקירה שלנו מציעה שלזן יש השפעה גדולה יותר על המחיר הכולל מאשר תאריך המכירה בפועל. אנו יכולים לראות זאת עם גרף עמודות:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="גרף עמודות של מחיר מול זן" src="images/price-by-variety.png" width="50%" />
בואו נתמקד לרגע רק בזן אחד של דלעות, 'סוג פאי', ונראה מה ההשפעה של התאריך על המחיר:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="גרף פיזור של מחיר מול יום בשנה" src="images/pie-pumpkins-scatter.png" width="50%" />
אם עכשיו נחשב את המתאם בין `Price` ל-`DayOfYear` באמצעות פונקציית `corr`, נקבל משהו כמו `-0.27` - מה שאומר שאימון מודל חיזוי הגיוני.
> לפני אימון מודל רגרסיה לינארית, חשוב לוודא שהנתונים שלנו נקיים. רגרסיה לינארית לא עובדת טוב עם ערכים חסרים, ולכן הגיוני להיפטר מכל התאים הריקים:
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
גישה נוספת תהיה למלא את הערכים הריקים בערכים ממוצעים מהעמודה המתאימה.
## רגרסיה לינארית פשוטה
[![למידת מכונה למתחילים - רגרסיה לינארית ופולינומית באמצעות Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "למידת מכונה למתחילים - רגרסיה לינארית ופולינומית באמצעות Scikit-learn")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על רגרסיה לינארית ופולינומית.
כדי לאמן את מודל הרגרסיה הלינארית שלנו, נשתמש בספריית **Scikit-learn**.
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
נתחיל בהפרדת ערכי הקלט (תכונות) והתוצאה הצפויה (תווית) למערכים נפרדים של numpy:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> שימו לב שהיינו צריכים לבצע `reshape` על נתוני הקלט כדי שחבילת הרגרסיה הלינארית תבין אותם נכון. רגרסיה לינארית מצפה למערך דו-ממדי כקלט, שבו כל שורה במערך מתאימה לווקטור של תכונות קלט. במקרה שלנו, מכיוון שיש לנו רק קלט אחד - אנו צריכים מערך עם צורה N×1, כאשר N הוא גודל מאגר הנתונים.
לאחר מכן, אנו צריכים לחלק את הנתונים למאגרי אימון ובדיקה, כך שנוכל לאמת את המודל שלנו לאחר האימון:
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
לבסוף, אימון מודל הרגרסיה הלינארית עצמו לוקח רק שתי שורות קוד. אנו מגדירים את אובייקט `LinearRegression`, ומתאימים אותו לנתונים שלנו באמצעות שיטת `fit`:
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
אובייקט `LinearRegression` לאחר התאמה (`fit`) מכיל את כל המקדמים של הרגרסיה, שניתן לגשת אליהם באמצעות תכונת `.coef_`. במקרה שלנו, יש רק מקדם אחד, שאמור להיות בסביבות `-0.017`. זה אומר שהמחירים נראים כאילו הם יורדים מעט עם הזמן, אבל לא יותר מדי, בסביבות 2 סנט ליום. אנו יכולים גם לגשת לנקודת החיתוך של הרגרסיה עם ציר ה-Y באמצעות `lin_reg.intercept_` - זה יהיה בסביבות `21` במקרה שלנו, מה שמעיד על המחיר בתחילת השנה.
כדי לראות עד כמה המודל שלנו מדויק, אנו יכולים לחזות מחירים על מאגר נתוני הבדיקה, ואז למדוד עד כמה התחזיות שלנו קרובות לערכים הצפויים. ניתן לעשות זאת באמצעות מדד שגיאה ממוצעת ריבועית (MSE), שהוא הממוצע של כל ההבדלים הריבועיים בין הערך הצפוי לערך החזוי.
```python
pred = lin_reg.predict(X_test)
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
```
נראה שהשגיאה שלנו מתרכזת סביב 2 נקודות, שזה בערך 17%. לא כל כך טוב. אינדיקטור נוסף לאיכות המודל הוא **מקדם ההחלטיות**, שניתן לחשב כך:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
אם הערך הוא 0, זה אומר שהמודל לא מתחשב בנתוני הקלט ופועל כ*מנבא הליניארי הגרוע ביותר*, שהוא פשוט ממוצע של התוצאה. ערך של 1 אומר שאנחנו יכולים לנבא באופן מושלם את כל התוצאות הצפויות. במקרה שלנו, המקדם הוא בערך 0.06, שזה די נמוך.
ניתן גם לשרטט את נתוני הבדיקה יחד עם קו הרגרסיה כדי לראות טוב יותר איך הרגרסיה פועלת במקרה שלנו:
```python
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
```
<img alt="רגרסיה ליניארית" src="images/linear-results.png" width="50%" />
## רגרסיה פולינומית
סוג נוסף של רגרסיה ליניארית הוא רגרסיה פולינומית. בעוד שלפעמים יש קשר ליניארי בין משתנים - ככל שנפח הדלעת גדול יותר, כך המחיר גבוה יותר - לפעמים קשרים אלו לא יכולים להיות מיוצגים כמישור או כקו ישר.
✅ הנה [כמה דוגמאות נוספות](https://online.stat.psu.edu/stat501/lesson/9/9.8) לנתונים שיכולים להשתמש ברגרסיה פולינומית.
תסתכלו שוב על הקשר בין תאריך למחיר. האם פיזור הנתונים נראה כאילו הוא חייב להיות מנותח באמצעות קו ישר? האם מחירים לא יכולים להשתנות? במקרה כזה, ניתן לנסות רגרסיה פולינומית.
✅ פולינומים הם ביטויים מתמטיים שיכולים לכלול משתנה אחד או יותר ומקדמים.
רגרסיה פולינומית יוצרת קו מעוקל שמתאים טוב יותר לנתונים לא ליניאריים. במקרה שלנו, אם נכלול משתנה `DayOfYear` בריבוע בנתוני הקלט, נוכל להתאים את הנתונים שלנו לעקומה פרבולית, שתהיה לה מינימום בנקודה מסוימת במהלך השנה.
ספריית Scikit-learn כוללת [API של צינור](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) שמאפשר לשלב שלבים שונים של עיבוד נתונים יחד. **צינור** הוא שרשרת של **אומדנים**. במקרה שלנו, ניצור צינור שמוסיף תחילה תכונות פולינומיות למודל שלנו, ואז מאמן את הרגרסיה:
```python
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
```
שימוש ב-`PolynomialFeatures(2)` אומר שנכלול את כל הפולינומים מדרגה שנייה מנתוני הקלט. במקרה שלנו זה פשוט אומר `DayOfYear`<sup>2</sup>, אבל אם ישנם שני משתני קלט X ו-Y, זה יוסיף X<sup>2</sup>, XY ו-Y<sup>2</sup>. ניתן גם להשתמש בפולינומים מדרגה גבוהה יותר אם רוצים.
ניתן להשתמש בצינורות באותו אופן כמו באובייקט `LinearRegression` המקורי, כלומר ניתן להשתמש ב-`fit` בצינור ואז ב-`predict` כדי לקבל את תוצאות הניבוי. הנה הגרף שמראה את נתוני הבדיקה ואת עקומת הקירוב:
<img alt="רגרסיה פולינומית" src="images/poly-results.png" width="50%" />
שימוש ברגרסיה פולינומית מאפשר לנו לקבל MSE מעט נמוך יותר ומקדם החלטיות גבוה יותר, אך לא באופן משמעותי. יש לקחת בחשבון תכונות נוספות!
> ניתן לראות שהמחירים המינימליים של דלעות נצפים איפשהו סביב ליל כל הקדושים. איך אפשר להסביר את זה?
🎃 כל הכבוד, יצרתם מודל שיכול לעזור לנבא את מחיר דלעות הפאי. כנראה שתוכלו לחזור על אותו תהליך עבור כל סוגי הדלעות, אבל זה יהיה מייגע. עכשיו נלמד איך לקחת בחשבון את סוג הדלעת במודל שלנו!
## תכונות קטגוריות
בעולם האידיאלי, נרצה להיות מסוגלים לנבא מחירים עבור סוגי דלעות שונים באמצעות אותו מודל. עם זאת, העמודה `Variety` שונה במקצת מעמודות כמו `Month`, מכיוון שהיא מכילה ערכים לא מספריים. עמודות כאלה נקראות **קטגוריות**.
[![ML למתחילים - ניבוי תכונות קטגוריות עם רגרסיה ליניארית](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML למתחילים - ניבוי תכונות קטגוריות עם רגרסיה ליניארית")
> 🎥 לחצו על התמונה למעלה לסרטון קצר על שימוש בתכונות קטגוריות.
כאן ניתן לראות איך המחיר הממוצע תלוי בסוג הדלעת:
<img alt="מחיר ממוצע לפי סוג" src="images/price-by-variety.png" width="50%" />
כדי לקחת את סוג הדלעת בחשבון, תחילה עלינו להמיר אותו לצורה מספרית, או **לקודד** אותו. ישנן מספר דרכים לעשות זאת:
* **קידוד מספרי פשוט** יבנה טבלה של סוגי דלעות שונים, ואז יחליף את שם הסוג במספר אינדקס בטבלה. זו לא הבחירה הטובה ביותר עבור רגרסיה ליניארית, מכיוון שרגרסיה ליניארית מתחשבת בערך המספרי של האינדקס ומוסיפה אותו לתוצאה, תוך הכפלה במקדם מסוים. במקרה שלנו, הקשר בין מספר האינדקס למחיר הוא בבירור לא ליניארי, גם אם נוודא שהאינדקסים מסודרים בצורה מסוימת.
* **קידוד One-hot** יחליף את העמודה `Variety` בארבע עמודות שונות, אחת לכל סוג. כל עמודה תכיל `1` אם השורה המתאימה היא מסוג מסוים, ו-`0` אחרת. זה אומר שיהיו ארבעה מקדמים ברגרסיה ליניארית, אחד לכל סוג דלעת, שאחראי על "מחיר התחלתי" (או ליתר דיוק "מחיר נוסף") עבור אותו סוג מסוים.
הקוד הבא מראה איך ניתן לקודד סוג דלעת בשיטת One-hot:
```python
pd.get_dummies(new_pumpkins['Variety'])
```
ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE
----|-----------|-----------|--------------------------|----------
70 | 0 | 0 | 0 | 1
71 | 0 | 0 | 0 | 1
... | ... | ... | ... | ...
1738 | 0 | 1 | 0 | 0
1739 | 0 | 1 | 0 | 0
1740 | 0 | 1 | 0 | 0
1741 | 0 | 1 | 0 | 0
1742 | 0 | 1 | 0 | 0
כדי לאמן רגרסיה ליניארית באמצעות סוג דלעת מקודד בשיטת One-hot כקלט, פשוט צריך לאתחל את נתוני `X` ו-`y` בצורה נכונה:
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
שאר הקוד זהה למה שהשתמשנו בו קודם כדי לאמן רגרסיה ליניארית. אם תנסו זאת, תראו ש-Mean Squared Error נשאר בערך אותו דבר, אבל מקדם ההחלטיות עולה משמעותית (~77%). כדי לקבל ניבויים מדויקים יותר, ניתן לקחת בחשבון תכונות קטגוריות נוספות, כמו גם תכונות מספריות, כגון `Month` או `DayOfYear`. כדי לקבל מערך גדול של תכונות, ניתן להשתמש ב-`join`:
```python
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
```
כאן אנו לוקחים בחשבון גם את `City` ואת סוג האריזה, מה שמביא אותנו ל-MSE של 2.84 (10%) ולמקדם החלטיות של 0.94!
## לשלב הכל יחד
כדי ליצור את המודל הטוב ביותר, ניתן להשתמש בנתונים משולבים (קטגוריות מקודדות בשיטת One-hot + נתונים מספריים) מהדוגמה לעיל יחד עם רגרסיה פולינומית. הנה הקוד המלא לנוחיותכם:
```python
# set up training data
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# make train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# setup and train the pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# predict results for test data
pred = pipeline.predict(X_test)
# calculate MSE and determination
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
זה אמור לתת לנו את מקדם ההחלטיות הטוב ביותר של כמעט 97%, ו-MSE=2.23 (~8% שגיאת ניבוי).
| מודל | MSE | מקדם החלטיות |
|-------|-----|---------------|
| `DayOfYear` ליניארי | 2.77 (17.2%) | 0.07 |
| `DayOfYear` פולינומי | 2.73 (17.0%) | 0.08 |
| `Variety` ליניארי | 5.24 (19.7%) | 0.77 |
| כל התכונות ליניארי | 2.84 (10.5%) | 0.94 |
| כל התכונות פולינומי | 2.23 (8.25%) | 0.97 |
🏆 כל הכבוד! יצרתם ארבעה מודלים של רגרסיה בשיעור אחד ושיפרתם את איכות המודל ל-97%. בחלק האחרון על רגרסיה תלמדו על רגרסיה לוגיסטית כדי לקבוע קטגוריות.
---
## 🚀אתגר
בדקו משתנים שונים במחברת זו כדי לראות איך הקורלציה משפיעה על דיוק המודל.
## [מבחן לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
בשיעור זה למדנו על רגרסיה ליניארית. ישנם סוגים חשובים נוספים של רגרסיה. קראו על טכניקות Stepwise, Ridge, Lasso ו-Elasticnet. קורס טוב ללמוד כדי להעמיק הוא [קורס הלמידה הסטטיסטית של סטנפורד](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).
## משימה
[בנו מודל](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "cc471fa89c293bc735dd3a9a0fb79b1b",
"translation_date": "2025-09-05T18:42:57+00:00",
"source_file": "2-Regression/3-Linear/assignment.md",
"language_code": "he"
}
-->
# יצירת מודל רגרסיה
## הוראות
בשיעור זה הוצג כיצד לבנות מודל באמצעות רגרסיה לינארית ורגרסיה פולינומית. בעזרת הידע הזה, מצאו מערך נתונים או השתמשו באחד ממערכי הנתונים המובנים של Scikit-learn כדי לבנות מודל חדש. הסבירו במחברת שלכם מדוע בחרתם בטכניקה שבחרתם, והציגו את דיוק המודל שלכם. אם המודל אינו מדויק, הסבירו מדוע.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ---------------------------------------------------------- | ------------------------- | --------------------------- |
| | מציג מחברת מלאה עם פתרון מתועד היטב | הפתרון אינו שלם | הפתרון פגום או מכיל באגים |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T18:43:25+00:00",
"source_file": "2-Regression/3-Linear/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,412 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "abf86d845c84330bce205a46b382ec88",
"translation_date": "2025-09-05T18:46:04+00:00",
"source_file": "2-Regression/4-Logistic/README.md",
"language_code": "he"
}
-->
# רגרסיה לוגיסטית לחיזוי קטגוריות
![אינפוגרפיקה של רגרסיה לוגיסטית מול רגרסיה ליניארית](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png)
## [מבחן מקדים להרצאה](https://ff-quizzes.netlify.app/en/ml/)
> ### [השיעור הזה זמין גם ב-R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
## מבוא
בשיעור האחרון על רגרסיה, אחת מטכניקות ה-ML הקלאסיות הבסיסיות, נבחן את הרגרסיה הלוגיסטית. תשתמשו בטכניקה זו כדי לגלות דפוסים לחיזוי קטגוריות בינאריות. האם הממתק הזה הוא שוקולד או לא? האם המחלה הזו מדבקת או לא? האם הלקוח הזה יבחר במוצר הזה או לא?
בשיעור הזה תלמדו:
- ספרייה חדשה להדמיית נתונים
- טכניקות לרגרסיה לוגיסטית
✅ העמיקו את ההבנה שלכם בעבודה עם סוג זה של רגרסיה במודול [Learn](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott)
## דרישות מקדימות
לאחר שעבדנו עם נתוני הדלעת, אנחנו כבר מספיק מכירים אותם כדי להבין שיש קטגוריה בינארית אחת שאפשר לעבוד איתה: `Color`.
בואו נבנה מודל רגרסיה לוגיסטית כדי לחזות, בהתבסס על משתנים מסוימים, יזה צבע צפוי להיות לדלעת מסוימת_ (כתום 🎃 או לבן 👻).
> למה אנחנו מדברים על סיווג בינארי בשיעור שמקושר לרגרסיה? רק מטעמי נוחות לשונית, שכן רגרסיה לוגיסטית היא [בעצם שיטת סיווג](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), אם כי מבוססת על ליניאריות. למדו על דרכים אחרות לסווג נתונים בקבוצת השיעורים הבאה.
## הגדרת השאלה
למטרותינו, נבטא זאת כבינארי: 'לבן' או 'לא לבן'. יש גם קטגוריה 'מפוספסת' במאגר הנתונים שלנו, אבל יש מעט מקרים שלה, ולכן לא נשתמש בה. היא נעלמת בכל מקרה ברגע שמסירים ערכים חסרים מהמאגר.
> 🎃 עובדה מעניינת: לפעמים אנחנו קוראים לדלעות לבנות 'דלעות רפאים'. הן לא קלות לגילוף, ולכן הן פחות פופולריות מהכתומות, אבל הן נראות מגניבות! אז אפשר גם לנסח מחדש את השאלה שלנו כ: 'רפאים' או 'לא רפאים'. 👻
## על רגרסיה לוגיסטית
רגרסיה לוגיסטית שונה מרגרסיה ליניארית, שלמדתם עליה קודם, בכמה דרכים חשובות.
[![ML למתחילים - הבנת רגרסיה לוגיסטית לסיווג בלמידת מכונה](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "ML למתחילים - הבנת רגרסיה לוגיסטית לסיווג בלמידת מכונה")
> 🎥 לחצו על התמונה למעלה לסרטון קצר על רגרסיה לוגיסטית.
### סיווג בינארי
רגרסיה לוגיסטית לא מציעה את אותן תכונות כמו רגרסיה ליניארית. הראשונה מציעה חיזוי של קטגוריה בינארית ("לבן או לא לבן"), בעוד שהאחרונה מסוגלת לחזות ערכים רציפים, למשל בהתבסס על מקור הדלעת וזמן הקטיף, _כמה המחיר שלה יעלה_.
![מודל סיווג דלעות](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png)
> אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded)
### סיווגים אחרים
ישנם סוגים אחרים של רגרסיה לוגיסטית, כולל מולטינומיאלית ואורדינלית:
- **מולטינומיאלית**, שכוללת יותר מקטגוריה אחת - "כתום, לבן ומפוספס".
- **אורדינלית**, שכוללת קטגוריות מסודרות, שימושית אם נרצה לסדר את התוצאות שלנו באופן לוגי, כמו הדלעות שלנו שמסודרות לפי מספר סופי של גדלים (מיני, קטן, בינוני, גדול, XL, XXL).
![רגרסיה מולטינומיאלית מול אורדינלית](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png)
### המשתנים לא חייבים להיות מתואמים
זוכרים איך רגרסיה ליניארית עבדה טוב יותר עם משתנים מתואמים? רגרסיה לוגיסטית היא ההפך - המשתנים לא חייבים להיות מתואמים. זה עובד עבור הנתונים האלה שיש להם מתאמים חלשים יחסית.
### צריך הרבה נתונים נקיים
רגרסיה לוגיסטית תיתן תוצאות מדויקות יותר אם תשתמשו ביותר נתונים; מאגר הנתונים הקטן שלנו אינו אופטימלי למשימה זו, אז קחו זאת בחשבון.
[![ML למתחילים - ניתוח והכנת נתונים לרגרסיה לוגיסטית](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "ML למתחילים - ניתוח והכנת נתונים לרגרסיה לוגיסטית")
> 🎥 לחצו על התמונה למעלה לסרטון קצר על הכנת נתונים לרגרסיה ליניארית.
✅ חשבו על סוגי הנתונים שיתאימו לרגרסיה לוגיסטית.
## תרגיל - ניקוי הנתונים
ראשית, ננקה את הנתונים מעט, נסיר ערכים חסרים ונבחר רק חלק מהעמודות:
1. הוסיפו את הקוד הבא:
```python
columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']
pumpkins = full_pumpkins.loc[:, columns_to_select]
pumpkins.dropna(inplace=True)
```
תמיד אפשר להציץ במאגר הנתונים החדש שלכם:
```python
pumpkins.info
```
### הדמיה - תרשים קטגוריאלי
עד עכשיו טענתם את [מחברת ההתחלה](../../../../2-Regression/4-Logistic/notebook.ipynb) עם נתוני הדלעות שוב וניקיתם אותה כך שתשמר מאגר נתונים המכיל כמה משתנים, כולל `Color`. בואו נדמיין את מאגר הנתונים במחברת באמצעות ספרייה אחרת: [Seaborn](https://seaborn.pydata.org/index.html), שנבנתה על Matplotlib שבה השתמשנו קודם.
Seaborn מציעה דרכים מעניינות להדמיית הנתונים שלכם. לדוגמה, אפשר להשוות את התפלגות הנתונים עבור כל `Variety` ו-`Color` בתרשים קטגוריאלי.
1. צרו תרשים כזה באמצעות הפונקציה `catplot`, תוך שימוש בנתוני הדלעות שלנו `pumpkins`, והגדירו מיפוי צבעים לכל קטגוריית דלעת (כתום או לבן):
```python
import seaborn as sns
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
sns.catplot(
data=pumpkins, y="Variety", hue="Color", kind="count",
palette=palette,
)
```
![רשת של נתונים מדומיינים](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png)
בהתבוננות בנתונים, אפשר לראות כיצד נתוני הצבע קשורים לזן.
✅ בהתבסס על התרשים הקטגוריאלי הזה, אילו חקירות מעניינות אתם יכולים לדמיין?
### עיבוד נתונים: קידוד תכונות ותוויות
מאגר הנתונים של הדלעות שלנו מכיל ערכי מחרוזת עבור כל העמודות שלו. עבודה עם נתונים קטגוריאליים היא אינטואיטיבית עבור בני אדם אך לא עבור מכונות. אלגוריתמים של למידת מכונה עובדים טוב עם מספרים. לכן קידוד הוא שלב חשוב מאוד בשלב עיבוד הנתונים, מכיוון שהוא מאפשר לנו להפוך נתונים קטגוריאליים לנתונים מספריים, מבלי לאבד מידע. קידוד טוב מוביל לבניית מודל טוב.
לקידוד תכונות יש שני סוגים עיקריים של מקודדים:
1. מקודד אורדינלי: מתאים היטב למשתנים אורדינליים, שהם משתנים קטגוריאליים שבהם הנתונים שלהם עוקבים אחר סדר לוגי, כמו עמודת `Item Size` במאגר הנתונים שלנו. הוא יוצר מיפוי כך שכל קטגוריה מיוצגת על ידי מספר, שהוא הסדר של הקטגוריה בעמודה.
```python
from sklearn.preprocessing import OrdinalEncoder
item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]
ordinal_features = ['Item Size']
ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
```
2. מקודד קטגוריאלי: מתאים היטב למשתנים נומינליים, שהם משתנים קטגוריאליים שבהם הנתונים שלהם אינם עוקבים אחר סדר לוגי, כמו כל התכונות השונות מ-`Item Size` במאגר הנתונים שלנו. זהו קידוד one-hot, כלומר כל קטגוריה מיוצגת על ידי עמודה בינארית: המשתנה המקודד שווה ל-1 אם הדלעת שייכת לזן הזה ול-0 אחרת.
```python
from sklearn.preprocessing import OneHotEncoder
categorical_features = ['City Name', 'Package', 'Variety', 'Origin']
categorical_encoder = OneHotEncoder(sparse_output=False)
```
לאחר מכן, משתמשים ב-`ColumnTransformer` כדי לשלב מספר מקודדים לשלב אחד וליישם אותם על העמודות המתאימות.
```python
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', ordinal_encoder, ordinal_features),
('cat', categorical_encoder, categorical_features)
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)
```
מצד שני, לקידוד התווית, משתמשים במחלקת `LabelEncoder` של scikit-learn, שהיא מחלקת עזר לנרמל תוויות כך שיכילו רק ערכים בין 0 ל-n_classes-1 (כאן, 0 ו-1).
```python
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(pumpkins['Color'])
```
לאחר שקידדנו את התכונות והתווית, אפשר למזג אותן למאגר נתונים חדש `encoded_pumpkins`.
```python
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
```
✅ מה היתרונות של שימוש במקודד אורדינלי עבור עמודת `Item Size`?
### ניתוח קשרים בין משתנים
עכשיו, לאחר שעיבדנו את הנתונים שלנו, אפשר לנתח את הקשרים בין התכונות לתווית כדי להבין עד כמה המודל יוכל לחזות את התווית בהתבסס על התכונות. הדרך הטובה ביותר לבצע ניתוח כזה היא באמצעות הדמיית הנתונים. נשתמש שוב בפונקציה `catplot` של Seaborn, כדי להמחיש את הקשרים בין `Item Size`, `Variety` ו-`Color` בתרשים קטגוריאלי. כדי להמחיש את הנתונים טוב יותר נשתמש בעמודת `Item Size` המקודדת ובעמודת `Variety` הלא מקודדת.
```python
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
g = sns.catplot(
data=pumpkins,
x="Item Size", y="Color", row='Variety',
kind="box", orient="h",
sharex=False, margin_titles=True,
height=1.8, aspect=4, palette=palette,
)
g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
g.set_titles(row_template="{row_name}")
```
![תרשים קטגוריאלי של נתונים מדומיינים](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png)
### שימוש בתרשים swarm
מכיוון ש-Color הוא קטגוריה בינארית (לבן או לא), הוא דורש '[גישה מיוחדת](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) להדמיה'. יש דרכים אחרות להמחיש את הקשר של קטגוריה זו עם משתנים אחרים.
אפשר להמחיש משתנים זה לצד זה עם תרשימי Seaborn.
1. נסו תרשים 'swarm' כדי להראות את התפלגות הערכים:
```python
palette = {
0: 'orange',
1: 'wheat'
}
sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
```
![swarm של נתונים מדומיינים](../../../../2-Regression/4-Logistic/images/swarm_2.png)
**שימו לב**: הקוד למעלה עשוי ליצור אזהרה, מכיוון ש-Seaborn מתקשה לייצג כמות כזו של נקודות נתונים בתרשים swarm. פתרון אפשרי הוא להקטין את גודל הסמן, באמצעות הפרמטר 'size'. עם זאת, שימו לב שזה משפיע על קריאות התרשים.
> **🧮 תראו לי את המתמטיקה**
>
> רגרסיה לוגיסטית מתבססת על הרעיון של 'סבירות מרבית' באמצעות [פונקציות סיגמואיד](https://wikipedia.org/wiki/Sigmoid_function). פונקציית סיגמואיד על תרשים נראית כמו צורת 'S'. היא לוקחת ערך וממפה אותו למקום בין 0 ל-1. העקומה שלה נקראת גם 'עקומה לוגיסטית'. הנוסחה שלה נראית כך:
>
> ![פונקציה לוגיסטית](../../../../2-Regression/4-Logistic/images/sigmoid.png)
>
> כאשר נקודת האמצע של הסיגמואיד נמצאת בנקודת ה-0 של x, L הוא הערך המרבי של העקומה, ו-k הוא תלילות העקומה. אם תוצאת הפונקציה היא יותר מ-0.5, התווית המדוברת תינתן למעמד '1' של הבחירה הבינארית. אם לא, היא תסווג כ-'0'.
## בניית המודל שלכם
בניית מודל למציאת סיווגים בינאריים היא פשוטה באופן מפתיע ב-Scikit-learn.
[![ML למתחילים - רגרסיה לוגיסטית לסיווג נתונים](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "ML למתחילים - רגרסיה לוגיסטית לסיווג נתונים")
> 🎥 לחצו על התמונה למעלה לסרטון קצר על בניית מודל רגרסיה ליניארית.
1. בחרו את המשתנים שתרצו להשתמש בהם במודל הסיווג שלכם וחלקו את קבוצות האימון והבדיקה באמצעות קריאה ל-`train_test_split()`:
```python
from sklearn.model_selection import train_test_split
X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
y = encoded_pumpkins['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
2. עכשיו אפשר לאמן את המודל, באמצעות קריאה ל-`fit()` עם נתוני האימון שלכם, ולהדפיס את התוצאה שלו:
```python
from sklearn.metrics import f1_score, classification_report
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print('Predicted labels: ', predictions)
print('F1-score: ', f1_score(y_test, predictions))
```
הסתכלו על לוח התוצאות של המודל שלכם. הוא לא רע, בהתחשב בכך שיש לכם רק כ-1000 שורות נתונים:
```output
precision recall f1-score support
0 0.94 0.98 0.96 166
1 0.85 0.67 0.75 33
accuracy 0.92 199
macro avg 0.89 0.82 0.85 199
weighted avg 0.92 0.92 0.92 199
Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 0 0 0 1 1]
F1-score: 0.7457627118644068
```
## הבנה טובה יותר באמצעות מטריצת בלבול
בעוד שאפשר לקבל דוח תוצאות [מונחים](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) על ידי הדפסת הפריטים למעלה, ייתכן שתוכלו להבין את המודל שלכם ביתר קלות באמצעות [מטריצת בלבול](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) שתעזור לנו להבין כיצד המודל מתפקד.
> 🎓 '[מטריצת בלבול](https://wikipedia.org/wiki/Confusion_matrix)' (או 'מטריצת שגיאות') היא טבלה שמבטאת את החיוביים והשליליים האמיתיים מול השגויים של המודל שלכם, ובכך מעריכה את דיוק התחזיות.
1. כדי להשתמש במטריצת בלבול, קראו ל-`confusion_matrix()`:
```python
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, predictions)
```
הסתכלו על מטריצת הבלבול של המודל שלכם:
```output
array([[162, 4],
[ 11, 22]])
```
ב-Scikit-learn, שורות (axis 0) הן תוויות אמיתיות ועמודות (axis 1) הן תוויות חזויות.
| | 0 | 1 |
| :---: | :---: | :---: |
| 0 | TN | FP |
| 1 | FN | TP |
מה קורה כאן? נניח שהמודל שלנו מתבקש לסווג דלעות בין שתי קטגוריות בינאריות, קטגוריה 'לבן' וקטגוריה 'לא-לבן'.
- אם המודל שלכם חוזה דלעת כלא לבנה והיא שייכת לקטגוריה 'לא-לבן' במציאות, אנחנו קוראים לזה שלילי אמיתי (True Negative), שמוצג על ידי המספר בפינה השמאלית העליונה.
- אם המודל שלכם חוזה דלעת כלבנה והיא שייכת לקטגוריה 'לא-לבן' במציאות, אנחנו קוראים לזה שלילי שגוי (False Negative), שמוצג על ידי המספר בפינה השמאלית התחתונה.
- אם המודל שלכם חוזה דלעת כלא לבנה והיא שייכת לקטגוריה 'לבן' במציאות, אנחנו קוראים לזה חיובי שגוי (False Positive), שמוצג על ידי המספר בפינה הימנית העליונה.
- אם המודל שלכם חוזה דלעת כלבנה והיא שייכת לקטגוריה 'לבן' במציאות, אנחנו קוראים לזה חיובי אמיתי (True Positive), שמוצג על ידי המספר בפינה הימנית התחתונה.
כפי שכנראה ניחשתם, עדיף שיהיו יותר חיוביים אמיתיים ושליליים אמיתיים ומספר נמוך יותר של חיוביים שגויים ושליליים שגויים, מה שמעיד על כך שהמודל מתפקד טוב יותר.
כיצד מטריצת הבלבול קשורה לדיוק ולשליפה? זכרו, דוח הסיווג שהודפס למעלה הציג דיוק (0.85) ושליפה (0.67).
דיוק = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
שליפה = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666
✅ ש: לפי מטריצת הבלבול, איך המודל ביצע? ת: לא רע; יש מספר טוב של שליליים אמיתיים אבל גם כמה שליליים שגויים.
בואו נחזור למונחים שראינו קודם בעזרת המיפוי של TP/TN ו-FP/FN במטריצת הבלבול:
🎓 דיוק: TP/(TP + FP) החלק של המקרים הרלוונטיים מתוך המקרים שנמצאו (לדוגמה, אילו תוויות סווגו היטב).
🎓 שליפה: TP/(TP + FN) החלק של המקרים הרלוונטיים שנמצאו, בין אם סווגו היטב או לא.
🎓 ציון f1: (2 * דיוק * שליפה)/(דיוק + שליפה) ממוצע משוקלל של דיוק ושליפה, כאשר הטוב ביותר הוא 1 והגרוע ביותר הוא 0.
🎓 תמיכה: מספר המופעים של כל תווית שנמצאה.
🎓 דיוק כללי: (TP + TN)/(TP + TN + FP + FN) אחוז התוויות שסווגו בצורה מדויקת עבור דגימה.
🎓 ממוצע מאקרו: חישוב הממוצע הלא משוקלל של המדדים עבור כל תווית, מבלי להתחשב באי-איזון בין התוויות.
🎓 ממוצע משוקלל: חישוב הממוצע של המדדים עבור כל תווית, תוך התחשבות באי-איזון בין התוויות על ידי שקילתן לפי התמיכה (מספר המקרים האמיתיים עבור כל תווית).
✅ האם אתם יכולים לחשוב על איזה מדד כדאי להתמקד אם אתם רוצים שהמודל יפחית את מספר השליליים השגויים?
## ויזואליזציה של עקומת ROC של המודל הזה
[![ML למתחילים - ניתוח ביצועי רגרסיה לוגיסטית עם עקומות ROC](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML למתחילים - ניתוח ביצועי רגרסיה לוגיסטית עם עקומות ROC")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על עקומות ROC
בואו נעשה ויזואליזציה נוספת כדי לראות את מה שנקרא 'עקומת ROC':
```python
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
fig = plt.figure(figsize=(6, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
```
באמצעות Matplotlib, שרטטו את [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) או ROC של המודל. עקומות ROC משמשות לעיתים קרובות כדי לקבל מבט על תוצאות מסווג במונחים של חיוביים אמיתיים מול חיוביים שגויים. "עקומות ROC מציגות בדרך כלל את שיעור החיוביים האמיתיים על ציר ה-Y, ואת שיעור החיוביים השגויים על ציר ה-X." לכן, תלילות העקומה והמרחק בין קו האמצע לעקומה חשובים: אתם רוצים עקומה שמתקדמת במהירות למעלה ומעל הקו. במקרה שלנו, יש חיוביים שגויים בהתחלה, ואז הקו מתקדם למעלה ומעל בצורה נכונה:
![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png)
לבסוף, השתמשו ב-API של [`roc_auc_score`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) של Scikit-learn כדי לחשב את 'שטח מתחת לעקומה' (AUC):
```python
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
```
התוצאה היא `0.9749908725812341`. מכיוון ש-AUC נע בין 0 ל-1, אתם רוצים ציון גבוה, שכן מודל שמנבא בצורה נכונה ב-100% יקבל AUC של 1; במקרה הזה, המודל י טוב_.
בשיעורים עתידיים על סיווגים, תלמדו כיצד לשפר את ציוני המודל שלכם. אבל לעת עתה, ברכות! סיימתם את שיעורי הרגרסיה האלה!
---
## 🚀אתגר
יש עוד הרבה ללמוד על רגרסיה לוגיסטית! אבל הדרך הטובה ביותר ללמוד היא להתנסות. מצאו מערך נתונים שמתאים לסוג זה של ניתוח ובנו מודל איתו. מה אתם לומדים? טיפ: נסו [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) עבור מערכי נתונים מעניינים.
## [מבחן לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
קראו את העמודים הראשונים של [המאמר הזה מסטנפורד](https://web.stanford.edu/~jurafsky/slp3/5.pdf) על שימושים מעשיים לרגרסיה לוגיסטית. חשבו על משימות שמתאימות יותר לאחד מסוגי הרגרסיה שלמדנו עד כה. מה יעבוד הכי טוב?
## משימה
[נסו שוב את הרגרסיה הזו](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "8af40209a41494068c1f42b14c0b450d",
"translation_date": "2025-09-05T18:49:27+00:00",
"source_file": "2-Regression/4-Logistic/assignment.md",
"language_code": "he"
}
-->
# ניסיון חוזר עם רגרסיה
## הוראות
בשיעור השתמשת בתת-קבוצה של נתוני הדלעת. עכשיו, חזור לנתונים המקוריים ונסה להשתמש בכולם, לאחר ניקוי וסטנדרטיזציה, כדי לבנות מודל רגרסיה לוגיסטית.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ----------------------------------------------------------------------- | --------------------------------------------------------- | -------------------------------------------------------- |
| | מוצג מחברת עם מודל מוסבר היטב ובעל ביצועים טובים | מוצג מחברת עם מודל בעל ביצועים מינימליים | מוצג מחברת עם מודל בעל ביצועים נמוכים או ללא מודל כלל |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T18:49:49+00:00",
"source_file": "2-Regression/4-Logistic/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,54 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "508582278dbb8edd2a8a80ac96ef416c",
"translation_date": "2025-09-05T18:37:21+00:00",
"source_file": "2-Regression/README.md",
"language_code": "he"
}
-->
# מודלים של רגרסיה ללמידת מכונה
## נושא אזורי: מודלים של רגרסיה למחירי דלעת בצפון אמריקה 🎃
בצפון אמריקה, דלעות משמשות לעיתים קרובות ליצירת פרצופים מפחידים לכבוד ליל כל הקדושים. בואו נגלה עוד על הירקות המרתקים האלה!
![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg)
> צילום על ידי <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> ב-<a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## מה תלמדו
[![מבוא לרגרסיה](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "סרטון מבוא לרגרסיה - לחצו לצפייה!")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון מבוא קצר לשיעור זה
השיעורים בסעיף זה עוסקים בסוגי רגרסיה בהקשר של למידת מכונה. מודלים של רגרסיה יכולים לעזור לקבוע את _הקשר_ בין משתנים. סוג זה של מודל יכול לחזות ערכים כמו אורך, טמפרטורה או גיל, ובכך לחשוף קשרים בין משתנים תוך ניתוח נקודות נתונים.
בסדרת השיעורים הזו, תגלו את ההבדלים בין רגרסיה לינארית לרגרסיה לוגיסטית, ומתי כדאי להעדיף אחת על פני השנייה.
[![למידת מכונה למתחילים - מבוא למודלים של רגרסיה בלמידת מכונה](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "למידת מכונה למתחילים - מבוא למודלים של רגרסיה בלמידת מכונה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר שמציג את מודלי הרגרסיה.
בקבוצת השיעורים הזו, תתארגנו להתחיל משימות למידת מכונה, כולל הגדרת Visual Studio Code לניהול מחברות, הסביבה הנפוצה למדעני נתונים. תגלו את Scikit-learn, ספרייה ללמידת מכונה, ותבנו את המודלים הראשונים שלכם, עם דגש על מודלים של רגרסיה בפרק זה.
> ישנם כלים שימושיים עם מעט קוד שיכולים לעזור לכם ללמוד על עבודה עם מודלים של רגרסיה. נסו [Azure ML למשימה זו](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
### שיעורים
1. [כלים מקצועיים](1-Tools/README.md)
2. [ניהול נתונים](2-Data/README.md)
3. [רגרסיה לינארית ופולינומית](3-Linear/README.md)
4. [רגרסיה לוגיסטית](4-Logistic/README.md)
---
### קרדיטים
"למידת מכונה עם רגרסיה" נכתב באהבה על ידי [Jen Looper](https://twitter.com/jenlooper)
♥️ תורמי חידונים כוללים: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) ו-[Ornella Altunyan](https://twitter.com/ornelladotcom)
מאגר הנתונים של דלעות הוצע על ידי [הפרויקט הזה ב-Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices) והנתונים שלו נלקחו מ-[דוחות סטנדרטיים של שווקי טרמינל לגידולים מיוחדים](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) שמופצים על ידי משרד החקלאות של ארצות הברית. הוספנו כמה נקודות סביב צבע בהתבסס על מגוון כדי לנרמל את ההתפלגות. נתונים אלה נמצאים בתחום הציבורי.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,359 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "e0b75f73e4a90d45181dc5581fe2ef5c",
"translation_date": "2025-09-05T19:45:06+00:00",
"source_file": "3-Web-App/1-Web-App/README.md",
"language_code": "he"
}
-->
# בניית אפליקציית אינטרנט לשימוש במודל למידת מכונה
בשיעור הזה, תאמנו מודל למידת מכונה על סט נתונים יוצא דופן: _תצפיות עב"מים במאה האחרונה_, שנאספו ממאגר הנתונים של NUFORC.
תלמדו:
- איך 'לשמר' מודל מאומן
- איך להשתמש במודל הזה באפליקציית Flask
נמשיך להשתמש במחברות לניקוי נתונים ולאימון המודל שלנו, אבל תוכלו לקחת את התהליך צעד אחד קדימה על ידי חקר השימוש במודל "בשדה", כלומר: באפליקציית אינטרנט.
כדי לעשות זאת, תצטרכו לבנות אפליקציית אינטרנט באמצעות Flask.
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
## בניית אפליקציה
ישנן מספר דרכים לבנות אפליקציות אינטרנט לצריכת מודלים של למידת מכונה. הארכיטקטורה של האינטרנט שלכם עשויה להשפיע על הדרך שבה המודל שלכם מאומן. דמיינו שאתם עובדים בעסק שבו קבוצת מדעני הנתונים אימנה מודל שהם רוצים שתשתמשו בו באפליקציה.
### שיקולים
ישנן שאלות רבות שעליכם לשאול:
- **האם זו אפליקציית אינטרנט או אפליקציה לנייד?** אם אתם בונים אפליקציה לנייד או צריכים להשתמש במודל בהקשר של IoT, תוכלו להשתמש ב-[TensorFlow Lite](https://www.tensorflow.org/lite/) ולהשתמש במודל באפליקציות אנדרואיד או iOS.
- **היכן המודל יימצא?** בענן או מקומית?
- **תמיכה לא מקוונת.** האם האפליקציה צריכה לעבוד במצב לא מקוון?
- **איזו טכנולוגיה שימשה לאימון המודל?** הטכנולוגיה שנבחרה עשויה להשפיע על הכלים שתצטרכו להשתמש בהם.
- **שימוש ב-TensorFlow.** אם אתם מאמנים מודל באמצעות TensorFlow, למשל, האקוסיסטם הזה מספק את היכולת להמיר מודל TensorFlow לשימוש באפליקציית אינטרנט באמצעות [TensorFlow.js](https://www.tensorflow.org/js/).
- **שימוש ב-PyTorch.** אם אתם בונים מודל באמצעות ספרייה כמו [PyTorch](https://pytorch.org/), יש לכם אפשרות לייצא אותו בפורמט [ONNX](https://onnx.ai/) (Open Neural Network Exchange) לשימוש באפליקציות אינטרנט JavaScript שיכולות להשתמש ב-[Onnx Runtime](https://www.onnxruntime.ai/). אפשרות זו תיחקר בשיעור עתידי עבור מודל שאומן באמצעות Scikit-learn.
- **שימוש ב-Lobe.ai או Azure Custom Vision.** אם אתם משתמשים במערכת SaaS (תוכנה כשירות) ללמידת מכונה כמו [Lobe.ai](https://lobe.ai/) או [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) לאימון מודל, סוג זה של תוכנה מספק דרכים לייצא את המודל לפלטפורמות רבות, כולל בניית API מותאם אישית שניתן לשאול בענן על ידי האפליקציה המקוונת שלכם.
יש לכם גם את האפשרות לבנות אפליקציית אינטרנט שלמה ב-Flask שתוכל לאמן את המודל בעצמה בדפדפן אינטרנט. ניתן לעשות זאת גם באמצעות TensorFlow.js בהקשר של JavaScript.
למטרותינו, מכיוון שעבדנו עם מחברות מבוססות Python, בואו נחקור את השלבים שעליכם לבצע כדי לייצא מודל מאומן ממחברת כזו לפורמט שניתן לקריאה על ידי אפליקציית אינטרנט שנבנתה ב-Python.
## כלי
למשימה זו, תצטרכו שני כלים: Flask ו-Pickle, שניהם פועלים על Python.
✅ מהו [Flask](https://palletsprojects.com/p/flask/)? מוגדר כ'מיקרו-פריימוורק' על ידי יוצריו, Flask מספק את התכונות הבסיסיות של פריימוורקים לאינטרנט באמצעות Python ומנוע תבניות לבניית דפי אינטרנט. עיינו ב-[מודול הלמידה הזה](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) כדי לתרגל בנייה עם Flask.
✅ מהו [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 הוא מודול Python שמבצע סריאליזציה ודס-סריאליזציה של מבנה אובייקט ב-Python. כשאתם 'משמרים' מודל, אתם מבצעים סריאליזציה או משטחים את המבנה שלו לשימוש באינטרנט. שימו לב: Pickle אינו בטוח באופן אינהרנטי, אז היו זהירים אם תתבקשו 'לפרוק' קובץ. קובץ משומר מסומן בסיומת `.pkl`.
## תרגיל - ניקוי הנתונים שלכם
בשיעור הזה תשתמשו בנתונים מ-80,000 תצפיות עב"מים, שנאספו על ידי [NUFORC](https://nuforc.org) (המרכז הלאומי לדיווח על עב"מים). לנתונים האלה יש תיאורים מעניינים של תצפיות עב"מים, לדוגמה:
- **תיאור ארוך לדוגמה.** "אדם יוצא מקרן אור שמאירה על שדה דשא בלילה ורץ לכיוון מגרש החניה של Texas Instruments".
- **תיאור קצר לדוגמה.** "האורות רדפו אחרינו".
גיליון הנתונים [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) כולל עמודות על `עיר`, `מדינה` ו`ארץ` שבהן התצפית התרחשה, `צורה` של האובייקט ו`קו רוחב` ו`קו אורך`.
ב-[מחברת](../../../../3-Web-App/1-Web-App/notebook.ipynb) הריקה שמצורפת לשיעור הזה:
1. ייבאו את `pandas`, `matplotlib`, ו-`numpy` כפי שעשיתם בשיעורים קודמים וייבאו את גיליון הנתונים של עב"מים. תוכלו להסתכל על דוגמת סט נתונים:
```python
import pandas as pd
import numpy as np
ufos = pd.read_csv('./data/ufos.csv')
ufos.head()
```
1. המירו את נתוני העב"מים למסגרת נתונים קטנה עם כותרות חדשות. בדקו את הערכים הייחודיים בשדה `Country`.
```python
ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
ufos.Country.unique()
```
1. עכשיו, תוכלו לצמצם את כמות הנתונים שעלינו להתמודד איתם על ידי הסרת ערכים ריקים וייבוא תצפיות בין 1-60 שניות בלבד:
```python
ufos.dropna(inplace=True)
ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
ufos.info()
```
1. ייבאו את ספריית `LabelEncoder` של Scikit-learn כדי להמיר את ערכי הטקסט של מדינות למספר:
✅ LabelEncoder מקודד נתונים לפי סדר אלפביתי
```python
from sklearn.preprocessing import LabelEncoder
ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])
ufos.head()
```
הנתונים שלכם צריכים להיראות כך:
```output
Seconds Country Latitude Longitude
2 20.0 3 53.200000 -2.916667
3 20.0 4 28.978333 -96.645833
14 30.0 4 35.823889 -80.253611
23 60.0 4 45.582778 -122.352222
24 3.0 3 51.783333 -0.783333
```
## תרגיל - בניית המודל שלכם
עכשיו תוכלו להתכונן לאמן מודל על ידי חלוקת הנתונים לקבוצת אימון ובדיקה.
1. בחרו את שלושת המאפיינים שתרצו לאמן עליהם כוקטור X שלכם, והוקטור y יהיה `Country`. אתם רוצים להיות מסוגלים להזין `Seconds`, `Latitude` ו-`Longitude` ולקבל מזהה מדינה להחזרה.
```python
from sklearn.model_selection import train_test_split
Selected_features = ['Seconds','Latitude','Longitude']
X = ufos[Selected_features]
y = ufos['Country']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
1. אימנו את המודל שלכם באמצעות רגרסיה לוגיסטית:
```python
from sklearn.metrics import accuracy_score, classification_report
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print('Predicted labels: ', predictions)
print('Accuracy: ', accuracy_score(y_test, predictions))
```
הדיוק לא רע **(כ-95%)**, ולא מפתיע, מכיוון ש-`Country` ו-`Latitude/Longitude` מתואמים.
המודל שיצרתם אינו מאוד מהפכני מכיוון שאתם אמורים להיות מסוגלים להסיק `Country` מ-`Latitude` ו-`Longitude`, אבל זהו תרגיל טוב לנסות לאמן מנתונים גולמיים שניקיתם, ייצאתם, ואז להשתמש במודל הזה באפליקציית אינטרנט.
## תרגיל - 'שימור' המודל שלכם
עכשיו, הגיע הזמן _לשמר_ את המודל שלכם! תוכלו לעשות זאת בכמה שורות קוד. לאחר שהוא _משומר_, טענו את המודל המשומר ובדקו אותו מול מערך נתונים לדוגמה שמכיל ערכים עבור שניות, קו רוחב וקו אורך.
```python
import pickle
model_filename = 'ufo-model.pkl'
pickle.dump(model, open(model_filename,'wb'))
model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]]))
```
המודל מחזיר **'3'**, שזהו קוד המדינה עבור בריטניה. מדהים! 👽
## תרגיל - בניית אפליקציית Flask
עכשיו תוכלו לבנות אפליקציית Flask שתוכל לקרוא את המודל שלכם ולהחזיר תוצאות דומות, אבל בצורה יותר נעימה לעין.
1. התחילו ביצירת תיקייה בשם **web-app** ליד קובץ _notebook.ipynb_ שבו נמצא קובץ _ufo-model.pkl_ שלכם.
1. בתיקייה הזו צרו עוד שלוש תיקיות: **static**, עם תיקייה **css** בתוכה, ו-**templates**. עכשיו אמורים להיות לכם הקבצים והתיקיות הבאים:
```output
web-app/
static/
css/
templates/
notebook.ipynb
ufo-model.pkl
```
✅ עיינו בתיקיית הפתרון כדי לראות את האפליקציה המוגמרת
1. הקובץ הראשון שיש ליצור בתיקיית _web-app_ הוא קובץ **requirements.txt**. כמו _package.json_ באפליקציית JavaScript, קובץ זה מפרט את התלויות הנדרשות על ידי האפליקציה. ב-**requirements.txt** הוסיפו את השורות:
```text
scikit-learn
pandas
numpy
flask
```
1. עכשיו, הריצו את הקובץ הזה על ידי ניווט ל-_web-app_:
```bash
cd web-app
```
1. בטרמינל שלכם הקלידו `pip install`, כדי להתקין את הספריות המפורטות ב-_requirements.txt_:
```bash
pip install -r requirements.txt
```
1. עכשיו, אתם מוכנים ליצור עוד שלושה קבצים כדי לסיים את האפליקציה:
1. צרו **app.py** בשורש.
2. צרו **index.html** בתיקיית _templates_.
3. צרו **styles.css** בתיקיית _static/css_.
1. בנו את קובץ _styles.css_ עם כמה סגנונות:
```css
body {
width: 100%;
height: 100%;
font-family: 'Helvetica';
background: black;
color: #fff;
text-align: center;
letter-spacing: 1.4px;
font-size: 30px;
}
input {
min-width: 150px;
}
.grid {
width: 300px;
border: 1px solid #2d2d2d;
display: grid;
justify-content: center;
margin: 20px auto;
}
.box {
color: #fff;
background: #2d2d2d;
padding: 12px;
display: inline-block;
}
```
1. לאחר מכן, בנו את קובץ _index.html_:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>🛸 UFO Appearance Prediction! 👽</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body>
<div class="grid">
<div class="box">
<p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p>
<form action="{{ url_for('predict')}}" method="post">
<input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" />
<input type="text" name="latitude" placeholder="Latitude" required="required" />
<input type="text" name="longitude" placeholder="Longitude" required="required" />
<button type="submit" class="btn">Predict country where the UFO is seen</button>
</form>
<p>{{ prediction_text }}</p>
</div>
</div>
</body>
</html>
```
שימו לב לתבניות בקובץ הזה. שימו לב לסינטקס 'mustache' סביב משתנים שיסופקו על ידי האפליקציה, כמו טקסט התחזית: `{{}}`. יש גם טופס ששולח תחזית לנתיב `/predict`.
לבסוף, אתם מוכנים לבנות את קובץ ה-Python שמניע את צריכת המודל והצגת התחזיות:
1. ב-`app.py` הוסיפו:
```python
import numpy as np
from flask import Flask, request, render_template
import pickle
app = Flask(__name__)
model = pickle.load(open("./ufo-model.pkl", "rb"))
@app.route("/")
def home():
return render_template("index.html")
@app.route("/predict", methods=["POST"])
def predict():
int_features = [int(x) for x in request.form.values()]
final_features = [np.array(int_features)]
prediction = model.predict(final_features)
output = prediction[0]
countries = ["Australia", "Canada", "Germany", "UK", "US"]
return render_template(
"index.html", prediction_text="Likely country: {}".format(countries[output])
)
if __name__ == "__main__":
app.run(debug=True)
```
> 💡 טיפ: כשאתם מוסיפים [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) בזמן הרצת אפליקציית האינטרנט באמצעות Flask, כל שינוי שתעשו באפליקציה שלכם ישתקף מיד ללא צורך להפעיל מחדש את השרת. שימו לב! אל תפעילו מצב זה באפליקציה בסביבת ייצור.
אם תריצו `python app.py` או `python3 app.py` - שרת האינטרנט שלכם יתחיל לפעול, מקומית, ותוכלו למלא טופס קצר כדי לקבל תשובה לשאלה הבוערת שלכם על היכן נצפו עב"מים!
לפני שתעשו זאת, הסתכלו על החלקים של `app.py`:
1. קודם כל, התלויות נטענות והאפליקציה מתחילה.
1. לאחר מכן, המודל מיובא.
1. לאחר מכן, index.html מוצג בנתיב הבית.
בנתיב `/predict`, מספר דברים קורים כשהטופס נשלח:
1. משתני הטופס נאספים ומומרים למערך numpy. הם נשלחים למודל ותחזית מוחזרת.
2. המדינות שאנחנו רוצים להציג מוצגות מחדש כטקסט קריא מקוד המדינה החזוי שלהן, והערך הזה נשלח חזרה ל-index.html כדי להיות מוצג בתבנית.
שימוש במודל בדרך זו, עם Flask ומודל משומר, הוא יחסית פשוט. הדבר הקשה ביותר הוא להבין באיזו צורה הנתונים צריכים להיות כדי להישלח למודל ולקבל תחזית. זה תלוי לחלוטין באיך המודל אומן. למודל הזה יש שלוש נקודות נתונים שצריך להזין כדי לקבל תחזית.
בסביבה מקצועית, תוכלו לראות עד כמה תקשורת טובה היא הכרחית בין האנשים שמאמנים את המודל לבין אלה שצורכים אותו באפליקציית אינטרנט או נייד. במקרה שלנו, זה רק אדם אחד, אתם!
---
## 🚀 אתגר
במקום לעבוד במחברת ולייבא את המודל לאפליקציית Flask, תוכלו לאמן את המודל ממש בתוך אפליקציית Flask! נסו להמיר את קוד ה-Python במחברת, אולי לאחר ניקוי הנתונים שלכם, כדי לאמן את המודל מתוך האפליקציה בנתיב שנקרא `train`. מה היתרונות והחסרונות של שיטה זו?
## [שאלון אחרי השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
ישנן דרכים רבות לבנות אפליקציית אינטרנט לצריכת מודלים של למידת מכונה. הכינו רשימה של הדרכים שבהן תוכלו להשתמש ב-JavaScript או Python כדי לבנות אפליקציית אינטרנט שתנצל למידת מכונה. שקלו ארכיטקטורה: האם המודל צריך להישאר באפליקציה או לחיות בענן? אם האפשרות השנייה, איך הייתם ניגשים אליו? ציירו מודל ארכיטקטוני לפתרון אינטרנטי של למידת מכונה.
## משימה
[נסו מודל אחר](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a8e8ae10be335cbc745b75ee552317ff",
"translation_date": "2025-09-05T19:46:55+00:00",
"source_file": "3-Web-App/1-Web-App/assignment.md",
"language_code": "he"
}
-->
# נסה מודל אחר
## הוראות
עכשיו, לאחר שבנית אפליקציית אינטרנט אחת באמצעות מודל רגרסיה מאומן, השתמש באחד מהמודלים משיעור הרגרסיה הקודם כדי לבנות מחדש את אפליקציית האינטרנט הזו. תוכל לשמור על הסגנון או לעצב אותה באופן שונה כך שתשקף את נתוני הדלעת. שים לב לשנות את הקלטים כך שיתאימו לשיטת האימון של המודל שלך.
## קריטריונים להערכה
| קריטריונים | מצטיין | מספק | דורש שיפור |
| ------------------------- | ------------------------------------------------------ | ------------------------------------------------------ | ----------------------------------- |
| | אפליקציית האינטרנט פועלת כמצופה ומותקנת בענן | אפליקציית האינטרנט מכילה פגמים או מציגה תוצאות בלתי צפויות | אפליקציית האינטרנט אינה פועלת כראוי |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,35 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9836ff53cfef716ddfd70e06c5f43436",
"translation_date": "2025-09-05T19:44:12+00:00",
"source_file": "3-Web-App/README.md",
"language_code": "he"
}
-->
# בנה אפליקציית ווב לשימוש במודל ML שלך
בחלק זה של הקורס, תיחשף לנושא יישומי בתחום למידת מכונה: כיצד לשמור את המודל שלך שנבנה ב-Scikit-learn כקובץ שניתן להשתמש בו כדי לבצע תחזיות בתוך אפליקציית ווב. לאחר שהמודל נשמר, תלמד כיצד להשתמש בו באפליקציית ווב שנבנתה ב-Flask. תחילה תיצור מודל באמצעות נתונים העוסקים בתצפיות על עב"מים! לאחר מכן, תבנה אפליקציית ווב שתאפשר לך להזין מספר שניות יחד עם ערכי קו רוחב וקו אורך כדי לחזות באיזו מדינה דווח על עב"ם.
![חניית עב"מים](../../../3-Web-App/images/ufo.jpg)
צילום על ידי <a href="https://unsplash.com/@mdherren?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Michael Herren</a> ב-<a href="https://unsplash.com/s/photos/ufo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## שיעורים
1. [בנה אפליקציית ווב](1-Web-App/README.md)
## קרדיטים
"בנה אפליקציית ווב" נכתב באהבה על ידי [Jen Looper](https://twitter.com/jenlooper).
♥️ החידונים נכתבו על ידי Rohan Raj.
המאגר נלקח מ-[Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings).
ארכיטקטורת אפליקציית הווב הוצעה בחלקה על ידי [המאמר הזה](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) ו-[הריפו הזה](https://github.com/abhinavsagar/machine-learning-deployment) מאת Abhinav Sagar.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. אנו לא נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,313 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "aaf391d922bd6de5efba871d514c6d47",
"translation_date": "2025-09-05T19:58:31+00:00",
"source_file": "4-Classification/1-Introduction/README.md",
"language_code": "he"
}
-->
# מבוא לסיווג
בארבעת השיעורים הללו, תחקור את אחד הנושאים המרכזיים בלמידת מכונה קלאסית - _סיווג_. נעבור יחד על שימוש באלגוריתמים שונים לסיווג עם מערך נתונים על כל המטבחים המדהימים של אסיה והודו. מקווים שאתה רעב!
![רק קורטוב!](../../../../4-Classification/1-Introduction/images/pinch.png)
> חוגגים את המטבחים הפאן-אסייתיים בשיעורים האלה! תמונה מאת [Jen Looper](https://twitter.com/jenlooper)
סיווג הוא סוג של [למידה מונחית](https://wikipedia.org/wiki/Supervised_learning) שיש לה הרבה מן המשותף עם טכניקות רגרסיה. אם למידת מכונה עוסקת בניבוי ערכים או שמות לדברים באמצעות מערכי נתונים, אז סיווג בדרך כלל מתחלק לשתי קבוצות: _סיווג בינארי_ ו_סיווג רב-קטגורי_.
[![מבוא לסיווג](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "מבוא לסיווג")
> 🎥 לחץ על התמונה למעלה לצפייה בסרטון: ג'ון גוטאג מ-MIT מציג את נושא הסיווג
זכור:
- **רגרסיה ליניארית** עזרה לך לנבא קשרים בין משתנים ולבצע תחזיות מדויקות על מיקום נקודת נתונים חדשה ביחס לקו. לדוגמה, יכולת לנבא _מה יהיה מחיר דלעת בספטמבר לעומת דצמבר_.
- **רגרסיה לוגיסטית** עזרה לך לגלות "קטגוריות בינאריות": בנקודת מחיר זו, _האם הדלעת כתומה או לא כתומה_?
סיווג משתמש באלגוריתמים שונים כדי לקבוע דרכים אחרות להגדיר את התווית או הקטגוריה של נקודת נתונים. בואו נעבוד עם נתוני המטבחים האלה כדי לראות האם, על ידי התבוננות בקבוצת מרכיבים, נוכל לקבוע את מקור המטבח.
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
> ### [השיעור הזה זמין ב-R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
### מבוא
סיווג הוא אחת הפעילויות המרכזיות של חוקרי למידת מכונה ומדעני נתונים. החל מסיווג בסיסי של ערך בינארי ("האם האימייל הזה הוא ספאם או לא?"), ועד לסיווג תמונות מורכב וחלוקה באמצעות ראייה ממוחשבת, תמיד מועיל להיות מסוגל למיין נתונים לקטגוריות ולשאול שאלות עליהם.
במונחים מדעיים יותר, שיטת הסיווג שלך יוצרת מודל חיזוי שמאפשר לך למפות את הקשר בין משתני קלט למשתני פלט.
![סיווג בינארי לעומת רב-קטגורי](../../../../4-Classification/1-Introduction/images/binary-multiclass.png)
> בעיות בינאריות לעומת רב-קטגוריות עבור אלגוריתמי סיווג. אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
לפני שנתחיל בתהליך ניקוי הנתונים, ויזואליזציה שלהם והכנתם למשימות למידת המכונה שלנו, בואו נלמד מעט על הדרכים השונות שבהן ניתן להשתמש בלמידת מכונה כדי לסווג נתונים.
בהשראת [סטטיסטיקה](https://wikipedia.org/wiki/Statistical_classification), סיווג באמצעות למידת מכונה קלאסית משתמש בתכונות כמו `smoker`, `weight`, ו-`age` כדי לקבוע _סבירות לפתח מחלה X_. כטכניקת למידה מונחית הדומה לתרגילי הרגרסיה שביצעתם קודם לכן, הנתונים שלכם מתויגים והאלגוריתמים של למידת המכונה משתמשים בתוויות אלו כדי לסווג ולחזות קטגוריות (או 'תכונות') של מערך נתונים ולהקצות אותם לקבוצה או לתוצאה.
✅ הקדש רגע לדמיין מערך נתונים על מטבחים. מה מודל רב-קטגורי יוכל לענות עליו? מה מודל בינארי יוכל לענות עליו? מה אם היית רוצה לקבוע האם מטבח מסוים נוטה להשתמש בחילבה? מה אם היית רוצה לראות אם, בהתחשב בשקית מצרכים מלאה בכוכב אניס, ארטישוק, כרובית וחזרת, תוכל ליצור מנה הודית טיפוסית?
[![סלים מסתוריים משוגעים](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "סלים מסתוריים משוגעים")
> 🎥 לחץ על התמונה למעלה לצפייה בסרטון. כל הרעיון של התוכנית 'Chopped' הוא 'סל מסתורין' שבו שפים צריכים להכין מנה מתוך בחירה אקראית של מרכיבים. בטוח שמודל למידת מכונה היה עוזר!
## שלום 'מסווג'
השאלה שאנחנו רוצים לשאול על מערך הנתונים של המטבחים היא למעשה שאלה **רב-קטגורית**, מכיוון שיש לנו כמה מטבחים לאומיים פוטנציאליים לעבוד איתם. בהתחשב בקבוצת מרכיבים, לאיזו מהקטגוריות הרבות הנתונים יתאימו?
Scikit-learn מציעה מספר אלגוריתמים שונים לשימוש בסיווג נתונים, בהתאם לסוג הבעיה שברצונך לפתור. בשני השיעורים הבאים תלמד על כמה מהאלגוריתמים הללו.
## תרגיל - ניקוי ואיזון הנתונים שלך
המשימה הראשונה, לפני תחילת הפרויקט, היא לנקות ול**אזן** את הנתונים שלך כדי לקבל תוצאות טובות יותר. התחל עם הקובץ הריק _notebook.ipynb_ בתיקיית השורש של תיקייה זו.
הדבר הראשון להתקין הוא [imblearn](https://imbalanced-learn.org/stable/). זהו חבילת Scikit-learn שתאפשר לך לאזן את הנתונים בצורה טובה יותר (תלמד יותר על משימה זו בעוד רגע).
1. כדי להתקין `imblearn`, הרץ `pip install`, כך:
```python
pip install imblearn
```
1. ייבא את החבילות שאתה צריך כדי לייבא את הנתונים שלך ולבצע ויזואליזציה, וגם ייבא `SMOTE` מ-`imblearn`.
```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE
```
עכשיו אתה מוכן לייבא את הנתונים.
1. המשימה הבאה תהיה לייבא את הנתונים:
```python
df = pd.read_csv('../data/cuisines.csv')
```
שימוש ב-`read_csv()` יקרא את תוכן קובץ ה-csv _cusines.csv_ וימקם אותו במשתנה `df`.
1. בדוק את צורת הנתונים:
```python
df.head()
```
חמש השורות הראשונות נראות כך:
```output
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
```
1. קבל מידע על הנתונים האלה על ידי קריאה ל-`info()`:
```python
df.info()
```
הפלט שלך נראה כך:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2448 entries, 0 to 2447
Columns: 385 entries, Unnamed: 0 to zucchini
dtypes: int64(384), object(1)
memory usage: 7.2+ MB
```
## תרגיל - ללמוד על מטבחים
עכשיו העבודה מתחילה להיות מעניינת יותר. בואו נגלה את התפלגות הנתונים, לפי מטבח.
1. הצג את הנתונים כעמודות על ידי קריאה ל-`barh()`:
```python
df.cuisine.value_counts().plot.barh()
```
![התפלגות נתוני מטבחים](../../../../4-Classification/1-Introduction/images/cuisine-dist.png)
יש מספר סופי של מטבחים, אבל התפלגות הנתונים אינה אחידה. אתה יכול לתקן את זה! לפני כן, חקור קצת יותר.
1. גלה כמה נתונים זמינים לכל מטבח והדפס אותם:
```python
thai_df = df[(df.cuisine == "thai")]
japanese_df = df[(df.cuisine == "japanese")]
chinese_df = df[(df.cuisine == "chinese")]
indian_df = df[(df.cuisine == "indian")]
korean_df = df[(df.cuisine == "korean")]
print(f'thai df: {thai_df.shape}')
print(f'japanese df: {japanese_df.shape}')
print(f'chinese df: {chinese_df.shape}')
print(f'indian df: {indian_df.shape}')
print(f'korean df: {korean_df.shape}')
```
הפלט נראה כך:
```output
thai df: (289, 385)
japanese df: (320, 385)
chinese df: (442, 385)
indian df: (598, 385)
korean df: (799, 385)
```
## גילוי מרכיבים
עכשיו אתה יכול להעמיק בנתונים וללמוד מהם המרכיבים הטיפוסיים לכל מטבח. כדאי לנקות נתונים חוזרים שיוצרים בלבול בין מטבחים, אז בואו נלמד על הבעיה הזו.
1. צור פונקציה `create_ingredient()` ב-Python כדי ליצור מסגרת נתונים של מרכיבים. פונקציה זו תתחיל בהשמטת עמודה לא מועילה ותמיין מרכיבים לפי הספירה שלהם:
```python
def create_ingredient_df(df):
ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
inplace=False)
return ingredient_df
```
עכשיו תוכל להשתמש בפונקציה הזו כדי לקבל מושג על עשרת המרכיבים הפופולריים ביותר לפי מטבח.
1. קרא ל-`create_ingredient()` והצג את הנתונים על ידי קריאה ל-`barh()`:
```python
thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()
```
![תאילנדי](../../../../4-Classification/1-Introduction/images/thai.png)
1. עשה את אותו הדבר עבור הנתונים היפניים:
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![יפני](../../../../4-Classification/1-Introduction/images/japanese.png)
1. עכשיו עבור המרכיבים הסיניים:
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![סיני](../../../../4-Classification/1-Introduction/images/chinese.png)
1. הצג את המרכיבים ההודיים:
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![הודי](../../../../4-Classification/1-Introduction/images/indian.png)
1. לבסוף, הצג את המרכיבים הקוריאניים:
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![קוריאני](../../../../4-Classification/1-Introduction/images/korean.png)
1. עכשיו, השמט את המרכיבים הנפוצים ביותר שיוצרים בלבול בין מטבחים שונים, על ידי קריאה ל-`drop()`:
כולם אוהבים אורז, שום וג'ינג'ר!
```python
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
labels_df = df.cuisine #.unique()
feature_df.head()
```
## איזון מערך הנתונים
עכשיו, לאחר שניקית את הנתונים, השתמש ב-[SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "טכניקת דגימה יתר סינתטית" - כדי לאזן אותם.
1. קרא ל-`fit_resample()`, אסטרטגיה זו יוצרת דגימות חדשות באמצעות אינטרפולציה.
```python
oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
```
על ידי איזון הנתונים שלך, תקבל תוצאות טובות יותר בעת סיווגם. חשב על סיווג בינארי. אם רוב הנתונים שלך הם מקטגוריה אחת, מודל למידת מכונה הולך לנבא את הקטגוריה הזו בתדירות גבוהה יותר, פשוט כי יש יותר נתונים עבורה. איזון הנתונים לוקח נתונים מוטים ועוזר להסיר את חוסר האיזון הזה.
1. עכשיו תוכל לבדוק את מספרי התוויות לפי מרכיב:
```python
print(f'new label count: {transformed_label_df.value_counts()}')
print(f'old label count: {df.cuisine.value_counts()}')
```
הפלט שלך נראה כך:
```output
new label count: korean 799
chinese 799
indian 799
japanese 799
thai 799
Name: cuisine, dtype: int64
old label count: korean 799
indian 598
chinese 442
japanese 320
thai 289
Name: cuisine, dtype: int64
```
הנתונים נקיים, מאוזנים, ומאוד טעימים!
1. השלב האחרון הוא לשמור את הנתונים המאוזנים שלך, כולל תוויות ותכונות, למסגרת נתונים חדשה שניתן לייצא לקובץ:
```python
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
```
1. תוכל להציץ שוב בנתונים באמצעות `transformed_df.head()` ו-`transformed_df.info()`. שמור עותק של הנתונים האלה לשימוש בשיעורים עתידיים:
```python
transformed_df.head()
transformed_df.info()
transformed_df.to_csv("../data/cleaned_cuisines.csv")
```
קובץ ה-CSV החדש הזה נמצא עכשיו בתיקיית הנתונים הראשית.
---
## 🚀אתגר
תוכנית הלימודים הזו מכילה כמה מערכי נתונים מעניינים. חפש בתיקיות `data` וראה אם יש מערכי נתונים שמתאימים לסיווג בינארי או רב-קטגורי? אילו שאלות היית שואל על מערך הנתונים הזה?
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
חקור את ה-API של SMOTE. לאילו מקרי שימוש הוא מתאים ביותר? אילו בעיות הוא פותר?
## משימה
[חקור שיטות סיווג](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b2a01912beb24cfb0007f83594dba801",
"translation_date": "2025-09-05T20:00:27+00:00",
"source_file": "4-Classification/1-Introduction/assignment.md",
"language_code": "he"
}
-->
# חקור שיטות סיווג
## הוראות
ב[תיעוד של Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html) תמצא רשימה גדולה של דרכים לסווג נתונים. ערוך חיפוש קצר בתיעוד הזה: המטרה שלך היא לחפש שיטות סיווג ולשייך אותן למערך נתונים בתוכנית הלימודים, שאלה שניתן לשאול לגביו, וטכניקת סיווג. צור גיליון אלקטרוני או טבלה בקובץ .doc והסבר כיצד מערך הנתונים יעבוד עם האלגוריתם של הסיווג.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| | מוצג מסמך שמסביר 5 אלגוריתמים לצד טכניקת סיווג. ההסבר מפורט וברור. | מוצג מסמך שמסביר 3 אלגוריתמים לצד טכניקת סיווג. ההסבר מפורט וברור. | מוצג מסמך שמסביר פחות משלושה אלגוריתמים לצד טכניקת סיווג, וההסבר אינו מפורט או ברור. |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T20:00:56+00:00",
"source_file": "4-Classification/1-Introduction/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,253 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1a6e9e46b34a2e559fbbfc1f95397c7b",
"translation_date": "2025-09-05T19:49:37+00:00",
"source_file": "4-Classification/2-Classifiers-1/README.md",
"language_code": "he"
}
-->
# מסווגי מטבחים 1
בשיעור הזה, תשתמשו במאגר הנתונים ששמרתם מהשיעור הקודם, שמלא בנתונים מאוזנים ונקיים על מטבחים.
תשתמשו במאגר הנתונים הזה עם מגוון מסווגים כדי _לחזות מטבח לאומי מסוים בהתבסס על קבוצת מרכיבים_. תוך כדי כך, תלמדו יותר על כמה מהדרכים שבהן ניתן להשתמש באלגוריתמים למשימות סיווג.
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
# הכנה
בהנחה שסיימתם את [שיעור 1](../1-Introduction/README.md), ודאו שקובץ _cleaned_cuisines.csv_ נמצא בתיקיית השורש `/data` עבור ארבעת השיעורים הללו.
## תרגיל - חיזוי מטבח לאומי
1. בעבודה בתיקיית _notebook.ipynb_ של השיעור הזה, ייבאו את הקובץ יחד עם ספריית Pandas:
```python
import pandas as pd
cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
cuisines_df.head()
```
הנתונים נראים כך:
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
1. עכשיו, ייבאו עוד כמה ספריות:
```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
from sklearn.svm import SVC
import numpy as np
```
1. חלקו את הקואורדינטות X ו-y לשני מסגרות נתונים עבור אימון. `cuisine` יכולה להיות מסגרת הנתונים של התוויות:
```python
cuisines_label_df = cuisines_df['cuisine']
cuisines_label_df.head()
```
זה ייראה כך:
```output
0 indian
1 indian
2 indian
3 indian
4 indian
Name: cuisine, dtype: object
```
1. הסירו את העמודה `Unnamed: 0` ואת העמודה `cuisine` באמצעות `drop()`. שמרו את שאר הנתונים כמאפיינים לאימון:
```python
cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
cuisines_feature_df.head()
```
המאפיינים שלכם ייראו כך:
| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
עכשיו אתם מוכנים לאמן את המודל שלכם!
## בחירת המסווג
עכשיו כשהנתונים שלכם נקיים ומוכנים לאימון, עליכם להחליט איזה אלגוריתם להשתמש בו למשימה.
Scikit-learn מקטלגת סיווג תחת למידה מונחית, ובקטגוריה הזו תמצאו דרכים רבות לסווג. [המגוון](https://scikit-learn.org/stable/supervised_learning.html) עשוי להיות מבלבל במבט ראשון. השיטות הבאות כולן כוללות טכניקות סיווג:
- מודלים ליניאריים
- מכונות וקטור תמיכה
- ירידה גרדיאנטית סטוכסטית
- שכנים קרובים
- תהליכים גאוסיאניים
- עצי החלטה
- שיטות אנסמבל (מסווג הצבעה)
- אלגוריתמים רב-מחלקתיים ורב-תוצאות (סיווג רב-מחלקתי ורב-תוויתי, סיווג רב-מחלקתי-רב-תוצאות)
> ניתן גם להשתמש [ברשתות נוירונים לסיווג נתונים](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), אבל זה מחוץ לתחום השיעור הזה.
### איזה מסווג לבחור?
אז, איזה מסווג כדאי לבחור? לעיתים, מעבר על כמה מהם וחיפוש אחר תוצאה טובה היא דרך לבדוק. Scikit-learn מציעה [השוואה צד-לצד](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) על מאגר נתונים שנוצר, המשווה בין KNeighbors, SVC בשתי דרכים, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB ו-QuadraticDiscrinationAnalysis, ומציגה את התוצאות בצורה חזותית:
![השוואת מסווגים](../../../../4-Classification/2-Classifiers-1/images/comparison.png)
> גרפים שנוצרו בתיעוד של Scikit-learn
> AutoML פותר את הבעיה הזו בצורה מסודרת על ידי הרצת ההשוואות הללו בענן, ומאפשר לכם לבחור את האלגוריתם הטוב ביותר עבור הנתונים שלכם. נסו זאת [כאן](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)
### גישה טובה יותר
גישה טובה יותר מאשר לנחש באופן אקראי היא לעקוב אחר הרעיונות בדף העזר להורדה [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). כאן, אנו מגלים שבשביל הבעיה הרב-מחלקתית שלנו, יש לנו כמה אפשרויות:
![דף עזר לבעיות רב-מחלקתיות](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png)
> חלק מדף העזר של Microsoft לאלגוריתמים, המתאר אפשרויות סיווג רב-מחלקתיות
✅ הורידו את דף העזר הזה, הדפיסו אותו ותלו אותו על הקיר שלכם!
### נימוקים
בואו נראה אם נוכל לנמק את דרכנו דרך גישות שונות בהתחשב במגבלות שיש לנו:
- **רשתות נוירונים כבדות מדי**. בהתחשב במאגר הנתונים הנקי אך המינימלי שלנו, ובעובדה שאנחנו מריצים את האימון באופן מקומי דרך מחברות, רשתות נוירונים כבדות מדי למשימה הזו.
- **אין מסווג דו-מחלקתי**. אנחנו לא משתמשים במסווג דו-מחלקתי, כך שזה שולל את האפשרות של one-vs-all.
- **עץ החלטה או רגרסיה לוגיסטית יכולים לעבוד**. עץ החלטה עשוי לעבוד, או רגרסיה לוגיסטית עבור נתונים רב-מחלקתיים.
- **עצים החלטה מחוזקים רב-מחלקתיים פותרים בעיה אחרת**. עץ החלטה מחוזק רב-מחלקתי מתאים ביותר למשימות לא פרמטריות, למשל משימות שנועדו לבנות דירוגים, ולכן הוא לא שימושי עבורנו.
### שימוש ב-Scikit-learn
נשתמש ב-Scikit-learn כדי לנתח את הנתונים שלנו. עם זאת, ישנן דרכים רבות להשתמש ברגרסיה לוגיסטית ב-Scikit-learn. הסתכלו על [הפרמטרים להעברה](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
בעיקרון, ישנם שני פרמטרים חשובים - `multi_class` ו-`solver` - שעלינו לציין, כאשר אנו מבקשים מ-Scikit-learn לבצע רגרסיה לוגיסטית. הערך של `multi_class` מיישם התנהגות מסוימת. הערך של `solver` הוא האלגוריתם לשימוש. לא כל הפותרים יכולים להיות משולבים עם כל ערכי `multi_class`.
לפי התיעוד, במקרה הרב-מחלקתי, אלגוריתם האימון:
- **משתמש בתוכנית one-vs-rest (OvR)**, אם אפשרות `multi_class` מוגדרת כ-`ovr`
- **משתמש באובדן קרוס-אנטרופי**, אם אפשרות `multi_class` מוגדרת כ-`multinomial`. (כרגע אפשרות `multinomial` נתמכת רק על ידי הפותרים lbfgs, sag, saga ו-newton-cg.)"
> 🎓 ה'תוכנית' כאן יכולה להיות 'ovr' (one-vs-rest) או 'multinomial'. מכיוון שרגרסיה לוגיסטית נועדה למעשה לתמוך בסיווג בינארי, תוכניות אלו מאפשרות לה להתמודד טוב יותר עם משימות סיווג רב-מחלקתיות. [מקור](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 ה'פותר' מוגדר כ"האלגוריתם לשימוש בבעיה האופטימיזציה". [מקור](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
Scikit-learn מציעה את הטבלה הזו כדי להסביר כיצד פותרים מתמודדים עם אתגרים שונים שמוצגים על ידי מבני נתונים שונים:
![פותרים](../../../../4-Classification/2-Classifiers-1/images/solvers.png)
## תרגיל - פיצול הנתונים
נוכל להתמקד ברגרסיה לוגיסטית לניסוי האימון הראשון שלנו מכיוון שלמדתם עליה לאחרונה בשיעור קודם.
פצלו את הנתונים שלכם לקבוצות אימון ובדיקה על ידי קריאה ל-`train_test_split()`:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## תרגיל - יישום רגרסיה לוגיסטית
מכיוון שאתם משתמשים במקרה הרב-מחלקתי, עליכם לבחור איזו וכנית_ להשתמש ואיזה ותר_ להגדיר. השתמשו ב-LogisticRegression עם הגדרה רב-מחלקתית והפותר **liblinear** לאימון.
1. צרו רגרסיה לוגיסטית עם multi_class מוגדר כ-`ovr` והפותר מוגדר כ-`liblinear`:
```python
lr = LogisticRegression(multi_class='ovr',solver='liblinear')
model = lr.fit(X_train, np.ravel(y_train))
accuracy = model.score(X_test, y_test)
print ("Accuracy is {}".format(accuracy))
```
✅ נסו פותר אחר כמו `lbfgs`, שלרוב מוגדר כברירת מחדל
> שים לב, השתמש בפונקציה [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) של Pandas כדי לשטח את הנתונים שלך בעת הצורך.
הדיוק טוב ביותר מ-**80%**!
1. ניתן לראות את המודל בפעולה על ידי בדיקת שורה אחת של נתונים (#50):
```python
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
print(f'cuisine: {y_test.iloc[50]}')
```
התוצאה מודפסת:
```output
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
cuisine: indian
```
✅ נסו מספר שורה שונה ובדקו את התוצאות
1. אם נעמיק, ניתן לבדוק את דיוק התחזית הזו:
```python
test= X_test.iloc[50].values.reshape(-1, 1).T
proba = model.predict_proba(test)
classes = model.classes_
resultdf = pd.DataFrame(data=proba, columns=classes)
topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
topPrediction.head()
```
התוצאה מודפסת - המטבח ההודי הוא הניחוש הטוב ביותר, עם הסתברות גבוהה:
| | 0 |
| -------: | -------: |
| indian | 0.715851 |
| chinese | 0.229475 |
| japanese | 0.029763 |
| korean | 0.017277 |
| thai | 0.007634 |
✅ האם תוכלו להסביר מדוע המודל די בטוח שזהו מטבח הודי?
1. קבלו פרטים נוספים על ידי הדפסת דוח סיווג, כפי שעשיתם בשיעורי הרגרסיה:
```python
y_pred = model.predict(X_test)
print(classification_report(y_test,y_pred))
```
| | precision | recall | f1-score | support |
| ------------ | --------- | ------ | -------- | ------- |
| chinese | 0.73 | 0.71 | 0.72 | 229 |
| indian | 0.91 | 0.93 | 0.92 | 254 |
| japanese | 0.70 | 0.75 | 0.72 | 220 |
| korean | 0.86 | 0.76 | 0.81 | 242 |
| thai | 0.79 | 0.85 | 0.82 | 254 |
| accuracy | 0.80 | 1199 | | |
| macro avg | 0.80 | 0.80 | 0.80 | 1199 |
| weighted avg | 0.80 | 0.80 | 0.80 | 1199 |
## 🚀אתגר
בשיעור זה השתמשתם בנתונים הנקיים שלכם כדי לבנות מודל למידת מכונה שיכול לחזות מטבח לאומי בהתבסס על סדרת מרכיבים. הקדישו זמן לקרוא על האפשרויות הרבות ש-Scikit-learn מציעה לסיווג נתונים. העמיקו במושג 'solver' כדי להבין מה מתרחש מאחורי הקלעים.
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
העמיקו מעט במתמטיקה שמאחורי רגרסיה לוגיסטית ב[שיעור הזה](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
## משימה
[לימדו על ה-solvers](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,24 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "de6025f96841498b0577e9d1aee18d1f",
"translation_date": "2025-09-05T19:52:34+00:00",
"source_file": "4-Classification/2-Classifiers-1/assignment.md",
"language_code": "he"
}
-->
# למד את הפותרים
## הוראות
בשיעור זה למדת על הפותרים השונים שמשלבים אלגוריתמים עם תהליך למידת מכונה כדי ליצור מודל מדויק. עבור על הפותרים שהוזכרו בשיעור ובחר שניים. במילים שלך, השווה והנגיד בין שני הפותרים הללו. איזה סוג של בעיה הם פותרים? כיצד הם עובדים עם מבני נתונים שונים? מדוע היית בוחר באחד על פני השני?
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | -------------------------------------------------------------------------------------------- | -------------------------------------------- | ---------------------- |
| | קובץ .doc מוצג עם שני פסקאות, אחת על כל פותר, המשוות ביניהם באופן מעמיק. | קובץ .doc מוצג עם פסקה אחת בלבד | המשימה אינה מלאה |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T19:53:03+00:00",
"source_file": "4-Classification/2-Classifiers-1/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,249 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "49047911108adc49d605cddfb455749c",
"translation_date": "2025-09-05T19:56:10+00:00",
"source_file": "4-Classification/3-Classifiers-2/README.md",
"language_code": "he"
}
-->
# מסווגי מטבחים 2
בשיעור הסיווג השני הזה, תחקור דרכים נוספות לסווג נתונים מספריים. בנוסף, תלמד על ההשלכות של בחירת מסווג אחד על פני אחר.
## [מבחן מקדים להרצאה](https://ff-quizzes.netlify.app/en/ml/)
### דרישות מוקדמות
אנו מניחים שסיימת את השיעורים הקודמים ויש לך מערך נתונים מנוקה בתיקיית `data` בשם _cleaned_cuisines.csv_ שנמצא בשורש תיקיית ארבעת השיעורים.
### הכנה
טענו את קובץ _notebook.ipynb_ שלך עם מערך הנתונים המנוקה וחילקנו אותו למסגרות נתונים X ו-y, מוכנות לתהליך בניית המודל.
## מפת סיווג
בשיעור הקודם, למדת על האפשרויות השונות שיש לך בעת סיווג נתונים באמצעות דף העזר של Microsoft. Scikit-learn מציעה דף עזר דומה אך מפורט יותר שיכול לעזור לצמצם את הבחירה במעריכים (מונח נוסף למסווגים):
![מפת ML מ-Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png)
> טיפ: [בקר במפה הזו אונליין](https://scikit-learn.org/stable/tutorial/machine_learning_map/) ולחץ לאורך המסלול כדי לקרוא את התיעוד.
### התוכנית
המפה הזו מאוד מועילה ברגע שיש לך הבנה ברורה של הנתונים שלך, שכן ניתן 'ללכת' לאורך המסלולים שלה כדי להגיע להחלטה:
- יש לנו >50 דגימות
- אנחנו רוצים לחזות קטגוריה
- יש לנו נתונים מתויגים
- יש לנו פחות מ-100K דגימות
- ✨ אנחנו יכולים לבחור ב-Linear SVC
- אם זה לא עובד, מכיוון שיש לנו נתונים מספריים
- אנחנו יכולים לנסות ✨ KNeighbors Classifier
- אם זה לא עובד, לנסות ✨ SVC ו-✨ Ensemble Classifiers
זהו מסלול מאוד מועיל לעקוב אחריו.
## תרגיל - חלוקת הנתונים
בהתאם למסלול הזה, כדאי להתחיל בייבוא כמה ספריות לשימוש.
1. ייבא את הספריות הנדרשות:
```python
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
import numpy as np
```
1. חלק את נתוני האימון והבדיקה שלך:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## מסווג Linear SVC
סיווג באמצעות Support-Vector (SVC) הוא חלק ממשפחת טכניקות ה-ML של Support-Vector Machines (למידע נוסף על אלו למטה). בשיטה זו, ניתן לבחור 'גרעין' כדי להחליט כיצד לקבץ את התוויות. הפרמטר 'C' מתייחס ל'רגולריזציה' שמווסתת את השפעת הפרמטרים. הגרעין יכול להיות אחד מ-[כמה](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); כאן אנו מגדירים אותו כ'לינארי' כדי להבטיח שנשתמש ב-Linear SVC. ברירת המחדל של הסתברות היא 'false'; כאן אנו מגדירים אותה כ'true' כדי לקבל הערכות הסתברות. אנו מגדירים את מצב האקראיות כ-'0' כדי לערבב את הנתונים ולקבל הסתברויות.
### תרגיל - יישום Linear SVC
התחל ביצירת מערך מסווגים. תוסיף בהדרגה למערך הזה ככל שנבדוק.
1. התחל עם Linear SVC:
```python
C = 10
# Create different classifiers.
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
}
```
2. אמן את המודל שלך באמצעות Linear SVC והדפס דוח:
```python
n_classifiers = len(classifiers)
for index, (name, classifier) in enumerate(classifiers.items()):
classifier.fit(X_train, np.ravel(y_train))
y_pred = classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
print(classification_report(y_test,y_pred))
```
התוצאה די טובה:
```output
Accuracy (train) for Linear SVC: 78.6%
precision recall f1-score support
chinese 0.71 0.67 0.69 242
indian 0.88 0.86 0.87 234
japanese 0.79 0.74 0.76 254
korean 0.85 0.81 0.83 242
thai 0.71 0.86 0.78 227
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.79 0.79 0.79 1199
```
## מסווג K-Neighbors
K-Neighbors הוא חלק ממשפחת שיטות ה-ML של "שכנים", שניתן להשתמש בהן ללמידה מונחית ולא מונחית. בשיטה זו, נוצר מספר מוגדר מראש של נקודות, והנתונים נאספים סביב נקודות אלו כך שניתן לחזות תוויות כלליות עבור הנתונים.
### תרגיל - יישום מסווג K-Neighbors
המסווג הקודם היה טוב ועבד היטב עם הנתונים, אבל אולי נוכל להשיג דיוק טוב יותר. נסה מסווג K-Neighbors.
1. הוסף שורה למערך המסווגים שלך (הוסף פסיק אחרי הפריט של Linear SVC):
```python
'KNN classifier': KNeighborsClassifier(C),
```
התוצאה קצת פחות טובה:
```output
Accuracy (train) for KNN classifier: 73.8%
precision recall f1-score support
chinese 0.64 0.67 0.66 242
indian 0.86 0.78 0.82 234
japanese 0.66 0.83 0.74 254
korean 0.94 0.58 0.72 242
thai 0.71 0.82 0.76 227
accuracy 0.74 1199
macro avg 0.76 0.74 0.74 1199
weighted avg 0.76 0.74 0.74 1199
```
✅ למד על [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors)
## מסווג Support Vector
מסווגי Support-Vector הם חלק ממשפחת [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) של שיטות ML המשמשות למשימות סיווג ורגרסיה. SVMs "ממפים דוגמאות אימון לנקודות במרחב" כדי למקסם את המרחק בין שתי קטגוריות. נתונים עוקבים ממופים למרחב הזה כך שניתן לחזות את הקטגוריה שלהם.
### תרגיל - יישום מסווג Support Vector
בואו ננסה להשיג דיוק קצת יותר טוב עם מסווג Support Vector.
1. הוסף פסיק אחרי הפריט של K-Neighbors, ואז הוסף את השורה הזו:
```python
'SVC': SVC(),
```
התוצאה די טובה!
```output
Accuracy (train) for SVC: 83.2%
precision recall f1-score support
chinese 0.79 0.74 0.76 242
indian 0.88 0.90 0.89 234
japanese 0.87 0.81 0.84 254
korean 0.91 0.82 0.86 242
thai 0.74 0.90 0.81 227
accuracy 0.83 1199
macro avg 0.84 0.83 0.83 1199
weighted avg 0.84 0.83 0.83 1199
```
✅ למד על [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm)
## מסווגי Ensemble
בואו נעקוב אחרי המסלול עד הסוף, למרות שהבדיקה הקודמת הייתה די טובה. ננסה כמה מסווגי 'Ensemble', במיוחד Random Forest ו-AdaBoost:
```python
'RFST': RandomForestClassifier(n_estimators=100),
'ADA': AdaBoostClassifier(n_estimators=100)
```
התוצאה מאוד טובה, במיוחד עבור Random Forest:
```output
Accuracy (train) for RFST: 84.5%
precision recall f1-score support
chinese 0.80 0.77 0.78 242
indian 0.89 0.92 0.90 234
japanese 0.86 0.84 0.85 254
korean 0.88 0.83 0.85 242
thai 0.80 0.87 0.83 227
accuracy 0.84 1199
macro avg 0.85 0.85 0.84 1199
weighted avg 0.85 0.84 0.84 1199
Accuracy (train) for ADA: 72.4%
precision recall f1-score support
chinese 0.64 0.49 0.56 242
indian 0.91 0.83 0.87 234
japanese 0.68 0.69 0.69 254
korean 0.73 0.79 0.76 242
thai 0.67 0.83 0.74 227
accuracy 0.72 1199
macro avg 0.73 0.73 0.72 1199
weighted avg 0.73 0.72 0.72 1199
```
✅ למד על [מסווגי Ensemble](https://scikit-learn.org/stable/modules/ensemble.html)
שיטה זו של למידת מכונה "משלבת את התחזיות של כמה מעריכים בסיסיים" כדי לשפר את איכות המודל. בדוגמה שלנו, השתמשנו ב-Random Trees ו-AdaBoost.
- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), שיטה ממוצעת, בונה 'יער' של 'עצים החלטה' עם אקראיות כדי להימנע מהתאמת יתר. הפרמטר n_estimators מוגדר למספר העצים.
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) מתאים מסווג למערך נתונים ואז מתאים עותקים של אותו מסווג לאותו מערך נתונים. הוא מתמקד במשקל של פריטים שסווגו באופן שגוי ומכוונן את ההתאמה למסווג הבא כדי לתקן.
---
## 🚀אתגר
לכל אחת מהטכניקות הללו יש מספר רב של פרמטרים שניתן לכוונן. חקור את פרמטרי ברירת המחדל של כל אחת מהן וחשוב על מה משמעות כוונון הפרמטרים הללו עבור איכות המודל.
## [מבחן לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
יש הרבה מונחים מקצועיים בשיעורים האלה, אז קח רגע לעיין [ברשימה הזו](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) של מונחים שימושיים!
## משימה
[משחק פרמטרים](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "58dfdaf79fb73f7d34b22bdbacf57329",
"translation_date": "2025-09-05T19:57:28+00:00",
"source_file": "4-Classification/3-Classifiers-2/assignment.md",
"language_code": "he"
}
-->
# משחק עם פרמטרים
## הוראות
ישנם הרבה פרמטרים שמוגדרים כברירת מחדל כאשר עובדים עם מסווגים אלו. Intellisense ב-VS Code יכול לעזור לכם לחקור אותם. בחרו אחת מטכניקות הסיווג של למידת מכונה בשיעור זה ואמנו מחדש מודלים תוך שינוי ערכי פרמטרים שונים. צרו מחברת שמסבירה מדוע שינויים מסוימים משפרים את איכות המודל בעוד שאחרים פוגעים בה. היו מפורטים בתשובתכם.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ---------------------------- |
| | מוצגת מחברת עם מסווג שבנוי במלואו, פרמטרים שונו והסברים ניתנו בתיבות טקסט | מוצגת מחברת חלקית או עם הסברים לקויים | מחברת עם באגים או פגמים |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T19:57:54+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,329 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "61bdec27ed2da8b098cd9065405d9bb0",
"translation_date": "2025-09-05T19:53:40+00:00",
"source_file": "4-Classification/4-Applied/README.md",
"language_code": "he"
}
-->
# בניית אפליקציית המלצות למטבח
בשיעור זה תבנו מודל סיווג באמצעות כמה מהטכניקות שלמדתם בשיעורים קודמים, ותשתמשו במאגר הנתונים הטעים של מטבחים שהשתמשנו בו לאורך הסדרה. בנוסף, תבנו אפליקציית אינטרנט קטנה שתשתמש במודל שמור, תוך שימוש ב-Onnx Web Runtime.
אחת השימושים הפרקטיים המועילים ביותר של למידת מכונה היא בניית מערכות המלצה, ואתם יכולים לעשות את הצעד הראשון בכיוון הזה כבר היום!
[![מצגת על אפליקציית האינטרנט הזו](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: ג'ן לופר בונה אפליקציית אינטרנט באמצעות נתוני מטבחים מסווגים
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
בשיעור זה תלמדו:
- כיצד לבנות מודל ולשמור אותו כמודל Onnx
- כיצד להשתמש ב-Netron כדי לבדוק את המודל
- כיצד להשתמש במודל שלכם באפליקציית אינטרנט לצורך הסקה
## בניית המודל שלכם
בניית מערכות למידת מכונה יישומיות היא חלק חשוב בשימוש בטכנולוגיות אלו עבור מערכות עסקיות. ניתן להשתמש במודלים בתוך אפליקציות אינטרנט (וכך גם להשתמש בהם במצב לא מקוון אם יש צורך) באמצעות Onnx.
בשיעור [קודם](../../3-Web-App/1-Web-App/README.md), בניתם מודל רגרסיה על תצפיות עב"מים, "כבשתם" אותו, והשתמשתם בו באפליקציית Flask. בעוד שהארכיטקטורה הזו מאוד שימושית, היא אפליקציית Python מלאה, וייתכן שהדרישות שלכם כוללות שימוש באפליקציית JavaScript.
בשיעור זה, תוכלו לבנות מערכת בסיסית מבוססת JavaScript לצורך הסקה. אך קודם לכן, עליכם לאמן מודל ולהמיר אותו לשימוש עם Onnx.
## תרגיל - אימון מודל סיווג
ראשית, אימנו מודל סיווג באמצעות מאגר הנתונים הנקי של מטבחים שהשתמשנו בו.
1. התחילו בייבוא ספריות שימושיות:
```python
!pip install skl2onnx
import pandas as pd
```
תזדקקו ל-[skl2onnx](https://onnx.ai/sklearn-onnx/) כדי לעזור להמיר את מודל Scikit-learn שלכם לפורמט Onnx.
1. לאחר מכן, עבדו עם הנתונים שלכם באותו אופן שעשיתם בשיעורים קודמים, על ידי קריאת קובץ CSV באמצעות `read_csv()`:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. הסירו את שני העמודות הראשונות שאינן נחוצות ושמרו את הנתונים הנותרים כ-'X':
```python
X = data.iloc[:,2:]
X.head()
```
1. שמרו את התוויות כ-'y':
```python
y = data[['cuisine']]
y.head()
```
### התחלת שגרת האימון
נשתמש בספריית 'SVC' שמספקת דיוק טוב.
1. ייבאו את הספריות המתאימות מ-Scikit-learn:
```python
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report
```
1. הפרידו בין קבוצות האימון והבדיקה:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. בנו מודל סיווג SVC כפי שעשיתם בשיעור הקודם:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
model.fit(X_train,y_train.values.ravel())
```
1. כעת, בדקו את המודל שלכם על ידי קריאה ל-`predict()`:
```python
y_pred = model.predict(X_test)
```
1. הדפיסו דוח סיווג כדי לבדוק את איכות המודל:
```python
print(classification_report(y_test,y_pred))
```
כפי שראינו קודם, הדיוק טוב:
```output
precision recall f1-score support
chinese 0.72 0.69 0.70 257
indian 0.91 0.87 0.89 243
japanese 0.79 0.77 0.78 239
korean 0.83 0.79 0.81 236
thai 0.72 0.84 0.78 224
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.79 0.79 0.79 1199
```
### המרת המודל שלכם ל-Onnx
וודאו שההמרה מתבצעת עם מספר הטנזור המתאים. מאגר הנתונים הזה כולל 380 מרכיבים, ולכן עליכם לציין את המספר הזה ב-`FloatTensorType`:
1. המירו באמצעות מספר טנזור של 380.
```python
from skl2onnx import convert_sklearn
from skl2onnx.common.data_types import FloatTensorType
initial_type = [('float_input', FloatTensorType([None, 380]))]
options = {id(model): {'nocl': True, 'zipmap': False}}
```
1. צרו את הקובץ onx ושמרו אותו כקובץ **model.onnx**:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
with open("./model.onnx", "wb") as f:
f.write(onx.SerializeToString())
```
> שימו לב, ניתן להעביר [אפשרויות](https://onnx.ai/sklearn-onnx/parameterized.html) בתסריט ההמרה שלכם. במקרה זה, העברנו 'nocl' כ-True ו-'zipmap' כ-False. מכיוון שמדובר במודל סיווג, יש לכם אפשרות להסיר את ZipMap שמייצר רשימת מילונים (לא נחוץ). `nocl` מתייחס למידע על מחלקות שנכלל במודל. ניתן להקטין את גודל המודל שלכם על ידי הגדרת `nocl` כ-'True'.
הרצת המחברת כולה תבנה כעת מודל Onnx ותשמור אותו בתיקייה זו.
## צפייה במודל שלכם
מודלים של Onnx אינם נראים היטב ב-Visual Studio Code, אך יש תוכנה חינמית טובה מאוד שרבים מהחוקרים משתמשים בה כדי להציג את המודל ולוודא שהוא נבנה כראוי. הורידו את [Netron](https://github.com/lutzroeder/Netron) ופתחו את קובץ model.onnx שלכם. תוכלו לראות את המודל הפשוט שלכם מוצג, עם 380 הקלטים והמסווג המופיעים:
![תצוגת Netron](../../../../4-Classification/4-Applied/images/netron.png)
Netron הוא כלי מועיל לצפייה במודלים שלכם.
כעת אתם מוכנים להשתמש במודל המגניב הזה באפליקציית אינטרנט. בואו נבנה אפליקציה שתהיה שימושית כאשר תביטו במקרר שלכם ותנסו להבין אילו שילובי מרכיבים שנותרו לכם יכולים לשמש להכנת מטבח מסוים, כפי שנקבע על ידי המודל שלכם.
## בניית אפליקציית אינטרנט להמלצות
ניתן להשתמש במודל שלכם ישירות באפליקציית אינטרנט. ארכיטקטורה זו גם מאפשרת לכם להריץ אותה באופן מקומי ואפילו לא מקוון אם יש צורך. התחילו ביצירת קובץ `index.html` באותה תיקייה שבה שמרתם את קובץ `model.onnx`.
1. בקובץ זה _index.html_, הוסיפו את הסימון הבא:
```html
<!DOCTYPE html>
<html>
<header>
<title>Cuisine Matcher</title>
</header>
<body>
...
</body>
</html>
```
1. כעת, בתוך תגי `body`, הוסיפו מעט סימון כדי להציג רשימת תיבות סימון המשקפות כמה מרכיבים:
```html
<h1>Check your refrigerator. What can you create?</h1>
<div id="wrapper">
<div class="boxCont">
<input type="checkbox" value="4" class="checkbox">
<label>apple</label>
</div>
<div class="boxCont">
<input type="checkbox" value="247" class="checkbox">
<label>pear</label>
</div>
<div class="boxCont">
<input type="checkbox" value="77" class="checkbox">
<label>cherry</label>
</div>
<div class="boxCont">
<input type="checkbox" value="126" class="checkbox">
<label>fenugreek</label>
</div>
<div class="boxCont">
<input type="checkbox" value="302" class="checkbox">
<label>sake</label>
</div>
<div class="boxCont">
<input type="checkbox" value="327" class="checkbox">
<label>soy sauce</label>
</div>
<div class="boxCont">
<input type="checkbox" value="112" class="checkbox">
<label>cumin</label>
</div>
</div>
<div style="padding-top:10px">
<button onClick="startInference()">What kind of cuisine can you make?</button>
</div>
```
שימו לב שכל תיבת סימון מקבלת ערך. ערך זה משקף את האינדקס שבו המרכיב נמצא לפי מאגר הנתונים. תפוח, למשל, ברשימה האלפביתית הזו, תופס את העמודה החמישית, ולכן הערך שלו הוא '4' מכיוון שאנחנו מתחילים לספור מ-0. תוכלו להתייעץ עם [גיליון המרכיבים](../../../../4-Classification/data/ingredient_indexes.csv) כדי לגלות את האינדקס של מרכיב מסוים.
המשיכו לעבוד בקובץ index.html, והוסיפו בלוק סקריפט שבו המודל נקרא לאחר סגירת `</div>` הסופית.
1. ראשית, ייבאו את [Onnx Runtime](https://www.onnxruntime.ai/):
```html
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script>
```
> Onnx Runtime משמש כדי לאפשר הרצת מודלים של Onnx על פני מגוון רחב של פלטפורמות חומרה, כולל אופטימיזציות ו-API לשימוש.
1. לאחר שה-runtime במקום, תוכלו לקרוא לו:
```html
<script>
const ingredients = Array(380).fill(0);
const checks = [...document.querySelectorAll('.checkbox')];
checks.forEach(check => {
check.addEventListener('change', function() {
// toggle the state of the ingredient
// based on the checkbox's value (1 or 0)
ingredients[check.value] = check.checked ? 1 : 0;
});
});
function testCheckboxes() {
// validate if at least one checkbox is checked
return checks.some(check => check.checked);
}
async function startInference() {
let atLeastOneChecked = testCheckboxes()
if (!atLeastOneChecked) {
alert('Please select at least one ingredient.');
return;
}
try {
// create a new session and load the model.
const session = await ort.InferenceSession.create('./model.onnx');
const input = new ort.Tensor(new Float32Array(ingredients), [1, 380]);
const feeds = { float_input: input };
// feed inputs and run
const results = await session.run(feeds);
// read from results
alert('You can enjoy ' + results.label.data[0] + ' cuisine today!')
} catch (e) {
console.log(`failed to inference ONNX model`);
console.error(e);
}
}
</script>
```
בקוד זה, מתרחשים כמה דברים:
1. יצרתם מערך של 380 ערכים אפשריים (1 או 0) שיוגדרו וישלחו למודל לצורך הסקה, בהתאם לשאלה האם תיבת סימון מסומנת.
2. יצרתם מערך של תיבות סימון ודרך לקבוע האם הן סומנו בפונקציית `init` שנקראת כאשר האפליקציה מתחילה. כאשר תיבת סימון מסומנת, מערך `ingredients` משתנה כדי לשקף את המרכיב שנבחר.
3. יצרתם פונקציית `testCheckboxes` שבודקת האם תיבת סימון כלשהי סומנה.
4. אתם משתמשים בפונקציית `startInference` כאשר הכפתור נלחץ, ואם תיבת סימון כלשהי סומנה, אתם מתחילים הסקה.
5. שגרת ההסקה כוללת:
1. הגדרת טעינה אסינכרונית של המודל
2. יצירת מבנה טנזור לשליחה למודל
3. יצירת 'feeds' שמשקפים את הקלט `float_input` שיצרתם כאשר אימנתם את המודל שלכם (ניתן להשתמש ב-Netron כדי לאמת את השם)
4. שליחת 'feeds' אלו למודל והמתנה לתגובה
## בדיקת האפליקציה שלכם
פתחו סשן טרמינל ב-Visual Studio Code בתיקייה שבה נמצא קובץ index.html שלכם. ודאו שיש לכם [http-server](https://www.npmjs.com/package/http-server) מותקן גלובלית, והקלידו `http-server` בשורת הפקודה. localhost אמור להיפתח ותוכלו לצפות באפליקציית האינטרנט שלכם. בדקו איזה מטבח מומלץ בהתבסס על מרכיבים שונים:
![אפליקציית אינטרנט למרכיבים](../../../../4-Classification/4-Applied/images/web-app.png)
מזל טוב, יצרתם אפליקציית אינטרנט להמלצות עם כמה שדות. הקדישו זמן לבניית המערכת הזו!
## 🚀אתגר
אפליקציית האינטרנט שלכם מאוד מינימלית, אז המשיכו לבנות אותה באמצעות מרכיבים והאינדקסים שלהם מתוך נתוני [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv). אילו שילובי טעמים עובדים כדי ליצור מנה לאומית מסוימת?
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
בעוד שהשיעור הזה רק נגע בשימושיות של יצירת מערכת המלצות למרכיבי מזון, תחום יישומי למידת מכונה זה עשיר בדוגמאות. קראו עוד על איך מערכות אלו נבנות:
- https://www.sciencedirect.com/topics/computer-science/recommendation-engine
- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/
- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/
## משימה
[בנו מערכת המלצות חדשה](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "799ed651e2af0a7cad17c6268db11578",
"translation_date": "2025-09-05T19:55:28+00:00",
"source_file": "4-Classification/4-Applied/assignment.md",
"language_code": "he"
}
-->
# בנה מערכת המלצות
## הוראות
בהתבסס על התרגילים שלך בשיעור הזה, אתה כבר יודע איך לבנות אפליקציית ווב מבוססת JavaScript באמצעות Onnx Runtime ומודל Onnx שהומר. נסה לבנות מערכת המלצות חדשה תוך שימוש בנתונים מהשיעורים האלה או ממקורות אחרים (נא לתת קרדיט). לדוגמה, תוכל ליצור מערכת המלצות לחיות מחמד בהתבסס על תכונות אישיות שונות, או מערכת המלצות לז'אנרים מוזיקליים בהתאם למצב הרוח של האדם. תהיה יצירתי!
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | -------------------------------------------------------------------- | ----------------------------------- | ------------------------------- |
| | מוצגת אפליקציית ווב ומחברת, שתיהן מתועדות היטב ופועלות | אחת מהשתיים חסרה או פגומה | שתיהן חסרות או פגומות |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לכל אי הבנות או פרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,41 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "74e809ffd1e613a1058bbc3e9600859e",
"translation_date": "2025-09-05T19:48:23+00:00",
"source_file": "4-Classification/README.md",
"language_code": "he"
}
-->
# התחלת עבודה עם סיווג
## נושא אזורי: מטבחים אסייתיים והודיים טעימים 🍜
באסיה ובהודו, מסורות האוכל מגוונות מאוד וטעימות במיוחד! בואו נבחן נתונים על מטבחים אזוריים כדי לנסות להבין את המרכיבים שלהם.
![מוכר אוכל תאילנדי](../../../4-Classification/images/thai-food.jpg)
> צילום על ידי <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Lisheng Chang</a> ב-<a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## מה תלמדו
בפרק זה, תבנו על בסיס הלימוד הקודם שלכם בנושא רגרסיה ותלמדו על מסווגים נוספים שתוכלו להשתמש בהם כדי להבין טוב יותר את הנתונים.
> ישנם כלים שימושיים עם מעט קוד שיכולים לעזור לכם ללמוד על עבודה עם מודלים של סיווג. נסו [Azure ML למשימה זו](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## שיעורים
1. [מבוא לסיווג](1-Introduction/README.md)
2. [מסווגים נוספים](2-Classifiers-1/README.md)
3. [עוד מסווגים](3-Classifiers-2/README.md)
4. [למידת מכונה יישומית: בניית אפליקציית ווב](4-Applied/README.md)
## קרדיטים
"התחלת עבודה עם סיווג" נכתב באהבה ♥️ על ידי [Cassie Breviu](https://www.twitter.com/cassiebreviu) ו-[Jen Looper](https://www.twitter.com/jenlooper)
מאגר הנתונים של המטבחים הטעימים נלקח מ-[Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines).
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,347 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "730225ea274c9174fe688b21d421539d",
"translation_date": "2025-09-05T19:11:55+00:00",
"source_file": "5-Clustering/1-Visualize/README.md",
"language_code": "he"
}
-->
# מבוא לקיבוץ
קיבוץ הוא סוג של [למידה ללא פיקוח](https://wikipedia.org/wiki/Unsupervised_learning) שמניח כי מערך הנתונים אינו מתויג או שהקלטים שלו אינם מותאמים לפלטים מוגדרים מראש. הוא משתמש באלגוריתמים שונים כדי למיין נתונים לא מתויגים ולספק קבוצות בהתאם לדפוסים שהוא מזהה בנתונים.
[![No One Like You by PSquare](https://img.youtube.com/vi/ty2advRiWJM/0.jpg)](https://youtu.be/ty2advRiWJM "No One Like You by PSquare")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון. בזמן שאתם לומדים על למידת מכונה עם קיבוץ, תהנו ממוזיקת דאנס הול ניגרית - זהו שיר מדורג מאוד משנת 2014 של PSquare.
## [שאלון לפני ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
### מבוא
[קיבוץ](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124) הוא כלי שימושי מאוד לחקר נתונים. בואו נראה אם הוא יכול לעזור לגלות מגמות ודפוסים באופן שבו קהל ניגרי צורך מוזיקה.
✅ הקדישו רגע לחשוב על השימושים בקיבוץ. בחיים האמיתיים, קיבוץ מתרחש בכל פעם שיש לכם ערימת כביסה ואתם צריכים למיין את הבגדים של בני המשפחה 🧦👕👖🩲. במדעי הנתונים, קיבוץ מתרחש כשמנסים לנתח את העדפות המשתמש או לקבוע את המאפיינים של כל מערך נתונים לא מתויג. קיבוץ, במובן מסוים, עוזר לעשות סדר בכאוס, כמו מגירת גרביים.
[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: ג'ון גוטאג מ-MIT מציג את נושא הקיבוץ
בסביבה מקצועית, קיבוץ יכול לשמש לקביעת דברים כמו פילוח שוק, למשל, לקבוע אילו קבוצות גיל קונות אילו פריטים. שימוש נוסף יכול להיות זיהוי חריגות, אולי כדי לזהות הונאה מתוך מערך נתונים של עסקאות בכרטיסי אשראי. או שתוכלו להשתמש בקיבוץ כדי לזהות גידולים בסריקות רפואיות.
✅ הקדישו רגע לחשוב כיצד נתקלתם בקיבוץ 'בעולם האמיתי', בסביבה בנקאית, מסחר אלקטרוני או עסקית.
> 🎓 מעניין, ניתוח קיבוץ מקורו בתחומי האנתרופולוגיה והפסיכולוגיה בשנות ה-30. האם אתם יכולים לדמיין כיצד הוא שימש אז?
לחילופין, תוכלו להשתמש בו לקיבוץ תוצאות חיפוש - לפי קישורי קניות, תמונות או ביקורות, למשל. קיבוץ שימושי כשיש לכם מערך נתונים גדול שברצונכם לצמצם ועליו לבצע ניתוח מעמיק יותר, כך שהטכניקה יכולה לשמש ללמידה על נתונים לפני בניית מודלים אחרים.
✅ לאחר שמערך הנתונים שלכם מאורגן בקבוצות, אתם מקצים לו מזהה קבוצה, וטכניקה זו יכולה להיות שימושית לשמירה על פרטיות מערך הנתונים; תוכלו להתייחס לנקודת נתונים לפי מזהה הקבוצה שלה, במקום לפי נתונים מזהים יותר. האם אתם יכולים לחשוב על סיבות נוספות מדוע תעדיפו להתייחס למזהה קבוצה במקום לאלמנטים אחרים של הקבוצה כדי לזהות אותה?
העמיקו את הבנתכם בטכניקות קיבוץ במודול [לימוד זה](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott)
## התחלת עבודה עם קיבוץ
[Scikit-learn מציעה מגוון רחב](https://scikit-learn.org/stable/modules/clustering.html) של שיטות לביצוע קיבוץ. הסוג שתבחרו תלוי במקרה השימוש שלכם. לפי התיעוד, לכל שיטה יש יתרונות שונים. הנה טבלה פשוטה של השיטות הנתמכות על ידי Scikit-learn ומקרי השימוש המתאימים להן:
| שם השיטה | מקרה שימוש |
| :------------------------ | :--------------------------------------------------------------------- |
| K-Means | שימוש כללי, אינדוקטיבי |
| Affinity propagation | קבוצות רבות ולא אחידות, אינדוקטיבי |
| Mean-shift | קבוצות רבות ולא אחידות, אינדוקטיבי |
| Spectral clustering | קבוצות מעטות ואחידות, טרנסדוקטיבי |
| Ward hierarchical clustering | קבוצות רבות ומוגבלות, טרנסדוקטיבי |
| Agglomerative clustering | קבוצות רבות ומוגבלות, מרחקים לא אוקלידיים, טרנסדוקטיבי |
| DBSCAN | גיאומטריה לא שטוחה, קבוצות לא אחידות, טרנסדוקטיבי |
| OPTICS | גיאומטריה לא שטוחה, קבוצות לא אחידות עם צפיפות משתנה, טרנסדוקטיבי |
| Gaussian mixtures | גיאומטריה שטוחה, אינדוקטיבי |
| BIRCH | מערך נתונים גדול עם חריגות, אינדוקטיבי |
> 🎓 איך אנחנו יוצרים קבוצות קשור מאוד לאופן שבו אנחנו אוספים את נקודות הנתונים לקבוצות. בואו נפרק קצת את המונחים:
>
> 🎓 ['טרנסדוקטיבי' מול 'אינדוקטיבי'](https://wikipedia.org/wiki/Transduction_(machine_learning))
>
> הסקה טרנסדוקטיבית נגזרת ממקרים שנצפו באימון שממופים למקרים ספציפיים בבדיקה. הסקה אינדוקטיבית נגזרת ממקרים באימון שממופים לכללים כלליים שמיושמים רק לאחר מכן על מקרים בבדיקה.
>
> דוגמה: דמיינו שיש לכם מערך נתונים שמסומן רק באופן חלקי. חלק מהפריטים הם 'תקליטים', חלק 'דיסקים', וחלק ריקים. המשימה שלכם היא לספק תוויות לריקים. אם תבחרו בגישה אינדוקטיבית, תאמנו מודל שמחפש 'תקליטים' ו'דיסקים', ותיישמו את התוויות הללו על הנתונים הלא מתויגים. גישה זו תתקשה לסווג פריטים שהם למעשה 'קלטות'. גישה טרנסדוקטיבית, לעומת זאת, מתמודדת עם נתונים לא ידועים בצורה יעילה יותר כשהיא עובדת על קיבוץ פריטים דומים יחד ואז מיישמת תווית לקבוצה. במקרה זה, הקבוצות עשויות לשקף 'דברים מוזיקליים עגולים' ו'דברים מוזיקליים מרובעים'.
>
> 🎓 ['גיאומטריה לא שטוחה' מול 'שטוחה'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
>
> נגזר מהמונחים המתמטיים, גיאומטריה לא שטוחה מול שטוחה מתייחסת למדידת המרחקים בין נקודות על ידי שיטות גיאומטריות 'שטוחות' ([אוקלידיות](https://wikipedia.org/wiki/Euclidean_geometry)) או 'לא שטוחות' (לא אוקלידיות).
>
>'שטוחה' בהקשר זה מתייחסת לגיאומטריה אוקלידית (חלקים ממנה נלמדים כגיאומטריה 'מישורית'), ו'לא שטוחה' מתייחסת לגיאומטריה לא אוקלידית. מה הקשר בין גיאומטריה ללמידת מכונה? ובכן, כשני תחומים שמבוססים על מתמטיקה, חייבת להיות דרך משותפת למדוד מרחקים בין נקודות בקבוצות, וזה יכול להיעשות בצורה 'שטוחה' או 'לא שטוחה', תלוי בטבע הנתונים. [מרחקים אוקלידיים](https://wikipedia.org/wiki/Euclidean_distance) נמדדים כאורך של קטע קו בין שתי נקודות. [מרחקים לא אוקלידיים](https://wikipedia.org/wiki/Non-Euclidean_geometry) נמדדים לאורך עקומה. אם הנתונים שלכם, כשהם מוצגים, נראים כאילו אינם קיימים על מישור, ייתכן שתצטרכו להשתמש באלגוריתם מיוחד כדי להתמודד איתם.
>
![Flat vs Nonflat Geometry Infographic](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png)
> אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded)
>
> 🎓 ['מרחקים'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
>
> קבוצות מוגדרות על ידי מטריצת המרחקים שלהן, כלומר המרחקים בין נקודות. מרחק זה יכול להימדד בכמה דרכים. קבוצות אוקלידיות מוגדרות על ידי ממוצע ערכי הנקודות, ומכילות 'centroid' או נקודת מרכז. המרחקים נמדדים כך לפי המרחק ל-centroid. מרחקים לא אוקלידיים מתייחסים ל'clustroids', הנקודה הקרובה ביותר לנקודות אחרות. Clustroids בתורם יכולים להיות מוגדרים בדרכים שונות.
>
> 🎓 ['מוגבל'](https://wikipedia.org/wiki/Constrained_clustering)
>
> [קיבוץ מוגבל](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) מכניס 'למידה חצי מפוקחת' לשיטה ללא פיקוח זו. היחסים בין נקודות מסומנים כ'לא ניתן לקשר' או 'חייב לקשר' כך שכמה כללים נכפים על מערך הנתונים.
>
>דוגמה: אם אלגוריתם משוחרר על אצווה של נתונים לא מתויגים או חצי מתויגים, הקבוצות שהוא יוצר עשויות להיות באיכות ירודה. בדוגמה לעיל, הקבוצות עשויות לקבץ 'דברים מוזיקליים עגולים', 'דברים מוזיקליים מרובעים', 'דברים משולשים' ו'עוגיות'. אם ניתנים כמה מגבלות, או כללים לעקוב אחריהם ("הפריט חייב להיות עשוי מפלסטיק", "הפריט צריך להיות מסוגל להפיק מוזיקה") זה יכול לעזור 'להגביל' את האלגוריתם לקבל החלטות טובות יותר.
>
> 🎓 'צפיפות'
>
> נתונים שהם 'רועשים' נחשבים ל'צפופים'. המרחקים בין נקודות בכל אחת מהקבוצות שלהם עשויים להוכיח, בבדיקה, שהם צפופים יותר או פחות, או 'עמוסים' ולכן נתונים אלה צריכים להיות מנותחים עם שיטת הקיבוץ המתאימה. [מאמר זה](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) מדגים את ההבדל בין שימוש בקיבוץ K-Means לבין אלגוריתמים של HDBSCAN לחקר מערך נתונים רועש עם צפיפות קבוצות לא אחידה.
## אלגוריתמי קיבוץ
ישנם מעל 100 אלגוריתמי קיבוץ, והשימוש בהם תלוי בטבע הנתונים שבידכם. בואו נדון בכמה מהעיקריים:
- **קיבוץ היררכי**. אם אובייקט מסווג לפי קרבתו לאובייקט סמוך, ולא לאחד רחוק יותר, קבוצות נוצרות על בסיס המרחק של חבריהן אל ומאובייקטים אחרים. הקיבוץ האגרומרטיבי של Scikit-learn הוא היררכי.
![Hierarchical clustering Infographic](../../../../5-Clustering/1-Visualize/images/hierarchical.png)
> אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **קיבוץ לפי מרכז**. אלגוריתם פופולרי זה דורש בחירה של 'k', או מספר הקבוצות שיש ליצור, ולאחר מכן האלגוריתם קובע את נקודת המרכז של קבוצה ואוסף נתונים סביב אותה נקודה. [קיבוץ K-means](https://wikipedia.org/wiki/K-means_clustering) הוא גרסה פופולרית של קיבוץ לפי מרכז. המרכז נקבע לפי הממוצע הקרוב ביותר, ומכאן השם. המרחק המרובע מהקבוצה ממוזער.
![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png)
> אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **קיבוץ מבוסס התפלגות**. מבוסס על מודלים סטטיסטיים, קיבוץ מבוסס התפלגות מתמקד בקביעת ההסתברות שנקודת נתונים שייכת לקבוצה, ומקצה אותה בהתאם. שיטות תערובת גאוסיאנית שייכות לסוג זה.
- **קיבוץ מבוסס צפיפות**. נקודות נתונים מוקצות לקבוצות על בסיס צפיפותן, או התאגדותן זו סביב זו. נקודות נתונים רחוקות מהקבוצה נחשבות לחריגות או רעש. DBSCAN, Mean-shift ו-OPTICS שייכות לסוג זה של קיבוץ.
- **קיבוץ מבוסס רשת**. עבור מערכי נתונים רב-ממדיים, נוצרת רשת והנתונים מחולקים בין תאי הרשת, ובכך נוצרים קבוצות.
## תרגיל - קבצו את הנתונים שלכם
קיבוץ כטכניקה נעזר מאוד בהדמיה נכונה, אז בואו נתחיל בהדמיה של נתוני המוזיקה שלנו. תרגיל זה יעזור לנו להחליט אילו משיטות הקיבוץ נוכל להשתמש בצורה היעילה ביותר עבור טבע הנתונים הללו.
1. פתחו את הקובץ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) בתיקייה זו.
1. ייבאו את חבילת `Seaborn` להדמיה טובה של נתונים.
```python
!pip install seaborn
```
1. הוסיפו את נתוני השירים מתוך [_nigerian-songs.csv_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/data/nigerian-songs.csv). טענו מסגרת נתונים עם מידע על השירים. התכוננו לחקור את הנתונים הללו על ידי ייבוא הספריות והצגת הנתונים:
```python
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv("../data/nigerian-songs.csv")
df.head()
```
בדקו את השורות הראשונות של הנתונים:
| | שם | אלבום | אמן | ז'אנר מוביל של האמן | תאריך יציאה | אורך | פופולריות | ריקודיות | אקוסטיות | אנרגיה | אינסטרומנטליות | חיות | עוצמה | דיבוריות | טמפו | חתימת זמן |
| --- | ---------------------- | ---------------------------- | ------------------ | ------------------- | ------------ | ----- | ---------- | --------- | --------- | ------ | ---------------- | ------ | ------- | ---------- | ------- | ---------- |
| 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 |
| 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine)| afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 |
| 2 | LITT! | LITT! | AYLØ | indie r&b | 2018 | 207758 | 40 | 0.836 | 0.272 | 0.564 | 0.000537 | 0.11 | -7.127 | 0.0424 | 130.005 | 4 |
| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
1. קבל מידע על מסגרת הנתונים על ידי קריאה ל-`info()`:
```python
df.info()
```
הפלט נראה כך:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 530 entries, 0 to 529
Data columns (total 16 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 530 non-null object
1 album 530 non-null object
2 artist 530 non-null object
3 artist_top_genre 530 non-null object
4 release_date 530 non-null int64
5 length 530 non-null int64
6 popularity 530 non-null int64
7 danceability 530 non-null float64
8 acousticness 530 non-null float64
9 energy 530 non-null float64
10 instrumentalness 530 non-null float64
11 liveness 530 non-null float64
12 loudness 530 non-null float64
13 speechiness 530 non-null float64
14 tempo 530 non-null float64
15 time_signature 530 non-null int64
dtypes: float64(8), int64(4), object(4)
memory usage: 66.4+ KB
```
1. בדוק שוב אם יש ערכים חסרים על ידי קריאה ל-`isnull()` ואימות שהסכום הוא 0:
```python
df.isnull().sum()
```
נראה טוב:
```output
name 0
album 0
artist 0
artist_top_genre 0
release_date 0
length 0
popularity 0
danceability 0
acousticness 0
energy 0
instrumentalness 0
liveness 0
loudness 0
speechiness 0
tempo 0
time_signature 0
dtype: int64
```
1. תאר את הנתונים:
```python
df.describe()
```
| | release_date | length | popularity | danceability | acousticness | energy | instrumentalness | liveness | loudness | speechiness | tempo | time_signature |
| ----- | ------------ | ----------- | ---------- | ------------ | ------------ | -------- | ---------------- | -------- | --------- | ----------- | ---------- | -------------- |
| count | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 | 530 |
| mean | 2015.390566 | 222298.1698 | 17.507547 | 0.741619 | 0.265412 | 0.760623 | 0.016305 | 0.147308 | -4.953011 | 0.130748 | 116.487864 | 3.986792 |
| std | 3.131688 | 39696.82226 | 18.992212 | 0.117522 | 0.208342 | 0.148533 | 0.090321 | 0.123588 | 2.464186 | 0.092939 | 23.518601 | 0.333701 |
| min | 1998 | 89488 | 0 | 0.255 | 0.000665 | 0.111 | 0 | 0.0283 | -19.362 | 0.0278 | 61.695 | 3 |
| 25% | 2014 | 199305 | 0 | 0.681 | 0.089525 | 0.669 | 0 | 0.07565 | -6.29875 | 0.0591 | 102.96125 | 4 |
| 50% | 2016 | 218509 | 13 | 0.761 | 0.2205 | 0.7845 | 0.000004 | 0.1035 | -4.5585 | 0.09795 | 112.7145 | 4 |
| 75% | 2017 | 242098.5 | 31 | 0.8295 | 0.403 | 0.87575 | 0.000234 | 0.164 | -3.331 | 0.177 | 125.03925 | 4 |
| max | 2020 | 511738 | 73 | 0.966 | 0.954 | 0.995 | 0.91 | 0.811 | 0.582 | 0.514 | 206.007 | 5 |
> 🤔 אם אנחנו עובדים עם קיבוץ, שיטה לא מפוקחת שאינה דורשת נתונים מתויגים, מדוע אנחנו מציגים את הנתונים עם תוויות? בשלב חקר הנתונים, הם שימושיים, אך הם אינם הכרחיים לפעולת האלגוריתמים של הקיבוץ. אפשר פשוט להסיר את כותרות העמודות ולהתייחס לנתונים לפי מספרי עמודות.
הסתכל על הערכים הכלליים של הנתונים. שים לב שהפופולריות יכולה להיות '0', מה שמראה שירים שאין להם דירוג. בואו נסיר אותם בקרוב.
1. השתמש בגרף עמודות כדי לגלות את הז'אנרים הפופולריים ביותר:
```python
import seaborn as sns
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top[:5].index,y=top[:5].values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
![most popular](../../../../5-Clustering/1-Visualize/images/popular.png)
✅ אם תרצה לראות יותר ערכים מובילים, שנה את `[:5]` לערך גדול יותר, או הסר אותו כדי לראות הכל.
שים לב, כאשר הז'אנר המוביל מתואר כ'חסר', זה אומר ש-Spotify לא סיווג אותו, אז בואו נסיר אותו.
1. הסר נתונים חסרים על ידי סינונם החוצה
```python
df = df[df['artist_top_genre'] != 'Missing']
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top.index,y=top.values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
עכשיו בדוק שוב את הז'אנרים:
![most popular](../../../../5-Clustering/1-Visualize/images/all-genres.png)
1. שלושת הז'אנרים המובילים שולטים בבירור במאגר הנתונים הזה. בואו נתמקד ב-`afro dancehall`, `afropop`, ו-`nigerian pop`, בנוסף נסנן את מאגר הנתונים כדי להסיר כל דבר עם ערך פופולריות של 0 (כלומר הוא לא סווג עם פופולריות במאגר הנתונים וניתן להתייחס אליו כרעש למטרותינו):
```python
df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')]
df = df[(df['popularity'] > 0)]
top = df['artist_top_genre'].value_counts()
plt.figure(figsize=(10,7))
sns.barplot(x=top.index,y=top.values)
plt.xticks(rotation=45)
plt.title('Top genres',color = 'blue')
```
1. בצע בדיקה מהירה כדי לראות אם הנתונים מתואמים בצורה חזקה במיוחד:
```python
corrmat = df.corr(numeric_only=True)
f, ax = plt.subplots(figsize=(12, 9))
sns.heatmap(corrmat, vmax=.8, square=True)
```
![correlations](../../../../5-Clustering/1-Visualize/images/correlation.png)
ההתאמה החזקה היחידה היא בין `energy` ל-`loudness`, מה שלא מפתיע במיוחד, בהתחשב בכך שמוזיקה רועשת היא בדרך כלל די אנרגטית. מלבד זאת, ההתאמות יחסית חלשות. יהיה מעניין לראות מה אלגוריתם קיבוץ יכול לעשות עם הנתונים האלה.
> 🎓 שים לב שהתאמה אינה מעידה על סיבתיות! יש לנו הוכחה להתאמה אך אין הוכחה לסיבתיות. [אתר משעשע](https://tylervigen.com/spurious-correlations) מציג כמה חזותיות שמדגישות את הנקודה הזו.
האם יש התכנסות במאגר הנתונים הזה סביב הפופולריות הנתפסת של שיר ורמת הריקודיות שלו? גריד פייסט מראה שיש מעגלים קונצנטריים שמתיישרים, ללא קשר לז'אנר. האם ייתכן שהטעם הניגרי מתכנס ברמת ריקודיות מסוימת עבור הז'אנר הזה?
✅ נסה נקודות נתונים שונות (אנרגיה, עוצמה, דיבוריות) ועוד או ז'אנרים מוזיקליים שונים. מה תוכל לגלות? הסתכל בטבלת `df.describe()` כדי לראות את ההתפלגות הכללית של נקודות הנתונים.
### תרגיל - התפלגות נתונים
האם שלושת הז'אנרים האלה שונים באופן משמעותי בתפיסת הריקודיות שלהם, בהתבסס על הפופולריות שלהם?
1. בדוק את התפלגות הנתונים של שלושת הז'אנרים המובילים שלנו עבור פופולריות וריקודיות לאורך ציר x ו-y נתון.
```python
sns.set_theme(style="ticks")
g = sns.jointplot(
data=df,
x="popularity", y="danceability", hue="artist_top_genre",
kind="kde",
)
```
תוכל לגלות מעגלים קונצנטריים סביב נקודת התכנסות כללית, שמראים את התפלגות הנקודות.
> 🎓 שים לב שהדוגמה הזו משתמשת בגרף KDE (Kernel Density Estimate) שמייצג את הנתונים באמצעות עקומת צפיפות הסתברות רציפה. זה מאפשר לנו לפרש נתונים כשעובדים עם התפלגויות מרובות.
באופן כללי, שלושת הז'אנרים מתיישרים באופן רופף מבחינת הפופולריות והריקודיות שלהם. קביעת קבוצות בנתונים שמתיישרים באופן רופף תהיה אתגר:
![distribution](../../../../5-Clustering/1-Visualize/images/distribution.png)
1. צור גרף פיזור:
```python
sns.FacetGrid(df, hue="artist_top_genre", height=5) \
.map(plt.scatter, "popularity", "danceability") \
.add_legend()
```
גרף פיזור של אותם צירים מראה דפוס דומה של התכנסות
![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png)
באופן כללי, עבור קיבוץ, ניתן להשתמש בגרפי פיזור כדי להראות קבוצות של נתונים, כך שלשלוט בסוג זה של ויזואליזציה זה מאוד שימושי. בשיעור הבא, ניקח את הנתונים המסוננים האלה ונשתמש בקיבוץ k-means כדי לגלות קבוצות בנתונים האלה שנראה כי חופפות בדרכים מעניינות.
---
## 🚀אתגר
בהכנה לשיעור הבא, צור תרשים על אלגוריתמי הקיבוץ השונים שתוכל לגלות ולהשתמש בהם בסביבת ייצור. אילו סוגי בעיות הקיבוץ מנסה לפתור?
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
לפני שתיישם אלגוריתמי קיבוץ, כפי שלמדנו, זה רעיון טוב להבין את טבע מאגר הנתונים שלך. קרא עוד על הנושא [כאן](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
[מאמר מועיל זה](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) עובר על הדרכים השונות שבהן אלגוריתמי קיבוץ שונים מתנהגים, בהתחשב בצורות נתונים שונות.
## משימה
[חקר ויזואליזציות אחרות עבור קיבוץ](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "589fa015a5e7d9e67bd629f7d47b53de",
"translation_date": "2025-09-05T19:15:59+00:00",
"source_file": "5-Clustering/1-Visualize/assignment.md",
"language_code": "he"
}
-->
# חקר ויזואליזציות אחרות עבור אשכולות
## הוראות
בשיעור זה, עבדת עם כמה טכניקות ויזואליזציה כדי להבין כיצד לשרטט את הנתונים שלך כהכנה לאשכולות. גרפים פיזוריים (Scatterplots), במיוחד, שימושיים למציאת קבוצות של אובייקטים. חקור דרכים שונות וספריות שונות ליצירת גרפים פיזוריים ותעד את עבודתך במחברת. תוכל להשתמש בנתונים מהשיעור הזה, שיעורים אחרים, או נתונים שתמצא בעצמך (עם זאת, אנא ציין את מקורם במחברת שלך). שרטט נתונים באמצעות גרפים פיזוריים והסבר מה גילית.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ---------------------------- |
| | מוצגת מחברת עם חמישה גרפים פיזוריים מתועדים היטב | מוצגת מחברת עם פחות מחמישה גרפים פיזוריים והיא פחות מתועדת היטב | מוצגת מחברת לא שלמה |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T19:16:28+00:00",
"source_file": "5-Clustering/1-Visualize/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,261 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7cdd17338d9bbd7e2171c2cd462eb081",
"translation_date": "2025-09-05T19:17:05+00:00",
"source_file": "5-Clustering/2-K-Means/README.md",
"language_code": "he"
}
-->
# אשכולות K-Means
## [מבחן מקדים](https://ff-quizzes.netlify.app/en/ml/)
בשיעור הזה תלמדו כיצד ליצור אשכולות באמצעות Scikit-learn וסט הנתונים של מוזיקה ניגרית שייבאתם קודם לכן. נכסה את היסודות של K-Means לצורך אשכולות. זכרו, כפי שלמדתם בשיעור הקודם, ישנן דרכים רבות לעבוד עם אשכולות, והשיטה שתבחרו תלויה בנתונים שלכם. ננסה את K-Means מכיוון שזו טכניקת האשכולות הנפוצה ביותר. בואו נתחיל!
מונחים שתלמדו עליהם:
- ציון סילואט
- שיטת המרפק
- אינרציה
- שונות
## מבוא
[K-Means Clustering](https://wikipedia.org/wiki/K-means_clustering) היא שיטה שמקורה בתחום עיבוד האותות. היא משמשת לחלוקה וקיבוץ קבוצות נתונים ל-'k' אשכולות באמצעות סדרת תצפיות. כל תצפית פועלת לקיבוץ נקודת נתונים נתונה הקרובה ביותר ל-'ממוצע' שלה, או לנקודת המרכז של האשכול.
ניתן להמחיש את האשכולות כ-[דיאגרמות וורונוי](https://wikipedia.org/wiki/Voronoi_diagram), הכוללות נקודה (או 'זרע') והאזור המתאים לה.
![דיאגרמת וורונוי](../../../../5-Clustering/2-K-Means/images/voronoi.png)
> אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
תהליך האשכולות של K-Means [מתבצע בשלושה שלבים](https://scikit-learn.org/stable/modules/clustering.html#k-means):
1. האלגוריתם בוחר מספר נקודות מרכזיות (k) על ידי דגימה מתוך סט הנתונים. לאחר מכן הוא מבצע לולאה:
1. הוא מקצה כל דגימה לנקודת המרכז הקרובה ביותר.
2. הוא יוצר נקודות מרכזיות חדשות על ידי חישוב הממוצע של כל הדגימות שהוקצו לנקודות המרכזיות הקודמות.
3. לאחר מכן, הוא מחשב את ההבדל בין הנקודות המרכזיות החדשות והישנות וחוזר על התהליך עד שהנקודות המרכזיות מתייצבות.
חיסרון אחד בשימוש ב-K-Means הוא הצורך לקבוע את 'k', כלומר את מספר הנקודות המרכזיות. למרבה המזל, שיטת ה'מרפק' עוזרת להעריך ערך התחלתי טוב עבור 'k'. תנסו את זה עוד מעט.
## דרישות מקדימות
תעבדו בקובץ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) של השיעור הזה, הכולל את ייבוא הנתונים והניקוי הראשוני שביצעתם בשיעור הקודם.
## תרגיל - הכנה
נתחיל בהסתכלות נוספת על נתוני השירים.
1. צרו תרשים קופסה (boxplot) על ידי קריאה ל-`boxplot()` עבור כל עמודה:
```python
plt.figure(figsize=(20,20), dpi=200)
plt.subplot(4,3,1)
sns.boxplot(x = 'popularity', data = df)
plt.subplot(4,3,2)
sns.boxplot(x = 'acousticness', data = df)
plt.subplot(4,3,3)
sns.boxplot(x = 'energy', data = df)
plt.subplot(4,3,4)
sns.boxplot(x = 'instrumentalness', data = df)
plt.subplot(4,3,5)
sns.boxplot(x = 'liveness', data = df)
plt.subplot(4,3,6)
sns.boxplot(x = 'loudness', data = df)
plt.subplot(4,3,7)
sns.boxplot(x = 'speechiness', data = df)
plt.subplot(4,3,8)
sns.boxplot(x = 'tempo', data = df)
plt.subplot(4,3,9)
sns.boxplot(x = 'time_signature', data = df)
plt.subplot(4,3,10)
sns.boxplot(x = 'danceability', data = df)
plt.subplot(4,3,11)
sns.boxplot(x = 'length', data = df)
plt.subplot(4,3,12)
sns.boxplot(x = 'release_date', data = df)
```
הנתונים האלה מעט רועשים: על ידי התבוננות בכל עמודה כתרשים קופסה, תוכלו לראות חריגות.
![חריגות](../../../../5-Clustering/2-K-Means/images/boxplots.png)
תוכלו לעבור על סט הנתונים ולהסיר את החריגות הללו, אך זה יהפוך את הנתונים למינימליים למדי.
1. לעת עתה, בחרו אילו עמודות תשתמשו בהן לתרגיל האשכולות שלכם. בחרו עמודות עם טווחים דומים וקודדו את העמודה `artist_top_genre` כנתונים מספריים:
```python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')]
y = df['artist_top_genre']
X['artist_top_genre'] = le.fit_transform(X['artist_top_genre'])
y = le.transform(y)
```
1. עכשיו עליכם לבחור כמה אשכולות למקד. אתם יודעים שיש 3 ז'אנרים של שירים שזיהינו מתוך סט הנתונים, אז בואו ננסה 3:
```python
from sklearn.cluster import KMeans
nclusters = 3
seed = 0
km = KMeans(n_clusters=nclusters, random_state=seed)
km.fit(X)
# Predict the cluster for each data point
y_cluster_kmeans = km.predict(X)
y_cluster_kmeans
```
אתם רואים מערך מודפס עם אשכולות חזויים (0, 1 או 2) עבור כל שורה של מסגרת הנתונים.
1. השתמשו במערך הזה כדי לחשב 'ציון סילואט':
```python
from sklearn import metrics
score = metrics.silhouette_score(X, y_cluster_kmeans)
score
```
## ציון סילואט
חפשו ציון סילואט קרוב ל-1. הציון הזה נע בין -1 ל-1, ואם הציון הוא 1, האשכול צפוף ומופרד היטב מאשכולות אחרים. ערך קרוב ל-0 מייצג אשכולות חופפים עם דגימות קרובות מאוד לגבול ההחלטה של האשכולות השכנים. [(מקור)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
הציון שלנו הוא **0.53**, כלומר באמצע. זה מצביע על כך שהנתונים שלנו לא מתאימים במיוחד לסוג זה של אשכולות, אבל בואו נמשיך.
### תרגיל - בניית מודל
1. ייבאו את `KMeans` והתחילו את תהליך האשכולות.
```python
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
```
יש כאן כמה חלקים שמצדיקים הסבר.
> 🎓 טווח: אלו הן האיטרציות של תהליך האשכולות.
> 🎓 random_state: "קובע את יצירת המספרים האקראיים עבור אתחול הנקודות המרכזיות." [מקור](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓 WCSS: "סכום הריבועים בתוך האשכולות" מודד את המרחק הממוצע בריבוע של כל הנקודות בתוך אשכול לנקודת המרכז של האשכול. [מקור](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce).
> 🎓 אינרציה: אלגוריתמי K-Means מנסים לבחור נקודות מרכזיות כדי למזער את 'האינרציה', "מדד לכמה האשכולות קוהרנטיים פנימית." [מקור](https://scikit-learn.org/stable/modules/clustering.html). הערך נוסף למשתנה wcss בכל איטרציה.
> 🎓 k-means++: ב-[Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) ניתן להשתמש באופטימיזציה 'k-means++', שמאתחלת את הנקודות המרכזיות כך שיהיו (בדרך כלל) רחוקות זו מזו, מה שמוביל לתוצאות טובות יותר מאתחול אקראי.
### שיטת המרפק
קודם לכן הסקתם, מכיוון שמיקדתם 3 ז'אנרים של שירים, שעליכם לבחור 3 אשכולות. אבל האם זה באמת המקרה?
1. השתמשו בשיטת ה'מרפק' כדי לוודא.
```python
plt.figure(figsize=(10,5))
sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red')
plt.title('Elbow')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
```
השתמשו במשתנה `wcss` שבניתם בשלב הקודם כדי ליצור תרשים שמראה היכן ה'כיפוף' במרפק, שמצביע על מספר האשכולות האופטימלי. אולי זה **באמת** 3!
![שיטת המרפק](../../../../5-Clustering/2-K-Means/images/elbow.png)
## תרגיל - הצגת האשכולות
1. נסו את התהליך שוב, הפעם עם שלושה אשכולות, והציגו את האשכולות כתרשים פיזור:
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3)
kmeans.fit(X)
labels = kmeans.predict(X)
plt.scatter(df['popularity'],df['danceability'],c = labels)
plt.xlabel('popularity')
plt.ylabel('danceability')
plt.show()
```
1. בדקו את דיוק המודל:
```python
labels = kmeans.labels_
correct_labels = sum(y == labels)
print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size))
print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
```
דיוק המודל הזה לא טוב במיוחד, וצורת האשכולות נותנת לכם רמז מדוע.
![אשכולות](../../../../5-Clustering/2-K-Means/images/clusters.png)
הנתונים האלה לא מאוזנים מספיק, לא מתואמים מספיק ויש יותר מדי שונות בין ערכי העמודות כדי ליצור אשכולות טובים. למעשה, האשכולות שנוצרים כנראה מושפעים או מוטים מאוד על ידי שלוש קטגוריות הז'אנרים שהגדרנו קודם. זה היה תהליך למידה!
בתיעוד של Scikit-learn, תוכלו לראות שמודל כמו זה, עם אשכולות שאינם מוגדרים היטב, סובל מבעיה של 'שונות':
![מודלים בעייתיים](../../../../5-Clustering/2-K-Means/images/problems.png)
> אינפוגרפיקה מתוך Scikit-learn
## שונות
שונות מוגדרת כ-"הממוצע של הריבועים של ההבדלים מהממוצע" [(מקור)](https://www.mathsisfun.com/data/standard-deviation.html). בהקשר של בעיית האשכולות הזו, היא מתייחסת לנתונים שבהם המספרים בסט הנתונים נוטים לסטות יותר מדי מהממוצע.
✅ זהו רגע מצוין לחשוב על כל הדרכים שבהן תוכלו לתקן את הבעיה הזו. לשפר את הנתונים עוד קצת? להשתמש בעמודות אחרות? להשתמש באלגוריתם אחר? רמז: נסו [לשנות את קנה המידה של הנתונים שלכם](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) כדי לנרמל אותם ולבדוק עמודות אחרות.
> נסו את '[מחשבון השונות](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' כדי להבין את המושג קצת יותר.
---
## 🚀אתגר
בלו זמן עם המחברת הזו, שנו פרמטרים. האם תוכלו לשפר את דיוק המודל על ידי ניקוי הנתונים יותר (למשל הסרת חריגות)? תוכלו להשתמש במשקלים כדי לתת משקל רב יותר לדגימות נתונים מסוימות. מה עוד תוכלו לעשות כדי ליצור אשכולות טובים יותר?
רמז: נסו לשנות את קנה המידה של הנתונים שלכם. יש קוד עם הערות במחברת שמוסיף שינוי קנה מידה סטנדרטי כדי לגרום לעמודות הנתונים להיראות דומות יותר זו לזו מבחינת טווח. תגלו שבעוד שציון הסילואט יורד, ה'כיפוף' בתרשים המרפק מתמתן. זאת מכיוון שהשארת הנתונים ללא שינוי קנה מידה מאפשרת לנתונים עם פחות שונות לשאת משקל רב יותר. קראו עוד על הבעיה הזו [כאן](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).
## [מבחן מסכם](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
הסתכלו על סימולטור K-Means [כמו זה](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). תוכלו להשתמש בכלי הזה כדי להמחיש נקודות נתונים לדוגמה ולקבוע את הנקודות המרכזיות שלהן. תוכלו לערוך את אקראיות הנתונים, מספרי האשכולות ומספרי הנקודות המרכזיות. האם זה עוזר לכם לקבל מושג כיצד ניתן לקבץ את הנתונים?
בנוסף, הסתכלו על [המסמך הזה על K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) מסטנפורד.
## משימה
[נסו שיטות אשכולות שונות](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b8e17eff34ad1680eba2a5d3cf9ffc41",
"translation_date": "2025-09-05T19:19:06+00:00",
"source_file": "5-Clustering/2-K-Means/assignment.md",
"language_code": "he"
}
-->
# נסו שיטות אשכולות שונות
## הוראות
בשיעור זה למדתם על אשכולות K-Means. לפעמים K-Means אינו מתאים לנתונים שלכם. צרו מחברת תוך שימוש בנתונים מהשיעורים הללו או ממקור אחר (תנו קרדיט למקור) והציגו שיטת אשכולות שונה שאינה משתמשת ב-K-Means. מה למדתם?
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ------------------------------------------------------------- | ----------------------------------------------------------------- | --------------------------- |
| | מוצגת מחברת עם מודל אשכולות מתועד היטב | מוצגת מחברת ללא תיעוד מספק ו/או עבודה לא מלאה | מוגשת עבודה לא מלאה |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T19:19:31+00:00",
"source_file": "5-Clustering/2-K-Means/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,42 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b28a3a4911584062772c537b653ebbc7",
"translation_date": "2025-09-05T19:10:12+00:00",
"source_file": "5-Clustering/README.md",
"language_code": "he"
}
-->
# מודלים של אשכולות ללמידת מכונה
אשכולות הם משימה בלמידת מכונה שבה מחפשים למצוא אובייקטים הדומים זה לזה ולחבר אותם לקבוצות הנקראות אשכולות. מה שמבדיל אשכולות מגישות אחרות בלמידת מכונה הוא שהדברים מתרחשים באופן אוטומטי, למעשה, אפשר לומר שזה ההפך מלמידה מונחית.
## נושא אזורי: מודלים של אשכולות לטעמי מוזיקה של קהל ניגרי 🎧
הקהל המגוון בניגריה מתאפיין בטעמי מוזיקה מגוונים. באמצעות נתונים שנאספו מ-Spotify (בהשראת [המאמר הזה](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), נבחן כמה מהמוזיקה הפופולרית בניגריה. מערך הנתונים הזה כולל מידע על ציוני 'ריקודיות', 'אקוסטיות', עוצמת קול, 'דיבוריות', פופולריות ואנרגיה של שירים שונים. יהיה מעניין לגלות דפוסים בנתונים האלה!
![פלטת תקליטים](../../../5-Clustering/images/turntable.jpg)
> צילום מאת <a href="https://unsplash.com/@marcelalaskoski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Marcela Laskoski</a> ב-<a href="https://unsplash.com/s/photos/nigerian-music?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
בסדרת השיעורים הזו, תגלו דרכים חדשות לנתח נתונים באמצעות טכניקות אשכולות. אשכולות שימושיים במיוחד כאשר מערך הנתונים שלכם חסר תוויות. אם יש לו תוויות, אז טכניקות סיווג כמו אלו שלמדתם בשיעורים קודמים עשויות להיות מועילות יותר. אבל במקרים שבהם אתם מחפשים לקבץ נתונים ללא תוויות, אשכולות הם דרך מצוינת לגלות דפוסים.
> ישנם כלים שימושיים בעלי קוד נמוך שיכולים לעזור לכם ללמוד לעבוד עם מודלים של אשכולות. נסו [Azure ML למשימה זו](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## שיעורים
1. [מבוא לאשכולות](1-Visualize/README.md)
2. [אשכולות K-Means](2-K-Means/README.md)
## קרדיטים
השיעורים הללו נכתבו עם 🎶 על ידי [Jen Looper](https://www.twitter.com/jenlooper) עם ביקורות מועילות מאת [Rishit Dagli](https://rishit_dagli) ו-[Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan).
מערך הנתונים [שירים ניגריים](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) נלקח מ-Kaggle ונאסף מ-Spotify.
דוגמאות שימושיות של K-Means שסייעו ביצירת השיעור כוללות את [חקירת האיריס הזו](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), [מחברת מבוא זו](https://www.kaggle.com/prashant111/k-means-clustering-with-python), ואת [דוגמת ה-NGO ההיפותטית הזו](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering).
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,179 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1c2ec40cf55c98a028a359c27ef7e45a",
"translation_date": "2025-09-05T20:35:49+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/README.md",
"language_code": "he"
}
-->
# מבוא לעיבוד שפה טבעית
השיעור הזה מכסה היסטוריה קצרה ומושגים חשובים של *עיבוד שפה טבעית*, תחום משנה של *בלשנות חישובית*.
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
## מבוא
NLP, כפי שהוא מוכר בדרך כלל, הוא אחד התחומים הידועים ביותר שבהם נעשה שימוש בלמידת מכונה בתוכנות ייצור.
✅ האם אתם יכולים לחשוב על תוכנה שאתם משתמשים בה מדי יום ושכנראה יש בה שילוב של NLP? מה לגבי תוכנות עיבוד תמלילים או אפליקציות ניידות שאתם משתמשים בהן באופן קבוע?
אתם תלמדו על:
- **הרעיון של שפות**. איך שפות התפתחו ומה היו התחומים המרכזיים של המחקר.
- **הגדרות ומושגים**. תלמדו גם הגדרות ומושגים על איך מחשבים מעבדים טקסט, כולל ניתוח תחבירי, דקדוק וזיהוי שמות עצם ופעלים. ישנם משימות קידוד בשיעור הזה, ומוצגים מספר מושגים חשובים שתלמדו לקודד בשיעורים הבאים.
## בלשנות חישובית
בלשנות חישובית היא תחום מחקר ופיתוח שנמשך עשרות שנים, העוסק בשאלה כיצד מחשבים יכולים לעבוד עם שפות, ואפילו להבין, לתרגם ולתקשר באמצעותן. עיבוד שפה טבעית (NLP) הוא תחום קשור שמתמקד באיך מחשבים יכולים לעבד שפות 'טבעיות', כלומר שפות אנושיות.
### דוגמה - תכתיב בטלפון
אם אי פעם הכתבתם לטלפון במקום להקליד או שאלתם עוזר וירטואלי שאלה, הדיבור שלכם הומר לצורת טקסט ואז עובד או *נותח* מהשפה שבה דיברתם. מילות המפתח שזוהו עובדו לפורמט שהטלפון או העוזר הווירטואלי יכלו להבין ולפעול לפיו.
![הבנה](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png)
> הבנה בלשנית אמיתית היא קשה! תמונה מאת [Jen Looper](https://twitter.com/jenlooper)
### איך הטכנולוגיה הזו מתאפשרת?
הדבר מתאפשר כי מישהו כתב תוכנית מחשב לעשות זאת. לפני כמה עשורים, כמה סופרי מדע בדיוני חזו שאנשים ידברו בעיקר עם המחשבים שלהם, והמחשבים תמיד יבינו בדיוק למה הם מתכוונים. למרבה הצער, התברר שזהו אתגר קשה יותר ממה שרבים דמיינו, ולמרות שהבעיה מובנת הרבה יותר כיום, ישנם אתגרים משמעותיים בהשגת עיבוד שפה טבעית 'מושלם' בכל הנוגע להבנת המשמעות של משפט. זו בעיה קשה במיוחד כשמדובר בהבנת הומור או זיהוי רגשות כמו סרקזם במשפט.
בשלב הזה, ייתכן שאתם נזכרים בשיעורי בית הספר שבהם המורה לימד את חלקי הדקדוק במשפט. במדינות מסוימות, תלמידים לומדים דקדוק ובלשנות כתחום לימוד ייעודי, אך ברבות מהמדינות, נושאים אלו נכללים כחלק מלימוד שפה: בין אם זו השפה הראשונה שלכם בבית הספר היסודי (לימוד קריאה וכתיבה) ואולי שפה שנייה בבית הספר העל-יסודי או התיכון. אל תדאגו אם אינכם מומחים בהבחנה בין שמות עצם לפעלים או בין תארים לתארי פועל!
אם אתם מתקשים להבדיל בין *הווה פשוט* ל-*הווה מתמשך*, אתם לא לבד. זהו אתגר עבור אנשים רבים, אפילו דוברי שפת אם. החדשות הטובות הן שמחשבים טובים מאוד ביישום כללים פורמליים, ותלמדו לכתוב קוד שיכול *לנתח* משפט כמו בן אדם. האתגר הגדול יותר שתבדקו בהמשך הוא הבנת *המשמעות* ו-*הרגש* של משפט.
## דרישות מוקדמות
לשיעור הזה, הדרישה העיקרית היא היכולת לקרוא ולהבין את השפה של השיעור. אין בעיות מתמטיות או משוואות לפתור. בעוד שהמחבר המקורי כתב את השיעור באנגלית, הוא מתורגם גם לשפות אחרות, כך שאתם עשויים לקרוא תרגום. ישנם דוגמאות שבהן נעשה שימוש במספר שפות שונות (כדי להשוות את כללי הדקדוק של שפות שונות). אלו *לא* מתורגמות, אך הטקסט המסביר כן, כך שהמשמעות צריכה להיות ברורה.
למשימות הקידוד, תשתמשו ב-Python והדוגמאות משתמשות ב-Python 3.8.
בקטע הזה, תצטרכו ותשתמשו ב:
- **הבנה של Python 3**. הבנת שפת תכנות ב-Python 3, השיעור הזה משתמש בקלט, לולאות, קריאת קבצים, מערכים.
- **Visual Studio Code + הרחבה**. נשתמש ב-Visual Studio Code ובהרחבת Python שלו. תוכלו גם להשתמש ב-IDE של Python לבחירתכם.
- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) היא ספריית עיבוד טקסט פשוטה עבור Python. עקבו אחר ההוראות באתר TextBlob כדי להתקין אותה במערכת שלכם (התקינו גם את ה-corpora, כפי שמוצג למטה):
```bash
pip install -U textblob
python -m textblob.download_corpora
```
> 💡 טיפ: ניתן להריץ Python ישירות בסביבות VS Code. בדקו את [התיעוד](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) למידע נוסף.
## לדבר עם מכונות
ההיסטוריה של הניסיון לגרום למחשבים להבין שפה אנושית נמשכת עשרות שנים, ואחד המדענים הראשונים שעסקו בעיבוד שפה טבעית היה *אלן טיורינג*.
### מבחן טיורינג
כשטיורינג חקר *בינה מלאכותית* בשנות ה-50, הוא שקל אם ניתן לערוך מבחן שיחה בין אדם למחשב (באמצעות תקשורת כתובה) שבו האדם בשיחה אינו בטוח אם הוא משוחח עם אדם אחר או עם מחשב.
אם, לאחר פרק זמן מסוים של שיחה, האדם לא יכול לקבוע אם התשובות הגיעו ממחשב או לא, האם ניתן לומר שהמחשב *חושב*?
### ההשראה - 'משחק החיקוי'
הרעיון לכך הגיע ממשחק מסיבות שנקרא *משחק החיקוי*, שבו חוקר נמצא לבד בחדר ומוטלת עליו המשימה לקבוע מי מבין שני אנשים (בחדר אחר) הם גבר ואישה בהתאמה. החוקר יכול לשלוח פתקים, ועליו לנסות לחשוב על שאלות שבהן התשובות הכתובות יחשפו את המגדר של האדם המסתורי. כמובן, השחקנים בחדר השני מנסים להטעות את החוקר על ידי מתן תשובות באופן שמטעה או מבלבל את החוקר, תוך כדי מתן רושם של תשובה כנה.
### פיתוח אליזה
בשנות ה-60, מדען מ-MIT בשם *ג'וזף וייזנבאום* פיתח [*אליזה*](https://wikipedia.org/wiki/ELIZA), 'מטפלת' ממוחשבת ששואלת את האדם שאלות ונותנת רושם של הבנת תשובותיו. עם זאת, בעוד שאליזה יכלה לנתח משפט ולזהות מבנים דקדוקיים מסוימים ומילות מפתח כדי לתת תשובה סבירה, לא ניתן היה לומר שהיא *מבינה* את המשפט. אם אליזה הוצגה עם משפט בפורמט "**אני** <u>עצוב</u>", היא עשויה לשנות ולסדר מחדש מילים במשפט כדי ליצור את התשובה "כמה זמן **אתה** <u>עצוב</u>".
זה נתן את הרושם שאליזה הבינה את ההצהרה ושאלה שאלה המשך, בעוד שבמציאות, היא שינתה את הזמן והוסיפה כמה מילים. אם אליזה לא יכלה לזהות מילת מפתח שיש לה תשובה עבורה, היא הייתה נותנת תשובה אקראית שיכולה להיות רלוונטית להרבה הצהרות שונות. ניתן היה להטעות את אליזה בקלות, למשל אם משתמש כתב "**אתה** <u>אופניים</u>", היא עשויה להגיב עם "כמה זמן **אני** <u>אופניים</u>?", במקום תשובה סבירה יותר.
[![שיחה עם אליזה](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "שיחה עם אליזה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון על תוכנית אליזה המקורית
> הערה: ניתן לקרוא את התיאור המקורי של [אליזה](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) שפורסם ב-1966 אם יש לכם חשבון ACM. לחלופין, קראו על אליזה ב-[ויקיפדיה](https://wikipedia.org/wiki/ELIZA).
## תרגיל - קידוד בוט שיחה בסיסי
בוט שיחה, כמו אליזה, הוא תוכנית שמקבלת קלט ממשתמש ונותנת רושם של הבנה ותגובה אינטליגנטית. בניגוד לאליזה, הבוט שלנו לא יכלול מספר כללים שיתנו לו את הרושם של שיחה אינטליגנטית. במקום זאת, הבוט שלנו יוכל רק לשמור על השיחה באמצעות תגובות אקראיות שעשויות להתאים כמעט לכל שיחה טריוויאלית.
### התוכנית
השלבים שלכם בבניית בוט שיחה:
1. הדפיסו הוראות שמייעצות למשתמש איך לתקשר עם הבוט
2. התחילו לולאה
1. קבלו קלט ממשתמש
2. אם המשתמש ביקש לצאת, צאו
3. עבדו את הקלט של המשתמש וקבעו תגובה (במקרה הזה, התגובה היא בחירה אקראית מתוך רשימת תגובות כלליות אפשריות)
4. הדפיסו את התגובה
3. חזרו לשלב 2
### בניית הבוט
בואו ניצור את הבוט עכשיו. נתחיל בהגדרת כמה משפטים.
1. צרו את הבוט הזה בעצמכם ב-Python עם התגובות האקראיות הבאות:
```python
random_responses = ["That is quite interesting, please tell me more.",
"I see. Do go on.",
"Why do you say that?",
"Funny weather we've been having, isn't it?",
"Let's change the subject.",
"Did you catch the game last night?"]
```
הנה דוגמת פלט שתנחה אתכם (קלט המשתמש מופיע בשורות שמתחילות ב-`>`):
```output
Hello, I am Marvin, the simple robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am good thanks
That is quite interesting, please tell me more.
> today I went for a walk
Did you catch the game last night?
> I did, but my team lost
Funny weather we've been having, isn't it?
> yes but I hope next week is better
Let's change the subject.
> ok, lets talk about music
Why do you say that?
> because I like music!
Why do you say that?
> bye
It was nice talking to you, goodbye!
```
פתרון אפשרי למשימה נמצא [כאן](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py)
✅ עצרו וחשבו
1. האם אתם חושבים שהתגובות האקראיות יוכלו 'להטעות' מישהו לחשוב שהבוט באמת הבין אותם?
2. אילו תכונות הבוט יצטרך כדי להיות יעיל יותר?
3. אם בוט באמת יכול 'להבין' את המשמעות של משפט, האם הוא יצטרך 'לזכור' את המשמעות של משפטים קודמים בשיחה גם כן?
---
## 🚀אתגר
בחרו אחד מהאלמנטים של "עצרו וחשבו" למעלה ונסו ליישם אותו בקוד או כתבו פתרון על נייר באמצעות פסאודו-קוד.
בשיעור הבא, תלמדו על מספר גישות נוספות לניתוח שפה טבעית ולמידת מכונה.
## [שאלון אחרי השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
עיינו במקורות למטה כהזדמנויות לקריאה נוספת.
### מקורות
1. שובר, לנארט, "בלשנות חישובית", *The Stanford Encyclopedia of Philosophy* (מהדורת אביב 2020), אדוארד נ. זלטה (עורך), URL = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
2. אוניברסיטת פרינסטון "אודות WordNet." [WordNet](https://wordnet.princeton.edu/). אוניברסיטת פרינסטון. 2010.
## משימה
[חפשו בוט](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1d7583e8046dacbb0c056d5ba0a71b16",
"translation_date": "2025-09-05T20:37:57+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/assignment.md",
"language_code": "he"
}
-->
# חיפוש אחר בוט
## הוראות
בוטים נמצאים בכל מקום. המשימה שלך: למצוא אחד ולאמץ אותו! ניתן למצוא אותם באתרי אינטרנט, באפליקציות בנקאיות ובטלפון, למשל כאשר אתה מתקשר לחברות שירותים פיננסיים לקבלת ייעוץ או מידע על חשבון. נתח את הבוט ונסה לבלבל אותו. אם הצלחת לבלבל את הבוט, מדוע לדעתך זה קרה? כתוב מאמר קצר על החוויה שלך.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | --------------------- |
| | נכתב מאמר מלא בן עמוד אחד, המסביר את הארכיטקטורה המשוערת של הבוט ומתאר את החוויה שלך איתו | המאמר אינו שלם או אינו מבוסס היטב | לא הוגש מאמר |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,224 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5f3cb462e3122e1afe7ab0050ccf2bd3",
"translation_date": "2025-09-05T20:25:32+00:00",
"source_file": "6-NLP/2-Tasks/README.md",
"language_code": "he"
}
-->
# משימות וטכניקות נפוצות בעיבוד שפה טבעית
ברוב המשימות של *עיבוד שפה טבעית*, הטקסט שיש לעבד חייב להיות מפורק, נבדק, והתוצאות נשמרות או מושוות עם חוקים ומאגרי נתונים. משימות אלו מאפשרות למתכנת להסיק את _המשמעות_ או _הכוונה_ או רק את _תדירות_ המונחים והמילים בטקסט.
## [שאלון לפני ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
בואו נגלה טכניקות נפוצות המשמשות לעיבוד טקסט. בשילוב עם למידת מכונה, טכניקות אלו עוזרות לנתח כמויות גדולות של טקסט בצורה יעילה. לפני שמיישמים למידת מכונה למשימות אלו, עם זאת, חשוב להבין את הבעיות שבהן נתקל מומחה NLP.
## משימות נפוצות בעיבוד שפה טבעית
ישנן דרכים שונות לנתח טקסט שבו אתם עובדים. ישנן משימות שניתן לבצע, ודרך משימות אלו ניתן להבין את הטקסט ולהסיק מסקנות. בדרך כלל מבצעים את המשימות הללו ברצף.
### טוקניזציה
כנראה הדבר הראשון שרוב האלגוריתמים של NLP צריכים לעשות הוא לפצל את הטקסט לטוקנים, או מילים. למרות שזה נשמע פשוט, התחשבות בסימני פיסוק ובמפרידי מילים ומשפטים בשפות שונות יכולה להפוך את המשימה למורכבת. ייתכן שתצטרכו להשתמש בשיטות שונות כדי לקבוע את הגבולות.
![טוקניזציה](../../../../6-NLP/2-Tasks/images/tokenization.png)
> טוקניזציה של משפט מתוך **גאווה ודעה קדומה**. אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
### אמבדינגים
[אמבדינגים של מילים](https://wikipedia.org/wiki/Word_embedding) הם דרך להמיר את נתוני הטקסט שלכם למספרים. אמבדינגים נעשים בצורה כזו שמילים עם משמעות דומה או מילים שמשתמשים בהן יחד מתרכזות יחד.
![אמבדינגים של מילים](../../../../6-NLP/2-Tasks/images/embedding.png)
> "יש לי את הכבוד הרב ביותר לעצבים שלך, הם חברים ותיקים שלי." - אמבדינגים של מילים למשפט מתוך **גאווה ודעה קדומה**. אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
✅ נסו [את הכלי המעניין הזה](https://projector.tensorflow.org/) להתנסות באמבדינגים של מילים. לחיצה על מילה אחת מציגה קבוצות של מילים דומות: 'toy' מתרכז עם 'disney', 'lego', 'playstation', ו-'console'.
### ניתוח תחבירי ותיוג חלקי דיבר
כל מילה שעברה טוקניזציה יכולה להיות מתויגת כחלק דיבר - שם עצם, פועל או תואר. המשפט `השועל האדום המהיר קפץ מעל הכלב החום העצלן` עשוי להיות מתויג כך: שועל = שם עצם, קפץ = פועל.
![ניתוח תחבירי](../../../../6-NLP/2-Tasks/images/parse.png)
> ניתוח תחבירי של משפט מתוך **גאווה ודעה קדומה**. אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
ניתוח תחבירי הוא זיהוי אילו מילים קשורות זו לזו במשפט - למשל `השועל האדום המהיר קפץ` הוא רצף של תואר-שם עצם-פועל שנפרד מהרצף `הכלב החום העצלן`.
### תדירות מילים וביטויים
הליך שימושי בעת ניתוח גוף טקסט גדול הוא לבנות מילון של כל מילה או ביטוי מעניין וכמה פעמים הם מופיעים. המשפט `השועל האדום המהיר קפץ מעל הכלב החום העצלן` מכיל תדירות של 2 עבור המילה "ה".
בואו נסתכל על טקסט לדוגמה שבו נספור את תדירות המילים. השיר "The Winners" של רודיארד קיפלינג מכיל את הבית הבא:
```output
What the moral? Who rides may read.
When the night is thick and the tracks are blind
A friend at a pinch is a friend, indeed,
But a fool to wait for the laggard behind.
Down to Gehenna or up to the Throne,
He travels the fastest who travels alone.
```
מכיוון שתדירות ביטויים יכולה להיות רגישה או לא רגישה לאותיות גדולות, הביטוי `a friend` מופיע בתדירות של 2, `the` מופיע בתדירות של 6, ו-`travels` מופיע בתדירות של 2.
### N-grams
ניתן לפצל טקסט לרצפים של מילים באורך קבוע, מילה אחת (unigram), שתי מילים (bigram), שלוש מילים (trigram) או כל מספר מילים (n-grams).
לדוגמה, המשפט `השועל האדום המהיר קפץ מעל הכלב החום העצלן` עם ערך n-gram של 2 יפיק את ה-n-grams הבאים:
1. השועל האדום
2. האדום המהיר
3. המהיר קפץ
4. קפץ מעל
5. מעל הכלב
6. הכלב החום
7. החום העצלן
ניתן לדמיין זאת כקופסה מחליקה על פני המשפט. הנה זה עבור n-grams של 3 מילים, ה-n-gram מודגש בכל משפט:
1. <u>**השועל האדום המהיר**</u> קפץ מעל הכלב החום העצלן
2. השועל **<u>האדום המהיר קפץ</u>** מעל הכלב החום העצלן
3. השועל האדום **<u>המהיר קפץ מעל</u>** הכלב החום העצלן
4. השועל האדום המהיר **<u>קפץ מעל הכלב</u>** החום העצלן
5. השועל האדום המהיר קפץ **<u>מעל הכלב החום</u>** העצלן
6. השועל האדום המהיר קפץ מעל <u>**הכלב החום העצלן**</u>
![חלון מחליק של n-grams](../../../../6-NLP/2-Tasks/images/n-grams.gif)
> ערך n-gram של 3: אינפוגרפיקה מאת [Jen Looper](https://twitter.com/jenlooper)
### חילוץ ביטויי שם עצם
ברוב המשפטים יש שם עצם שהוא הנושא או המושא של המשפט. באנגלית, ניתן לזהות אותו לעיתים קרובות ככזה שמקדים אותו 'a', 'an' או 'the'. זיהוי הנושא או המושא של משפט על ידי 'חילוץ ביטוי שם עצם' הוא משימה נפוצה ב-NLP כאשר מנסים להבין את משמעות המשפט.
✅ במשפט "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun.", האם תוכלו לזהות את ביטויי שם העצם?
במשפט `השועל האדום המהיר קפץ מעל הכלב החום העצלן` ישנם 2 ביטויי שם עצם: **השועל האדום המהיר** ו-**הכלב החום העצלן**.
### ניתוח רגשות
ניתן לנתח משפט או טקסט כדי לקבוע את הרגש שבו, או עד כמה הוא *חיובי* או *שלילי*. רגש נמדד ב-*קוטביות* וב-*אובייקטיביות/סובייקטיביות*. קוטביות נמדדת מ-1.0- עד 1.0 (שלילי עד חיובי) ו-0.0 עד 1.0 (הכי אובייקטיבי עד הכי סובייקטיבי).
✅ בהמשך תלמדו שיש דרכים שונות לקבוע רגש באמצעות למידת מכונה, אך דרך אחת היא להחזיק רשימה של מילים וביטויים שמסווגים כחיוביים או שליליים על ידי מומחה אנושי וליישם את המודל הזה על טקסט כדי לחשב ציון קוטביות. האם אתם יכולים לראות כיצד זה יעבוד בנסיבות מסוימות ופחות טוב באחרות?
### נטייה
נטייה מאפשרת לכם לקחת מילה ולקבל את הצורה היחידית או הרבים שלה.
### לממטיזציה
*למה* היא השורש או המילה הראשית עבור קבוצת מילים, למשל *flew*, *flies*, *flying* יש להן למה של הפועל *fly*.
ישנם גם מאגרי נתונים שימושיים זמינים לחוקר NLP, במיוחד:
### WordNet
[WordNet](https://wordnet.princeton.edu/) הוא מאגר נתונים של מילים, מילים נרדפות, מילים מנוגדות ועוד פרטים רבים עבור כל מילה בשפות רבות ושונות. הוא שימושי מאוד כאשר מנסים לבנות תרגומים, בודקי איות או כלים לשפה מכל סוג.
## ספריות NLP
למזלכם, אין צורך לבנות את כל הטכניקות הללו בעצמכם, שכן ישנן ספריות Python מצוינות שמקלות מאוד על מפתחים שאינם מתמחים בעיבוד שפה טבעית או למידת מכונה. השיעורים הבאים כוללים דוגמאות נוספות לכך, אך כאן תלמדו כמה דוגמאות שימושיות שיעזרו לכם במשימה הבאה.
### תרגיל - שימוש בספריית `TextBlob`
בואו נשתמש בספרייה בשם TextBlob שכן היא מכילה APIs מועילים להתמודדות עם סוגי משימות אלו. TextBlob "עומדת על כתפיהם של ענקים כמו [NLTK](https://nltk.org) ו-[pattern](https://github.com/clips/pattern), ומשתלבת היטב עם שניהם." יש לה כמות משמעותית של למידת מכונה מובנית ב-API שלה.
> הערה: מדריך [Quick Start](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) שימושי זמין עבור TextBlob ומומלץ למפתחי Python מנוסים.
בעת ניסיון לזהות *ביטויי שם עצם*, TextBlob מציעה מספר אפשרויות של מחלצים למציאת ביטויי שם עצם.
1. הסתכלו על `ConllExtractor`.
```python
from textblob import TextBlob
from textblob.np_extractors import ConllExtractor
# import and create a Conll extractor to use later
extractor = ConllExtractor()
# later when you need a noun phrase extractor:
user_input = input("> ")
user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified
np = user_input_blob.noun_phrases
```
> מה קורה כאן? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) הוא "מחלץ ביטויי שם עצם שמשתמש בניתוח תחבירי מבוסס על קורפוס האימון ConLL-2000." ConLL-2000 מתייחס לוועידת Computational Natural Language Learning בשנת 2000. בכל שנה הוועידה אירחה סדנה להתמודד עם בעיית NLP מורכבת, ובשנת 2000 זו הייתה חלוקת שמות עצם. מודל אומן על עיתון Wall Street Journal, עם "סעיפים 15-18 כנתוני אימון (211727 טוקנים) וסעיף 20 כנתוני בדיקה (47377 טוקנים)". תוכלו לראות את ההליכים ששימשו [כאן](https://www.clips.uantwerpen.be/conll2000/chunking/) ואת [התוצאות](https://ifarm.nl/erikt/research/np-chunking.html).
### אתגר - שיפור הבוט שלכם עם NLP
בשיעור הקודם בניתם בוט שאלות ותשובות פשוט מאוד. עכשיו, תשפרו את מרווין ותגרמו לו להיות קצת יותר אמפתי על ידי ניתוח הקלט שלכם לרגש והדפסת תגובה שתתאים לרגש. תצטרכו גם לזהות `noun_phrase` ולשאול עליו.
השלבים שלכם בבניית בוט שיחה טוב יותר:
1. הדפיסו הוראות שמייעצות למשתמש כיצד לתקשר עם הבוט
2. התחילו לולאה
1. קבלו קלט מהמשתמש
2. אם המשתמש ביקש לצאת, צאו
3. עבדו את קלט המשתמש וקבעו תגובת רגש מתאימה
4. אם זוהה ביטוי שם עצם ברגש, הפכו אותו לרבים ושאלו על הנושא
5. הדפיסו תגובה
3. חזרו לשלב 2
הנה קטע קוד לקביעת רגש באמצעות TextBlob. שימו לב שיש רק ארבע *דרגות* של תגובת רגש (אתם יכולים להוסיף יותר אם תרצו):
```python
if user_input_blob.polarity <= -0.5:
response = "Oh dear, that sounds bad. "
elif user_input_blob.polarity <= 0:
response = "Hmm, that's not great. "
elif user_input_blob.polarity <= 0.5:
response = "Well, that sounds positive. "
elif user_input_blob.polarity <= 1:
response = "Wow, that sounds great. "
```
הנה דוגמת פלט שתנחה אתכם (קלט המשתמש מופיע בשורות שמתחילות ב->):
```output
Hello, I am Marvin, the friendly robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am ok
Well, that sounds positive. Can you tell me more?
> I went for a walk and saw a lovely cat
Well, that sounds positive. Can you tell me more about lovely cats?
> cats are the best. But I also have a cool dog
Wow, that sounds great. Can you tell me more about cool dogs?
> I have an old hounddog but he is sick
Hmm, that's not great. Can you tell me more about old hounddogs?
> bye
It was nice talking to you, goodbye!
```
פתרון אפשרי למשימה נמצא [כאן](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py)
✅ בדיקת ידע
1. האם אתם חושבים שהתגובות האמפתיות יגרמו למישהו לחשוב שהבוט באמת מבין אותו?
2. האם זיהוי ביטוי שם עצם הופך את הבוט ליותר 'אמין'?
3. מדוע חילוץ 'ביטוי שם עצם' ממשפט הוא דבר שימושי לעשות?
---
ממשו את הבוט בבדיקת הידע הקודמת ונסו אותו על חבר. האם הוא יכול להטעות אותם? האם תוכלו להפוך את הבוט שלכם ליותר 'אמין'?
## 🚀אתגר
קחו משימה בבדיקת הידע הקודמת ונסו לממש אותה. נסו את הבוט על חבר. האם הוא יכול להטעות אותם? האם תוכלו להפוך את הבוט שלכם ליותר 'אמין'?
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
בשיעורים הבאים תלמדו יותר על ניתוח רגשות. חקרו את הטכניקה המעניינת הזו במאמרים כמו אלו ב-[KDNuggets](https://www.kdnuggets.com/tag/nlp)
## משימה
[גרמו לבוט לדבר בחזרה](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2efc4c2aba5ed06c780c05539c492ae3",
"translation_date": "2025-09-05T20:27:59+00:00",
"source_file": "6-NLP/2-Tasks/assignment.md",
"language_code": "he"
}
-->
# לגרום לבוט להגיב
## הוראות
בשיעורים הקודמים, תכנתת בוט בסיסי שאפשר לשוחח איתו. הבוט הזה נותן תשובות אקראיות עד שתגיד 'bye'. האם תוכל לגרום לתשובות להיות קצת פחות אקראיות, ולהפעיל תגובות אם תגיד דברים ספציפיים, כמו 'למה' או 'איך'? חשוב קצת איך למידת מכונה יכולה להפוך את העבודה הזו לפחות ידנית בזמן שאתה מרחיב את הבוט שלך. אתה יכול להשתמש בספריות NLTK או TextBlob כדי להקל על המשימות שלך.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ------------------------------------------- | ---------------------------------------------- | ----------------------- |
| | קובץ bot.py חדש מוצג ומתועד | קובץ בוט חדש מוצג אך מכיל באגים | קובץ לא מוצג |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. אנו לא נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,200 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "be03c8182982b87ced155e4e9d1438e8",
"translation_date": "2025-09-05T20:38:56+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/README.md",
"language_code": "he"
}
-->
# תרגום וניתוח רגשות עם למידת מכונה
בשיעורים הקודמים למדתם כיצד לבנות בוט בסיסי באמצעות `TextBlob`, ספרייה שמשתמשת בלמידת מכונה מאחורי הקלעים כדי לבצע משימות בסיסיות של עיבוד שפה טבעית כמו חילוץ ביטויי שם עצם. אתגר חשוב נוסף בבלשנות חישובית הוא תרגום מדויק של משפט משפה מדוברת או כתובה אחת לשפה אחרת.
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
תרגום הוא בעיה קשה מאוד, במיוחד לאור העובדה שיש אלפי שפות שלכל אחת מהן כללי דקדוק שונים מאוד. גישה אחת היא להמיר את כללי הדקדוק הפורמליים של שפה אחת, כמו אנגלית, למבנה שאינו תלוי בשפה, ואז לתרגם אותו על ידי המרה חזרה לשפה אחרת. גישה זו כוללת את השלבים הבאים:
1. **זיהוי**. זיהוי או תיוג של המילים בשפת המקור כעצם, פועל וכו'.
2. **יצירת תרגום**. הפקת תרגום ישיר של כל מילה בפורמט של שפת היעד.
### משפט לדוגמה, מאנגלית לאירית
ב'אנגלית', המשפט _I feel happy_ מורכב משלוש מילים בסדר הבא:
- **נושא** (I)
- **פועל** (feel)
- **תואר** (happy)
עם זאת, בשפה 'אירית', לאותו משפט יש מבנה דקדוקי שונה מאוד - רגשות כמו "*שמח*" או "*עצוב*" מתוארים כמשהו *שעליך*.
הביטוי האנגלי `I feel happy` באירית יהיה `Tá athas orm`. תרגום *מילולי* יהיה `שמח עליי`.
דובר אירית שמתרגם לאנגלית יאמר `I feel happy`, ולא `Happy is upon me`, כי הוא מבין את משמעות המשפט, גם אם המילים ומבנה המשפט שונים.
הסדר הפורמלי של המשפט באירית הוא:
- **פועל** (Tá או is)
- **תואר** (athas, או happy)
- **נושא** (orm, או עליי)
## תרגום
תוכנית תרגום נאיבית עשויה לתרגם מילים בלבד, תוך התעלמות ממבנה המשפט.
✅ אם למדתם שפה שנייה (או שלישית או יותר) כמבוגרים, ייתכן שהתחלתם לחשוב בשפת האם שלכם, לתרגם מושגים מילה במילה בראשכם לשפה השנייה, ואז לומר את התרגום שלכם. זה דומה למה שתוכניות תרגום נאיביות עושות. חשוב להתקדם מעבר לשלב הזה כדי להגיע לשטף!
תרגום נאיבי מוביל לתרגומים גרועים (ולפעמים מצחיקים): `I feel happy` מתורגם באופן מילולי ל-`Mise bhraitheann athas` באירית. זה אומר (מילולית) `אני מרגיש שמח` ואינו משפט אירי תקני. למרות שאנגלית ואירית הן שפות המדוברות בשני איים שכנים, הן שפות שונות מאוד עם מבני דקדוק שונים.
> תוכלו לצפות בכמה סרטונים על מסורות לשוניות איריות כמו [זה](https://www.youtube.com/watch?v=mRIaLSdRMMs)
### גישות למידת מכונה
עד כה, למדתם על הגישה של כללים פורמליים לעיבוד שפה טבעית. גישה נוספת היא להתעלם ממשמעות המילים, ו_במקום זאת להשתמש בלמידת מכונה כדי לזהות דפוסים_. זה יכול לעבוד בתרגום אם יש לכם הרבה טקסטים (*corpus*) או טקסטים (*corpora*) בשפת המקור ובשפת היעד.
לדוגמה, שקלו את המקרה של *גאווה ודעה קדומה*, רומן אנגלי ידוע שנכתב על ידי ג'יין אוסטן בשנת 1813. אם תעיינו בספר באנגלית ובתרגום אנושי של הספר ל*צרפתית*, תוכלו לזהות ביטויים באחד שמתורגמים באופן ידיומטי_ לשני. תעשו זאת בעוד רגע.
לדוגמה, כאשר ביטוי באנגלית כמו `I have no money` מתורגם באופן מילולי לצרפתית, הוא עשוי להפוך ל-`Je n'ai pas de monnaie`. "Monnaie" הוא 'דמיון שווא' צרפתי מסובך, שכן 'money' ו-'monnaie' אינם מילים נרדפות. תרגום טוב יותר שדובר אנושי עשוי לעשות יהיה `Je n'ai pas d'argent`, כי הוא מעביר טוב יותר את המשמעות שאין לך כסף (ולא 'כסף קטן' שהוא המשמעות של 'monnaie').
![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png)
> תמונה מאת [Jen Looper](https://twitter.com/jenlooper)
אם למודל למידת מכונה יש מספיק תרגומים אנושיים לבניית מודל, הוא יכול לשפר את דיוק התרגומים על ידי זיהוי דפוסים נפוצים בטקסטים שתורגמו בעבר על ידי דוברים אנושיים מומחים של שתי השפות.
### תרגיל - תרגום
תוכלו להשתמש ב-`TextBlob` כדי לתרגם משפטים. נסו את השורה הראשונה המפורסמת של **גאווה ודעה קדומה**:
```python
from textblob import TextBlob
blob = TextBlob(
"It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife!"
)
print(blob.translate(to="fr"))
```
`TextBlob` עושה עבודה די טובה בתרגום: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!".
אפשר לטעון שהתרגום של TextBlob מדויק הרבה יותר, למעשה, מהתרגום הצרפתי של הספר משנת 1932 על ידי V. Leconte ו-Ch. Pressoir:
"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles."
במקרה זה, התרגום המבוסס על למידת מכונה עושה עבודה טובה יותר מהמתרגם האנושי שהוסיף מילים מיותרות לפיו של המחבר המקורי לצורך 'בהירות'.
> מה קורה כאן? ולמה TextBlob כל כך טוב בתרגום? ובכן, מאחורי הקלעים, הוא משתמש ב-Google Translate, AI מתוחכם שמסוגל לנתח מיליוני ביטויים כדי לחזות את המחרוזות הטובות ביותר למשימה. אין כאן שום דבר ידני ואתם צריכים חיבור לאינטרנט כדי להשתמש ב-`blob.translate`.
✅ נסו עוד משפטים. מה עדיף, תרגום בלמידת מכונה או תרגום אנושי? באילו מקרים?
## ניתוח רגשות
תחום נוסף שבו למידת מכונה יכולה לעבוד היטב הוא ניתוח רגשות. גישה שאינה מבוססת למידת מכונה לניתוח רגשות היא לזהות מילים וביטויים שהם 'חיוביים' ו'שליליים'. לאחר מכן, בהתחשב בטקסט חדש, לחשב את הערך הכולל של המילים החיוביות, השליליות והנייטרליות כדי לזהות את הרגש הכללי.
גישה זו ניתנת להטעיה בקלות כפי שראיתם במשימת מרווין - המשפט `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` הוא משפט סרקסטי עם רגש שלילי, אך האלגוריתם הפשוט מזהה 'great', 'wonderful', 'glad' כחיוביים ו-'waste', 'lost' ו-'dark' כשליליים. הרגש הכללי מושפע מהמילים הסותרות הללו.
✅ עצרו רגע וחשבו כיצד אנו מעבירים סרקזם כדוברים אנושיים. אינטונציה משחקת תפקיד גדול. נסו לומר את המשפט "Well, that film was awesome" בדרכים שונות כדי לגלות כיצד הקול שלכם מעביר משמעות.
### גישות למידת מכונה
הגישה של למידת מכונה תהיה לאסוף באופן ידני גופי טקסט שליליים וחיוביים - ציוצים, או ביקורות סרטים, או כל דבר שבו האדם נתן ציון *וגם* דעה כתובה. לאחר מכן ניתן ליישם טכניקות עיבוד שפה טבעית על דעות וציונים, כך שדפוסים יופיעו (לדוגמה, ביקורות סרטים חיוביות נוטות לכלול את הביטוי 'Oscar worthy' יותר מאשר ביקורות שליליות, או ביקורות מסעדות חיוביות אומרות 'gourmet' הרבה יותר מאשר 'disgusting').
> ⚖️ **דוגמה**: אם עבדתם במשרד של פוליטיקאי ויש חוק חדש שנדון, ייתכן שתושבים יכתבו למשרד עם מיילים שתומכים או מתנגדים לחוק החדש. נניח שאתם מתבקשים לקרוא את המיילים ולמיין אותם לשתי ערימות, *בעד* ו-*נגד*. אם היו הרבה מיילים, ייתכן שתהיו מוצפים בניסיון לקרוא את כולם. לא יהיה נחמד אם בוט יוכל לקרוא את כולם עבורכם, להבין אותם ולומר לכם לאיזו ערימה כל מייל שייך?
>
> דרך אחת להשיג זאת היא להשתמש בלמידת מכונה. הייתם מאמנים את המודל עם חלק מהמיילים ה*נגד* וחלק מהמיילים ה*בעד*. המודל היה נוטה לשייך ביטויים ומילים לצד הנגד ולצד הבעד, *אך הוא לא היה מבין שום תוכן*, רק שמילים ודפוסים מסוימים נוטים להופיע יותר במיילים נגד או בעד. הייתם בודקים אותו עם כמה מיילים שלא השתמשתם בהם כדי לאמן את המודל, ורואים אם הוא הגיע לאותה מסקנה כמוכם. לאחר מכן, ברגע שהייתם מרוצים מהדיוק של המודל, הייתם יכולים לעבד מיילים עתידיים מבלי לקרוא כל אחד מהם.
✅ האם התהליך הזה נשמע כמו תהליכים שהשתמשתם בהם בשיעורים קודמים?
## תרגיל - משפטים רגשיים
רגש נמדד עם *קוטביות* של -1 עד 1, כלומר -1 הוא הרגש השלילי ביותר, ו-1 הוא הרגש החיובי ביותר. רגש נמדד גם עם ציון של 0 - 1 עבור אובייקטיביות (0) וסובייקטיביות (1).
הסתכלו שוב על *גאווה ודעה קדומה* של ג'יין אוסטן. הטקסט זמין כאן ב-[Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). הדוגמה למטה מציגה תוכנית קצרה שמנתחת את הרגש של המשפטים הראשונים והאחרונים מהספר ומציגה את קוטביות הרגש ואת ציון הסובייקטיביות/אובייקטיביות.
עליכם להשתמש בספריית `TextBlob` (שתוארה לעיל) כדי לקבוע `sentiment` (אין צורך לכתוב מחשבון רגשות משלכם) במשימה הבאה.
```python
from textblob import TextBlob
quote1 = """It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want of a wife."""
quote2 = """Darcy, as well as Elizabeth, really loved them; and they were both ever sensible of the warmest gratitude towards the persons who, by bringing her into Derbyshire, had been the means of uniting them."""
sentiment1 = TextBlob(quote1).sentiment
sentiment2 = TextBlob(quote2).sentiment
print(quote1 + " has a sentiment of " + str(sentiment1))
print(quote2 + " has a sentiment of " + str(sentiment2))
```
אתם רואים את הפלט הבא:
```output
It is a truth universally acknowledged, that a single man in possession of a good fortune, must be in want # of a wife. has a sentiment of Sentiment(polarity=0.20952380952380953, subjectivity=0.27142857142857146)
Darcy, as well as Elizabeth, really loved them; and they were
both ever sensible of the warmest gratitude towards the persons
who, by bringing her into Derbyshire, had been the means of
uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8)
```
## אתגר - בדיקת קוטביות רגשית
המשימה שלכם היא לקבוע, באמצעות קוטביות רגשית, האם ל-*גאווה ודעה קדומה* יש יותר משפטים חיוביים לחלוטין מאשר שליליים לחלוטין. לצורך משימה זו, תוכלו להניח שקוטביות של 1 או -1 היא חיובית לחלוטין או שלילית לחלוטין בהתאמה.
**שלבים:**
1. הורידו [עותק של גאווה ודעה קדומה](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) מ-Project Gutenberg כקובץ .txt. הסירו את המטא-דאטה בתחילת ובסוף הקובץ, והשאירו רק את הטקסט המקורי
2. פתחו את הקובץ ב-Python והוציאו את התוכן כמחרוזת
3. צרו TextBlob באמצעות מחרוזת הספר
4. נתחו כל משפט בספר בלולאה
1. אם הקוטביות היא 1 או -1, אחסנו את המשפט במערך או רשימה של הודעות חיוביות או שליליות
5. בסוף, הדפיסו את כל המשפטים החיוביים והשליליים (בנפרד) ואת המספר של כל אחד.
הנה [פתרון לדוגמה](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb).
✅ בדיקת ידע
1. הרגש מבוסס על מילים שנמצאות במשפט, אבל האם הקוד *מבין* את המילים?
2. האם לדעתכם קוטביות הרגש מדויקת, או במילים אחרות, האם אתם *מסכימים* עם הציונים?
1. במיוחד, האם אתם מסכימים או לא מסכימים עם הקוטביות החיובית **המוחלטת** של המשפטים הבאים?
* “What an excellent father you have, girls!” said she, when the door was shut.
* “Your examination of Mr. Darcy is over, I presume,” said Miss Bingley; “and pray what is the result?” “I am perfectly convinced by it that Mr. Darcy has no defect.
* How wonderfully these sort of things occur!
* I have the greatest dislike in the world to that sort of thing.
* Charlotte is an excellent manager, I dare say.
* “This is delightful indeed!
* I am so happy!
* Your idea of the ponies is delightful.
2. שלושת המשפטים הבאים דורגו עם קוטביות חיובית מוחלטת, אבל בקריאה מעמיקה, הם אינם משפטים חיוביים. מדוע ניתוח הרגש חשב שהם משפטים חיוביים?
* Happy shall I be, when his stay at Netherfield is over!” “I wish I could say anything to comfort you,” replied Elizabeth; “but it is wholly out of my power.
* If I could but see you as happy!
* Our distress, my dear Lizzy, is very great.
3. האם אתם מסכימים או לא מסכימים עם הקוטביות השלילית **המוחלטת** של המשפטים הבאים?
- Everybody is disgusted with his pride.
- “I should like to know how he behaves among strangers.” “You shall hear then—but prepare yourself for something very dreadful.
- The pause was to Elizabeths feelings dreadful.
- It would be dreadful!
✅ כל חובב של ג'יין אוסטן יבין שהיא לעיתים קרובות משתמשת בספריה כדי לבקר את ההיבטים המגוחכים יותר של החברה האנגלית בתקופת הריג'נסי. אליזבת בנט, הדמות הראשית ב-*גאווה ודעה קדומה*, היא צופה חברתית חדה (כמו המחברת) והשפה שלה לעיתים קרובות מאוד מעודנת. אפילו מר דארסי (מושא האהבה בסיפור) מציין את השימוש המשחקי והמתגרה של אליזבת בשפה: "היה לי העונג להכיר אותך מספיק זמן כדי לדעת שאת נהנית מאוד מדי פעם להביע דעות שאינן באמת שלך."
---
## 🚀אתגר
האם תוכלו לשפר את מרווין על ידי חילוץ תכונות נוספות מהקלט של המשתמש?
## [שאלון אחרי השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
ישנן דרכים רבות להפיק רגשות מטקסט. חשבו על יישומים עסקיים שיכולים להשתמש בטכניקה זו. חשבו על איך זה יכול להשתבש. קראו עוד על מערכות מתקדמות המוכנות לשימוש ארגוני שמנתחות רגשות, כמו [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). בדקו כמה מהמשפטים מתוך "גאווה ודעה קדומה" למעלה וראו אם ניתן לזהות בהם ניואנסים.
## משימה
[רישיון פואטי](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9d2a734deb904caff310d1a999c6bd7a",
"translation_date": "2025-09-05T20:42:17+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/assignment.md",
"language_code": "he"
}
-->
# רישיון פואטי
## הוראות
ב[מחברת זו](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) תוכלו למצוא מעל 500 שירים של אמילי דיקינסון, שכבר נותחו בעבר מבחינת רגשות באמצעות שירות ניתוח טקסט של Azure. באמצעות מערך נתונים זה, נתחו אותו באמצעות הטכניקות שתוארו בשיעור. האם הרגש המוצע של שיר תואם את ההחלטה של שירות Azure המתקדם יותר? מדוע כן או לא, לדעתכם? האם משהו הפתיע אתכם?
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ------------------------------------------------------------------------ | ----------------------------------------------------- | ----------------------- |
| | מוצגת מחברת עם ניתוח מעמיק של דוגמת הפלט של המחבר | המחברת אינה מלאה או אינה מבצעת ניתוח | לא מוצגת מחברת |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T20:43:00+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T20:42:43+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/R/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,417 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "8d32dadeda93c6fb5c43619854882ab1",
"translation_date": "2025-09-05T20:29:24+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/README.md",
"language_code": "he"
}
-->
# ניתוח רגשות עם ביקורות על מלונות - עיבוד הנתונים
בפרק זה תשתמשו בטכניקות שלמדתם בשיעורים הקודמים כדי לבצע ניתוח נתונים חקרני על מערך נתונים גדול. לאחר שתבינו היטב את השימושיות של העמודות השונות, תלמדו:
- כיצד להסיר עמודות שאינן נחוצות
- כיצד לחשב נתונים חדשים בהתבסס על עמודות קיימות
- כיצד לשמור את מערך הנתונים המתקבל לשימוש באתגר הסופי
## [מבחן מקדים להרצאה](https://ff-quizzes.netlify.app/en/ml/)
### מבוא
עד כה למדתם כיצד נתוני טקסט שונים מאוד מסוגי נתונים מספריים. אם מדובר בטקסט שנכתב או נאמר על ידי אדם, ניתן לנתח אותו כדי למצוא דפוסים ותדירויות, רגשות ומשמעויות. השיעור הזה לוקח אתכם למערך נתונים אמיתי עם אתגר אמיתי: **[515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** הכולל [רישיון CC0: Public Domain](https://creativecommons.org/publicdomain/zero/1.0/). הנתונים נגרדו מ-Booking.com ממקורות ציבוריים. יוצר מערך הנתונים הוא Jiashen Liu.
### הכנה
תצטרכו:
* יכולת להריץ מחברות .ipynb באמצעות Python 3
* pandas
* NLTK, [שאותו יש להתקין באופן מקומי](https://www.nltk.org/install.html)
* מערך הנתונים הזמין ב-Kaggle [515K Hotel Reviews Data in Europe](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). גודלו כ-230 MB לאחר חילוץ. הורידו אותו לתיקיית השורש `/data` המשויכת לשיעורי NLP אלו.
## ניתוח נתונים חקרני
האתגר הזה מניח שאתם בונים בוט המלצות למלונות באמצעות ניתוח רגשות ודירוגי אורחים. מערך הנתונים שבו תשתמשו כולל ביקורות על 1493 מלונות שונים ב-6 ערים.
באמצעות Python, מערך נתונים של ביקורות על מלונות, וניתוח רגשות של NLTK תוכלו לגלות:
* מהם המילים והביטויים הנפוצים ביותר בביקורות?
* האם *תגיות* רשמיות המתארות מלון מתואמות עם דירוגי ביקורות (לדוגמה, האם יש יותר ביקורות שליליות עבור מלון מסוים מ-*משפחה עם ילדים קטנים* מאשר מ-*מטייל יחיד*, אולי מצביע על כך שהוא מתאים יותר ל-*מטיילים יחידים*)?
* האם דירוגי הרגשות של NLTK 'מסכימים' עם הדירוג המספרי של המבקר?
#### מערך הנתונים
בואו נחקור את מערך הנתונים שהורדתם ושמרתם באופן מקומי. פתחו את הקובץ בעורך כמו VS Code או אפילו Excel.
הכותרות במערך הנתונים הן כדלקמן:
*Hotel_Address, Additional_Number_of_Scoring, Review_Date, Average_Score, Hotel_Name, Reviewer_Nationality, Negative_Review, Review_Total_Negative_Word_Counts, Total_Number_of_Reviews, Positive_Review, Review_Total_Positive_Word_Counts, Total_Number_of_Reviews_Reviewer_Has_Given, Reviewer_Score, Tags, days_since_review, lat, lng*
הנה הן מקובצות בצורה שעשויה להיות קלה יותר לבדיקה:
##### עמודות מלון
* `Hotel_Name`, `Hotel_Address`, `lat` (קו רוחב), `lng` (קו אורך)
* באמצעות *lat* ו-*lng* תוכלו למפות מיקום המלונות עם Python (אולי בצבעים שונים עבור ביקורות חיוביות ושליליות)
* Hotel_Address אינו שימושי במיוחד עבורנו, וכנראה נחליף אותו במדינה לצורך מיון וחיפוש קלים יותר
**עמודות מטא-ביקורת של מלון**
* `Average_Score`
* לפי יוצר מערך הנתונים, עמודה זו היא *הציון הממוצע של המלון, מחושב על סמך התגובה האחרונה בשנה האחרונה*. זו נראית דרך לא שגרתית לחשב את הציון, אך אלו הנתונים שנגרדו ולכן נוכל לקבלם כפי שהם לעת עתה.
✅ בהתבסס על העמודות האחרות במערך הנתונים, האם תוכלו לחשוב על דרך אחרת לחשב את הציון הממוצע?
* `Total_Number_of_Reviews`
* המספר הכולל של הביקורות שהמלון קיבל - לא ברור (ללא כתיבת קוד) אם זה מתייחס לביקורות במערך הנתונים.
* `Additional_Number_of_Scoring`
* פירושו שניתן ציון ביקורת אך לא נכתבה ביקורת חיובית או שלילית על ידי המבקר
**עמודות ביקורת**
- `Reviewer_Score`
- זהו ערך מספרי עם מקסימום ספרה עשרונית אחת בין הערכים המינימליים והמקסימליים 2.5 ו-10
- לא מוסבר מדוע 2.5 הוא הציון הנמוך ביותר האפשרי
- `Negative_Review`
- אם מבקר לא כתב דבר, שדה זה יכיל "**No Negative**"
- שימו לב שמבקר עשוי לכתוב ביקורת חיובית בעמודת הביקורת השלילית (לדוגמה, "אין שום דבר רע במלון הזה")
- `Review_Total_Negative_Word_Counts`
- ספירת מילים שליליות גבוהה יותר מצביעה על ציון נמוך יותר (ללא בדיקת הרגש)
- `Positive_Review`
- אם מבקר לא כתב דבר, שדה זה יכיל "**No Positive**"
- שימו לב שמבקר עשוי לכתוב ביקורת שלילית בעמודת הביקורת החיובית (לדוגמה, "אין שום דבר טוב במלון הזה בכלל")
- `Review_Total_Positive_Word_Counts`
- ספירת מילים חיוביות גבוהה יותר מצביעה על ציון גבוה יותר (ללא בדיקת הרגש)
- `Review_Date` ו-`days_since_review`
- ניתן ליישם מדד של טריות או התיישנות על ביקורת (ביקורות ישנות עשויות להיות פחות מדויקות מביקורות חדשות מכיוון שהניהול השתנה, או שיפוצים בוצעו, או נוספה בריכה וכו')
- `Tags`
- אלו תיאורים קצרים שמבקר עשוי לבחור כדי לתאר את סוג האורח שהוא היה (לדוגמה, יחיד או משפחה), סוג החדר שהיה לו, משך השהות ואופן הגשת הביקורת.
- למרבה הצער, השימוש בתגיות אלו בעייתי, בדקו את הסעיף למטה שמדבר על השימושיות שלהן
**עמודות מבקר**
- `Total_Number_of_Reviews_Reviewer_Has_Given`
- זה עשוי להיות גורם במודל המלצות, למשל, אם תוכלו לקבוע שמבקרים פורים יותר עם מאות ביקורות היו נוטים יותר להיות שליליים מאשר חיוביים. עם זאת, המבקר של כל ביקורת מסוימת אינו מזוהה עם קוד ייחודי, ולכן לא ניתן לקשר אותו למערך ביקורות. ישנם 30 מבקרים עם 100 או יותר ביקורות, אך קשה לראות כיצד זה יכול לסייע במודל ההמלצות.
- `Reviewer_Nationality`
- יש אנשים שעשויים לחשוב שלאומים מסוימים נוטים יותר לתת ביקורת חיובית או שלילית בגלל נטייה לאומית. היו זהירים בבניית השקפות אנקדוטליות כאלה לתוך המודלים שלכם. אלו סטריאוטיפים לאומיים (ולפעמים גזעיים), וכל מבקר היה אדם שכתב ביקורת על סמך חווייתו. ייתכן שהיא סוננה דרך עדשות רבות כמו שהיותיו הקודמות במלונות, המרחק שנסע, והטמפרמנט האישי שלו. קשה להצדיק את המחשבה שהלאום היה הסיבה לציון הביקורת.
##### דוגמאות
| ציון ממוצע | מספר כולל של ביקורות | ציון מבקר | ביקורת שלילית | ביקורת חיובית | תגיות |
| ----------- | ---------------------- | --------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ----------------------------------------------------------------------------------------- |
| 7.8 | 1945 | 2.5 | זה כרגע לא מלון אלא אתר בנייה. הטרידו אותי מהבוקר המוקדם ועד כל היום עם רעש בנייה בלתי נסבל בזמן מנוחה לאחר נסיעה ארוכה ועבודה בחדר. אנשים עבדו כל היום עם פטישי אוויר בחדרים סמוכים. ביקשתי להחליף חדר אך לא היה חדר שקט זמין. כדי להחמיר את המצב, חויבתי יתר על המידה. יצאתי בערב מכיוון שהייתי צריך לעזוב טיסה מוקדמת מאוד וקיבלתי חשבון מתאים. יום לאחר מכן המלון ביצע חיוב נוסף ללא הסכמתי מעבר למחיר שהוזמן. זה מקום נורא. אל תענישו את עצמכם על ידי הזמנה כאן. | שום דבר. מקום נורא. התרחקו. | נסיעת עסקים. זוג. חדר זוגי סטנדרטי. שהייה של 2 לילות. |
כפי שאתם יכולים לראות, האורח הזה לא נהנה מהשהות שלו במלון. למלון יש ציון ממוצע טוב של 7.8 ו-1945 ביקורות, אך המבקר הזה נתן לו 2.5 וכתב 115 מילים על כמה שהשהות שלו הייתה שלילית. אם הוא לא כתב דבר בעמודת הביקורת החיובית, אפשר להסיק שלא היה שום דבר חיובי, אך הוא כתב 7 מילים של אזהרה. אם רק נספור מילים במקום את המשמעות או הרגש של המילים, ייתכן שתהיה לנו תמונה מעוותת של כוונת המבקר. באופן מוזר, הציון שלו של 2.5 מבלבל, כי אם השהות במלון הייתה כל כך גרועה, מדוע לתת לו נקודות בכלל? בחקירת מערך הנתונים מקרוב, תראו שהציון הנמוך ביותר האפשרי הוא 2.5, לא 0. הציון הגבוה ביותר האפשרי הוא 10.
##### תגיות
כפי שצוין לעיל, במבט ראשון, הרעיון להשתמש ב-`Tags` כדי לקטלג את הנתונים נראה הגיוני. למרבה הצער, תגיות אלו אינן סטנדרטיות, מה שאומר שבמלון מסוים, האפשרויות עשויות להיות *Single room*, *Twin room*, ו-*Double room*, אך במלון הבא, הן יהיו *Deluxe Single Room*, *Classic Queen Room*, ו-*Executive King Room*. אלו עשויים להיות אותם דברים, אך יש כל כך הרבה וריאציות שהבחירה הופכת ל:
1. ניסיון לשנות את כל המונחים לסטנדרט יחיד, מה שקשה מאוד, מכיוון שלא ברור מה תהיה דרך ההמרה בכל מקרה (לדוגמה, *Classic single room* ממופה ל-*Single room* אך *Superior Queen Room with Courtyard Garden or City View* קשה יותר למפות)
1. נוכל לקחת גישה של NLP ולמדוד את התדירות של מונחים מסוימים כמו *Solo*, *Business Traveller*, או *Family with young kids* כפי שהם חלים על כל מלון, ולשלב זאת במודל ההמלצות
תגיות הן בדרך כלל (אך לא תמיד) שדה יחיד המכיל רשימה של 5 עד 6 ערכים מופרדים בפסיקים המתאימים ל-*סוג הטיול*, *סוג האורחים*, *סוג החדר*, *מספר הלילות*, ו-*סוג המכשיר שבו הוגשה הביקורת*. עם זאת, מכיוון שחלק מהמבקרים לא ממלאים כל שדה (ייתכן שהם משאירים אחד ריק), הערכים אינם תמיד באותו סדר.
לדוגמה, קחו את *סוג הקבוצה*. ישנם 1025 אפשרויות ייחודיות בשדה זה בעמודת `Tags`, ולמרבה הצער רק חלקן מתייחסות לקבוצה (חלקן הן סוג החדר וכו'). אם תסננו רק את אלו שמזכירים משפחה, התוצאות מכילות הרבה תוצאות מסוג *Family room*. אם תכללו את המונח *with*, כלומר תספרו את הערכים *Family with*, התוצאות טובות יותר, עם מעל 80,000 מתוך 515,000 התוצאות המכילות את הביטוי "Family with young children" או "Family with older children".
זה אומר שעמודת התגיות אינה חסרת תועלת לחלוטין עבורנו, אך יידרש מעט עבודה כדי להפוך אותה לשימושית.
##### ציון ממוצע של מלון
ישנם מספר מוזרויות או אי התאמות במערך הנתונים שאני לא מצליח להבין, אך הן מוצגות כאן כדי שתהיו מודעים להן בעת בניית המודלים שלכם. אם תצליחו להבין, אנא הודיעו לנו במדור הדיונים!
מערך הנתונים כולל את העמודות הבאות הקשורות לציון הממוצע ולמספר הביקורות:
1. Hotel_Name
2. Additional_Number_of_Scoring
3. Average_Score
4. Total_Number_of_Reviews
5. Reviewer_Score
המלון היחיד עם מספר הביקורות הגבוה ביותר במערך הנתונים הזה הוא *Britannia International Hotel Canary Wharf* עם 4789 ביקורות מתוך 515,000. אך אם נסתכל על הערך `Total_Number_of_Reviews` עבור מלון זה, הוא 9086. ניתן להסיק שיש הרבה יותר ציונים ללא ביקורות, ולכן אולי כדאי להוסיף את ערך העמודה `Additional_Number_of_Scoring`. הערך הזה הוא 2682, והוספתו ל-4789 מביאה אותנו ל-7471, שעדיין חסרים 1615 כדי להגיע ל-`Total_Number_of_Reviews`.
אם ניקח את עמודת `Average_Score`, ניתן להסיק שזהו הממוצע של הביקורות במערך הנתונים, אך התיאור מ-Kaggle הוא "*Average Score of the hotel, calculated based on the latest comment in the last year*". זה לא נראה שימושי במיוחד, אך נוכל לחשב ממוצע משלנו בהתבסס על ציוני הביקורות במערך הנתונים. באמצעות אותו מלון כדוגמה, הציון הממוצע של המלון ניתן כ-7.1 אך הציון המחושב (ממוצע ציוני המבקרים *ב*מערך הנתונים) הוא 6.8. זה קרוב, אך לא אותו ערך, ואנו יכולים רק לנחש שהציונים שניתנו בביקורות `Additional_Number_of_Scoring` העלו את הממוצע ל-7.1. למרבה הצער, ללא דרך לבדוק או להוכיח את ההנחה הזו, קשה להשתמש או לסמוך על `Average_Score`, `Additional_Number_of_Scoring` ו-`Total_Number_of_Reviews` כאשר הם מבוססים על, או מתייחסים לנתונים שאין לנו.
כדי לסבך את העניינים עוד יותר, המלון עם מספר הביקורות השני הגבוה ביותר יש לו ציון ממוצע מחושב של 8.12 והציון הממוצע במערך הנתונים הוא 8.1. האם הציון הנכון הוא צירוף מקרים או שהמלון הראשון הוא אי התאמה?
בהנחה שהמלון הזה עשוי להיות חריג, ושאולי רוב הערכים מתאימים (אך חלקם לא מסיבה כלשהי) נכתוב תוכנית קצרה בהמשך כדי לחקור את הערכים במערך הנתונים ולקבוע את השימוש הנכון (או אי השימוש) בערכים.
> 🚨 הערה של זהירות
>
> כאשר עובדים עם מערך הנתונים הזה, תכתבו קוד שמחשב משהו מתוך הטקסט מבלי שתצטרכו לקרוא או לנתח את הטקסט בעצמכם. זו המהות של עיבוד שפה טבעית (NLP), לפרש משמעות או תחושה מבלי שאדם יצטרך לעשות זאת. עם זאת, ייתכן שתתקלו בכמה ביקורות שליליות. אני ממליץ לכם לא לקרוא אותן, כי אין צורך בכך. חלקן טיפשיות או לא רלוונטיות, כמו ביקורות שליליות על מלון בסגנון "מזג האוויר לא היה טוב", דבר שאינו בשליטת המלון, או למעשה, אף אחד. אבל יש גם צד אפל לחלק מהביקורות. לפעמים הביקורות השליליות הן גזעניות, סקסיסטיות, או מפלות על בסיס גיל. זה מצער אך צפוי במערך נתונים שנאסף מאתר ציבורי. ישנם מבקרים שמשאירים ביקורות שתמצאו אותן דוחות, לא נוחות, או מטרידות. עדיף לתת לקוד למדוד את התחושה מאשר לקרוא אותן בעצמכם ולהתעצב. עם זאת, מדובר במיעוט שכותב דברים כאלה, אבל הם קיימים בכל זאת.
## תרגיל - חקר נתונים
### טעינת הנתונים
זה מספיק לבחון את הנתונים באופן חזותי, עכשיו תכתבו קצת קוד ותקבלו תשובות! החלק הזה משתמש בספריית pandas. המשימה הראשונה שלכם היא לוודא שאתם יכולים לטעון ולקרוא את נתוני ה-CSV. לספריית pandas יש טוען CSV מהיר, והתוצאה נשמרת ב-DataFrame, כפי שראיתם בשיעורים הקודמים. ה-CSV שאנחנו טוענים מכיל יותר מחצי מיליון שורות, אבל רק 17 עמודות. pandas מספקת דרכים רבות וחזקות לעבוד עם DataFrame, כולל היכולת לבצע פעולות על כל שורה.
מכאן והלאה בשיעור הזה, יהיו קטעי קוד והסברים על הקוד וגם דיון על מה המשמעות של התוצאות. השתמשו בקובץ _notebook.ipynb_ המצורף עבור הקוד שלכם.
בואו נתחיל בטעינת קובץ הנתונים שבו תשתמשו:
```python
# Load the hotel reviews from CSV
import pandas as pd
import time
# importing time so the start and end time can be used to calculate file loading time
print("Loading data file now, this could take a while depending on file size")
start = time.time()
# df is 'DataFrame' - make sure you downloaded the file to the data folder
df = pd.read_csv('../../data/Hotel_Reviews.csv')
end = time.time()
print("Loading took " + str(round(end - start, 2)) + " seconds")
```
עכשיו כשהנתונים נטענו, אנחנו יכולים לבצע עליהם פעולות. שמרו את הקוד הזה בראש התוכנית שלכם עבור החלק הבא.
## חקר הנתונים
במקרה הזה, הנתונים כבר *נקיים*, כלומר הם מוכנים לעבודה, ואין בהם תווים בשפות אחרות שעלולים להפריע לאלגוריתמים שמצפים לתווים באנגלית בלבד.
✅ ייתכן שתצטרכו לעבוד עם נתונים שדורשים עיבוד ראשוני כדי לעצב אותם לפני יישום טכניקות NLP, אבל לא הפעם. אם הייתם צריכים, איך הייתם מתמודדים עם תווים שאינם באנגלית?
קחו רגע לוודא שברגע שהנתונים נטענו, אתם יכולים לחקור אותם באמצעות קוד. קל מאוד להתמקד בעמודות `Negative_Review` ו-`Positive_Review`. הן מלאות בטקסט טבעי עבור אלגוריתמי ה-NLP שלכם לעיבוד. אבל חכו! לפני שאתם קופצים ל-NLP ולניתוח רגשות, כדאי שתעקבו אחרי הקוד למטה כדי לוודא שהערכים שניתנו בנתונים תואמים לערכים שאתם מחשבים עם pandas.
## פעולות על DataFrame
המשימה הראשונה בשיעור הזה היא לבדוק אם ההנחות הבאות נכונות על ידי כתיבת קוד שבוחן את ה-DataFrame (מבלי לשנות אותו).
> כמו בהרבה משימות תכנות, יש כמה דרכים להשלים את זה, אבל עצה טובה היא לעשות זאת בדרך הפשוטה והקלה ביותר, במיוחד אם זה יהיה קל יותר להבנה כשתחזרו לקוד הזה בעתיד. עם DataFrames, יש API מקיף שלרוב יציע דרך לעשות את מה שאתם רוצים בצורה יעילה.
התייחסו לשאלות הבאות כמשימות קוד ונסו לענות עליהן מבלי להסתכל על הפתרון.
1. הדפיסו את *הצורה* של ה-DataFrame שזה עתה טענתם (הצורה היא מספר השורות והעמודות).
2. חשבו את תדירות הלאומים של הסוקרים:
1. כמה ערכים ייחודיים יש לעמודה `Reviewer_Nationality` ומה הם?
2. איזה לאום של סוקרים הוא הנפוץ ביותר בנתונים (הדפיסו את המדינה ומספר הביקורות)?
3. מהם 10 הלאומים הנפוצים ביותר הבאים ותדירותם?
3. איזה מלון קיבל את מספר הביקורות הגבוה ביותר עבור כל אחד מ-10 הלאומים הנפוצים ביותר?
4. כמה ביקורות יש לכל מלון (תדירות הביקורות לכל מלון) בנתונים?
5. למרות שיש עמודה `Average_Score` לכל מלון בנתונים, אתם יכולים גם לחשב ציון ממוצע (לקחת את הממוצע של כל ציוני הסוקרים בנתונים עבור כל מלון). הוסיפו עמודה חדשה ל-DataFrame שלכם עם הכותרת `Calc_Average_Score` שמכילה את הממוצע המחושב.
6. האם יש מלונות עם אותו ציון (מעוגל למקום העשרוני הראשון) ב-`Average_Score` וב-`Calc_Average_Score`?
1. נסו לכתוב פונקציה ב-Python שמקבלת Series (שורה) כארגומנט ומשווה את הערכים, ומדפיסה הודעה כשהערכים אינם שווים. לאחר מכן השתמשו בשיטה `.apply()` כדי לעבד כל שורה עם הפונקציה.
7. חשבו והדפיסו כמה שורות יש עם ערכים של "No Negative" בעמודה `Negative_Review`.
8. חשבו והדפיסו כמה שורות יש עם ערכים של "No Positive" בעמודה `Positive_Review`.
9. חשבו והדפיסו כמה שורות יש עם ערכים של "No Positive" בעמודה `Positive_Review` **וגם** ערכים של "No Negative" בעמודה `Negative_Review`.
### תשובות בקוד
1. הדפיסו את *הצורה* של ה-DataFrame שזה עתה טענתם (הצורה היא מספר השורות והעמודות).
```python
print("The shape of the data (rows, cols) is " + str(df.shape))
> The shape of the data (rows, cols) is (515738, 17)
```
2. חשבו את תדירות הלאומים של הסוקרים:
1. כמה ערכים ייחודיים יש לעמודה `Reviewer_Nationality` ומה הם?
2. איזה לאום של סוקרים הוא הנפוץ ביותר בנתונים (הדפיסו את המדינה ומספר הביקורות)?
```python
# value_counts() creates a Series object that has index and values in this case, the country and the frequency they occur in reviewer nationality
nationality_freq = df["Reviewer_Nationality"].value_counts()
print("There are " + str(nationality_freq.size) + " different nationalities")
# print first and last rows of the Series. Change to nationality_freq.to_string() to print all of the data
print(nationality_freq)
There are 227 different nationalities
United Kingdom 245246
United States of America 35437
Australia 21686
Ireland 14827
United Arab Emirates 10235
...
Comoros 1
Palau 1
Northern Mariana Islands 1
Cape Verde 1
Guinea 1
Name: Reviewer_Nationality, Length: 227, dtype: int64
```
3. מהם 10 הלאומים הנפוצים ביותר הבאים ותדירותם?
```python
print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.")
# Notice there is a leading space on the values, strip() removes that for printing
# What is the top 10 most common nationalities and their frequencies?
print("The next 10 highest frequency reviewer nationalities are:")
print(nationality_freq[1:11].to_string())
The highest frequency reviewer nationality is United Kingdom with 245246 reviews.
The next 10 highest frequency reviewer nationalities are:
United States of America 35437
Australia 21686
Ireland 14827
United Arab Emirates 10235
Saudi Arabia 8951
Netherlands 8772
Switzerland 8678
Germany 7941
Canada 7894
France 7296
```
3. איזה מלון קיבל את מספר הביקורות הגבוה ביותר עבור כל אחד מ-10 הלאומים הנפוצים ביותר?
```python
# What was the most frequently reviewed hotel for the top 10 nationalities
# Normally with pandas you will avoid an explicit loop, but wanted to show creating a new dataframe using criteria (don't do this with large amounts of data because it could be very slow)
for nat in nationality_freq[:10].index:
# First, extract all the rows that match the criteria into a new dataframe
nat_df = df[df["Reviewer_Nationality"] == nat]
# Now get the hotel freq
freq = nat_df["Hotel_Name"].value_counts()
print("The most reviewed hotel for " + str(nat).strip() + " was " + str(freq.index[0]) + " with " + str(freq[0]) + " reviews.")
The most reviewed hotel for United Kingdom was Britannia International Hotel Canary Wharf with 3833 reviews.
The most reviewed hotel for United States of America was Hotel Esther a with 423 reviews.
The most reviewed hotel for Australia was Park Plaza Westminster Bridge London with 167 reviews.
The most reviewed hotel for Ireland was Copthorne Tara Hotel London Kensington with 239 reviews.
The most reviewed hotel for United Arab Emirates was Millennium Hotel London Knightsbridge with 129 reviews.
The most reviewed hotel for Saudi Arabia was The Cumberland A Guoman Hotel with 142 reviews.
The most reviewed hotel for Netherlands was Jaz Amsterdam with 97 reviews.
The most reviewed hotel for Switzerland was Hotel Da Vinci with 97 reviews.
The most reviewed hotel for Germany was Hotel Da Vinci with 86 reviews.
The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews.
```
4. כמה ביקורות יש לכל מלון (תדירות הביקורות לכל מלון) בנתונים?
```python
# First create a new dataframe based on the old one, removing the uneeded columns
hotel_freq_df = df.drop(["Hotel_Address", "Additional_Number_of_Scoring", "Review_Date", "Average_Score", "Reviewer_Nationality", "Negative_Review", "Review_Total_Negative_Word_Counts", "Positive_Review", "Review_Total_Positive_Word_Counts", "Total_Number_of_Reviews_Reviewer_Has_Given", "Reviewer_Score", "Tags", "days_since_review", "lat", "lng"], axis = 1)
# Group the rows by Hotel_Name, count them and put the result in a new column Total_Reviews_Found
hotel_freq_df['Total_Reviews_Found'] = hotel_freq_df.groupby('Hotel_Name').transform('count')
# Get rid of all the duplicated rows
hotel_freq_df = hotel_freq_df.drop_duplicates(subset = ["Hotel_Name"])
display(hotel_freq_df)
```
| Hotel_Name | Total_Number_of_Reviews | Total_Reviews_Found |
| :----------------------------------------: | :---------------------: | :-----------------: |
| Britannia International Hotel Canary Wharf | 9086 | 4789 |
| Park Plaza Westminster Bridge London | 12158 | 4169 |
| Copthorne Tara Hotel London Kensington | 7105 | 3578 |
| ... | ... | ... |
| Mercure Paris Porte d Orleans | 110 | 10 |
| Hotel Wagner | 135 | 10 |
| Hotel Gallitzinberg | 173 | 8 |
ייתכן שתשימו לב שהתוצאות *שנספרו בנתונים* אינן תואמות את הערך ב-`Total_Number_of_Reviews`. לא ברור אם הערך הזה בנתונים מייצג את מספר הביקורות הכולל שהמלון קיבל, אבל לא כולן נגרפו, או חישוב אחר. `Total_Number_of_Reviews` אינו משמש במודל בגלל חוסר הבהירות הזה.
5. למרות שיש עמודה `Average_Score` לכל מלון בנתונים, אתם יכולים גם לחשב ציון ממוצע (לקחת את הממוצע של כל ציוני הסוקרים בנתונים עבור כל מלון). הוסיפו עמודה חדשה ל-DataFrame שלכם עם הכותרת `Calc_Average_Score` שמכילה את הממוצע המחושב. הדפיסו את העמודות `Hotel_Name`, `Average_Score`, ו-`Calc_Average_Score`.
```python
# define a function that takes a row and performs some calculation with it
def get_difference_review_avg(row):
return row["Average_Score"] - row["Calc_Average_Score"]
# 'mean' is mathematical word for 'average'
df['Calc_Average_Score'] = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
# Add a new column with the difference between the two average scores
df["Average_Score_Difference"] = df.apply(get_difference_review_avg, axis = 1)
# Create a df without all the duplicates of Hotel_Name (so only 1 row per hotel)
review_scores_df = df.drop_duplicates(subset = ["Hotel_Name"])
# Sort the dataframe to find the lowest and highest average score difference
review_scores_df = review_scores_df.sort_values(by=["Average_Score_Difference"])
display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]])
```
ייתכן שתהיתם לגבי הערך `Average_Score` ולמה הוא לפעמים שונה מהממוצע המחושב. מכיוון שאנחנו לא יכולים לדעת למה חלק מהערכים תואמים, אבל אחרים יש להם הבדל, הכי בטוח במקרה הזה להשתמש בציוני הביקורות שיש לנו כדי לחשב את הממוצע בעצמנו. עם זאת, ההבדלים בדרך כלל מאוד קטנים, הנה המלונות עם ההבדל הגדול ביותר בין הממוצע בנתונים לבין הממוצע המחושב:
| Average_Score_Difference | Average_Score | Calc_Average_Score | Hotel_Name |
| :----------------------: | :-----------: | :----------------: | ------------------------------------------: |
| -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria |
| -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery |
| -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans |
| -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel |
| -0.5 | 7.0 | 7.5 | Hotel Royal Elys es |
| ... | ... | ... | ... |
| 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre |
| 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur |
| 0.9 | 6.8 | 5.9 | Villa Eugenie |
| 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux |
| 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar |
עם רק מלון אחד שיש לו הבדל בציון גדול מ-1, זה אומר שאנחנו כנראה יכולים להתעלם מההבדל ולהשתמש בממוצע המחושב.
6. חשבו והדפיסו כמה שורות יש עם ערכים של "No Negative" בעמודה `Negative_Review`.
7. חשבו והדפיסו כמה שורות יש עם ערכים של "No Positive" בעמודה `Positive_Review`.
8. חשבו והדפיסו כמה שורות יש עם ערכים של "No Positive" בעמודה `Positive_Review` **וגם** ערכים של "No Negative" בעמודה `Negative_Review`.
```python
# with lambdas:
start = time.time()
no_negative_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" else False , axis=1)
print("Number of No Negative reviews: " + str(len(no_negative_reviews[no_negative_reviews == True].index)))
no_positive_reviews = df.apply(lambda x: True if x['Positive_Review'] == "No Positive" else False , axis=1)
print("Number of No Positive reviews: " + str(len(no_positive_reviews[no_positive_reviews == True].index)))
both_no_reviews = df.apply(lambda x: True if x['Negative_Review'] == "No Negative" and x['Positive_Review'] == "No Positive" else False , axis=1)
print("Number of both No Negative and No Positive reviews: " + str(len(both_no_reviews[both_no_reviews == True].index)))
end = time.time()
print("Lambdas took " + str(round(end - start, 2)) + " seconds")
Number of No Negative reviews: 127890
Number of No Positive reviews: 35946
Number of both No Negative and No Positive reviews: 127
Lambdas took 9.64 seconds
```
## דרך נוספת
דרך נוספת לספור פריטים ללא Lambdas, ולהשתמש ב-sum כדי לספור את השורות:
```python
# without lambdas (using a mixture of notations to show you can use both)
start = time.time()
no_negative_reviews = sum(df.Negative_Review == "No Negative")
print("Number of No Negative reviews: " + str(no_negative_reviews))
no_positive_reviews = sum(df["Positive_Review"] == "No Positive")
print("Number of No Positive reviews: " + str(no_positive_reviews))
both_no_reviews = sum((df.Negative_Review == "No Negative") & (df.Positive_Review == "No Positive"))
print("Number of both No Negative and No Positive reviews: " + str(both_no_reviews))
end = time.time()
print("Sum took " + str(round(end - start, 2)) + " seconds")
Number of No Negative reviews: 127890
Number of No Positive reviews: 35946
Number of both No Negative and No Positive reviews: 127
Sum took 0.19 seconds
```
ייתכן ששמתם לב שיש 127 שורות שיש להן גם "No Negative" וגם "No Positive" כערכים בעמודות `Negative_Review` ו-`Positive_Review` בהתאמה. זה אומר שהסוקר נתן למלון ציון מספרי, אבל נמנע מלכתוב ביקורת חיובית או שלילית. למרבה המזל מדובר בכמות קטנה של שורות (127 מתוך 515738, או 0.02%), כך שזה כנראה לא יטה את המודל או התוצאות לכיוון מסוים, אבל ייתכן שלא ציפיתם שמאגר נתונים של ביקורות יכיל שורות ללא ביקורות, ולכן כדאי לחקור את הנתונים כדי לגלות שורות כאלה.
עכשיו כשחקרתם את מאגר הנתונים, בשיעור הבא תסננו את הנתונים ותוסיפו ניתוח רגשות.
---
## 🚀אתגר
השיעור הזה מדגים, כפי שראינו בשיעורים קודמים, כמה חשוב להבין את הנתונים ואת המוזרויות שלהם לפני ביצוע פעולות עליהם. נתונים מבוססי טקסט, במיוחד, דורשים בדיקה מדוקדקת. חפרו במאגרי נתונים שונים שמבוססים על טקסט ונסו לגלות אזורים שיכולים להכניס הטיה או רגשות מוטים למודל.
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
קחו [את מסלול הלמידה הזה על NLP](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) כדי לגלות כלים לנסות כשבונים מודלים מבוססי דיבור וטקסט.
## משימה
[NLTK](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,19 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "bf39bceb833cd628f224941dca8041df",
"translation_date": "2025-09-05T20:34:07+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/assignment.md",
"language_code": "he"
}
-->
# NLTK
## הוראות
NLTK היא ספרייה ידועה לשימוש בבלשנות חישובית ועיבוד שפה טבעית (NLP). נצלו את ההזדמנות לקרוא את '[ספר NLTK](https://www.nltk.org/book/)' ולנסות את התרגילים שבו. במשימה זו, שאינה מדורגת, תכירו את הספרייה הזו לעומק.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T20:34:47+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T20:34:29+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/R/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,389 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2c742993fe95d5bcbb2846eda3d442a1",
"translation_date": "2025-09-05T20:43:53+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/README.md",
"language_code": "he"
}
-->
# ניתוח רגשות עם ביקורות על מלונות
עכשיו, לאחר שחקרת את מערך הנתונים לעומק, הגיע הזמן לסנן את העמודות ולהשתמש בטכניקות עיבוד שפה טבעית (NLP) על מערך הנתונים כדי לקבל תובנות חדשות על המלונות.
## [מבחן מקדים להרצאה](https://ff-quizzes.netlify.app/en/ml/)
### פעולות סינון וניתוח רגשות
כפי שכנראה שמת לב, יש כמה בעיות במערך הנתונים. חלק מהעמודות מלאות במידע חסר תועלת, אחרות נראות לא נכונות. גם אם הן נכונות, לא ברור כיצד חושבו, ואין אפשרות לאמת את התשובות באופן עצמאי באמצעות חישובים משלך.
## תרגיל: עוד קצת עיבוד נתונים
נקה את הנתונים עוד קצת. הוסף עמודות שיהיו שימושיות בהמשך, שנה את הערכים בעמודות אחרות, והסר עמודות מסוימות לחלוטין.
1. עיבוד ראשוני של עמודות
1. הסר את `lat` ו-`lng`
2. החלף את הערכים ב-`Hotel_Address` בערכים הבאים (אם הכתובת מכילה את שם העיר והמדינה, שנה אותה רק לעיר ולמדינה).
אלו הערים והמדינות היחידות במערך הנתונים:
אמסטרדם, הולנד
ברצלונה, ספרד
לונדון, בריטניה
מילאנו, איטליה
פריז, צרפת
וינה, אוסטריה
```python
def replace_address(row):
if "Netherlands" in row["Hotel_Address"]:
return "Amsterdam, Netherlands"
elif "Barcelona" in row["Hotel_Address"]:
return "Barcelona, Spain"
elif "United Kingdom" in row["Hotel_Address"]:
return "London, United Kingdom"
elif "Milan" in row["Hotel_Address"]:
return "Milan, Italy"
elif "France" in row["Hotel_Address"]:
return "Paris, France"
elif "Vienna" in row["Hotel_Address"]:
return "Vienna, Austria"
# Replace all the addresses with a shortened, more useful form
df["Hotel_Address"] = df.apply(replace_address, axis = 1)
# The sum of the value_counts() should add up to the total number of reviews
print(df["Hotel_Address"].value_counts())
```
עכשיו תוכל לשאול נתונים ברמת מדינה:
```python
display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"}))
```
| Hotel_Address | Hotel_Name |
| :--------------------- | :--------: |
| Amsterdam, Netherlands | 105 |
| Barcelona, Spain | 211 |
| London, United Kingdom | 400 |
| Milan, Italy | 162 |
| Paris, France | 458 |
| Vienna, Austria | 158 |
2. עיבוד עמודות מטא-ביקורת של מלונות
1. הסר את `Additional_Number_of_Scoring`
1. החלף את `Total_Number_of_Reviews` במספר הכולל של הביקורות על המלון שבפועל נמצאות במערך הנתונים
1. החלף את `Average_Score` בציון שחושב על ידינו
```python
# Drop `Additional_Number_of_Scoring`
df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True)
# Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values
df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')
df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
```
3. עיבוד עמודות ביקורת
1. הסר את `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` ו-`days_since_review`
2. שמור את `Reviewer_Score`, `Negative_Review` ו-`Positive_Review` כפי שהם,
3. שמור את `Tags` לעת עתה
- נבצע פעולות סינון נוספות על התגים בחלק הבא ואז נסיר את התגים
4. עיבוד עמודות מבקר
1. הסר את `Total_Number_of_Reviews_Reviewer_Has_Given`
2. שמור את `Reviewer_Nationality`
### עמודות תג
עמודת ה-`Tag` בעייתית מכיוון שהיא רשימה (בצורת טקסט) המאוחסנת בעמודה. למרבה הצער, הסדר ומספר תתי-הקטעים בעמודה זו אינם תמיד זהים. קשה לאדם לזהות את הביטויים הנכונים שיש להתעניין בהם, מכיוון שיש 515,000 שורות ו-1427 מלונות, ולכל אחד יש אפשרויות מעט שונות שהמבקר יכול לבחור. כאן נכנס לתמונה NLP. ניתן לסרוק את הטקסט ולמצוא את הביטויים הנפוצים ביותר ולספור אותם.
למרבה הצער, אנחנו לא מעוניינים במילים בודדות, אלא בביטויים מרובי מילים (לדוגמה, *נסיעת עסקים*). הפעלת אלגוריתם חלוקת תדירות ביטויים מרובי מילים על כמות נתונים כזו (6762646 מילים) עשויה לקחת זמן רב במיוחד, אך מבלי להסתכל על הנתונים, נראה שזהו מחיר הכרחי. כאן ניתוח נתונים חקרני מועיל, מכיוון שראית דוגמה של התגים כמו `[' נסיעת עסקים ', ' מטייל יחיד ', ' חדר יחיד ', ' שהה 5 לילות ', ' נשלח ממכשיר נייד ']`, תוכל להתחיל לשאול אם ניתן לצמצם משמעותית את העיבוד שעליך לבצע. למרבה המזל, זה אפשרי - אבל קודם עליך לבצע כמה צעדים כדי לוודא מהם התגים הרלוונטיים.
### סינון תגים
זכור שהמטרה של מערך הנתונים היא להוסיף רגשות ועמודות שיעזרו לך לבחור את המלון הטוב ביותר (עבור עצמך או אולי עבור לקוח שמבקש ממך ליצור בוט המלצות על מלונות). עליך לשאול את עצמך אם התגים שימושיים או לא במערך הנתונים הסופי. הנה פרשנות אחת (אם היית זקוק למערך הנתונים מסיבות אחרות, ייתכן שתגים שונים יישארו/יוסרו מהבחירה):
1. סוג הנסיעה רלוונטי, והוא צריך להישאר
2. סוג קבוצת האורחים חשוב, והוא צריך להישאר
3. סוג החדר, הסוויטה או הסטודיו שבו האורח שהה אינו רלוונטי (לכל המלונות יש בעצם אותם חדרים)
4. המכשיר שעליו נשלחה הביקורת אינו רלוונטי
5. מספר הלילות שהמבקר שהה *יכול* להיות רלוונטי אם תייחס שהיות ארוכות יותר לכך שהם אהבו את המלון יותר, אבל זה גבולי, וסביר להניח שאינו רלוונטי
לסיכום, **שמור 2 סוגי תגים והסר את האחרים**.
ראשית, אינך רוצה לספור את התגים עד שהם יהיו בפורמט טוב יותר, כלומר יש להסיר את הסוגריים המרובעים והמרכאות. ניתן לעשות זאת בכמה דרכים, אך כדאי לבחור את המהירה ביותר מכיוון שזה עשוי לקחת זמן רב לעבד הרבה נתונים. למרבה המזל, ל-pandas יש דרך קלה לבצע כל אחד מהשלבים הללו.
```Python
# Remove opening and closing brackets
df.Tags = df.Tags.str.strip("[']")
# remove all quotes too
df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
```
כל תג הופך למשהו כמו: `נסיעת עסקים, מטייל יחיד, חדר יחיד, שהה 5 לילות, נשלח ממכשיר נייד`.
לאחר מכן אנו מוצאים בעיה. חלק מהביקורות, או השורות, מכילות 5 עמודות, חלק 3, חלק 6. זהו תוצאה של אופן יצירת מערך הנתונים, וקשה לתקן. אתה רוצה לקבל ספירת תדירות של כל ביטוי, אך הם בסדר שונה בכל ביקורת, כך שהספירה עשויה להיות שגויה, ומלון עשוי לא לקבל תג שהגיע לו.
במקום זאת תשתמש בסדר השונה לטובתנו, מכיוון שכל תג הוא מרובה מילים אך גם מופרד באמצעות פסיק! הדרך הפשוטה ביותר לעשות זאת היא ליצור 6 עמודות זמניות עם כל תג מוכנס לעמודה המתאימה לסדר שלו בתג. לאחר מכן תוכל למזג את 6 העמודות לעמודה גדולה אחת ולהפעיל את השיטה `value_counts()` על העמודה המתקבלת. בהדפסה תראה שהיו 2428 תגים ייחודיים. הנה דוגמה קטנה:
| Tag | Count |
| ------------------------------ | ------ |
| נסיעת פנאי | 417778 |
| נשלח ממכשיר נייד | 307640 |
| זוג | 252294 |
| שהה לילה אחד | 193645 |
| שהה 2 לילות | 133937 |
| מטייל יחיד | 108545 |
| שהה 3 לילות | 95821 |
| נסיעת עסקים | 82939 |
| קבוצה | 65392 |
| משפחה עם ילדים קטנים | 61015 |
| שהה 4 לילות | 47817 |
| חדר זוגי | 35207 |
| חדר זוגי סטנדרטי | 32248 |
| חדר זוגי משופר | 31393 |
| משפחה עם ילדים גדולים | 26349 |
| חדר זוגי דלוקס | 24823 |
| חדר זוגי או תאומים | 22393 |
| שהה 5 לילות | 20845 |
| חדר זוגי או תאומים סטנדרטי | 17483 |
| חדר זוגי קלאסי | 16989 |
| חדר זוגי או תאומים משופר | 13570 |
| 2 חדרים | 12393 |
חלק מהתגים הנפוצים כמו `נשלח ממכשיר נייד` אינם מועילים לנו, ולכן ייתכן שזה רעיון חכם להסיר אותם לפני ספירת הופעת הביטויים, אך זו פעולה כה מהירה שניתן להשאיר אותם ולהתעלם מהם.
### הסרת תגים של אורך שהייה
הסרת תגים אלו היא שלב 1, היא מפחיתה מעט את מספר התגים שיש לשקול. שים לב שאינך מסיר אותם ממערך הנתונים, אלא פשוט בוחר להסיר אותם משיקול כערכים לספירה/שמירה במערך הביקורות.
| אורך שהייה | Count |
| ---------------- | ------ |
| שהה לילה אחד | 193645 |
| שהה 2 לילות | 133937 |
| שהה 3 לילות | 95821 |
| שהה 4 לילות | 47817 |
| שהה 5 לילות | 20845 |
| שהה 6 לילות | 9776 |
| שהה 7 לילות | 7399 |
| שהה 8 לילות | 2502 |
| שהה 9 לילות | 1293 |
| ... | ... |
יש מגוון עצום של חדרים, סוויטות, סטודיו, דירות וכדומה. כולם פחות או יותר אותו דבר ואינם רלוונטיים עבורך, לכן הסר אותם משיקול.
| סוג חדר | Count |
| ----------------------------- | ----- |
| חדר זוגי | 35207 |
| חדר זוגי סטנדרטי | 32248 |
| חדר זוגי משופר | 31393 |
| חדר זוגי דלוקס | 24823 |
| חדר זוגי או תאומים | 22393 |
| חדר זוגי או תאומים סטנדרטי | 17483 |
| חדר זוגי קלאסי | 16989 |
| חדר זוגי או תאומים משופר | 13570 |
לבסוף, וזה משמח (כי זה לא דרש הרבה עיבוד בכלל), תישאר עם התגים הבאים *שימושיים*:
| Tag | Count |
| --------------------------------------------- | ------ |
| נסיעת פנאי | 417778 |
| זוג | 252294 |
| מטייל יחיד | 108545 |
| נסיעת עסקים | 82939 |
| קבוצה (משולב עם מטיילים עם חברים) | 67535 |
| משפחה עם ילדים קטנים | 61015 |
| משפחה עם ילדים גדולים | 26349 |
| עם חיית מחמד | 1405 |
אפשר לטעון ש`מטיילים עם חברים` זהה פחות או יותר ל`קבוצה`, וזה יהיה הוגן לשלב את השניים כפי שמוצג לעיל. הקוד לזיהוי התגים הנכונים נמצא ב-[מחברת התגים](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb).
השלב האחרון הוא ליצור עמודות חדשות עבור כל אחד מהתגים הללו. לאחר מכן, עבור כל שורת ביקורת, אם עמודת ה-`Tag` תואמת לאחת מהעמודות החדשות, הוסף 1, אם לא, הוסף 0. התוצאה הסופית תהיה ספירה של כמה מבקרים בחרו במלון זה (במצטבר) עבור, למשל, עסקים מול פנאי, או להביא חיית מחמד, וזה מידע שימושי בעת המלצה על מלון.
```python
# Process the Tags into new columns
# The file Hotel_Reviews_Tags.py, identifies the most important tags
# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends,
# Family with young children, Family with older children, With a pet
df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0)
df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0)
df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0)
df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0)
df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0)
df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0)
df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0)
df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0)
```
### שמור את הקובץ שלך
לבסוף, שמור את מערך הנתונים כפי שהוא עכשיו עם שם חדש.
```python
df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True)
# Saving new data file with calculated columns
print("Saving results to Hotel_Reviews_Filtered.csv")
df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False)
```
## פעולות ניתוח רגשות
בחלק האחרון הזה, תיישם ניתוח רגשות על עמודות הביקורות ותשמור את התוצאות במערך נתונים.
## תרגיל: טען ושמור את הנתונים המסוננים
שים לב שעכשיו אתה טוען את מערך הנתונים המסונן שנשמר בחלק הקודם, **לא** את מערך הנתונים המקורי.
```python
import time
import pandas as pd
import nltk as nltk
from nltk.corpus import stopwords
from nltk.sentiment.vader import SentimentIntensityAnalyzer
nltk.download('vader_lexicon')
# Load the filtered hotel reviews from CSV
df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')
# You code will be added here
# Finally remember to save the hotel reviews with new NLP data added
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False)
```
### הסרת מילים נפוצות
אם היית מפעיל ניתוח רגשות על עמודות הביקורות השליליות והחיוביות, זה יכול לקחת זמן רב. נבדק על מחשב נייד חזק עם מעבד מהיר, זה לקח 12 - 14 דקות תלוי באיזו ספריית ניתוח רגשות נעשה שימוש. זה זמן (יחסית) ארוך, ולכן כדאי לבדוק אם ניתן להאיץ את התהליך.
הסרת מילים נפוצות, או מילים באנגלית שאינן משנות את הרגש של משפט, היא הצעד הראשון. על ידי הסרתן, ניתוח הרגשות אמור לרוץ מהר יותר, אך לא להיות פחות מדויק (מכיוון שהמילים הנפוצות אינן משפיעות על הרגש, אך הן מאטות את הניתוח).
הביקורת השלילית הארוכה ביותר הייתה 395 מילים, אך לאחר הסרת המילים הנפוצות, היא מכילה 195 מילים.
הסרת המילים הנפוצות היא גם פעולה מהירה, הסרת המילים הנפוצות מ-2 עמודות ביקורות על פני 515,000 שורות לקחה 3.3 שניות במכשיר הבדיקה. זה יכול לקחת מעט יותר או פחות זמן עבורך תלוי במהירות המעבד של המכשיר שלך, זיכרון RAM, האם יש לך SSD או לא, וכמה גורמים נוספים. הקיצור היחסי של הפעולה אומר שאם זה משפר את זמן ניתוח הרגשות, אז זה שווה לעשות.
```python
from nltk.corpus import stopwords
# Load the hotel reviews from CSV
df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv")
# Remove stop words - can be slow for a lot of text!
# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches
# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends
start = time.time()
cache = set(stopwords.words("english"))
def remove_stopwords(review):
text = " ".join([word for word in review.split() if word not in cache])
return text
# Remove the stop words from both columns
df.Negative_Review = df.Negative_Review.apply(remove_stopwords)
df.Positive_Review = df.Positive_Review.apply(remove_stopwords)
```
### ביצוע ניתוח רגשות
עכשיו עליך לחשב את ניתוח הרגשות עבור עמודות הביקורות השליליות והחיוביות, ולשמור את התוצאה ב-2 עמודות חדשות. המבחן של הרגש יהיה להשוות אותו לציון של המבקר עבור אותה ביקורת. לדוגמה, אם הרגש חושב שלביקורת השלילית היה רגש של 1 (רגש חיובי מאוד) ולביקורת החיובית רגש של 1, אך המבקר נתן למלון את הציון הנמוך ביותר האפשרי, אז או שהטקסט של הביקורת אינו תואם לציון, או שמנתח הרגשות לא הצליח לזהות את הרגש בצורה נכונה. עליך לצפות שחלק מציוני הרגשות יהיו שגויים לחלוטין, ולעיתים זה יהיה ניתן להסבר, למשל הביקורת יכולה להיות מאוד סרקסטית "כמובן ש-מ-א-ו-ד אהבתי לישון בחדר בלי חימום" ומנתח הרגשות חושב שזה רגש חיובי, למרות שאדם שקורא את זה היה יודע שזה סרקזם.
NLTK מספקת מנתחי רגשות שונים ללמידה, ואתם יכולים להחליף ביניהם ולבדוק אם הניתוח הרגשי מדויק יותר או פחות. ניתוח הרגשות של VADER משמש כאן.
> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
```python
from nltk.sentiment.vader import SentimentIntensityAnalyzer
# Create the vader sentiment analyser (there are others in NLTK you can try too)
vader_sentiment = SentimentIntensityAnalyzer()
# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
# There are 3 possibilities of input for a review:
# It could be "No Negative", in which case, return 0
# It could be "No Positive", in which case, return 0
# It could be a review, in which case calculate the sentiment
def calc_sentiment(review):
if review == "No Negative" or review == "No Positive":
return 0
return vader_sentiment.polarity_scores(review)["compound"]
```
מאוחר יותר בתוכנית שלכם, כאשר תהיו מוכנים לחשב רגשות, תוכלו ליישם זאת על כל ביקורת באופן הבא:
```python
# Add a negative sentiment and positive sentiment column
print("Calculating sentiment columns for both positive and negative reviews")
start = time.time()
df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment)
df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment)
end = time.time()
print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds")
```
זה לוקח בערך 120 שניות במחשב שלי, אבל זה ישתנה ממחשב למחשב. אם אתם רוצים להדפיס את התוצאות ולבדוק אם הרגש תואם את הביקורת:
```python
df = df.sort_values(by=["Negative_Sentiment"], ascending=True)
print(df[["Negative_Review", "Negative_Sentiment"]])
df = df.sort_values(by=["Positive_Sentiment"], ascending=True)
print(df[["Positive_Review", "Positive_Sentiment"]])
```
הדבר האחרון שיש לעשות עם הקובץ לפני השימוש בו באתגר הוא לשמור אותו! כדאי גם לשקול לסדר מחדש את כל העמודות החדשות שלכם כך שיהיה קל לעבוד איתן (עבור בני אדם, זה שינוי קוסמטי).
```python
# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)
df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1)
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False)
```
עליכם להריץ את כל הקוד עבור [מחברת הניתוח](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (לאחר שהרצתם [את מחברת הסינון](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) כדי ליצור את קובץ Hotel_Reviews_Filtered.csv).
לסיכום, השלבים הם:
1. קובץ הנתונים המקורי **Hotel_Reviews.csv** נחקר בשיעור הקודם עם [מחברת החקירה](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb)
2. Hotel_Reviews.csv מסונן על ידי [מחברת הסינון](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) ומתקבל **Hotel_Reviews_Filtered.csv**
3. Hotel_Reviews_Filtered.csv מעובד על ידי [מחברת ניתוח הרגשות](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) ומתקבל **Hotel_Reviews_NLP.csv**
4. השתמשו ב-Hotel_Reviews_NLP.csv באתגר ה-NLP למטה
### מסקנה
כשאתם התחלתם, היה לכם קובץ נתונים עם עמודות ונתונים, אבל לא הכל היה ניתן לאימות או לשימוש. חקרתם את הנתונים, סיננתם את מה שלא היה נחוץ, המרתם תגיות למשהו שימושי, חישבתם ממוצעים משלכם, הוספתם עמודות רגשות, וכנראה למדתם דברים מעניינים על עיבוד טקסט טבעי.
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## אתגר
עכשיו, כשניתחתם את הרגשות בקובץ הנתונים שלכם, נסו להשתמש באסטרטגיות שלמדתם בתוכנית הלימודים הזו (אולי clustering?) כדי לזהות דפוסים סביב רגשות.
## סקירה ולימוד עצמי
קחו [את המודול הזה](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) כדי ללמוד עוד ולהשתמש בכלים שונים לחקר רגשות בטקסט.
## משימה
[נסו קובץ נתונים אחר](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "daf144daa552da6a7d442aff6f3e77d8",
"translation_date": "2025-09-05T20:46:52+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/assignment.md",
"language_code": "he"
}
-->
# נסה מערך נתונים אחר
## הוראות
עכשיו, לאחר שלמדת להשתמש ב-NLTK כדי להקצות רגשות לטקסט, נסה מערך נתונים אחר. סביר להניח שתצטרך לבצע עיבוד נתונים סביבו, אז צור מחברת ותעד את תהליך החשיבה שלך. מה אתה מגלה?
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------------- |
| | מחברת מלאה ומערך נתונים מוצגים עם תאים מתועדים היטב המסבירים כיצד מוקצים הרגשות | המחברת חסרה הסברים טובים | המחברת פגומה |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T20:47:34+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T20:47:16+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/R/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,38 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1eb379dc2d0c9940b320732d16083778",
"translation_date": "2025-09-05T20:24:24+00:00",
"source_file": "6-NLP/README.md",
"language_code": "he"
}
-->
# התחלת עבודה עם עיבוד שפה טבעית
עיבוד שפה טבעית (NLP) הוא היכולת של תוכנת מחשב להבין שפה אנושית כפי שהיא מדוברת ונכתבת - מה שמכונה שפה טבעית. זהו מרכיב של בינה מלאכותית (AI). תחום ה-NLP קיים כבר יותר מ-50 שנה ויש לו שורשים בתחום הבלשנות. כל התחום מכוון לעזור למכונות להבין ולעבד את השפה האנושית. לאחר מכן ניתן להשתמש בזה לביצוע משימות כמו בדיקת איות או תרגום מכונה. יש לו מגוון יישומים בעולם האמיתי בתחומים רבים, כולל מחקר רפואי, מנועי חיפוש ומודיעין עסקי.
## נושא אזורי: שפות וספרות אירופיות ומלונות רומנטיים באירופה ❤️
בפרק זה של התוכנית, תיחשפו לאחד השימושים הנפוצים ביותר בלמידת מכונה: עיבוד שפה טבעית (NLP). תחום זה, שמקורו בבלשנות חישובית, מהווה גשר בין בני אדם למכונות באמצעות תקשורת קולית או טקסטואלית.
בשיעורים אלו נלמד את יסודות ה-NLP על ידי בניית בוטים שיחתיים קטנים כדי להבין כיצד למידת מכונה מסייעת להפוך את השיחות הללו ליותר ויותר 'חכמות'. תצאו למסע בזמן, ותשוחחו עם אליזבת בנט ומר דארסי מתוך הרומן הקלאסי של ג'יין אוסטן, **גאווה ודעה קדומה**, שפורסם בשנת 1813. לאחר מכן, תעמיקו את הידע שלכם על ידי לימוד ניתוח רגשות דרך ביקורות על מלונות באירופה.
![ספר גאווה ודעה קדומה ותה](../../../6-NLP/images/p&p.jpg)
> צילום על ידי <a href="https://unsplash.com/@elaineh?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Elaine Howlin</a> ב-<a href="https://unsplash.com/s/photos/pride-and-prejudice?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## שיעורים
1. [מבוא לעיבוד שפה טבעית](1-Introduction-to-NLP/README.md)
2. [משימות וטכניקות נפוצות ב-NLP](2-Tasks/README.md)
3. [תרגום וניתוח רגשות באמצעות למידת מכונה](3-Translation-Sentiment/README.md)
4. [הכנת הנתונים שלכם](4-Hotel-Reviews-1/README.md)
5. [NLTK לניתוח רגשות](5-Hotel-Reviews-2/README.md)
## קרדיטים
שיעורי עיבוד השפה הטבעית הללו נכתבו עם ☕ על ידי [Stephen Howell](https://twitter.com/Howell_MSFT)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "ee0670655c89e4719319764afb113624",
"translation_date": "2025-09-05T20:35:05+00:00",
"source_file": "6-NLP/data/README.md",
"language_code": "he"
}
-->
הורד את נתוני ביקורת המלון לתיקייה זו.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס AI [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,199 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "662b509c39eee205687726636d0a8455",
"translation_date": "2025-09-05T19:03:40+00:00",
"source_file": "7-TimeSeries/1-Introduction/README.md",
"language_code": "he"
}
-->
# מבוא לחיזוי סדרות זמן
![סיכום סדרות זמן בסקצ'נוט](../../../../sketchnotes/ml-timeseries.png)
> סקצ'נוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
בשיעור הזה ובשיעור הבא, תלמדו מעט על חיזוי סדרות זמן, תחום מעניין וחשוב בארגז הכלים של מדען ML, אשר פחות מוכר בהשוואה לנושאים אחרים. חיזוי סדרות זמן הוא מעין 'כדור בדולח': בהתבסס על ביצועים קודמים של משתנה כמו מחיר, ניתן לחזות את הערך הפוטנציאלי העתידי שלו.
[![מבוא לחיזוי סדרות זמן](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "מבוא לחיזוי סדרות זמן")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון על חיזוי סדרות זמן
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
זהו תחום שימושי ומעניין בעל ערך ממשי לעסקים, בשל יישומו הישיר לבעיות של תמחור, מלאי וניהול שרשרת אספקה. בעוד שטכניקות למידה עמוקה החלו לשמש כדי להפיק תובנות נוספות ולחזות ביצועים עתידיים בצורה טובה יותר, חיזוי סדרות זמן נותר תחום שמבוסס רבות על טכניקות ML קלאסיות.
> ניתן למצוא את תכנית הלימודים השימושית של Penn State בנושא סדרות זמן [כאן](https://online.stat.psu.edu/stat510/lesson/1)
## מבוא
נניח שאתם מנהלים מערך של מדחני חניה חכמים המספקים נתונים על תדירות השימוש בהם ועל משך הזמן לאורך זמן.
> מה אם הייתם יכולים לחזות, בהתבסס על ביצועי העבר של המדחן, את ערכו העתידי בהתאם לחוקי ההיצע והביקוש?
חיזוי מדויק של הזמן לפעול כדי להשיג את המטרה שלכם הוא אתגר שניתן להתמודד איתו באמצעות חיזוי סדרות זמן. זה אולי לא ישמח אנשים שיחויבו יותר בזמני עומס כשהם מחפשים מקום חניה, אבל זו דרך בטוחה לייצר הכנסה לניקוי הרחובות!
בואו נחקור כמה מסוגי האלגוריתמים של סדרות זמן ונתחיל במחברת כדי לנקות ולהכין נתונים. הנתונים שתנתחו נלקחו מתחרות החיזוי GEFCom2014. הם כוללים 3 שנים של נתוני עומס חשמל וטמפרטורה לפי שעה בין השנים 2012 ל-2014. בהתבסס על דפוסים היסטוריים של עומס חשמל וטמפרטורה, תוכלו לחזות ערכים עתידיים של עומס חשמל.
בדוגמה זו, תלמדו כיצד לחזות צעד זמן אחד קדימה, תוך שימוש בנתוני עומס היסטוריים בלבד. עם זאת, לפני שמתחילים, כדאי להבין מה קורה מאחורי הקלעים.
## כמה הגדרות
כשנתקלים במונח 'סדרות זמן', חשוב להבין את השימוש בו בהקשרים שונים.
🎓 **סדרות זמן**
במתמטיקה, "סדרות זמן הן סדרה של נקודות נתונים שמאונדקסות (או רשומות או מוצגות בגרף) לפי סדר זמן. לרוב, סדרות זמן הן רצף שנלקח בנקודות זמן עוקבות במרווחים שווים." דוגמה לסדרות זמן היא ערך הסגירה היומי של [מדד דאו ג'ונס](https://wikipedia.org/wiki/Time_series). השימוש בגרפים של סדרות זמן ובמודלים סטטיסטיים נפוץ בעיבוד אותות, חיזוי מזג אוויר, חיזוי רעידות אדמה ובתחומים נוספים שבהם אירועים מתרחשים ונקודות נתונים יכולות להיות מוצגות לאורך זמן.
🎓 **ניתוח סדרות זמן**
ניתוח סדרות זמן הוא ניתוח של נתוני סדרות הזמן שהוזכרו לעיל. נתוני סדרות זמן יכולים להופיע בצורות שונות, כולל 'סדרות זמן מופרעות' שמזהות דפוסים בהתפתחות סדרות זמן לפני ואחרי אירוע מפריע. סוג הניתוח הנדרש עבור סדרות הזמן תלוי באופי הנתונים. נתוני סדרות זמן עצמם יכולים להופיע כרצף של מספרים או תווים.
הניתוח שמתבצע משתמש במגוון שיטות, כולל תחום התדר ותחום הזמן, ליניארי ולא ליניארי, ועוד. [למדו עוד](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) על הדרכים הרבות לנתח סוג זה של נתונים.
🎓 **חיזוי סדרות זמן**
חיזוי סדרות זמן הוא השימוש במודל כדי לחזות ערכים עתידיים בהתבסס על דפוסים שהוצגו על ידי נתונים שנאספו בעבר. בעוד שניתן להשתמש במודלים רגרסיביים כדי לחקור נתוני סדרות זמן, עם אינדקסי זמן כמשתני x בגרף, נתונים כאלה עדיף לנתח באמצעות סוגים מיוחדים של מודלים.
נתוני סדרות זמן הם רשימה של תצפיות מסודרות, בניגוד לנתונים שניתן לנתח באמצעות רגרסיה ליניארית. המודל הנפוץ ביותר הוא ARIMA, ראשי תיבות של "Autoregressive Integrated Moving Average".
[מודלי ARIMA](https://online.stat.psu.edu/stat510/lesson/1/1.1) "מקשרים את הערך הנוכחי של סדרה לערכים קודמים ולשגיאות חיזוי קודמות." הם מתאימים ביותר לניתוח נתונים בתחום הזמן, שבו הנתונים מסודרים לאורך זמן.
> ישנם כמה סוגים של מודלי ARIMA, עליהם תוכלו ללמוד [כאן](https://people.duke.edu/~rnau/411arim.htm) ותגעו בהם בשיעור הבא.
בשיעור הבא, תבנו מודל ARIMA באמצעות [סדרות זמן חד-משתניות](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), שמתמקדות במשתנה אחד שמשנה את ערכו לאורך זמן. דוגמה לסוג זה של נתונים היא [מערך הנתונים הזה](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) שמקליט את ריכוז ה-CO2 החודשי במצפה מאונה לואה:
| CO2 | YearMonth | Year | Month |
| :----: | :-------: | :---: | :---: |
| 330.62 | 1975.04 | 1975 | 1 |
| 331.40 | 1975.13 | 1975 | 2 |
| 331.87 | 1975.21 | 1975 | 3 |
| 333.18 | 1975.29 | 1975 | 4 |
| 333.92 | 1975.38 | 1975 | 5 |
| 333.43 | 1975.46 | 1975 | 6 |
| 331.85 | 1975.54 | 1975 | 7 |
| 330.01 | 1975.63 | 1975 | 8 |
| 328.51 | 1975.71 | 1975 | 9 |
| 328.41 | 1975.79 | 1975 | 10 |
| 329.25 | 1975.88 | 1975 | 11 |
| 330.97 | 1975.96 | 1975 | 12 |
✅ זיהו את המשתנה שמשתנה לאורך זמן במערך הנתונים הזה
## מאפיינים של נתוני סדרות זמן שיש לקחת בחשבון
כשמסתכלים על נתוני סדרות זמן, ייתכן שתבחינו שיש להם [מאפיינים מסוימים](https://online.stat.psu.edu/stat510/lesson/1/1.1) שצריך לקחת בחשבון ולהפחית כדי להבין טוב יותר את הדפוסים שלהם. אם תחשבו על נתוני סדרות זמן כעל 'אות' פוטנציאלי שברצונכם לנתח, ניתן לחשוב על המאפיינים הללו כעל 'רעש'. לעיתים קרובות תצטרכו להפחית את ה'רעש' הזה על ידי קיזוז חלק מהמאפיינים הללו באמצעות טכניקות סטטיסטיות.
הנה כמה מושגים שכדאי להכיר כדי לעבוד עם סדרות זמן:
🎓 **מגמות**
מגמות מוגדרות כעליות וירידות מדידות לאורך זמן. [קראו עוד](https://machinelearningmastery.com/time-series-trends-in-python). בהקשר של סדרות זמן, מדובר על איך להשתמש ואם יש צורך, להסיר מגמות מסדרות הזמן שלכם.
🎓 **[עונתיות](https://machinelearningmastery.com/time-series-seasonality-with-python/)**
עונתיות מוגדרת כתנודות מחזוריות, כמו למשל עומס בתקופת החגים שעשוי להשפיע על מכירות. [הסתכלו](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) על איך סוגים שונים של גרפים מציגים עונתיות בנתונים.
🎓 **חריגות**
חריגות הן נקודות נתונים רחוקות מהשונות הסטנדרטית של הנתונים.
🎓 **מחזור ארוך טווח**
בנפרד מעונתיות, נתונים עשויים להציג מחזור ארוך טווח כמו מיתון כלכלי שנמשך יותר משנה.
🎓 **שונות קבועה**
לאורך זמן, חלק מהנתונים מציגים תנודות קבועות, כמו שימוש באנרגיה ביום ובלילה.
🎓 **שינויים פתאומיים**
הנתונים עשויים להציג שינוי פתאומי שדורש ניתוח נוסף. לדוגמה, סגירה פתאומית של עסקים בעקבות COVID גרמה לשינויים בנתונים.
✅ הנה [גרף סדרות זמן לדוגמה](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) שמציג הוצאה יומית על מטבע במשחק לאורך כמה שנים. האם תוכלו לזהות מאפיינים כלשהם מהרשימה לעיל בנתונים הללו?
![הוצאה על מטבע במשחק](../../../../7-TimeSeries/1-Introduction/images/currency.png)
## תרגיל - התחלה עם נתוני שימוש באנרגיה
בואו נתחיל ביצירת מודל סדרות זמן לחיזוי שימוש עתידי באנרגיה בהתבסס על שימוש בעבר.
> הנתונים בדוגמה זו נלקחו מתחרות החיזוי GEFCom2014. הם כוללים 3 שנים של נתוני עומס חשמל וטמפרטורה לפי שעה בין השנים 2012 ל-2014.
>
> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli and Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016.
1. בתיקיית `working` של השיעור הזה, פתחו את הקובץ _notebook.ipynb_. התחילו בהוספת ספריות שיעזרו לכם לטעון ולהציג נתונים
```python
import os
import matplotlib.pyplot as plt
from common.utils import load_data
%matplotlib inline
```
שימו לב, אתם משתמשים בקבצים מהתיקייה `common` הכלולה שמגדירה את הסביבה שלכם ומטפלת בהורדת הנתונים.
2. לאחר מכן, בדקו את הנתונים כ-DataFrame על ידי קריאה ל-`load_data()` ו-`head()`:
```python
data_dir = './data'
energy = load_data(data_dir)[['load']]
energy.head()
```
תוכלו לראות שישנם שני עמודות שמייצגות תאריך ועומס:
| | load |
| :-----------------: | :----: |
| 2012-01-01 00:00:00 | 2698.0 |
| 2012-01-01 01:00:00 | 2558.0 |
| 2012-01-01 02:00:00 | 2444.0 |
| 2012-01-01 03:00:00 | 2402.0 |
| 2012-01-01 04:00:00 | 2403.0 |
3. עכשיו, הציגו את הנתונים בגרף על ידי קריאה ל-`plot()`:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![גרף אנרגיה](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png)
4. עכשיו, הציגו את השבוע הראשון של יולי 2014, על ידי מתן קלט ל-`energy` בתבנית `[מתאריך]: [עד תאריך]`:
```python
energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![יולי](../../../../7-TimeSeries/1-Introduction/images/july-2014.png)
גרף יפהפה! הסתכלו על הגרפים הללו ונסו לקבוע אם תוכלו לזהות מאפיינים כלשהם מהרשימה לעיל. מה ניתן להסיק על ידי ויזואליזציה של הנתונים?
בשיעור הבא, תיצרו מודל ARIMA כדי ליצור תחזיות.
---
## 🚀אתגר
צרו רשימה של כל התעשיות ותחומי המחקר שאתם יכולים לחשוב עליהם שיכולים להרוויח מחיזוי סדרות זמן. האם תוכלו לחשוב על יישום של טכניקות אלו באמנויות? בכלכלה? באקולוגיה? בקמעונאות? בתעשייה? בפיננסים? איפה עוד?
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
למרות שלא נכסה אותם כאן, רשתות נוירונים משמשות לעיתים לשיפור שיטות קלאסיות של חיזוי סדרות זמן. קראו עוד על כך [במאמר הזה](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412)
## משימה
[הציגו עוד סדרות זמן](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "d1781b0b92568ea1d119d0a198b576b4",
"translation_date": "2025-09-05T19:05:59+00:00",
"source_file": "7-TimeSeries/1-Introduction/assignment.md",
"language_code": "he"
}
-->
# הצגת סדרות זמן נוספות
## הוראות
התחלת ללמוד על חיזוי סדרות זמן על ידי התבוננות בסוג הנתונים שדורשים מודלים מיוחדים אלו. כבר הצגת נתונים הקשורים לאנרגיה. עכשיו, חפש נתונים נוספים שיכולים להפיק תועלת מחיזוי סדרות זמן. מצא שלוש דוגמאות (נסה [Kaggle](https://kaggle.com) ו-[Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) ויצור מחברת להצגת הנתונים. ציין במחברת כל מאפיין מיוחד שיש לנתונים (עונתיות, שינויים פתאומיים או מגמות אחרות).
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ----------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| | שלושה מערכי נתונים מוצגים ומוסברים במחברת | שני מערכי נתונים מוצגים ומוסברים במחברת | מעט מערכי נתונים מוצגים או מוסברים במחברת או שהנתונים שהוצגו אינם מספקים |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T19:06:47+00:00",
"source_file": "7-TimeSeries/1-Introduction/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. אנו לא נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T19:06:29+00:00",
"source_file": "7-TimeSeries/1-Introduction/solution/R/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,404 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "917dbf890db71a322f306050cb284749",
"translation_date": "2025-09-05T18:59:03+00:00",
"source_file": "7-TimeSeries/2-ARIMA/README.md",
"language_code": "he"
}
-->
# חיזוי סדרות זמן עם ARIMA
בשיעור הקודם, למדתם מעט על חיזוי סדרות זמן וטעינת מערך נתונים שמציג את התנודות בעומס החשמלי לאורך תקופת זמן.
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: מבוא קצר למודלים של ARIMA. הדוגמה נעשתה ב-R, אך הרעיונות הם אוניברסליים.
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
## מבוא
בשיעור זה, תגלו דרך ספציפית לבנות מודלים עם [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). מודלים של ARIMA מתאימים במיוחד לנתונים שמציגים [אי-סטציונריות](https://wikipedia.org/wiki/Stationary_process).
## מושגים כלליים
כדי לעבוד עם ARIMA, ישנם כמה מושגים שחשוב להכיר:
- 🎓 **סטציונריות**. בהקשר סטטיסטי, סטציונריות מתייחסת לנתונים שההתפלגות שלהם אינה משתנה כאשר הם מוזזים בזמן. נתונים שאינם סטציונריים מציגים תנודות עקב מגמות שיש להפוך אותן כדי לנתח. עונתיות, למשל, יכולה להכניס תנודות לנתונים וניתן להסיר אותה באמצעות תהליך של 'הבדל עונתי'.
- 🎓 **[הבדלה](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. הבדלה של נתונים, שוב בהקשר סטטיסטי, מתייחסת לתהליך של הפיכת נתונים שאינם סטציונריים לסטציונריים על ידי הסרת המגמה הלא-קבועה שלהם. "הבדלה מסירה את השינויים ברמת סדרת הזמן, מבטלת מגמות ועונתיות ובכך מייצבת את הממוצע של סדרת הזמן." [מאמר מאת Shixiong et al](https://arxiv.org/abs/1904.07632)
## ARIMA בהקשר של סדרות זמן
בואו נפרק את החלקים של ARIMA כדי להבין טוב יותר כיצד הוא עוזר לנו לבנות מודלים של סדרות זמן ולבצע תחזיות.
- **AR - עבור AutoRegressive**. מודלים אוטורגרסיביים, כפי שהשם מרמז, מסתכלים 'אחורה' בזמן כדי לנתח ערכים קודמים בנתונים שלכם ולבצע הנחות לגביהם. ערכים קודמים אלו נקראים 'פיגורים'. דוגמה לכך תהיה נתונים שמציגים מכירות חודשיות של עפרונות. סך המכירות של כל חודש ייחשב כ'משתנה מתפתח' במערך הנתונים. מודל זה נבנה כאשר "המשתנה המתפתח של העניין מוערך על ערכיו המפגרים (כלומר, הקודמים)." [ויקיפדיה](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)
- **I - עבור Integrated**. בניגוד למודלים דומים כמו 'ARMA', ה-'I' ב-ARIMA מתייחס להיבט ה*[משולב](https://wikipedia.org/wiki/Order_of_integration)* שלו. הנתונים 'משולבים' כאשר מיושמים שלבי הבדלה כדי לבטל אי-סטציונריות.
- **MA - עבור Moving Average**. ההיבט של [ממוצע נע](https://wikipedia.org/wiki/Moving-average_model) במודל זה מתייחס למשתנה הפלט שנקבע על ידי התבוננות בערכים הנוכחיים והעבריים של פיגורים.
שורה תחתונה: ARIMA משמש כדי להתאים מודל בצורה הקרובה ביותר לנתונים המיוחדים של סדרות זמן.
## תרגיל - בניית מודל ARIMA
פתחו את תיקיית [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) בשיעור זה ומצאו את הקובץ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb).
1. הריצו את המחברת כדי לטעון את ספריית Python `statsmodels`; תזדקקו לה עבור מודלים של ARIMA.
1. טענו ספריות נחוצות.
1. כעת, טענו מספר ספריות נוספות שימושיות לשרטוט נתונים:
```python
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from pandas.plotting import autocorrelation_plot
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
from IPython.display import Image
%matplotlib inline
pd.options.display.float_format = '{:,.2f}'.format
np.set_printoptions(precision=2)
warnings.filterwarnings("ignore") # specify to ignore warning messages
```
1. טענו את הנתונים מקובץ `/data/energy.csv` לתוך DataFrame של Pandas והסתכלו עליהם:
```python
energy = load_data('./data')[['load']]
energy.head(10)
```
1. שרטטו את כל נתוני האנרגיה הזמינים מינואר 2012 עד דצמבר 2014. לא אמורות להיות הפתעות, כפי שראינו את הנתונים בשיעור הקודם:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
כעת, בואו נבנה מודל!
### יצירת מערכי נתונים לאימון ובדיקה
כעת הנתונים שלכם טעונים, כך שתוכלו להפריד אותם למערכי אימון ובדיקה. תאמנו את המודל שלכם על מערך האימון. כרגיל, לאחר שהמודל סיים את האימון, תעריכו את דיוקו באמצעות מערך הבדיקה. עליכם לוודא שמערך הבדיקה מכסה תקופה מאוחרת יותר בזמן ממערך האימון כדי להבטיח שהמודל לא יקבל מידע מתקופות זמן עתידיות.
1. הקצו תקופה של חודשיים מה-1 בספטמבר עד ה-31 באוקטובר 2014 למערך האימון. מערך הבדיקה יכלול את התקופה של חודשיים מה-1 בנובמבר עד ה-31 בדצמבר 2014:
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
מכיוון שנתונים אלו משקפים את צריכת האנרגיה היומית, ישנו דפוס עונתי חזק, אך הצריכה דומה ביותר לצריכה בימים האחרונים.
1. ויזואליזציה של ההבדלים:
```python
energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
.join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
.plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![נתוני אימון ובדיקה](../../../../7-TimeSeries/2-ARIMA/images/train-test.png)
לכן, שימוש בחלון זמן קטן יחסית לאימון הנתונים אמור להיות מספיק.
> הערה: מכיוון שהפונקציה שבה אנו משתמשים להתאמת מודל ARIMA משתמשת באימות בתוך הדגימה במהלך ההתאמה, נוותר על נתוני אימות.
### הכנת הנתונים לאימון
כעת, עליכם להכין את הנתונים לאימון על ידי ביצוע סינון וסקיילינג של הנתונים שלכם. סננו את מערך הנתונים שלכם כך שיכלול רק את התקופות והעמודות הנדרשות, וסקיילינג כדי להבטיח שהנתונים יוקרנו בטווח 0,1.
1. סננו את מערך הנתונים המקורי כך שיכלול רק את התקופות שהוזכרו לכל מערך ורק את העמודה הנדרשת 'load' בנוסף לתאריך:
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
test = energy.copy()[energy.index >= test_start_dt][['load']]
print('Training data shape: ', train.shape)
print('Test data shape: ', test.shape)
```
תוכלו לראות את הצורה של הנתונים:
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
1. בצעו סקיילינג לנתונים כך שיהיו בטווח (0, 1).
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
train.head(10)
```
1. ויזואליזציה של הנתונים המקוריים מול הנתונים המוקנים:
```python
energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12)
train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12)
plt.show()
```
![מקורי](../../../../7-TimeSeries/2-ARIMA/images/original.png)
> הנתונים המקוריים
![מוקנה](../../../../7-TimeSeries/2-ARIMA/images/scaled.png)
> הנתונים המוקנים
1. כעת, לאחר שכיילתם את הנתונים המוקנים, תוכלו לכייל את נתוני הבדיקה:
```python
test['load'] = scaler.transform(test)
test.head()
```
### יישום ARIMA
הגיע הזמן ליישם ARIMA! כעת תשתמשו בספריית `statsmodels` שהתקנתם קודם.
כעת עליכם לבצע מספר שלבים:
1. הגדירו את המודל על ידי קריאה ל-`SARIMAX()` והעברת פרמטרי המודל: פרמטרים p, d, ו-q, ופרמטרים P, D, ו-Q.
2. הכינו את המודל לנתוני האימון על ידי קריאה לפונקציה fit().
3. בצעו תחזיות על ידי קריאה לפונקציה `forecast()` וציון מספר הצעדים (ה'אופק') לתחזית.
> 🎓 מה משמעות כל הפרמטרים הללו? במודל ARIMA ישנם 3 פרמטרים המשמשים לסייע במידול ההיבטים המרכזיים של סדרת זמן: עונתיות, מגמה ורעש. הפרמטרים הם:
`p`: הפרמטר הקשור להיבט האוטורגרסיבי של המודל, שמשלב ערכים *עבריים*.
`d`: הפרמטר הקשור לחלק המשולב של המודל, שמשפיע על כמות ה-*הבדלה* (🎓 זוכרים הבדלה 👆?) שיש ליישם על סדרת זמן.
`q`: הפרמטר הקשור לחלק הממוצע הנע של המודל.
> הערה: אם לנתונים שלכם יש היבט עונתי - כמו במקרה זה - , אנו משתמשים במודל ARIMA עונתי (SARIMA). במקרה זה עליכם להשתמש בקבוצת פרמטרים נוספת: `P`, `D`, ו-`Q` שמתארים את אותם קשרים כמו `p`, `d`, ו-`q`, אך מתייחסים לרכיבים העונתיים של המודל.
1. התחילו בהגדרת ערך האופק המועדף עליכם. בואו ננסה 3 שעות:
```python
# Specify the number of steps to forecast ahead
HORIZON = 3
print('Forecasting horizon:', HORIZON, 'hours')
```
בחירת הערכים הטובים ביותר עבור פרמטרי מודל ARIMA יכולה להיות מאתגרת מכיוון שהיא מעט סובייקטיבית וגוזלת זמן. ייתכן שתרצו לשקול שימוש בפונקציה `auto_arima()` מתוך ספריית [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html).
1. לעת עתה נסו כמה בחירות ידניות כדי למצוא מודל טוב.
```python
order = (4, 1, 0)
seasonal_order = (1, 1, 0, 24)
model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order)
results = model.fit()
print(results.summary())
```
טבלה של תוצאות מודפסת.
בניתם את המודל הראשון שלכם! כעת עלינו למצוא דרך להעריך אותו.
### הערכת המודל שלכם
כדי להעריך את המודל שלכם, תוכלו לבצע את מה שנקרא `walk forward` validation. בפועל, מודלים של סדרות זמן מאומנים מחדש בכל פעם שנתונים חדשים הופכים זמינים. זה מאפשר למודל לבצע את התחזית הטובה ביותר בכל שלב זמן.
מתחילים בתחילת סדרת הזמן באמצעות טכניקה זו, מאמנים את המודל על מערך נתוני האימון. לאחר מכן מבצעים תחזית על שלב הזמן הבא. התחזית מוערכת מול הערך הידוע. מערך האימון מורחב כך שיכלול את הערך הידוע והתהליך חוזר על עצמו.
> הערה: עליכם לשמור על חלון מערך האימון קבוע לצורך אימון יעיל יותר כך שבכל פעם שאתם מוסיפים תצפית חדשה למערך האימון, אתם מסירים את התצפית מתחילת המערך.
תהליך זה מספק הערכה חזקה יותר של איך המודל יפעל בפועל. עם זאת, הוא מגיע בעלות חישובית של יצירת כל כך הרבה מודלים. זה מקובל אם הנתונים קטנים או אם המודל פשוט, אך יכול להיות בעייתי בקנה מידה גדול.
Walk-forward validation הוא תקן הזהב להערכת מודלים של סדרות זמן ומומלץ לפרויקטים שלכם.
1. ראשית, צרו נקודת נתוני בדיקה עבור כל שלב אופק.
```python
test_shifted = test.copy()
for t in range(1, HORIZON+1):
test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H')
test_shifted = test_shifted.dropna(how='any')
test_shifted.head(5)
```
| | | load | load+1 | load+2 |
| ---------- | -------- | ---- | ------ | ------ |
| 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 |
| 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 |
| 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 |
| 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 |
| 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 |
הנתונים מוזזים אופקית בהתאם לנקודת האופק שלהם.
1. בצעו תחזיות על נתוני הבדיקה שלכם באמצעות גישה זו של חלון הזזה בלולאה בגודל אורך נתוני הבדיקה:
```python
%%time
training_window = 720 # dedicate 30 days (720 hours) for training
train_ts = train['load']
test_ts = test_shifted
history = [x for x in train_ts]
history = history[(-training_window):]
predictions = list()
order = (2, 1, 0)
seasonal_order = (1, 1, 0, 24)
for t in range(test_ts.shape[0]):
model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order)
model_fit = model.fit()
yhat = model_fit.forecast(steps = HORIZON)
predictions.append(yhat)
obs = list(test_ts.iloc[t])
# move the training window
history.append(obs[0])
history.pop(0)
print(test_ts.index[t])
print(t+1, ': predicted =', yhat, 'expected =', obs)
```
תוכלו לצפות באימון מתרחש:
```output
2014-12-30 00:00:00
1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323]
2014-12-30 01:00:00
2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126]
2014-12-30 02:00:00
3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795]
```
1. השוו את התחזיות לעומס בפועל:
```python
eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)])
eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1]
eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h')
eval_df['actual'] = np.array(np.transpose(test_ts)).ravel()
eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']])
eval_df.head()
```
פלט
| | | timestamp | h | prediction | actual |
| --- | ---------- | --------- | --- | ---------- | -------- |
| 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 |
| 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 |
| 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 |
| 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 |
| 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 |
התבוננו בתחזית הנתונים השעתית, בהשוואה לעומס בפועל. עד כמה זה מדויק?
### בדיקת דיוק המודל
בדקו את דיוק המודל שלכם על ידי בדיקת שגיאת האחוז הממוצעת המוחלטת (MAPE) שלו על כל התחזיות.
> **🧮 הצג לי את המתמטיקה**
>
> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png)
>
> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) משמש להציג את דיוק התחזית כיחס שמוגדר על ידי הנוסחה לעיל. ההפרש בין הערך האמיתי לערך החזוי מחולק בערך האמיתי.
> "הערך המוחלט בחישוב זה מסוכם עבור כל נקודת תחזית בזמן ומחולק במספר הנקודות המותאמות n." [ויקיפדיה](https://wikipedia.org/wiki/Mean_absolute_percentage_error)
1. כתיבת משוואה בקוד:
```python
if(HORIZON > 1):
eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual']
print(eval_df.groupby('h')['APE'].mean())
```
1. חישוב MAPE של צעד אחד:
```python
print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%')
```
MAPE של תחזית צעד אחד: 0.5570581332313952 %
1. הדפסת MAPE של תחזית רב-שלבית:
```python
print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%')
```
```output
Multi-step forecast MAPE: 1.1460048657704118 %
```
מספר נמוך הוא הטוב ביותר: יש לקחת בחשבון שתחזית עם MAPE של 10 היא תחזית עם סטייה של 10%.
1. אבל כמו תמיד, קל יותר לראות מדידה כזו של דיוק באופן חזותי, אז בואו נשרטט את זה:
```python
if(HORIZON == 1):
## Plotting single step forecast
eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8))
else:
## Plotting multi step forecast
plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']]
for t in range(1, HORIZON+1):
plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values
fig = plt.figure(figsize=(15, 8))
ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0)
ax = fig.add_subplot(111)
for t in range(1, HORIZON+1):
x = plot_df['timestamp'][(t-1):]
y = plot_df['t+'+str(t)][0:len(x)]
ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t))
ax.legend(loc='best')
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![מודל סדרת זמן](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png)
🏆 גרף יפה מאוד, שמציג מודל עם דיוק טוב. עבודה מצוינת!
---
## 🚀אתגר
חקרו את הדרכים לבחון את דיוקו של מודל סדרת זמן. בשיעור זה נגענו ב-MAPE, אבל האם יש שיטות נוספות שתוכלו להשתמש בהן? חקרו אותן והוסיפו הערות. מסמך מועיל ניתן למצוא [כאן](https://otexts.com/fpp2/accuracy.html)
## [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
שיעור זה נוגע רק ביסודות של תחזיות סדרת זמן עם ARIMA. הקדישו זמן להעמיק את הידע שלכם על ידי חקר [מאגר זה](https://microsoft.github.io/forecasting/) וסוגי המודלים השונים שבו כדי ללמוד דרכים נוספות לבנות מודלים של סדרות זמן.
## משימה
[מודל ARIMA חדש](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1c814013e10866dfd92cdb32caaae3ac",
"translation_date": "2025-09-05T19:02:05+00:00",
"source_file": "7-TimeSeries/2-ARIMA/assignment.md",
"language_code": "he"
}
-->
# מודל ARIMA חדש
## הוראות
עכשיו, לאחר שבניתם מודל ARIMA, בנו מודל חדש עם נתונים חדשים (נסו אחד מ[מאגרי הנתונים האלה של Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). תעדו את העבודה שלכם במחברת, בצעו ויזואליזציה לנתונים ולמודל שלכם, ובדקו את דיוקו באמצעות MAPE.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ---------------------------------- |
| | מוצגת מחברת עם מודל ARIMA חדש שנבנה, נבדק והוסבר עם ויזואליזציות ודיוק שצוין. | המחברת המוצגת אינה מתועדת או מכילה שגיאות | מוצגת מחברת לא מלאה |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T19:02:50+00:00",
"source_file": "7-TimeSeries/2-ARIMA/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T19:02:32+00:00",
"source_file": "7-TimeSeries/2-ARIMA/solution/R/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,400 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "482bccabe1df958496ea71a3667995cd",
"translation_date": "2025-09-05T19:07:29+00:00",
"source_file": "7-TimeSeries/3-SVR/README.md",
"language_code": "he"
}
-->
# חיזוי סדרות זמן עם Support Vector Regressor
בשיעור הקודם, למדת כיצד להשתמש במודל ARIMA כדי לבצע תחזיות של סדרות זמן. עכשיו תכיר את מודל Support Vector Regressor, שהוא מודל רגרסיה המשמש לחיזוי נתונים רציפים.
## [מבחן מקדים](https://ff-quizzes.netlify.app/en/ml/)
## מבוא
בשיעור זה, תגלו דרך ספציפית לבנות מודלים עם [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) עבור רגרסיה, או **SVR: Support Vector Regressor**.
### SVR בהקשר של סדרות זמן [^1]
לפני שנבין את החשיבות של SVR בחיזוי סדרות זמן, הנה כמה מושגים חשובים שעליכם להכיר:
- **רגרסיה:** טכניקת למידה מונחית לחיזוי ערכים רציפים מתוך קבוצת נתונים נתונה. הרעיון הוא להתאים עקומה (או קו) במרחב התכונות שיש לה את המספר המרבי של נקודות נתונים. [לחצו כאן](https://en.wikipedia.org/wiki/Regression_analysis) למידע נוסף.
- **Support Vector Machine (SVM):** סוג של מודל למידת מכונה מונחית המשמש לסיווג, רגרסיה וזיהוי חריגות. המודל הוא היפר-מישור במרחב התכונות, שבמקרה של סיווג משמש כגבול, ובמקרה של רגרסיה משמש כקו ההתאמה הטוב ביותר. ב-SVM, פונקציית Kernel משמשת בדרך כלל כדי להפוך את קבוצת הנתונים למרחב בעל מספר ממדים גבוה יותר, כך שניתן להפריד אותם בקלות. [לחצו כאן](https://en.wikipedia.org/wiki/Support-vector_machine) למידע נוסף על SVMs.
- **Support Vector Regressor (SVR):** סוג של SVM, שמטרתו למצוא את קו ההתאמה הטוב ביותר (שבמקרה של SVM הוא היפר-מישור) שיש לו את המספר המרבי של נקודות נתונים.
### למה SVR? [^1]
בשיעור הקודם למדתם על ARIMA, שהוא שיטה סטטיסטית ליניארית מוצלחת לחיזוי נתוני סדרות זמן. עם זאת, במקרים רבים, נתוני סדרות זמן מכילים *אי-ליניאריות*, שלא ניתן למפות באמצעות מודלים ליניאריים. במקרים כאלה, היכולת של SVM להתחשב באי-ליניאריות בנתונים עבור משימות רגרסיה הופכת את SVR למוצלח בחיזוי סדרות זמן.
## תרגיל - בניית מודל SVR
השלבים הראשונים להכנת הנתונים זהים לאלה של השיעור הקודם על [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA).
פתחו את [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) בתיקייה של שיעור זה ומצאו את הקובץ [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb).[^2]
1. הריצו את המחברת וייבאו את הספריות הנדרשות: [^2]
```python
import sys
sys.path.append('../../')
```
```python
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from sklearn.svm import SVR
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
```
2. טענו את הנתונים מתוך הקובץ `/data/energy.csv` לתוך DataFrame של Pandas והסתכלו עליהם: [^2]
```python
energy = load_data('../../data')[['load']]
```
3. צרו גרף של כל נתוני האנרגיה הזמינים מינואר 2012 עד דצמבר 2014: [^2]
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![נתונים מלאים](../../../../7-TimeSeries/3-SVR/images/full-data.png)
עכשיו, בואו נבנה את מודל ה-SVR שלנו.
### יצירת קבוצות אימון ובדיקה
עכשיו הנתונים שלכם טעונים, כך שתוכלו להפריד אותם לקבוצות אימון ובדיקה. לאחר מכן תעצבו מחדש את הנתונים כדי ליצור קבוצת נתונים מבוססת צעדי זמן, שתידרש עבור SVR. תאמנו את המודל שלכם על קבוצת האימון. לאחר שהמודל סיים את האימון, תעריכו את דיוקו על קבוצת האימון, קבוצת הבדיקה ולאחר מכן על כל קבוצת הנתונים כדי לראות את הביצועים הכוללים. עליכם לוודא שקבוצת הבדיקה מכסה תקופה מאוחרת יותר בזמן מקבוצת האימון כדי להבטיח שהמודל לא יקבל מידע מתקופות זמן עתידיות [^2] (מצב המכונה *Overfitting*).
1. הקצו תקופה של חודשיים מה-1 בספטמבר עד ה-31 באוקטובר 2014 לקבוצת האימון. קבוצת הבדיקה תכלול את התקופה של חודשיים מה-1 בנובמבר עד ה-31 בדצמבר 2014: [^2]
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
2. הציגו את ההבדלים: [^2]
```python
energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
.join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
.plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![נתוני אימון ובדיקה](../../../../7-TimeSeries/3-SVR/images/train-test.png)
### הכנת הנתונים לאימון
עכשיו, עליכם להכין את הנתונים לאימון על ידי ביצוע סינון וסקיילינג של הנתונים שלכם. סננו את קבוצת הנתונים כך שתכלול רק את התקופות והעמודות הדרושות, וסקיילינג כדי להבטיח שהנתונים יוקרנו בטווח 0,1.
1. סננו את קבוצת הנתונים המקורית כך שתכלול רק את התקופות שהוזכרו לכל קבוצה ותכלול רק את העמודה הדרושה 'load' בנוסף לתאריך: [^2]
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
test = energy.copy()[energy.index >= test_start_dt][['load']]
print('Training data shape: ', train.shape)
print('Test data shape: ', test.shape)
```
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
2. בצעו סקיילינג לנתוני האימון כך שיהיו בטווח (0, 1): [^2]
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
```
4. עכשיו, בצעו סקיילינג לנתוני הבדיקה: [^2]
```python
test['load'] = scaler.transform(test)
```
### יצירת נתונים עם צעדי זמן [^1]
עבור SVR, אתם ממירים את נתוני הקלט לצורה `[batch, timesteps]`. לכן, תעצבו מחדש את `train_data` ו-`test_data` כך שתהיה ממד חדש שמתייחס לצעדי הזמן.
```python
# Converting to numpy arrays
train_data = train.values
test_data = test.values
```
לדוגמה זו, ניקח `timesteps = 5`. כך שהקלטים למודל הם הנתונים עבור 4 צעדי הזמן הראשונים, והפלט יהיה הנתונים עבור צעד הזמן החמישי.
```python
timesteps=5
```
המרת נתוני האימון לטנסור דו-ממדי באמצעות list comprehension מקונן:
```python
train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0]
train_data_timesteps.shape
```
```output
(1412, 5)
```
המרת נתוני הבדיקה לטנסור דו-ממדי:
```python
test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0]
test_data_timesteps.shape
```
```output
(44, 5)
```
בחירת קלטים ופלטים מנתוני האימון והבדיקה:
```python
x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]]
x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]]
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
```
```output
(1412, 4) (1412, 1)
(44, 4) (44, 1)
```
### יישום SVR [^1]
עכשיו, הגיע הזמן ליישם SVR. לקריאה נוספת על יישום זה, תוכלו לעיין ב-[תיעוד הזה](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). עבור היישום שלנו, נבצע את השלבים הבאים:
1. הגדירו את המודל על ידי קריאה ל-`SVR()` והעברת היפר-פרמטרים של המודל: kernel, gamma, c ו-epsilon
2. הכינו את המודל לנתוני האימון על ידי קריאה לפונקציה `fit()`
3. בצעו תחזיות על ידי קריאה לפונקציה `predict()`
עכשיו ניצור מודל SVR. כאן נשתמש ב-[RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel), ונגדיר את היפר-פרמטרים gamma, C ו-epsilon כ-0.5, 10 ו-0.05 בהתאמה.
```python
model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05)
```
#### התאמת המודל לנתוני האימון [^1]
```python
model.fit(x_train, y_train[:,0])
```
```output
SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5,
kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
```
#### ביצוע תחזיות עם המודל [^1]
```python
y_train_pred = model.predict(x_train).reshape(-1,1)
y_test_pred = model.predict(x_test).reshape(-1,1)
print(y_train_pred.shape, y_test_pred.shape)
```
```output
(1412, 1) (44, 1)
```
יצרתם את ה-SVR שלכם! עכשיו נצטרך להעריך אותו.
### הערכת המודל שלכם [^1]
להערכה, קודם כל נחזיר את הנתונים לסקייל המקורי שלנו. לאחר מכן, כדי לבדוק את הביצועים, ניצור גרף של סדרת הזמן המקורית והתחזית, ונדפיס גם את תוצאת ה-MAPE.
החזירו את הפלטים המנובאים והמקוריים לסקייל המקורי:
```python
# Scaling the predictions
y_train_pred = scaler.inverse_transform(y_train_pred)
y_test_pred = scaler.inverse_transform(y_test_pred)
print(len(y_train_pred), len(y_test_pred))
```
```python
# Scaling the original values
y_train = scaler.inverse_transform(y_train)
y_test = scaler.inverse_transform(y_test)
print(len(y_train), len(y_test))
```
#### בדיקת ביצועי המודל על נתוני האימון והבדיקה [^1]
נחלץ את חותמות הזמן מקבוצת הנתונים כדי להציג בציר ה-x של הגרף שלנו. שימו לב שאנחנו משתמשים ב-```timesteps-1``` הערכים הראשונים כקלט עבור הפלט הראשון, כך שחותמות הזמן עבור הפלט יתחילו לאחר מכן.
```python
train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:]
test_timestamps = energy[test_start_dt:].index[timesteps-1:]
print(len(train_timestamps), len(test_timestamps))
```
```output
1412 44
```
צרו גרף של התחזיות עבור נתוני האימון:
```python
plt.figure(figsize=(25,6))
plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.title("Training data prediction")
plt.show()
```
![תחזית נתוני אימון](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png)
הדפיסו את MAPE עבור נתוני האימון
```python
print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')
```
```output
MAPE for training data: 1.7195710200875551 %
```
צרו גרף של התחזיות עבור נתוני הבדיקה
```python
plt.figure(figsize=(10,3))
plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![תחזית נתוני בדיקה](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png)
הדפיסו את MAPE עבור נתוני הבדיקה
```python
print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')
```
```output
MAPE for testing data: 1.2623790187854018 %
```
🏆 קיבלתם תוצאה טובה מאוד על קבוצת הבדיקה!
### בדיקת ביצועי המודל על כל קבוצת הנתונים [^1]
```python
# Extracting load values as numpy array
data = energy.copy().values
# Scaling
data = scaler.transform(data)
# Transforming to 2D tensor as per model input requirement
data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0]
print("Tensor shape: ", data_timesteps.shape)
# Selecting inputs and outputs from data
X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]]
print("X shape: ", X.shape,"\nY shape: ", Y.shape)
```
```output
Tensor shape: (26300, 5)
X shape: (26300, 4)
Y shape: (26300, 1)
```
```python
# Make model predictions
Y_pred = model.predict(X).reshape(-1,1)
# Inverse scale and reshape
Y_pred = scaler.inverse_transform(Y_pred)
Y = scaler.inverse_transform(Y)
```
```python
plt.figure(figsize=(30,8))
plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(Y_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![תחזית נתונים מלאים](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png)
```python
print('MAPE: ', mape(Y_pred, Y)*100, '%')
```
```output
MAPE: 2.0572089029888656 %
```
🏆 גרפים מרשימים מאוד, שמראים מודל עם דיוק טוב. כל הכבוד!
---
## 🚀אתגר
- נסו לשנות את היפר-פרמטרים (gamma, C, epsilon) בזמן יצירת המודל והעריכו את הנתונים כדי לראות איזה סט של היפר-פרמטרים נותן את התוצאות הטובות ביותר על נתוני הבדיקה. למידע נוסף על היפר-פרמטרים אלה, תוכלו לעיין בתיעוד [כאן](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel).
- נסו להשתמש בפונקציות kernel שונות עבור המודל ונתחו את ביצועיהן על קבוצת הנתונים. מסמך מועיל ניתן למצוא [כאן](https://scikit-learn.org/stable/modules/svm.html#kernel-functions).
- נסו להשתמש בערכים שונים עבור `timesteps` כדי שהמודל יוכל להסתכל אחורה ולבצע תחזית.
## [מבחן מסכם](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
שיעור זה נועד להציג את השימוש ב-SVR לחיזוי סדרות זמן. לקריאה נוספת על SVR, תוכלו לעיין ב-[בלוג הזה](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). תיעוד זה ב-[scikit-learn](https://scikit-learn.org/stable/modules/svm.html) מספק הסבר מקיף יותר על SVMs באופן כללי, [SVRs](https://scikit-learn.org/stable/modules/svm.html#regression) וגם פרטי יישום אחרים כמו [פונקציות kernel](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) שונות שניתן להשתמש בהן, והפרמטרים שלהן.
## משימה
[מודל SVR חדש](assignment.md)
## קרדיטים
[^1]: הטקסט, הקוד והתוצאות בסעיף זה נתרמו על ידי [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD)
[^2]: הטקסט, הקוד והתוצאות בסעיף זה נלקחו מ-[ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "94aa2fc6154252ae30a3f3740299707a",
"translation_date": "2025-09-05T19:09:36+00:00",
"source_file": "7-TimeSeries/3-SVR/assignment.md",
"language_code": "he"
}
-->
# מודל SVR חדש
## הוראות [^1]
עכשיו כשיצרתם מודל SVR, צרו מודל חדש עם נתונים חדשים (נסו אחד מ[מאגרי הנתונים האלה מדוק](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). תעדו את העבודה שלכם במחברת, ויזואליזו את הנתונים ואת המודל שלכם, ובדקו את דיוקו באמצעות גרפים מתאימים ו-MAPE. בנוסף, נסו לשנות את ההיפר-פרמטרים השונים וגם להשתמש בערכים שונים עבור שלבי הזמן.
## קריטריונים להערכה [^1]
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ---------------------------------------------------------- | ----------------------------------------------------- | ---------------------------- |
| | מוצגת מחברת עם מודל SVR שנבנה, נבדק והוסבר עם ויזואליזציות ודיוק מצוין. | המחברת המוצגת אינה מתועדת או מכילה שגיאות. | מוצגת מחברת לא מלאה |
[^1]: הטקסט בסעיף זה מבוסס על [המשימה מ-ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,37 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "61342603bad8acadbc6b2e4e3aab3f66",
"translation_date": "2025-09-05T18:57:42+00:00",
"source_file": "7-TimeSeries/README.md",
"language_code": "he"
}
-->
# מבוא לחיזוי סדרות זמן
מהו חיזוי סדרות זמן? מדובר בניבוי אירועים עתידיים על ידי ניתוח מגמות מהעבר.
## נושא אזורי: שימוש עולמי בחשמל ✨
בשני השיעורים הללו, תיחשפו לחיזוי סדרות זמן, תחום פחות מוכר בלמידת מכונה, אך בעל ערך רב ליישומים בתעשייה ובעסקים, בין היתר. למרות שניתן להשתמש ברשתות עצביות כדי לשפר את יעילות המודלים הללו, נלמד אותם בהקשר של למידת מכונה קלאסית, כאשר המודלים מסייעים לנבא ביצועים עתידיים בהתבסס על העבר.
המיקוד האזורי שלנו הוא שימוש בחשמל בעולם, מערך נתונים מעניין ללמידה על חיזוי צריכת חשמל עתידית בהתבסס על דפוסי עומס מהעבר. ניתן לראות כיצד סוג כזה של חיזוי יכול להיות מועיל מאוד בסביבה עסקית.
![רשת חשמל](../../../7-TimeSeries/images/electric-grid.jpg)
תמונה מאת [Peddi Sai hrithik](https://unsplash.com/@shutter_log?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText) של עמודי חשמל על כביש ברג'סטאן ב-[Unsplash](https://unsplash.com/s/photos/electric-india?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText)
## שיעורים
1. [מבוא לחיזוי סדרות זמן](1-Introduction/README.md)
2. [בניית מודלים ARIMA לחיזוי סדרות זמן](2-ARIMA/README.md)
3. [בניית Support Vector Regressor לחיזוי סדרות זמן](3-SVR/README.md)
## קרדיטים
"מבוא לחיזוי סדרות זמן" נכתב עם ⚡️ על ידי [Francesca Lazzeri](https://twitter.com/frlazzeri) ו-[Jen Looper](https://twitter.com/jenlooper). המחברות הופיעו לראשונה באופן מקוון ב-[מאגר Azure "Deep Learning For Time Series"](https://github.com/Azure/DeepLearningForTimeSeriesForecasting) שנכתב במקור על ידי Francesca Lazzeri. השיעור על SVR נכתב על ידי [Anirban Mukherjee](https://github.com/AnirbanMukherjeeXD)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,256 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "911efd5e595089000cb3c16fce1beab8",
"translation_date": "2025-09-05T20:12:27+00:00",
"source_file": "8-Reinforcement/1-QLearning/README.md",
"language_code": "he"
}
-->
# מבוא ללמידת חיזוק ולמידת Q
![סיכום למידת חיזוק בלמידת מכונה בסקצ'נוט](../../../../sketchnotes/ml-reinforcement.png)
> סקצ'נוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
למידת חיזוק כוללת שלושה מושגים חשובים: הסוכן, מצבים מסוימים, ומערך פעולות לכל מצב. על ידי ביצוע פעולה במצב מסוים, הסוכן מקבל תגמול. דמיינו שוב את משחק המחשב סופר מריו. אתם מריו, נמצאים ברמת משחק, עומדים ליד קצה צוק. מעליכם יש מטבע. אתם, בתור מריו, ברמת משחק, במיקום ספציפי... זהו המצב שלכם. צעד אחד ימינה (פעולה) יוביל אתכם מעבר לקצה, וזה יעניק לכם ניקוד נמוך. לעומת זאת, לחיצה על כפתור הקפיצה תאפשר לכם לצבור נקודה ולהישאר בחיים. זהו תוצאה חיובית שצריכה להעניק לכם ניקוד חיובי.
באמצעות למידת חיזוק וסימולטור (המשחק), ניתן ללמוד כיצד לשחק את המשחק כדי למקסם את התגמול, כלומר להישאר בחיים ולצבור כמה שיותר נקודות.
[![מבוא ללמידת חיזוק](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
> 🎥 לחצו על התמונה למעלה כדי לשמוע את דמיטרי מדבר על למידת חיזוק
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
## דרישות מוקדמות והגדרות
בשיעור זה, נתנסה בקוד בפייתון. עליכם להיות מסוגלים להריץ את הקוד של Jupyter Notebook מהשיעור הזה, בין אם במחשב שלכם או בענן.
ניתן לפתוח את [מחברת השיעור](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) ולעבור על השיעור כדי לבנות.
> **הערה:** אם אתם פותחים את הקוד מהענן, תצטרכו גם להוריד את הקובץ [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), שמשמש בקוד המחברת. הוסיפו אותו לאותה תיקייה כמו המחברת.
## מבוא
בשיעור זה, נחקור את עולמו של **[פטר והזאב](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, בהשראת אגדה מוזיקלית של המלחין הרוסי [סרגיי פרוקופייב](https://en.wikipedia.org/wiki/Sergei_Prokofiev). נשתמש ב**למידת חיזוק** כדי לאפשר לפטר לחקור את סביבתו, לאסוף תפוחים טעימים ולהימנע ממפגש עם הזאב.
**למידת חיזוק** (RL) היא טכניקת למידה שמאפשרת לנו ללמוד התנהגות אופטימלית של **סוכן** בסביבה מסוימת על ידי ביצוע ניסויים רבים. סוכן בסביבה זו צריך שיהיה לו **מטרה**, שמוגדרת על ידי **פונקציית תגמול**.
## הסביבה
לצורך הפשטות, נניח שעולמו של פטר הוא לוח מרובע בגודל `width` x `height`, כמו זה:
![הסביבה של פטר](../../../../8-Reinforcement/1-QLearning/images/environment.png)
כל תא בלוח הזה יכול להיות:
* **קרקע**, שעליה פטר ויצורים אחרים יכולים ללכת.
* **מים**, שעליהם כמובן אי אפשר ללכת.
* **עץ** או **דשא**, מקום שבו אפשר לנוח.
* **תפוח**, שמייצג משהו שפטר ישמח למצוא כדי להאכיל את עצמו.
* **זאב**, שהוא מסוכן ויש להימנע ממנו.
ישנו מודול פייתון נפרד, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), שמכיל את הקוד לעבודה עם הסביבה הזו. מכיוון שהקוד הזה אינו חשוב להבנת המושגים שלנו, נייבא את המודול ונשתמש בו כדי ליצור את הלוח לדוגמה (בלוק קוד 1):
```python
from rlboard import *
width, height = 8,8
m = Board(width,height)
m.randomize(seed=13)
m.plot()
```
הקוד הזה אמור להדפיס תמונה של הסביבה הדומה לזו שמוצגת למעלה.
## פעולות ומדיניות
בדוגמה שלנו, המטרה של פטר תהיה למצוא תפוח, תוך הימנעות מהזאב ומכשולים אחרים. לשם כך, הוא יכול למעשה להסתובב עד שימצא תפוח.
לכן, בכל מיקום, הוא יכול לבחור בין אחת מהפעולות הבאות: למעלה, למטה, שמאלה וימינה.
נגדיר את הפעולות הללו כמילון, ונמפה אותן לזוגות של שינויי קואורדינטות מתאימים. לדוגמה, תנועה ימינה (`R`) תתאים לזוג `(1,0)`. (בלוק קוד 2):
```python
actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
action_idx = { a : i for i,a in enumerate(actions.keys()) }
```
לסיכום, האסטרטגיה והמטרה של התרחיש הזה הם כדלקמן:
- **האסטרטגיה**, של הסוכן שלנו (פטר) מוגדרת על ידי מה שנקרא **מדיניות**. מדיניות היא פונקציה שמחזירה את הפעולה בכל מצב נתון. במקרה שלנו, מצב הבעיה מיוצג על ידי הלוח, כולל המיקום הנוכחי של השחקן.
- **המטרה**, של למידת החיזוק היא בסופו של דבר ללמוד מדיניות טובה שתאפשר לנו לפתור את הבעיה ביעילות. עם זאת, כבסיס, נשקול את המדיניות הפשוטה ביותר שנקראת **הליכה אקראית**.
## הליכה אקראית
בואו נפתור את הבעיה שלנו תחילה על ידי יישום אסטרטגיית הליכה אקראית. עם הליכה אקראית, נבחר באופן אקראי את הפעולה הבאה מתוך הפעולות המותרות, עד שנגיע לתפוח (בלוק קוד 3).
1. יישמו את ההליכה האקראית עם הקוד הבא:
```python
def random_policy(m):
return random.choice(list(actions))
def walk(m,policy,start_position=None):
n = 0 # number of steps
# set initial position
if start_position:
m.human = start_position
else:
m.random_start()
while True:
if m.at() == Board.Cell.apple:
return n # success!
if m.at() in [Board.Cell.wolf, Board.Cell.water]:
return -1 # eaten by wolf or drowned
while True:
a = actions[policy(m)]
new_pos = m.move_pos(m.human,a)
if m.is_valid(new_pos) and m.at(new_pos)!=Board.Cell.water:
m.move(a) # do the actual move
break
n+=1
walk(m,random_policy)
```
הקריאה ל-`walk` אמורה להחזיר את אורך המסלול המתאים, שיכול להשתנות מריצה אחת לאחרת.
1. הריצו את ניסוי ההליכה מספר פעמים (נניח, 100), והדפיסו את הסטטיסטיקות המתקבלות (בלוק קוד 4):
```python
def print_statistics(policy):
s,w,n = 0,0,0
for _ in range(100):
z = walk(m,policy)
if z<0:
w+=1
else:
s += z
n += 1
print(f"Average path length = {s/n}, eaten by wolf: {w} times")
print_statistics(random_policy)
```
שימו לב שאורך המסלול הממוצע הוא סביב 30-40 צעדים, שזה די הרבה, בהתחשב בכך שהמרחק הממוצע לתפוח הקרוב ביותר הוא סביב 5-6 צעדים.
תוכלו גם לראות כיצד נראית תנועתו של פטר במהלך ההליכה האקראית:
![הליכה אקראית של פטר](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif)
## פונקציית תגמול
כדי להפוך את המדיניות שלנו לאינטליגנטית יותר, עלינו להבין אילו מהלכים הם "טובים" יותר מאחרים. לשם כך, עלינו להגדיר את המטרה שלנו.
המטרה יכולה להיות מוגדרת במונחים של **פונקציית תגמול**, שתחזיר ערך ניקוד עבור כל מצב. ככל שהמספר גבוה יותר, כך פונקציית התגמול טובה יותר. (בלוק קוד 5)
```python
move_reward = -0.1
goal_reward = 10
end_reward = -10
def reward(m,pos=None):
pos = pos or m.human
if not m.is_valid(pos):
return end_reward
x = m.at(pos)
if x==Board.Cell.water or x == Board.Cell.wolf:
return end_reward
if x==Board.Cell.apple:
return goal_reward
return move_reward
```
דבר מעניין לגבי פונקציות תגמול הוא שבמקרים רבים, *אנו מקבלים תגמול משמעותי רק בסוף המשחק*. משמעות הדבר היא שהאלגוריתם שלנו צריך לזכור "צעדים טובים" שהובילו לתגמול חיובי בסוף, ולהגדיל את חשיבותם. באופן דומה, כל המהלכים שמובילים לתוצאות רעות צריכים להיות מדוכאים.
## למידת Q
האלגוריתם שנדון בו כאן נקרא **למידת Q**. באלגוריתם זה, המדיניות מוגדרת על ידי פונקציה (או מבנה נתונים) שנקראת **טבלת Q**. היא מתעדת את "הטוב" של כל אחת מהפעולות במצב נתון.
היא נקראת טבלת Q מכיוון שלעתים קרובות נוח לייצג אותה כטבלה, או מערך רב-ממדי. מכיוון שלוח המשחק שלנו הוא בגודל `width` x `height`, נוכל לייצג את טבלת Q באמצעות מערך numpy עם צורה `width` x `height` x `len(actions)`: (בלוק קוד 6)
```python
Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
```
שימו לב שאנו מאתחלים את כל הערכים בטבלת Q עם ערך שווה, במקרה שלנו - 0.25. זה תואם למדיניות "הליכה אקראית", מכיוון שכל המהלכים בכל מצב הם טובים באותה מידה. נוכל להעביר את טבלת Q לפונקציית `plot` כדי להמחיש את הטבלה על הלוח: `m.plot(Q)`.
![הסביבה של פטר](../../../../8-Reinforcement/1-QLearning/images/env_init.png)
במרכז כל תא יש "חץ" שמצביע על כיוון התנועה המועדף. מכיוון שכל הכיוונים שווים, מוצגת נקודה.
כעת עלינו להריץ את הסימולציה, לחקור את הסביבה שלנו, וללמוד חלוקה טובה יותר של ערכי טבלת Q, שתאפשר לנו למצוא את הדרך לתפוח הרבה יותר מהר.
## מהות למידת Q: משוואת בלמן
ברגע שנתחיל לזוז, לכל פעולה יהיה תגמול מתאים, כלומר נוכל באופן תיאורטי לבחור את הפעולה הבאה על סמך התגמול המיידי הגבוה ביותר. עם זאת, ברוב המצבים, המהלך לא ישיג את מטרתנו להגיע לתפוח, ולכן לא נוכל להחליט מיד איזה כיוון טוב יותר.
> זכרו שזה לא התוצאה המיידית שחשובה, אלא התוצאה הסופית, שנקבל בסוף הסימולציה.
כדי לקחת בחשבון את התגמול המושהה, עלינו להשתמש בעקרונות של **[תכנות דינמי](https://en.wikipedia.org/wiki/Dynamic_programming)**, שמאפשרים לנו לחשוב על הבעיה שלנו באופן רקורסיבי.
נניח שאנחנו נמצאים כעת במצב *s*, ורוצים לעבור למצב הבא *s'*. על ידי כך, נקבל את התגמול המיידי *r(s,a)*, שמוגדר על ידי פונקציית התגמול, בתוספת תגמול עתידי כלשהו. אם נניח שטבלת Q שלנו משקפת נכון את "האטרקטיביות" של כל פעולה, אז במצב *s'* נבחר פעולה *a* שתואמת לערך המקסימלי של *Q(s',a')*. לכן, התגמול העתידי הטוב ביותר שנוכל לקבל במצב *s* יוגדר כ-`max`
## בדיקת המדיניות
מכיוון ש-Q-Table מציג את "האטרקטיביות" של כל פעולה בכל מצב, קל מאוד להשתמש בו כדי להגדיר ניווט יעיל בעולם שלנו. במקרה הפשוט ביותר, ניתן לבחור את הפעולה המתאימה לערך הגבוה ביותר ב-Q-Table: (בלוק קוד 9)
```python
def qpolicy_strict(m):
x,y = m.human
v = probs(Q[x,y])
a = list(actions)[np.argmax(v)]
return a
walk(m,qpolicy_strict)
```
> אם תנסו את הקוד למעלה מספר פעמים, ייתכן שתשימו לב שלפעמים הוא "נתקע", ותצטרכו ללחוץ על כפתור ה-STOP במחברת כדי להפסיק אותו. זה קורה מכיוון שיכולות להיות מצבים שבהם שני מצבים "מצביעים" זה על זה מבחינת ערך Q אופטימלי, ובמקרה כזה הסוכן ימשיך לנוע בין אותם מצבים ללא סוף.
## 🚀אתגר
> **משימה 1:** שנו את הפונקציה `walk` כך שתוגבל אורך המסלול המרבי למספר מסוים של צעדים (לדוגמה, 100), וצפו בקוד למעלה מחזיר את הערך הזה מדי פעם.
> **משימה 2:** שנו את הפונקציה `walk` כך שלא תחזור למקומות שבהם כבר הייתה בעבר. זה ימנע מ-`walk` להיכנס ללולאה, אך עדיין ייתכן שהסוכן ימצא את עצמו "תקוע" במקום שממנו אינו יכול לברוח.
## ניווט
מדיניות ניווט טובה יותר תהיה זו שהשתמשנו בה במהלך האימון, שמשלבת ניצול וחקר. במדיניות זו, נבחר כל פעולה עם הסתברות מסוימת, פרופורציונלית לערכים ב-Q-Table. אסטרטגיה זו עדיין עשויה לגרום לסוכן לחזור למיקום שכבר חקר, אך כפי שניתן לראות מהקוד למטה, היא מביאה למסלול ממוצע קצר מאוד למיקום הרצוי (זכרו ש-`print_statistics` מריץ את הסימולציה 100 פעמים): (בלוק קוד 10)
```python
def qpolicy(m):
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
return a
print_statistics(qpolicy)
```
לאחר הרצת הקוד הזה, אתם אמורים לקבל אורך מסלול ממוצע קטן בהרבה מאשר קודם, בטווח של 3-6.
## חקירת תהליך הלמידה
כפי שציינו, תהליך הלמידה הוא איזון בין חקר לבין ניצול הידע שנצבר על מבנה מרחב הבעיה. ראינו שהתוצאות של הלמידה (היכולת לעזור לסוכן למצוא מסלול קצר למטרה) השתפרו, אך גם מעניין לצפות כיצד אורך המסלול הממוצע מתנהג במהלך תהליך הלמידה:
## סיכום הלמידות:
- **אורך המסלול הממוצע עולה**. מה שאנו רואים כאן הוא שבתחילה, אורך המסלול הממוצע עולה. זה כנראה נובע מכך שכאשר איננו יודעים דבר על הסביבה, אנו נוטים להיתקע במצבים גרועים, כמו מים או זאב. ככל שאנו לומדים יותר ומתחילים להשתמש בידע הזה, אנו יכולים לחקור את הסביבה לזמן ארוך יותר, אך עדיין איננו יודעים היטב היכן נמצאים התפוחים.
- **אורך המסלול יורד ככל שאנו לומדים יותר**. ברגע שאנו לומדים מספיק, קל יותר לסוכן להשיג את המטרה, ואורך המסלול מתחיל לרדת. עם זאת, אנו עדיין פתוחים לחקר, ולכן לעיתים קרובות אנו סוטים מהמסלול הטוב ביותר ובוחנים אפשרויות חדשות, מה שגורם למסלול להיות ארוך יותר מהאופטימלי.
- **אורך המסלול עולה באופן פתאומי**. מה שאנו גם רואים בגרף הוא שבשלב מסוים, האורך עלה באופן פתאומי. זה מצביע על האופי הסטוכסטי של התהליך, ועל כך שבשלב מסוים אנו יכולים "לקלקל" את מקדמי ה-Q-Table על ידי החלפתם בערכים חדשים. באופן אידיאלי, יש למזער זאת על ידי הפחתת קצב הלמידה (לדוגמה, לקראת סוף האימון, אנו משנים את ערכי ה-Q-Table רק במידה קטנה).
בסך הכל, חשוב לזכור שההצלחה והאיכות של תהליך הלמידה תלויים באופן משמעותי בפרמטרים, כמו קצב הלמידה, דעיכת קצב הלמידה, ופקטור ההנחה. אלו נקראים לעיתים קרובות **היפר-פרמטרים**, כדי להבדילם מ-**פרמטרים**, שאותם אנו ממטבים במהלך האימון (לדוגמה, מקדמי Q-Table). תהליך מציאת הערכים הטובים ביותר להיפר-פרמטרים נקרא **אופטימיזציה של היפר-פרמטרים**, והוא ראוי לנושא נפרד.
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## משימה
[עולם מציאותי יותר](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,41 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "68394b2102d3503882e5e914bd0ff5c1",
"translation_date": "2025-09-05T20:17:14+00:00",
"source_file": "8-Reinforcement/1-QLearning/assignment.md",
"language_code": "he"
}
-->
# עולם מציאותי יותר
במצב שלנו, פיטר הצליח לנוע כמעט בלי להתעייף או להרגיש רעב. בעולם מציאותי יותר, הוא צריך לשבת ולנוח מדי פעם, וגם להאכיל את עצמו. בואו נעשה את העולם שלנו מציאותי יותר, על ידי יישום הכללים הבאים:
1. כאשר פיטר נע ממקום למקום, הוא מאבד **אנרגיה** וצובר **עייפות**.
2. פיטר יכול להחזיר לעצמו אנרגיה על ידי אכילת תפוחים.
3. פיטר יכול להיפטר מעייפות על ידי מנוחה מתחת לעץ או על הדשא (כלומר, הליכה למיקום בלוח שבו יש עץ או דשא - שדה ירוק).
4. פיטר צריך למצוא ולהרוג את הזאב.
5. כדי להרוג את הזאב, פיטר צריך להגיע לרמות מסוימות של אנרגיה ועייפות, אחרת הוא מפסיד בקרב.
## הוראות
השתמשו במחברת המקורית [notebook.ipynb](../../../../8-Reinforcement/1-QLearning/notebook.ipynb) כנקודת התחלה לפתרון שלכם.
שנו את פונקציית התגמול בהתאם לכללי המשחק, הריצו את אלגוריתם הלמידה החיזוקית כדי ללמוד את האסטרטגיה הטובה ביותר לנצח במשחק, והשוו את התוצאות של הליכה אקראית עם האלגוריתם שלכם מבחינת מספר המשחקים שניצחו והפסידו.
> **Note**: בעולם החדש שלכם, המצב מורכב יותר, ובנוסף למיקום האדם כולל גם רמות עייפות ואנרגיה. אתם יכולים לבחור לייצג את המצב כטופל (Board,energy,fatigue), או להגדיר מחלקה עבור המצב (ייתכן שתרצו גם להוריש אותה מ-`Board`), או אפילו לשנות את מחלקת `Board` המקורית בתוך [rlboard.py](../../../../8-Reinforcement/1-QLearning/rlboard.py).
בפתרון שלכם, אנא שמרו על הקוד האחראי לאסטרטגיית ההליכה האקראית, והשוו את תוצאות האלגוריתם שלכם עם ההליכה האקראית בסוף.
> **Note**: ייתכן שתצטרכו להתאים את ההיפר-פרמטרים כדי לגרום לזה לעבוד, במיוחד את מספר האפוקים. מכיוון שהצלחה במשחק (הקרב עם הזאב) היא אירוע נדיר, אתם יכולים לצפות לזמן אימון ארוך יותר.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| | מוצגת מחברת עם הגדרת כללי עולם חדשים, אלגוריתם Q-Learning והסברים טקסטואליים. האלגוריתם מצליח לשפר משמעותית את התוצאות בהשוואה להליכה אקראית. | מוצגת מחברת, אלגוריתם Q-Learning מיושם ומשפר את התוצאות בהשוואה להליכה אקראית, אך לא באופן משמעותי; או שהמחברת מתועדת בצורה לקויה והקוד אינו מובנה היטב. | נעשה ניסיון להגדיר מחדש את כללי העולם, אך אלגוריתם Q-Learning אינו עובד, או שפונקציית התגמול אינה מוגדרת במלואה. |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T20:18:50+00:00",
"source_file": "8-Reinforcement/1-QLearning/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס AI [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T20:18:34+00:00",
"source_file": "8-Reinforcement/1-QLearning/solution/R/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו אחראים לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,333 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "107d5bb29da8a562e7ae72262d251a75",
"translation_date": "2025-09-05T20:19:54+00:00",
"source_file": "8-Reinforcement/2-Gym/README.md",
"language_code": "he"
}
-->
## דרישות מקדימות
בשיעור הזה נשתמש בספרייה בשם **OpenAI Gym** כדי לדמות **סביבות** שונות. ניתן להריץ את הקוד של השיעור הזה באופן מקומי (למשל, מ-Visual Studio Code), ובמקרה כזה הסימולציה תיפתח בחלון חדש. כאשר מריצים את הקוד אונליין, ייתכן שתצטרכו לבצע כמה התאמות בקוד, כפי שמתואר [כאן](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7).
## OpenAI Gym
בשיעור הקודם, חוקי המשחק והמצב הוגדרו על ידי מחלקת `Board` שהגדרנו בעצמנו. כאן נשתמש ב**סביבת סימולציה** מיוחדת, שתדמה את הפיזיקה שמאחורי מוט האיזון. אחת מסביבות הסימולציה הפופולריות ביותר לאימון אלגוריתמים של למידת חיזוק נקראת [Gym](https://gym.openai.com/), שמנוהלת על ידי [OpenAI](https://openai.com/). באמצעות ה-Gym נוכל ליצור סביבות שונות, החל מסימולציית CartPole ועד משחקי Atari.
> **הערה**: ניתן לראות סביבות נוספות הזמינות ב-OpenAI Gym [כאן](https://gym.openai.com/envs/#classic_control).
ראשית, נתקין את ה-Gym ונייבא את הספריות הנדרשות (קוד בלוק 1):
```python
import sys
!{sys.executable} -m pip install gym
import gym
import matplotlib.pyplot as plt
import numpy as np
import random
```
## תרגיל - אתחול סביבת CartPole
כדי לעבוד עם בעיית איזון מוט ה-CartPole, עלינו לאתחל את הסביבה המתאימה. כל סביבה מקושרת ל:
- **מרחב תצפיות** שמגדיר את מבנה המידע שאנו מקבלים מהסביבה. עבור בעיית ה-CartPole, אנו מקבלים את מיקום המוט, מהירות ועוד ערכים נוספים.
- **מרחב פעולות** שמגדיר פעולות אפשריות. במקרה שלנו מרחב הפעולות הוא דיסקרטי, ומורכב משתי פעולות - **שמאלה** ו-**ימינה**. (קוד בלוק 2)
1. כדי לאתחל, הקלידו את הקוד הבא:
```python
env = gym.make("CartPole-v1")
print(env.action_space)
print(env.observation_space)
print(env.action_space.sample())
```
כדי לראות איך הסביבה עובדת, נריץ סימולציה קצרה של 100 צעדים. בכל צעד, נספק אחת מהפעולות לביצוע - בסימולציה הזו פשוט נבחר פעולה באופן אקראי מתוך `action_space`.
1. הריצו את הקוד הבא וראו מה מתקבל.
✅ זכרו שמומלץ להריץ את הקוד הזה בהתקנה מקומית של Python! (קוד בלוק 3)
```python
env.reset()
for i in range(100):
env.render()
env.step(env.action_space.sample())
env.close()
```
אתם אמורים לראות משהו דומה לתמונה הזו:
![CartPole ללא איזון](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif)
1. במהלך הסימולציה, עלינו לקבל תצפיות כדי להחליט כיצד לפעול. למעשה, פונקציית הצעד מחזירה תצפיות נוכחיות, פונקציית תגמול ודגל שמציין האם יש טעם להמשיך את הסימולציה או לא: (קוד בלוק 4)
```python
env.reset()
done = False
while not done:
env.render()
obs, rew, done, info = env.step(env.action_space.sample())
print(f"{obs} -> {rew}")
env.close()
```
בסופו של דבר תראו משהו כזה בתוצאות המחברת:
```text
[ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0
[ 0.02917248 -0.04828055 0.03248977 0.00543839] -> 1.0
[ 0.02820687 0.14636075 0.03259854 -0.27681916] -> 1.0
[ 0.03113408 0.34100283 0.02706215 -0.55904489] -> 1.0
[ 0.03795414 0.53573468 0.01588125 -0.84308041] -> 1.0
...
[ 0.17299878 0.15868546 -0.20754175 -0.55975453] -> 1.0
[ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0
```
וקטור התצפיות שמוחזר בכל צעד של הסימולציה מכיל את הערכים הבאים:
- מיקום העגלה
- מהירות העגלה
- זווית המוט
- קצב הסיבוב של המוט
1. קבלו את הערכים המינימליים והמקסימליים של המספרים הללו: (קוד בלוק 5)
```python
print(env.observation_space.low)
print(env.observation_space.high)
```
ייתכן שתשימו לב שערך התגמול בכל צעד של הסימולציה הוא תמיד 1. זאת מכיוון שהמטרה שלנו היא לשרוד כמה שיותר זמן, כלומר לשמור על המוט במצב אנכי סביר למשך הזמן הארוך ביותר.
✅ למעשה, סימולציית CartPole נחשבת לפתרון אם נצליח להגיע לתגמול ממוצע של 195 לאורך 100 ניסיונות רצופים.
## דיסקרטיזציה של מצב
בלמידת Q, עלינו לבנות טבלת Q שמגדירה מה לעשות בכל מצב. כדי לעשות זאת, עלינו שהמצב יהיה **דיסקרטי**, כלומר יכיל מספר סופי של ערכים דיסקרטיים. לכן, עלינו למצוא דרך **לדסקרט** את התצפיות שלנו, ולמפות אותן לקבוצה סופית של מצבים.
יש כמה דרכים לעשות זאת:
- **חלוקה לבינים**. אם אנו יודעים את הטווח של ערך מסוים, נוכל לחלק את הטווח למספר **בינים**, ואז להחליף את הערך במספר הבין שאליו הוא שייך. ניתן לעשות זאת באמצעות המתודה [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) של numpy. במקרה זה, נדע בדיוק את גודל המצב, מכיוון שהוא תלוי במספר הבינים שנבחר לדיגיטציה.
✅ ניתן להשתמש באינטרפולציה ליניארית כדי להביא ערכים לטווח סופי (למשל, מ-20- עד 20), ואז להמיר מספרים לשלמים על ידי עיגול. זה נותן לנו פחות שליטה על גודל המצב, במיוחד אם איננו יודעים את הטווחים המדויקים של ערכי הקלט. לדוגמה, במקרה שלנו 2 מתוך 4 הערכים אינם מוגבלים בטווח העליון/תחתון שלהם, מה שעשוי להוביל למספר אינסופי של מצבים.
בדוגמה שלנו, נבחר בגישה השנייה. כפי שתשימו לב מאוחר יותר, למרות שהטווחים העליונים/תחתונים אינם מוגדרים, הערכים הללו לעיתים רחוקות לוקחים ערכים מחוץ לטווחים סופיים מסוימים, ולכן מצבים עם ערכים קיצוניים יהיו נדירים מאוד.
1. הנה הפונקציה שתיקח את התצפית מהמודל שלנו ותפיק טופס של 4 ערכים שלמים: (קוד בלוק 6)
```python
def discretize(x):
return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))
```
1. בואו נחקור גם שיטת דיסקרטיזציה נוספת באמצעות בינים: (קוד בלוק 7)
```python
def create_bins(i,num):
return np.arange(num+1)*(i[1]-i[0])/num+i[0]
print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10))
ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # intervals of values for each parameter
nbins = [20,20,10,10] # number of bins for each parameter
bins = [create_bins(ints[i],nbins[i]) for i in range(4)]
def discretize_bins(x):
return tuple(np.digitize(x[i],bins[i]) for i in range(4))
```
1. עכשיו נריץ סימולציה קצרה ונצפה בערכי הסביבה הדיסקרטיים. אתם מוזמנים לנסות גם את `discretize` וגם את `discretize_bins` ולראות אם יש הבדל.
`discretize_bins` מחזירה את מספר הבין, שהוא מבוסס על 0. לכן עבור ערכי משתנה קלט סביב 0 היא מחזירה את המספר מאמצע הטווח (10). ב-`discretize`, לא דאגנו לטווח ערכי הפלט, מה שמאפשר להם להיות שליליים, ולכן ערכי המצב אינם מוזזים, ו-0 מתאים ל-0. (קוד בלוק 8)
```python
env.reset()
done = False
while not done:
#env.render()
obs, rew, done, info = env.step(env.action_space.sample())
#print(discretize_bins(obs))
print(discretize(obs))
env.close()
```
✅ בטלו את ההערה בשורה שמתחילה ב-env.render אם אתם רוצים לראות איך הסביבה מתבצעת. אחרת, תוכלו להריץ אותה ברקע, מה שמהיר יותר. נשתמש בהרצה "בלתי נראית" זו במהלך תהליך למידת Q.
## מבנה טבלת Q
בשיעור הקודם, המצב היה זוג פשוט של מספרים מ-0 עד 8, ולכן היה נוח לייצג את טבלת Q באמצעות טנזור numpy עם צורה של 8x8x2. אם נשתמש בדיסקרטיזציה באמצעות בינים, גודל וקטור המצב שלנו גם ידוע, ולכן נוכל להשתמש באותה גישה ולייצג מצב באמצעות מערך בצורת 20x20x10x10x2 (כאן 2 הוא הממד של מרחב הפעולות, והמידות הראשונות מתאימות למספר הבינים שבחרנו להשתמש עבור כל אחד מהפרמטרים במרחב התצפיות).
עם זאת, לפעמים המידות המדויקות של מרחב התצפיות אינן ידועות. במקרה של פונקציית `discretize`, לעולם לא נוכל להיות בטוחים שהמצב שלנו נשאר בתוך גבולות מסוימים, מכיוון שחלק מהערכים המקוריים אינם מוגבלים. לכן, נשתמש בגישה מעט שונה ונייצג את טבלת Q באמצעות מילון.
1. השתמשו בזוג *(state,action)* כמפתח המילון, והערך יתאים לערך הכניסה בטבלת Q. (קוד בלוק 9)
```python
Q = {}
actions = (0,1)
def qvalues(state):
return [Q.get((state,a),0) for a in actions]
```
כאן אנו גם מגדירים פונקציה `qvalues()`, שמחזירה רשימה של ערכי טבלת Q עבור מצב נתון שמתאים לכל הפעולות האפשריות. אם הכניסה אינה קיימת בטבלת Q, נחזיר 0 כברירת מחדל.
## בואו נתחיל בלמידת Q
עכשיו אנחנו מוכנים ללמד את פיטר לשמור על איזון!
1. ראשית, נגדיר כמה היפרפרמטרים: (קוד בלוק 10)
```python
# hyperparameters
alpha = 0.3
gamma = 0.9
epsilon = 0.90
```
כאן, `alpha` הוא **קצב הלמידה** שמגדיר באיזו מידה עלינו להתאים את הערכים הנוכחיים של טבלת Q בכל צעד. בשיעור הקודם התחלנו עם 1, ואז הפחתנו את `alpha` לערכים נמוכים יותר במהלך האימון. בדוגמה הזו נשמור אותו קבוע רק לשם הפשטות, ואתם יכולים להתנסות בהתאמת ערכי `alpha` מאוחר יותר.
`gamma` הוא **גורם ההנחה** שמראה באיזו מידה עלינו להעדיף תגמול עתידי על פני תגמול נוכחי.
`epsilon` הוא **גורם החקר/ניצול** שקובע האם עלינו להעדיף חקר על פני ניצול או להפך. באלגוריתם שלנו, נבחר באחוז `epsilon` מהמקרים את הפעולה הבאה לפי ערכי טבלת Q, ובשאר המקרים נבצע פעולה אקראית. זה יאפשר לנו לחקור אזורים במרחב החיפוש שמעולם לא ראינו קודם.
✅ מבחינת איזון - בחירת פעולה אקראית (חקר) תפעל כמו מכה אקראית בכיוון הלא נכון, והמוט יצטרך ללמוד כיצד להתאושש מה"טעויות" הללו.
### שיפור האלגוריתם
ניתן גם לבצע שני שיפורים באלגוריתם שלנו מהשיעור הקודם:
- **חישוב תגמול מצטבר ממוצע**, לאורך מספר סימולציות. נדפיס את ההתקדמות כל 5000 איטרציות, ונחשב את התגמול המצטבר הממוצע לאורך פרק הזמן הזה. המשמעות היא שאם נקבל יותר מ-195 נקודות - נוכל להחשיב את הבעיה כפתורה, באיכות גבוהה אף יותר מהנדרש.
- **חישוב התוצאה המצטברת הממוצעת המקסימלית**, `Qmax`, ונשמור את טבלת Q המתאימה לתוצאה זו. כאשר תריצו את האימון תבחינו שלפעמים התוצאה המצטברת הממוצעת מתחילה לרדת, ואנו רוצים לשמור את ערכי טבלת Q המתאימים למודל הטוב ביותר שנצפה במהלך האימון.
1. אספו את כל התגמולים המצטברים בכל סימולציה בוקטור `rewards` לצורך גרפיקה מאוחרת יותר. (קוד בלוק 11)
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
Qmax = 0
cum_rewards = []
rewards = []
for epoch in range(100000):
obs = env.reset()
done = False
cum_reward=0
# == do the simulation ==
while not done:
s = discretize(obs)
if random.random()<epsilon:
# exploitation - chose the action according to Q-Table probabilities
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
else:
# exploration - randomly chose the action
a = np.random.randint(env.action_space.n)
obs, rew, done, info = env.step(a)
cum_reward+=rew
ns = discretize(obs)
Q[(s,a)] = (1 - alpha) * Q.get((s,a),0) + alpha * (rew + gamma * max(qvalues(ns)))
cum_rewards.append(cum_reward)
rewards.append(cum_reward)
# == Periodically print results and calculate average reward ==
if epoch%5000==0:
print(f"{epoch}: {np.average(cum_rewards)}, alpha={alpha}, epsilon={epsilon}")
if np.average(cum_rewards) > Qmax:
Qmax = np.average(cum_rewards)
Qbest = Q
cum_rewards=[]
```
מה שתשימו לב מהתוצאות הללו:
- **קרוב למטרה שלנו**. אנו קרובים מאוד להשגת המטרה של קבלת 195 תגמולים מצטברים לאורך 100+ ריצות רצופות של הסימולציה, או שאולי כבר השגנו אותה! גם אם נקבל מספרים קטנים יותר, עדיין איננו יודעים, מכיוון שאנו מחשבים ממוצע לאורך 5000 ריצות, ורק 100 ריצות נדרשות בקריטריון הרשמי.
- **התגמול מתחיל לרדת**. לפעמים התגמול מתחיל לרדת, מה שאומר שאנו יכולים "להרוס" ערכים שכבר נלמדו בטבלת Q עם כאלה שמחמירים את המצב.
תצפית זו ברורה יותר אם נגרף את התקדמות האימון.
## גרפיקה של התקדמות האימון
במהלך האימון, אספנו את ערך התגמול המצטבר בכל אחת מהאיטרציות לוקטור `rewards`. הנה איך זה נראה כשאנו מגרפים אותו מול מספר האיטרציות:
```python
plt.plot(rewards)
```
![התקדמות גולמית](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png)
מהגרף הזה, לא ניתן להסיק דבר, מכיוון שבשל טבעו של תהליך האימון הסטוכסטי, אורך הסשנים משתנה מאוד. כדי להבין יותר את הגרף הזה, נוכל לחשב את **הממוצע הרץ** לאורך סדרת ניסויים, נאמר 100. ניתן לעשות זאת בנוחות באמצעות `np.convolve`: (קוד בלוק 12)
```python
def running_average(x,window):
return np.convolve(x,np.ones(window)/window,mode='valid')
plt.plot(running_average(rewards,100))
```
![התקדמות האימון](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png)
## שינוי היפרפרמטרים
כדי להפוך את הלמידה ליציבה יותר, הגיוני להתאים כמה מההיפרפרמטרים שלנו במהלך האימון. במיוחד:
- **עבור קצב הלמידה**, `alpha`, נוכל להתחיל עם ערכים קרובים ל-1, ואז להמשיך להקטין את הפרמטר. עם הזמן, נקבל ערכי הסתברות טובים בטבלת Q, ולכן עלינו להתאים אותם בעדינות, ולא להחליף לחלוטין בערכים חדשים.
- **הגדלת epsilon**. ייתכן שנרצה להגדיל את `epsilon` בהדרגה, כדי לחקור פחות ולנצל יותר. כנראה הגיוני להתחיל עם ערך נמוך של `epsilon`, ולהתקדם כמעט עד 1.
> **משימה 1**: נסו לשחק עם ערכי ההיפרפרמטרים ולבדוק אם אתם מצליחים להשיג תגמול מצטבר גבוה יותר. האם אתם מגיעים מעל 195?
> **משימה 2**: כדי לפתור את הבעיה באופן פורמלי, עליכם להגיע ל-195 תגמול ממוצע לאורך 100 ריצות רצופות. מדדו זאת במהלך האימון וודאו שהבעיה נפתרה באופן פורמלי!
## לראות את התוצאה בפעולה
יהיה מעניין לראות כיצד המודל המאומן מתנהג בפועל. בואו נריץ את הסימולציה ונשתמש באותה אסטרטגיית בחירת פעולות כמו במהלך האימון, על ידי דגימה בהתאם להתפלגות ההסתברות ב-Q-Table: (בלוק קוד 13)
```python
obs = env.reset()
done = False
while not done:
s = discretize(obs)
env.render()
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
obs,_,done,_ = env.step(a)
env.close()
```
אתם אמורים לראות משהו כזה:
![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif)
---
## 🚀אתגר
> **משימה 3**: כאן השתמשנו בעותק הסופי של Q-Table, שייתכן שאינו הטוב ביותר. זכרו ששמרנו את ה-Q-Table עם הביצועים הטובים ביותר במשתנה `Qbest`! נסו את אותו הדוגמה עם ה-Q-Table הטוב ביותר על ידי העתקת `Qbest` ל-`Q` ובדקו אם אתם מבחינים בהבדל.
> **משימה 4**: כאן לא בחרנו את הפעולה הטובה ביותר בכל שלב, אלא דגמנו לפי התפלגות ההסתברות המתאימה. האם יהיה הגיוני יותר תמיד לבחור את הפעולה הטובה ביותר, עם הערך הגבוה ביותר ב-Q-Table? ניתן לעשות זאת באמצעות פונקציית `np.argmax` כדי למצוא את מספר הפעולה המתאים לערך הגבוה ביותר ב-Q-Table. יישמו את האסטרטגיה הזו ובדקו אם היא משפרת את האיזון.
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## משימה
[אמן מכונית הרים](assignment.md)
## סיכום
למדנו כעת כיצד לאמן סוכנים להשיג תוצאות טובות רק על ידי מתן פונקציית תגמול שמגדירה את מצב המשחק הרצוי, ועל ידי מתן הזדמנות לחקור את מרחב החיפוש בצורה חכמה. יישמנו בהצלחה את אלגוריתם Q-Learning במקרים של סביבות דיסקרטיות ורציפות, אך עם פעולות דיסקרטיות.
חשוב גם ללמוד מצבים שבהם מצב הפעולה הוא רציף, וכאשר מרחב התצפית מורכב הרבה יותר, כמו התמונה ממסך משחק Atari. בבעיות אלו לעיתים קרובות נדרש להשתמש בטכניקות למידת מכונה חזקות יותר, כמו רשתות נוירונים, כדי להשיג תוצאות טובות. נושאים מתקדמים אלו הם הנושא של קורס הבינה המלאכותית המתקדם שלנו שיבוא בהמשך.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,57 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1f2b7441745eb52e25745423b247016b",
"translation_date": "2025-09-05T20:22:54+00:00",
"source_file": "8-Reinforcement/2-Gym/assignment.md",
"language_code": "he"
}
-->
# אימון מכונית הרים
[OpenAI Gym](http://gym.openai.com) תוכנן כך שכל הסביבות מספקות את אותו API - כלומר, אותן שיטות `reset`, `step` ו-`render`, ואותן הפשטות של **מרחב הפעולה** ו**מרחב התצפית**. לכן, אמור להיות אפשרי להתאים את אותם אלגוריתמים של למידת חיזוק לסביבות שונות עם שינויים מינימליים בקוד.
## סביבת מכונית הרים
[סביבת מכונית הרים](https://gym.openai.com/envs/MountainCar-v0/) כוללת מכונית שנתקעה בעמק:
המטרה היא לצאת מהעמק ולתפוס את הדגל, על ידי ביצוע אחת מהפעולות הבאות בכל שלב:
| ערך | משמעות |
|---|---|
| 0 | להאיץ שמאלה |
| 1 | לא להאיץ |
| 2 | להאיץ ימינה |
הטריק המרכזי בבעיה זו הוא שהמנוע של המכונית אינו חזק מספיק כדי לטפס על ההר במעבר אחד. לכן, הדרך היחידה להצליח היא לנסוע קדימה ואחורה כדי לצבור מומנטום.
מרחב התצפית מורכב משני ערכים בלבד:
| מספר | תצפית | מינימום | מקסימום |
|-----|--------------|---------|---------|
| 0 | מיקום המכונית | -1.2 | 0.6 |
| 1 | מהירות המכונית | -0.07 | 0.07 |
מערכת התגמולים עבור מכונית ההרים די מורכבת:
* תגמול של 0 מוענק אם הסוכן הגיע לדגל (מיקום = 0.5) בראש ההר.
* תגמול של -1 מוענק אם המיקום של הסוכן קטן מ-0.5.
הפרק מסתיים אם מיקום המכונית גדול מ-0.5, או אם אורך הפרק עולה על 200.
## הוראות
התאם את אלגוריתם למידת החיזוק שלנו כדי לפתור את בעיית מכונית ההרים. התחל עם הקוד הקיים ב-[notebook.ipynb](../../../../8-Reinforcement/2-Gym/notebook.ipynb), החלף את הסביבה, שנה את פונקציות הדיסקרטיזציה של המצב, ונסה לגרום לאלגוריתם הקיים להתאמן עם שינויים מינימליים בקוד. בצע אופטימיזציה לתוצאה על ידי התאמת היפר-פרמטרים.
> **Note**: ייתכן שיהיה צורך בהתאמת היפר-פרמטרים כדי לגרום לאלגוריתם להתכנס.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | ------- | ----- | ----------- |
| | אלגוריתם Q-Learning הותאם בהצלחה מדוגמת CartPole עם שינויים מינימליים בקוד, ומסוגל לפתור את הבעיה של תפיסת הדגל בפחות מ-200 צעדים. | אלגוריתם Q-Learning חדש אומץ מהאינטרנט, אך מתועד היטב; או אלגוריתם קיים אומץ אך אינו מגיע לתוצאות הרצויות. | הסטודנט לא הצליח לאמץ אלגוריתם כלשהו בהצלחה, אך עשה צעדים משמעותיים לקראת פתרון (מימש דיסקרטיזציה של מצב, מבנה נתונים של Q-Table וכו'). |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T20:24:02+00:00",
"source_file": "8-Reinforcement/2-Gym/solution/Julia/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T20:23:44+00:00",
"source_file": "8-Reinforcement/2-Gym/solution/R/README.md",
"language_code": "he"
}
-->
זהו מציין מקום זמני
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,67 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "20ca019012b1725de956681d036d8b18",
"translation_date": "2025-09-05T20:09:36+00:00",
"source_file": "8-Reinforcement/README.md",
"language_code": "he"
}
-->
# מבוא ללמידת חיזוק
למידת חיזוק, RL, נחשבת לאחת מהפרדיגמות הבסיסיות של למידת מכונה, לצד למידה מונחית ולמידה בלתי מונחית. RL עוסקת בקבלת החלטות: קבלת ההחלטות הנכונות או לפחות ללמוד מהן.
דמיינו שיש לכם סביבה מדומה כמו שוק המניות. מה קורה אם אתם מטילים רגולציה מסוימת? האם יש לכך השפעה חיובית או שלילית? אם קורה משהו שלילי, עליכם לקחת את ה_חיזוק השלילי_, ללמוד ממנו ולשנות כיוון. אם התוצאה חיובית, עליכם לבנות על אותו יזוק חיובי_.
![פטר והזאב](../../../8-Reinforcement/images/peter.png)
> פטר וחבריו צריכים לברוח מהזאב הרעב! תמונה מאת [Jen Looper](https://twitter.com/jenlooper)
## נושא אזורי: פטר והזאב (רוסיה)
[פטר והזאב](https://en.wikipedia.org/wiki/Peter_and_the_Wolf) הוא אגדה מוזיקלית שנכתבה על ידי המלחין הרוסי [סרגיי פרוקופייב](https://en.wikipedia.org/wiki/Sergei_Prokofiev). זהו סיפור על החלוץ הצעיר פטר, שיוצא באומץ מביתו אל קרחת היער כדי לרדוף אחרי הזאב. בחלק זה, נלמד אלגוריתמים של למידת מכונה שיעזרו לפטר:
- **לחקור** את האזור הסובב ולבנות מפה ניווט אופטימלית.
- **ללמוד** כיצד להשתמש בסקייטבורד ולשמור על איזון עליו, כדי לנוע מהר יותר.
[![פטר והזאב](https://img.youtube.com/vi/Fmi5zHg4QSM/0.jpg)](https://www.youtube.com/watch?v=Fmi5zHg4QSM)
> 🎥 לחצו על התמונה למעלה כדי להאזין ל"פטר והזאב" מאת פרוקופייב
## למידת חיזוק
בחלקים הקודמים ראיתם שני סוגים של בעיות למידת מכונה:
- **מונחית**, שבה יש לנו מערכי נתונים שמציעים פתרונות לדוגמה לבעיה שאנו רוצים לפתור. [סיווג](../4-Classification/README.md) ו[רגרסיה](../2-Regression/README.md) הם משימות של למידה מונחית.
- **בלתי מונחית**, שבה אין לנו נתוני אימון מתויגים. הדוגמה העיקרית ללמידה בלתי מונחית היא [אשכולות](../5-Clustering/README.md).
בחלק זה, נציג בפניכם סוג חדש של בעיית למידה שאינה דורשת נתוני אימון מתויגים. ישנם כמה סוגים של בעיות כאלה:
- **[למידה חצי-מונחית](https://wikipedia.org/wiki/Semi-supervised_learning)**, שבה יש לנו הרבה נתונים לא מתויגים שניתן להשתמש בהם כדי לאמן את המודל מראש.
- **[למידת חיזוק](https://wikipedia.org/wiki/Reinforcement_learning)**, שבה סוכן לומד כיצד להתנהג על ידי ביצוע ניסויים בסביבה מדומה.
### דוגמה - משחק מחשב
נניח שאתם רוצים ללמד מחשב לשחק במשחק, כמו שחמט או [סופר מריו](https://wikipedia.org/wiki/Super_Mario). כדי שהמחשב ישחק במשחק, אנו צריכים שהוא ינבא איזו פעולה לבצע בכל אחד ממצבי המשחק. למרות שזה עשוי להיראות כמו בעיית סיווג, זה לא - מכיוון שאין לנו מערך נתונים עם מצבים ופעולות תואמות. למרות שאולי יש לנו נתונים כמו משחקי שחמט קיימים או הקלטות של שחקנים משחקים סופר מריו, סביר להניח שהנתונים הללו לא יכסו מספיק מצבים אפשריים.
במקום לחפש נתוני משחק קיימים, **למידת חיזוק** (RL) מבוססת על הרעיון של *לגרום למחשב לשחק* פעמים רבות ולצפות בתוצאה. לכן, כדי ליישם למידת חיזוק, אנו צריכים שני דברים:
- **סביבה** ו**סימולטור** שמאפשרים לנו לשחק במשחק פעמים רבות. הסימולטור יגדיר את כללי המשחק, כמו גם את המצבים והפעולות האפשריים.
- **פונקציית תגמול**, שתספר לנו עד כמה הצלחנו במהלך כל מהלך או משחק.
ההבדל העיקרי בין סוגי למידת מכונה אחרים לבין RL הוא שב-RL בדרך כלל איננו יודעים אם ניצחנו או הפסדנו עד לסיום המשחק. לכן, איננו יכולים לומר אם מהלך מסוים לבדו הוא טוב או לא - אנו מקבלים תגמול רק בסוף המשחק. והמטרה שלנו היא לעצב אלגוריתמים שיאפשרו לנו לאמן מודל בתנאים של אי ודאות. נלמד על אלגוריתם RL אחד שנקרא **Q-learning**.
## שיעורים
1. [מבוא ללמידת חיזוק ו-Q-Learning](1-QLearning/README.md)
2. [שימוש בסביבת סימולציה של Gym](2-Gym/README.md)
## קרדיטים
"מבוא ללמידת חיזוק" נכתב באהבה על ידי [Dmitry Soshnikov](http://soshnikov.com)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,159 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "83320d6b6994909e35d830cebf214039",
"translation_date": "2025-09-05T19:21:54+00:00",
"source_file": "9-Real-World/1-Applications/README.md",
"language_code": "he"
}
-->
# פוסטסקריפט: למידת מכונה בעולם האמיתי
![סיכום של למידת מכונה בעולם האמיתי בסקצ'נוט](../../../../sketchnotes/ml-realworld.png)
> סקצ'נוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
במהלך הקורס הזה, למדתם דרכים רבות להכנת נתונים לאימון וליצירת מודלים של למידת מכונה. בניתם סדרה של מודלים קלאסיים כמו רגרסיה, אשכולות, סיווג, עיבוד שפה טבעית ומודלים של סדרות זמן. כל הכבוד! עכשיו, אתם אולי תוהים למה כל זה נועד... מהן היישומים בעולם האמיתי של המודלים הללו?
למרות שהרבה עניין בתעשייה מתמקד בבינה מלאכותית, שלרוב עושה שימוש בלמידה עמוקה, עדיין יש יישומים חשובים למודלים קלאסיים של למידת מכונה. ייתכן שאפילו אתם משתמשים בחלק מהיישומים הללו היום! בשיעור הזה, תחקור כיצד שמונה תעשיות ותחומים שונים משתמשים במודלים אלו כדי להפוך את היישומים שלהם ליותר יעילים, אמינים, חכמים ובעלי ערך למשתמשים.
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
## 💰 פיננסים
תחום הפיננסים מציע הזדמנויות רבות ללמידת מכונה. בעיות רבות בתחום זה מתאימות למידול ופתרון באמצעות למידת מכונה.
### זיהוי הונאות בכרטיסי אשראי
למדנו על [אשכולות k-means](../../5-Clustering/2-K-Means/README.md) מוקדם יותר בקורס, אבל איך ניתן להשתמש בהם כדי לפתור בעיות הקשורות להונאות בכרטיסי אשראי?
אשכולות k-means מועילים בטכניקה לזיהוי הונאות בכרטיסי אשראי הנקראת **זיהוי חריגות**. חריגות, או סטיות בתצפיות על סט נתונים, יכולות להצביע אם כרטיס אשראי נמצא בשימוש רגיל או אם מתרחש משהו חריג. כפי שמוצג במאמר המקושר למטה, ניתן למיין נתוני כרטיסי אשראי באמצעות אלגוריתם אשכולות k-means ולהקצות כל עסקה לאשכול על סמך מידת החריגות שלה. לאחר מכן, ניתן להעריך את האשכולות המסוכנים ביותר כדי להבחין בין עסקאות הונאה לעסקאות לגיטימיות.
[Reference](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf)
### ניהול עושר
בניהול עושר, אדם או חברה מנהלים השקעות עבור לקוחותיהם. תפקידם הוא לשמר ולהגדיל את העושר לטווח הארוך, ולכן חשוב לבחור השקעות שמניבות ביצועים טובים.
אחת הדרכים להעריך את ביצועי ההשקעה היא באמצעות רגרסיה סטטיסטית. [רגרסיה ליניארית](../../2-Regression/1-Tools/README.md) היא כלי חשוב להבנת ביצועי קרן ביחס למדד מסוים. ניתן גם להסיק האם תוצאות הרגרסיה הן משמעותיות סטטיסטית, או כמה הן ישפיעו על השקעות הלקוח. ניתן להרחיב את הניתוח באמצעות רגרסיה מרובה, שבה ניתן לקחת בחשבון גורמי סיכון נוספים. לדוגמה כיצד זה יעבוד עבור קרן ספציפית, עיינו במאמר למטה על הערכת ביצועי קרן באמצעות רגרסיה.
[Reference](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/)
## 🎓 חינוך
תחום החינוך הוא גם תחום מעניין שבו ניתן ליישם למידת מכונה. ישנן בעיות מעניינות להתמודד איתן כמו זיהוי רמאות במבחנים או חיבורים, או ניהול הטיות, מכוונות או לא, בתהליך התיקון.
### חיזוי התנהגות תלמידים
[Coursera](https://coursera.com), ספק קורסים פתוחים מקוון, מחזיק בלוג טכנולוגי נהדר שבו הם דנים בהחלטות הנדסיות רבות. במקרה זה, הם שרטטו קו רגרסיה כדי לנסות לחקור כל קשר בין דירוג NPS (Net Promoter Score) נמוך לבין שמירה על קורס או נשירה ממנו.
[Reference](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a)
### הפחתת הטיות
[Grammarly](https://grammarly.com), עוזר כתיבה שבודק שגיאות כתיב ודקדוק, משתמש במערכות מתקדמות של [עיבוד שפה טבעית](../../6-NLP/README.md) במוצריו. הם פרסמו מחקר מעניין בבלוג הטכנולוגי שלהם על איך הם התמודדו עם הטיה מגדרית בלמידת מכונה, כפי שלמדתם בשיעור ההוגנות המבואי שלנו.
[Reference](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/)
## 👜 קמעונאות
תחום הקמעונאות יכול בהחלט להרוויח משימוש בלמידת מכונה, החל מיצירת מסע לקוח טוב יותר ועד לניהול מלאי בצורה אופטימלית.
### התאמת מסע הלקוח
ב-Wayfair, חברה שמוכרת מוצרים לבית כמו רהיטים, עזרה ללקוחות למצוא את המוצרים הנכונים לטעמם ולצרכיהם היא קריטית. במאמר זה, מהנדסים מהחברה מתארים כיצד הם משתמשים בלמידת מכונה ובעיבוד שפה טבעית כדי "להציג את התוצאות הנכונות ללקוחות". במיוחד, מנוע כוונת השאילתה שלהם נבנה כדי להשתמש בחילוץ ישויות, אימון מסווגים, חילוץ נכסים ודעות, ותיוג רגשות על ביקורות לקוחות. זהו מקרה שימוש קלאסי של איך NLP עובד בקמעונאות מקוונת.
[Reference](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search)
### ניהול מלאי
חברות חדשניות וזריזות כמו [StitchFix](https://stitchfix.com), שירות קופסאות ששולח בגדים לצרכנים, מסתמכות רבות על למידת מכונה להמלצות וניהול מלאי. צוותי הסטיילינג שלהם עובדים יחד עם צוותי הסחורה שלהם, למעשה: "אחד ממדעני הנתונים שלנו התנסה באלגוריתם גנטי ויישם אותו על בגדים כדי לחזות מה יהיה פריט לבוש מצליח שלא קיים היום. הבאנו את זה לצוות הסחורה ועכשיו הם יכולים להשתמש בזה ככלי."
[Reference](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/)
## 🏥 בריאות
תחום הבריאות יכול לנצל למידת מכונה כדי לייעל משימות מחקר וגם בעיות לוגיסטיות כמו אשפוז חוזר של מטופלים או עצירת התפשטות מחלות.
### ניהול ניסויים קליניים
רעילות בניסויים קליניים היא דאגה מרכזית עבור יצרני תרופות. כמה רעילות היא נסבלת? במחקר זה, ניתוח שיטות ניסוי קליניות שונות הוביל לפיתוח גישה חדשה לחיזוי הסיכויים לתוצאות ניסויים קליניים. במיוחד, הם הצליחו להשתמש ביער אקראי כדי ליצור [מסווג](../../4-Classification/README.md) שמסוגל להבחין בין קבוצות של תרופות.
[Reference](https://www.sciencedirect.com/science/article/pii/S2451945616302914)
### ניהול אשפוז חוזר בבתי חולים
טיפול בבתי חולים הוא יקר, במיוחד כאשר מטופלים צריכים להתאשפז שוב. מאמר זה דן בחברה שמשתמשת בלמידת מכונה כדי לחזות פוטנציאל אשפוז חוזר באמצעות אלגוריתמי [אשכולות](../../5-Clustering/README.md). אשכולות אלו עוזרים לאנליסטים "לגלות קבוצות של אשפוזים חוזרים שעשויים לחלוק סיבה משותפת".
[Reference](https://healthmanagement.org/c/healthmanagement/issuearticle/hospital-readmissions-and-machine-learning)
### ניהול מחלות
המגפה האחרונה שמה זרקור על הדרכים שבהן למידת מכונה יכולה לעזור בעצירת התפשטות מחלות. במאמר זה, תזהו שימוש ב-ARIMA, עקומות לוגיסטיות, רגרסיה ליניארית ו-SARIMA. "עבודה זו היא ניסיון לחשב את שיעור התפשטות הנגיף הזה וכך לחזות את מקרי המוות, ההחלמות והמקרים המאושרים, כך שזה עשוי לעזור לנו להתכונן טוב יותר ולהישאר בחיים."
[Reference](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/)
## 🌲 אקולוגיה וטכנולוגיה ירוקה
הטבע והאקולוגיה מורכבים ממערכות רגישות רבות שבהן האינטראקציה בין בעלי חיים לטבע נכנסת למוקד. חשוב להיות מסוגלים למדוד מערכות אלו בצורה מדויקת ולפעול בהתאם אם משהו קורה, כמו שריפת יער או ירידה באוכלוסיית בעלי החיים.
### ניהול יערות
למדתם על [למידת חיזוקים](../../8-Reinforcement/README.md) בשיעורים קודמים. היא יכולה להיות מאוד שימושית כאשר מנסים לחזות דפוסים בטבע. במיוחד, ניתן להשתמש בה כדי לעקוב אחר בעיות אקולוגיות כמו שריפות יער והתפשטות מינים פולשים. בקנדה, קבוצת חוקרים השתמשה בלמידת חיזוקים כדי לבנות מודלים של דינמיקת שריפות יער מתמונות לוויין. באמצעות "תהליך התפשטות מרחבי (SSP)" חדשני, הם דמיינו שריפת יער כ"סוכן בכל תא בנוף". "סט הפעולות שהאש יכולה לבצע ממיקום בכל נקודת זמן כולל התפשטות צפונה, דרומה, מזרחה או מערבה או אי התפשטות.
גישה זו הופכת את ההגדרה הרגילה של למידת חיזוקים מכיוון שהדינמיקה של תהליך ההחלטה של מרקוב (MDP) המתאים היא פונקציה ידועה להתפשטות מיידית של שריפות." קראו עוד על האלגוריתמים הקלאסיים שבהם השתמשה הקבוצה בקישור למטה.
[Reference](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full)
### חישת תנועה של בעלי חיים
בעוד שלמידה עמוקה יצרה מהפכה במעקב חזותי אחר תנועות בעלי חיים (ניתן לבנות [עוקב דובי קוטב](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) משלכם כאן), למידת מכונה קלאסית עדיין יש מקום במשימה זו.
חיישנים למעקב אחר תנועות של בעלי חיים בחוות ו-IoT עושים שימוש בסוג זה של עיבוד חזותי, אך טכניקות למידת מכונה בסיסיות יותר מועילות לעיבוד מקדים של נתונים. לדוגמה, במאמר זה, תנוחות כבשים נוטרו ונותחו באמצעות אלגוריתמי מסווגים שונים. ייתכן שתזהו את עקומת ROC בעמוד 335.
[Reference](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf)
### ⚡️ ניהול אנרגיה
בשיעורים שלנו על [חיזוי סדרות זמן](../../7-TimeSeries/README.md), העלינו את הרעיון של מדחנים חכמים כדי לייצר הכנסות לעיר על סמך הבנת היצע וביקוש. מאמר זה דן בפירוט כיצד אשכולות, רגרסיה וחיזוי סדרות זמן שולבו כדי לעזור לחזות שימוש עתידי באנרגיה באירלנד, בהתבסס על מדידה חכמה.
[Reference](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf)
## 💼 ביטוח
תחום הביטוח הוא תחום נוסף שמשתמש בלמידת מכונה כדי לבנות ולייעל מודלים פיננסיים ואקטואריים.
### ניהול תנודתיות
MetLife, ספק ביטוח חיים, פתוח לגבי הדרך שבה הם מנתחים ומפחיתים תנודתיות במודלים הפיננסיים שלהם. במאמר זה תבחינו בהדמיות סיווג בינאריות ואורדינליות. תגלו גם הדמיות חיזוי.
[Reference](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf)
## 🎨 אמנות, תרבות וספרות
בתחום האמנות, למשל בעיתונאות, ישנן בעיות מעניינות רבות. זיהוי חדשות מזויפות הוא בעיה גדולה שכן הוכח שהיא משפיעה על דעת הקהל ואפילו על הפלת דמוקרטיות. מוזיאונים יכולים גם להרוויח משימוש בלמידת מכונה בכל דבר, החל ממציאת קשרים בין פריטים ועד תכנון משאבים.
### זיהוי חדשות מזויפות
זיהוי חדשות מזויפות הפך למשחק של חתול ועכבר במדיה של היום. במאמר זה, חוקרים מציעים שמערכת שמשלבת כמה מטכניקות למידת המכונה שלמדנו יכולה להיבחן והמודל הטוב ביותר ייושם: "מערכת זו מבוססת על עיבוד שפה טבעית כדי לחלץ תכונות מהנתונים ולאחר מכן תכונות אלו משמשות לאימון מסווגי למידת מכונה כמו Naive Bayes, Support Vector Machine (SVM), Random Forest (RF), Stochastic Gradient Descent (SGD), ו-Logistic Regression (LR)."
[Reference](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf)
מאמר זה מראה כיצד שילוב תחומים שונים של למידת מכונה יכול להפיק תוצאות מעניינות שיכולות לעזור לעצור את התפשטות החדשות המזויפות ולמנוע נזק אמיתי; במקרה זה, המניע היה התפשטות שמועות על טיפולי COVID שגרמו לאלימות המונית.
### למידת מכונה במוזיאונים
מוזיאונים נמצאים על סף מהפכת AI שבה קטלוג ודיגיטציה של אוספים ומציאת קשרים בין פריטים הופכים לקלים יותר ככל שהטכנולוגיה מתקדמת. פרויקטים כמו [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) עוזרים לפתוח את המסתורין של אוספים בלתי נגישים כמו הארכיונים של הוותיקן. אבל, ההיבט העסקי של מוזיאונים מרוויח גם ממודלים של למידת מכונה.
לדוגמה, מכון האמנות של שיקגו בנה מודלים כדי לחזות מה מעניין את הקהל ומתי הוא יגיע לתערוכות. המטרה היא ליצור חוויות מבקר מותאמות ואופטימליות בכל פעם שהמשתמש מבקר במוזיאון. "במהלך שנת הכספים 2017, המודל חזה נוכחות והכנסות בדיוק של 1 אחוז, אומר אנדרו סימניק, סגן נשיא בכיר במכון האמנות."
[Reference](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices)
## 🏷 שיווק
### פילוח לקוחות
אסטרטגיות השיווק היעילות ביותר מכוונות ללקוחות בדרכים שונות בהתבסס על קבוצות שונות. במאמר זה, נדונים השימושים באלגוריתמי אשכולות כדי לתמוך בשיווק מובחן. שיווק מובחן עוזר לחברות לשפר את זיהוי המותג, להגיע ליותר לקוחות ולהרוויח יותר כסף.
[Reference](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/)
## 🚀 אתגר
זהו תחום נוסף שמרוויח מחלק מהטכניקות שלמדתם בקורס זה, וגלה כיצד הוא משתמש בלמידת מכונה.
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
לצוות מדעי הנתונים של Wayfair יש כמה סרטונים מעניינים על איך הם משתמשים בלמידת מכונה בחברה שלהם. שווה [להציץ](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)!
## משימה
[חיפוש אוצר בלמידת מכונה](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "fdebfcd0a3f12c9e2b436ded1aa79885",
"translation_date": "2025-09-05T19:24:40+00:00",
"source_file": "9-Real-World/1-Applications/assignment.md",
"language_code": "he"
}
-->
# חיפוש אוצרות בלמידת מכונה
## הוראות
בשיעור הזה, למדתם על מגוון שימושים אמיתיים שנפתרו באמצעות למידת מכונה קלאסית. למרות שהשימוש בלמידה עמוקה, טכניקות וכלים חדשים ב-AI, וניצול רשתות נוירונים עזרו להאיץ את הפיתוח של כלים לסיוע בתחומים אלו, למידת מכונה קלאסית באמצעות הטכניקות שנלמדו בתוכנית הלימודים עדיין מחזיקה בערך רב.
במשימה הזו, דמיינו שאתם משתתפים בהאקתון. השתמשו במה שלמדתם בתוכנית הלימודים כדי להציע פתרון באמצעות למידת מכונה קלאסית לבעיה באחד התחומים שנדונו בשיעור הזה. צרו מצגת שבה תדונו כיצד תיישמו את הרעיון שלכם. נקודות בונוס אם תוכלו לאסוף נתוני דוגמה ולבנות מודל למידת מכונה שיתמוך בקונספט שלכם!
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| --------- | ---------------------------------------------------------------- | --------------------------------------------- | ---------------- |
| | מוצגת מצגת PowerPoint - בונוס על בניית מודל | מוצגת מצגת בסיסית ולא חדשנית | העבודה אינה שלמה |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,178 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "df2b538e8fbb3e91cf0419ae2f858675",
"translation_date": "2025-09-05T19:25:51+00:00",
"source_file": "9-Real-World/2-Debugging-ML-Models/README.md",
"language_code": "he"
}
-->
# פוסטסקריפט: איתור שגיאות במודלים של למידת מכונה באמצעות רכיבי לוח מחוונים של AI אחראי
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
## מבוא
למידת מכונה משפיעה על חיי היומיום שלנו. הבינה המלאכותית מוצאת את דרכה למערכות החשובות ביותר שמשפיעות עלינו כיחידים ועל החברה שלנו, כמו בריאות, פיננסים, חינוך ותעסוקה. לדוגמה, מערכות ומודלים מעורבים במשימות קבלת החלטות יומיומיות, כמו אבחנות רפואיות או זיהוי הונאות. כתוצאה מכך, ההתקדמות בבינה מלאכותית יחד עם האימוץ המואץ שלה נתקלים בציפיות חברתיות מתפתחות ובתקנות הולכות וגוברות בתגובה. אנו רואים באופן קבוע תחומים שבהם מערכות AI ממשיכות לאכזב; הן חושפות אתגרים חדשים; וממשלות מתחילות להסדיר פתרונות AI. לכן, חשוב לנתח את המודלים הללו כדי להבטיח תוצאות הוגנות, אמינות, כוללות, שקופות ואחראיות לכולם.
בתוכנית הלימודים הזו, נבחן כלים מעשיים שניתן להשתמש בהם כדי להעריך אם למודל יש בעיות של AI אחראי. טכניקות מסורתיות לאיתור שגיאות במודלים של למידת מכונה נוטות להתבסס על חישובים כמותיים כמו דיוק מצטבר או ממוצע הפסד שגיאה. דמיינו מה יכול לקרות כאשר הנתונים שבהם אתם משתמשים לבניית המודלים הללו חסרים דמוגרפיות מסוימות, כמו גזע, מגדר, השקפה פוליטית, דת, או מייצגים באופן לא פרופורציונלי דמוגרפיות כאלה. ומה לגבי מצב שבו הפלט של המודל מפורש כמעדיף דמוגרפיה מסוימת? זה יכול להוביל לייצוג יתר או חסר של קבוצות תכונות רגישות, מה שגורם לבעיות של הוגנות, הכללה או אמינות במודל. גורם נוסף הוא שמודלים של למידת מכונה נחשבים לקופסאות שחורות, מה שמקשה להבין ולהסביר מה מניע את התחזיות של המודל. כל אלה הם אתגרים שמדעני נתונים ומפתחי AI מתמודדים איתם כאשר אין להם כלים מתאימים לאיתור שגיאות ולהערכת ההוגנות או האמינות של מודל.
בשיעור זה תלמדו על איתור שגיאות במודלים באמצעות:
- **ניתוח שגיאות**: זיהוי אזורים בהתפלגות הנתונים שבהם למודל יש שיעורי שגיאה גבוהים.
- **סקירת מודל**: ביצוע ניתוח השוואתי בין קבוצות נתונים שונות כדי לגלות פערים במדדי הביצועים של המודל.
- **ניתוח נתונים**: חקירה של אזורים שבהם עשויה להיות ייצוג יתר או חסר של הנתונים, מה שעלול להטות את המודל להעדיף דמוגרפיה אחת על פני אחרת.
- **חשיבות תכונות**: הבנה אילו תכונות מניעות את התחזיות של המודל ברמה גלובלית או מקומית.
## דרישות מקדימות
כדרישה מקדימה, אנא עיינו ב[כלי AI אחראי למפתחים](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard)
> ![Gif על כלי AI אחראי](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif)
## ניתוח שגיאות
מדדי ביצועים מסורתיים של מודלים המשמשים למדידת דיוק הם לרוב חישובים המבוססים על תחזיות נכונות מול שגויות. לדוגמה, קביעה שמודל מדויק ב-89% מהזמן עם הפסד שגיאה של 0.001 יכולה להיחשב כביצועים טובים. שגיאות אינן מחולקות באופן אחיד בנתוני הבסיס שלכם. ייתכן שתקבלו ציון דיוק של 89% למודל אך תגלו שיש אזורים שונים בנתונים שבהם המודל נכשל ב-42% מהזמן. ההשלכות של דפוסי כשל אלה עם קבוצות נתונים מסוימות יכולות להוביל לבעיות של הוגנות או אמינות. חשוב להבין את האזורים שבהם המודל מתפקד היטב או לא. אזורי הנתונים שבהם יש מספר גבוה של אי דיוקים במודל עשויים להתברר כדמוגרפיה נתונים חשובה.
![ניתוח ואיתור שגיאות במודל](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png)
רכיב ניתוח השגיאות בלוח המחוונים של RAI ממחיש כיצד כשלי המודל מחולקים בין קבוצות שונות באמצעות ויזואליזציה של עץ. זה שימושי בזיהוי תכונות או אזורים שבהם יש שיעור שגיאות גבוה בנתונים שלכם. על ידי צפייה במקור רוב אי הדיוקים של המודל, תוכלו להתחיל לחקור את שורש הבעיה. ניתן גם ליצור קבוצות נתונים כדי לבצע ניתוח עליהן. קבוצות נתונים אלו מסייעות בתהליך איתור השגיאות כדי לקבוע מדוע ביצועי המודל טובים בקבוצה אחת אך שגויים באחרת.
![ניתוח שגיאות](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png)
הסימנים הוויזואליים במפת העץ מסייעים באיתור אזורי הבעיה במהירות. לדוגמה, ככל שצבע אדום כהה יותר מופיע בצומת עץ, כך שיעור השגיאות גבוה יותר.
מפת חום היא פונקציונליות ויזואליזציה נוספת שמשתמשים יכולים להשתמש בה כדי לחקור את שיעור השגיאות באמצעות תכונה אחת או שתיים ולמצוא גורם תורם לשגיאות המודל על פני כל קבוצת הנתונים או הקבוצות.
![מפת חום לניתוח שגיאות](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png)
השתמשו בניתוח שגיאות כאשר אתם צריכים:
* להבין לעומק כיצד כשלי המודל מחולקים על פני קבוצת נתונים ועל פני מספר ממדי קלט ותכונות.
* לפרק את מדדי הביצועים המצטברים כדי לגלות באופן אוטומטי קבוצות שגויות וליידע את הצעדים הממוקדים שלכם למיתון הבעיה.
## סקירת מודל
הערכת ביצועי מודל למידת מכונה דורשת הבנה הוליסטית של התנהגותו. ניתן להשיג זאת על ידי סקירת יותר ממדד אחד, כמו שיעור שגיאות, דיוק, ריקול, דיוק תחזיות או MAE (שגיאה מוחלטת ממוצעת), כדי למצוא פערים בין מדדי ביצועים. מדד ביצועים אחד עשוי להיראות מצוין, אך אי דיוקים יכולים להתגלות במדד אחר. בנוסף, השוואת המדדים לפערים על פני כל קבוצת הנתונים או הקבוצות עוזרת להאיר את האזורים שבהם המודל מתפקד היטב או לא. זה חשוב במיוחד כדי לראות את ביצועי המודל בין תכונות רגישות לעומת לא רגישות (למשל, גזע, מגדר או גיל של מטופל) כדי לחשוף אי הוגנות פוטנציאלית במודל. לדוגמה, גילוי שהמודל שגוי יותר בקבוצה שיש לה תכונות רגישות יכול לחשוף אי הוגנות פוטנציאלית במודל.
רכיב סקירת המודל בלוח המחוונים של RAI מסייע לא רק בניתוח מדדי הביצועים של ייצוג הנתונים בקבוצה, אלא גם נותן למשתמשים את היכולת להשוות את התנהגות המודל בין קבוצות שונות.
![קבוצות נתונים - סקירת מודל בלוח המחוונים של RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png)
הפונקציונליות של ניתוח מבוסס תכונות של הרכיב מאפשרת למשתמשים לצמצם תת-קבוצות נתונים בתוך תכונה מסוימת כדי לזהות אנומליות ברמה גרעינית. לדוגמה, ללוח המחוונים יש אינטליגנציה מובנית ליצירת קבוצות באופן אוטומטי עבור תכונה שנבחרה על ידי המשתמש (למשל, *"time_in_hospital < 3"* או *"time_in_hospital >= 7"*). זה מאפשר למשתמש לבודד תכונה מסוימת מקבוצת נתונים גדולה יותר כדי לראות אם היא משפיעה על תוצאות שגויות של המודל.
![קבוצות תכונות - סקירת מודל בלוח המחוונים של RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png)
רכיב סקירת המודל תומך בשני סוגים של מדדי פערים:
**פער בביצועי המודל**: קבוצת מדדים זו מחשבת את הפער (ההבדל) בערכים של מדד הביצועים הנבחר בין תת-קבוצות נתונים. הנה כמה דוגמאות:
* פער בשיעור דיוק
* פער בשיעור שגיאות
* פער בדיוק תחזיות
* פער בריקול
* פער בשגיאה מוחלטת ממוצעת (MAE)
**פער בשיעור הבחירה**: מדד זה מכיל את ההבדל בשיעור הבחירה (תחזית חיובית) בין תת-קבוצות. דוגמה לכך היא הפער בשיעורי אישור הלוואות. שיעור הבחירה מתייחס לחלק מנקודות הנתונים בכל מחלקה שמסווגות כ-1 (במיון בינארי) או להתפלגות ערכי התחזיות (ברגרסיה).
## ניתוח נתונים
> "אם תענה את הנתונים מספיק זמן, הם יודו בכל דבר" - רונלד קואז
האמירה הזו נשמעת קיצונית, אבל נכון שנתונים יכולים להיות מנוצלים כדי לתמוך בכל מסקנה. מניפולציה כזו יכולה לפעמים לקרות באופן לא מכוון. כבני אדם, לכולנו יש הטיות, ולעיתים קרובות קשה לדעת באופן מודע מתי אנו מכניסים הטיה לנתונים. הבטחת הוגנות ב-AI ולמידת מכונה נותרת אתגר מורכב.
נתונים הם נקודת עיוור גדולה עבור מדדי ביצועים מסורתיים של מודלים. ייתכן שיש לכם ציוני דיוק גבוהים, אך זה לא תמיד משקף את הטיה הנתונים הבסיסית שיכולה להיות בקבוצת הנתונים שלכם. לדוגמה, אם קבוצת נתונים של עובדים כוללת 27% נשים בתפקידים בכירים בחברה ו-73% גברים באותו רמה, מודל AI לפרסום משרות שמאומן על נתונים אלו עשוי לכוון בעיקר לקהל גברים עבור משרות בכירות. חוסר איזון זה בנתונים הטה את תחזיות המודל להעדיף מגדר אחד. זה חושף בעיית הוגנות שבה יש הטיה מגדרית במודל AI.
רכיב ניתוח הנתונים בלוח המחוונים של RAI מסייע בזיהוי אזורים שבהם יש ייצוג יתר או חסר בקבוצת הנתונים. הוא עוזר למשתמשים לאבחן את שורש הבעיות של שגיאות ובעיות הוגנות שנגרמות מחוסר איזון בנתונים או מחוסר ייצוג של קבוצת נתונים מסוימת. זה נותן למשתמשים את היכולת להציג ויזואלית קבוצות נתונים על סמך תחזיות ותוצאות בפועל, קבוצות שגיאות ותכונות ספציפיות. לפעמים גילוי קבוצת נתונים לא מיוצגת יכול גם לחשוף שהמודל לא לומד היטב, ולכן יש אי דיוקים גבוהים. מודל שיש לו הטיה נתונים הוא לא רק בעיית הוגנות אלא גם מראה שהמודל אינו כולל או אמין.
![רכיב ניתוח נתונים בלוח המחוונים של RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png)
השתמשו בניתוח נתונים כאשר אתם צריכים:
* לחקור את סטטיסטיקות קבוצת הנתונים שלכם על ידי בחירת מסננים שונים כדי לחלק את הנתונים שלכם לממדים שונים (המכונים גם קבוצות).
* להבין את התפלגות קבוצת הנתונים שלכם על פני קבוצות שונות וקבוצות תכונות.
* לקבוע האם הממצאים שלכם הקשורים להוגנות, ניתוח שגיאות וסיבתיות (שנגזרו מרכיבים אחרים בלוח המחוונים) הם תוצאה של התפלגות קבוצת הנתונים שלכם.
* להחליט באילו אזורים לאסוף יותר נתונים כדי למתן שגיאות שנובעות מבעיות ייצוג, רעש תוויות, רעש תכונות, הטיה תוויות וגורמים דומים.
## פרשנות מודל
מודלים של למידת מכונה נוטים להיות קופסאות שחורות. הבנת אילו תכונות נתונים מרכזיות מניעות את התחזיות של מודל יכולה להיות מאתגרת. חשוב לספק שקיפות לגבי הסיבה שמודל עושה תחזית מסוימת. לדוגמה, אם מערכת AI חוזה שמטופל סוכרתי נמצא בסיכון לחזור לבית חולים תוך פחות מ-30 ימים, עליה לספק נתונים תומכים שהובילו לתחזית שלה. נתונים תומכים אלו מביאים שקיפות שעוזרת לרופאים או בתי חולים לקבל החלטות מושכלות. בנוסף, היכולת להסביר מדוע מודל עשה תחזית עבור מטופל מסוים מאפשרת אחריות עם תקנות בריאות. כאשר אתם משתמשים במודלים של למידת מכונה בדרכים שמשפיעות על חיי אנשים, חשוב להבין ולהסביר מה משפיע על התנהגות המודל. פרשנות והסבר מודל עוזרים לענות על שאלות בתרחישים כמו:
* איתור שגיאות במודל: מדוע המודל שלי עשה את הטעות הזו? איך אני יכול לשפר את המודל שלי?
* שיתוף פעולה בין אדם ל-AI: איך אני יכול להבין ולסמוך על ההחלטות של המודל?
* עמידה בתקנות: האם המודל שלי עומד בדרישות החוקיות?
רכיב חשיבות התכונות בלוח המחוונים של RAI עוזר לכם לאתר שגיאות ולקבל הבנה מקיפה של איך מודל עושה תחזיות. זהו גם כלי שימושי עבור אנשי מקצוע בלמידת מכונה ומקבלי החלטות להסביר ולהציג ראיות לתכונות שמשפיעות על התנהגות המודל לצורך עמידה בתקנות. לאחר מכן, משתמשים יכולים לחקור הסברים גלובליים ומקומיים כדי לאמת אילו תכונות מניעות את התחזיות של המודל. הסברים גלובליים מציגים את התכונות המרכזיות שהשפיעו על התחזיות הכוללות של המודל. הסברים מקומיים מציגים אילו תכונות הובילו לתחזית של המודל עבור מקרה יחיד. היכולת להעריך הסברים מקומיים מועילה גם באיתור שגיאות או בביקורת מקרה ספציפי כדי להבין ולהסביר מדוע מודל עשה תחזית מדויקת או שגויה.
![רכיב חשיבות התכונות בלוח המחוונים של RAI](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png)
* הסברים גלובליים: לדוגמה, אילו תכונות משפיעות על ההתנהגות הכוללת של מודל חזרה לבית חולים של חולי סוכרת?
* הסברים מקומיים: לדוגמה, מדוע מטופל סוכרתי מעל גיל 60 עם אשפוזים קודמים חזה שיחזור או לא יחזור לבית חולים תוך 30 ימים?
בתהליך איתור שגיאות של בחינת ביצועי המודל על פני קבוצות שונות, חשיבות התכונות מראה מהי רמת ההשפעה של תכונה על פני הקבוצות. זה עוזר לחשוף אנומליות כאשר משווים את רמת ההשפעה של התכונה על תחזיות שגויות של המודל. רכיב חשיבות התכונות יכול להראות אילו ערכים בתכונה השפיעו באופן חיובי או שלילי על תוצאות המודל. לדוגמה, אם מודל עשה תחזית שגויה, הרכיב נותן לכם את היכולת להעמיק ולזהות אילו תכונות או ערכי תכונות הובילו לתחזית. רמת פירוט זו עוזרת לא רק באיתור שגיאות אלא מספקת שקיפות ואחריות במצבי ביקורת. לבסוף, הרכיב יכול לעזור לכם לזהות בעיות הוגנות. לדוגמה, אם תכונה רגישה כמו אתניות או מגדר משפיעה מאוד על תחזיות המודל, זה יכול להיות סימן להטיה גזעית או מגדרית במודל.
![חשיבות תכונות](../../../../9-Real-World/2-Debugging-ML-Models/images/9-features-influence.png)
השתמשו בפרשנות כאשר אתם צריכים:
* לקבוע עד כמה ניתן לסמוך על תחזיות מערכת ה-AI שלכם על ידי הבנת אילו תכונות הן החשובות ביותר עבור התחזיות.
* לגשת לאיתור שגיאות במודל שלכם על ידי הבנתו תחילה וזיהוי האם המודל משתמש בתכונות בריאות או רק בקורלציות שגויות.
* לחשוף מקורות פוטנציאליים של אי הוגנות על ידי הבנת האם המודל מבסס תחזיות על תכונות רגישות או על תכונות שמקושרות מאוד אליהן.
* לבנות אמון משתמש בהחלטות המודל שלכם על ידי יצירת הסברים מקומיים להמחשת התוצאות שלהם.
* להשלים ביקורת רגולטורית של מערכת AI כדי לאמת מודלים ולפקח על ההשפעה של החלטות המודל על בני אדם.
## סיכום
כל רכיבי לוח המחוונים של RAI הם כלים מעשיים שעוזרים לכם לבנות מודלים של למידת מכונה שפוגעים פחות ומעוררים יותר אמון בחברה.
- **ייצוג יתר או חסר**. הרעיון הוא שקבוצה מסוימת אינה נראית במקצוע מסוים, וכל שירות או פונקציה שממשיכים לקדם זאת תורמים לנזק.
### לוח מחוונים של Azure RAI
[לוח המחוונים של Azure RAI](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) מבוסס על כלים בקוד פתוח שפותחו על ידי מוסדות אקדמיים וארגונים מובילים, כולל Microsoft. כלים אלו חיוניים למדעני נתונים ומפתחי AI כדי להבין טוב יותר את התנהגות המודל, לגלות ולתקן בעיות לא רצויות במודלים של AI.
- למדו כיצד להשתמש ברכיבים השונים על ידי עיון ב[תיעוד לוח המחוונים של RAI.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu)
- עיינו בכמה [מחברות לדוגמה של לוח המחוונים של RAI](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) לצורך איתור בעיות בתרחישים של AI אחראי ב-Azure Machine Learning.
---
## 🚀 אתגר
כדי למנוע מראש הטיה סטטיסטית או הטיה בנתונים, עלינו:
- להבטיח מגוון רקעים ונקודות מבט בקרב האנשים שעובדים על המערכות
- להשקיע במאגרי נתונים שמשקפים את המגוון בחברה שלנו
- לפתח שיטות טובות יותר לזיהוי ותיקון הטיה כאשר היא מתרחשת
חשבו על תרחישים אמיתיים שבהם אי-צדק ניכר בבניית מודלים ובשימוש בהם. מה עוד כדאי לקחת בחשבון?
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
בשיעור זה, למדתם כמה מהכלים המעשיים לשילוב AI אחראי בלמידת מכונה.
צפו בסדנה זו כדי להעמיק בנושאים:
- לוח מחוונים של AI אחראי: פתרון כולל ליישום RAI בפועל מאת Besmira Nushi ו-Mehrnoosh Sameki
[![לוח מחוונים של AI אחראי: פתרון כולל ליישום RAI בפועל](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "לוח מחוונים של AI אחראי: פתרון כולל ליישום RAI בפועל")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: לוח מחוונים של AI אחראי: פתרון כולל ליישום RAI בפועל מאת Besmira Nushi ו-Mehrnoosh Sameki
עיינו בחומרים הבאים כדי ללמוד עוד על AI אחראי וכיצד לבנות מודלים אמינים יותר:
- כלים של Microsoft ללוח מחוונים של RAI לצורך איתור בעיות במודלים של ML: [משאבי כלים ל-AI אחראי](https://aka.ms/rai-dashboard)
- חקרו את ערכת הכלים ל-AI אחראי: [Github](https://github.com/microsoft/responsible-ai-toolbox)
- מרכז המשאבים של Microsoft ל-AI אחראי: [משאבי AI אחראי Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- קבוצת המחקר FATE של Microsoft: [FATE: צדק, אחריות, שקיפות ואתיקה ב-AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
## משימה
[חקרו את לוח המחוונים של RAI](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "91c6a180ef08e20cc15acfd2d6d6e164",
"translation_date": "2025-09-05T19:29:20+00:00",
"source_file": "9-Real-World/2-Debugging-ML-Models/assignment.md",
"language_code": "he"
}
-->
# חקור את לוח המחוונים של AI אחראי (RAI)
## הוראות
בשיעור זה למדת על לוח המחוונים של RAI, אוסף של רכיבים המבוססים על כלים "קוד פתוח" שנועדו לעזור למדעני נתונים לבצע ניתוח שגיאות, חקר נתונים, הערכת הוגנות, פרשנות מודלים, הערכות נגד/מה-אם וניתוח סיבתי במערכות AI. עבור משימה זו, חקור כמה מדוגמאות [מחברות](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) של לוח המחוונים של RAI ודווח על ממצאיך במאמר או מצגת.
## קריטריונים להערכה
| קריטריון | מצטיין | מספק | דורש שיפור |
| -------- | --------- | -------- | ----------------- |
| | מאמר או מצגת PowerPoint מוצגים, דנים ברכיבי לוח המחוונים של RAI, במחברת שהורצה ובמסקנות שהוסקו מהרצתה | מאמר מוצג ללא מסקנות | לא מוצג מאמר |
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,32 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5e069a0ac02a9606a69946c2b3c574a9",
"translation_date": "2025-09-05T19:20:43+00:00",
"source_file": "9-Real-World/README.md",
"language_code": "he"
}
-->
# פוסטסקריפט: יישומים בעולם האמיתי של למידת מכונה קלאסית
בחלק זה של התוכנית, תיחשפו לכמה יישומים בעולם האמיתי של למידת מכונה קלאסית. חיפשנו ברחבי האינטרנט מאמרים ומחקרים על יישומים שהשתמשו באסטרטגיות אלו, תוך הימנעות מרשתות נוירונים, למידה עמוקה ובינה מלאכותית ככל האפשר. תלמדו כיצד למידת מכונה משמשת במערכות עסקיות, יישומים אקולוגיים, פיננסים, אמנות ותרבות, ועוד.
![שחמט](../../../9-Real-World/images/chess.jpg)
> צילום על ידי <a href="https://unsplash.com/@childeye?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">אלקסיס פובט</a> ב-<a href="https://unsplash.com/s/photos/artificial-intelligence?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## שיעור
1. [יישומים בעולם האמיתי עבור למידת מכונה](1-Applications/README.md)
2. [ניפוי שגיאות במודלים של למידת מכונה באמצעות רכיבי לוח מחוונים של AI אחראי](2-Debugging-ML-Models/README.md)
## קרדיטים
"יישומים בעולם האמיתי" נכתב על ידי צוות אנשים, כולל [ג'ן לופר](https://twitter.com/jenlooper) ו-[אורנלה אלטוניאן](https://twitter.com/ornelladotcom).
"ניפוי שגיאות במודלים של למידת מכונה באמצעות רכיבי לוח מחוונים של AI אחראי" נכתב על ידי [רות יעקובו](https://twitter.com/ruthieyakubu)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "c06b12caf3c901eb3156e3dd5b0aea56",
"translation_date": "2025-09-05T18:36:46+00:00",
"source_file": "CODE_OF_CONDUCT.md",
"language_code": "he"
}
-->
# קוד ההתנהגות של קוד פתוח של מיקרוסופט
הפרויקט הזה אימץ את [קוד ההתנהגות של קוד פתוח של מיקרוסופט](https://opensource.microsoft.com/codeofconduct/).
משאבים:
- [קוד ההתנהגות של קוד פתוח של מיקרוסופט](https://opensource.microsoft.com/codeofconduct/)
- [שאלות נפוצות על קוד ההתנהגות של מיקרוסופט](https://opensource.microsoft.com/codeofconduct/faq/)
- צרו קשר עם [opencode@microsoft.com](mailto:opencode@microsoft.com) לשאלות או חששות
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "977ec5266dfd78ad1ce2bd8d46fccbda",
"translation_date": "2025-09-05T18:34:36+00:00",
"source_file": "CONTRIBUTING.md",
"language_code": "he"
}
-->
# תרומה
הפרויקט הזה מקבל בברכה תרומות והצעות. רוב התרומות דורשות ממך להסכים להסכם רישיון תורם (CLA) שמצהיר שיש לך את הזכות, ואתה אכן מעניק לנו את הזכויות להשתמש בתרומתך. לפרטים נוספים, בקר בכתובת https://cla.microsoft.com.
> חשוב: בעת תרגום טקסט במאגר הזה, אנא וודא שאינך משתמש בתרגום מכונה. אנו נוודא את התרגומים דרך הקהילה, לכן אנא התנדב לתרגום רק בשפות שבהן אתה שולט היטב.
כאשר אתה מגיש בקשת משיכה (pull request), CLA-bot יקבע באופן אוטומטי אם עליך לספק CLA ויעצב את הבקשה בהתאם (לדוגמה, תווית, תגובה). פשוט עקוב אחר ההוראות שסופקו על ידי הבוט. תצטרך לעשות זאת רק פעם אחת בכל המאגרים שמשתמשים ב-CLA שלנו.
הפרויקט הזה אימץ את [קוד ההתנהגות של קוד פתוח של Microsoft](https://opensource.microsoft.com/codeofconduct/).
למידע נוסף, ראה את [שאלות נפוצות על קוד ההתנהגות](https://opensource.microsoft.com/codeofconduct/faq/)
או צור קשר עם [opencode@microsoft.com](mailto:opencode@microsoft.com) לכל שאלה או הערה נוספת.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,178 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "612aef7a03204260e940131b09691977",
"translation_date": "2025-09-05T18:29:55+00:00",
"source_file": "README.md",
"language_code": "he"
}
-->
[![GitHub license](https://img.shields.io/github/license/microsoft/ML-For-Beginners.svg)](https://github.com/microsoft/ML-For-Beginners/blob/master/LICENSE)
[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/graphs/contributors/)
[![GitHub issues](https://img.shields.io/github/issues/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/issues/)
[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/ML-For-Beginners.svg)](https://GitHub.com/microsoft/ML-For-Beginners/pulls/)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/ML-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/ML-For-Beginners/watchers/)
[![GitHub forks](https://img.shields.io/github/forks/microsoft/ML-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/ML-For-Beginners/network/)
[![GitHub stars](https://img.shields.io/github/stars/microsoft/ML-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/ML-For-Beginners/stargazers/)
### 🌐 תמיכה רב-שפתית
#### נתמך באמצעות GitHub Action (אוטומטי ותמיד מעודכן)
[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](../ar/README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](./README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md)
#### הצטרפו לקהילה
[![Azure AI Discord](https://dcbadge.limes.pink/api/server/kzRShWzttr)](https://discord.gg/kzRShWzttr)
# למידת מכונה למתחילים - תוכנית לימודים
> 🌍 מסע מסביב לעולם תוך חקר למידת מכונה דרך תרבויות עולמיות 🌍
צוות Cloud Advocates במיקרוסופט שמח להציע תוכנית לימודים בת 12 שבועות ו-26 שיעורים בנושא **למידת מכונה**. בתוכנית זו תלמדו על מה שמכונה לעיתים **למידת מכונה קלאסית**, תוך שימוש בעיקר בספריית Scikit-learn והימנעות מלמידה עמוקה, שמכוסה בתוכנית הלימודים שלנו [AI למתחילים](https://aka.ms/ai4beginners). ניתן לשלב את השיעורים הללו עם תוכנית הלימודים שלנו ['מדעי הנתונים למתחילים'](https://aka.ms/ds4beginners), גם כן!
צאו איתנו למסע מסביב לעולם תוך יישום טכניקות קלאסיות על נתונים מאזורים שונים בעולם. כל שיעור כולל שאלונים לפני ואחרי השיעור, הוראות כתובות להשלמת השיעור, פתרון, משימה ועוד. הפדגוגיה מבוססת הפרויקטים שלנו מאפשרת לכם ללמוד תוך כדי בנייה, שיטה מוכחת להטמעת מיומנויות חדשות.
**✍️ תודה רבה למחברים שלנו** ג'ן לופר, סטיבן האוול, פרנצ'סקה לזארי, טומומי אימורה, קסי ברביו, דמיטרי סושניקוב, כריס נורינג, אנירבן מוקרג'י, אורנלה אלטוניאן, רות יעקובו ואיימי בויד
**🎨 תודה גם למאיירים שלנו** טומומי אימורה, דאסאני מדיפאלי וג'ן לופר
**🙏 תודה מיוחדת 🙏 למחברי, מבקרי ותורמי התוכן מקרב שגרירי הסטודנטים של מיקרוסופט**, במיוחד רישיט דגלי, מוחמד סאקיב חאן אינאן, רוהאן ראג', אלכסנדרו פטרסקו, אבישק ג'ייסוואל, נאורין טבאסום, יואן סמואילה וסניגדה אגרוול
**🤩 תודה נוספת לשגרירי הסטודנטים של מיקרוסופט אריק וואנג'או, ג'סלין סונדי ווידושי גופטה על שיעורי R שלנו!**
# התחלת העבודה
בצעו את השלבים הבאים:
1. **פיצול הריפוזיטורי**: לחצו על כפתור "Fork" בפינה הימנית העליונה של הדף.
2. **שכפול הריפוזיטורי**: `git clone https://github.com/microsoft/ML-For-Beginners.git`
> [מצאו את כל המשאבים הנוספים לקורס זה באוסף Microsoft Learn שלנו](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
**[סטודנטים](https://aka.ms/student-page)**, כדי להשתמש בתוכנית הלימודים הזו, פצלו את הריפוזיטורי כולו לחשבון GitHub שלכם והשלימו את התרגילים בעצמכם או בקבוצה:
- התחילו עם שאלון לפני השיעור.
- קראו את השיעור והשלימו את הפעילויות, תוך עצירה והרהור בכל בדיקת ידע.
- נסו ליצור את הפרויקטים על ידי הבנת השיעורים במקום להריץ את קוד הפתרון; עם זאת, קוד זה זמין בתיקיות `/solution` בכל שיעור מבוסס פרויקט.
- בצעו את השאלון לאחר השיעור.
- השלימו את האתגר.
- השלימו את המשימה.
- לאחר השלמת קבוצת שיעורים, בקרו ב-[לוח הדיונים](https://github.com/microsoft/ML-For-Beginners/discussions) ו"למדו בקול רם" על ידי מילוי טופס PAT המתאים. 'PAT' הוא כלי הערכת התקדמות שהוא טופס שאתם ממלאים כדי להעמיק את הלמידה שלכם. תוכלו גם להגיב ל-PATs אחרים כדי שנלמד יחד.
> ללימוד נוסף, אנו ממליצים לעקוב אחר [מודולים ונתיבי לימוד של Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott).
**מורים**, [הוספנו כמה הצעות](for-teachers.md) כיצד להשתמש בתוכנית הלימודים הזו.
---
## סרטוני הדרכה
חלק מהשיעורים זמינים כסרטונים קצרים. תוכלו למצוא את כולם בתוך השיעורים, או ברשימת ההשמעה [ML למתחילים בערוץ YouTube של Microsoft Developer](https://aka.ms/ml-beginners-videos) על ידי לחיצה על התמונה למטה.
[![ML for beginners banner](../../images/ml-for-beginners-video-banner.png)](https://aka.ms/ml-beginners-videos)
---
## הכירו את הצוות
[![Promo video](../../images/ml.gif)](https://youtu.be/Tj1XWrDSYJU)
**Gif מאת** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal)
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון על הפרויקט והאנשים שיצרו אותו!
---
## פדגוגיה
בחרנו שני עקרונות פדגוגיים בעת בניית תוכנית הלימודים הזו: להבטיח שהיא מבוססת **פרויקטים מעשיים** ושכוללת **שאלונים תכופים**. בנוסף, לתוכנית הלימודים יש **נושא משותף** שמעניק לה לכידות.
על ידי הבטחת התאמת התוכן לפרויקטים, התהליך נעשה יותר מרתק עבור סטודנטים ושימור המושגים יוגבר. בנוסף, שאלון בעל סיכון נמוך לפני השיעור מכוון את כוונת הסטודנט ללמידת הנושא, בעוד ששאלון שני לאחר השיעור מבטיח שימור נוסף. תוכנית הלימודים הזו תוכננה להיות גמישה ומהנה וניתן לקחת אותה בשלמותה או בחלקים. הפרויקטים מתחילים קטנים והופכים מורכבים יותר עד סוף מחזור 12 השבועות. תוכנית הלימודים כוללת גם נספח על יישומים בעולם האמיתי של למידת מכונה, שניתן להשתמש בו כקרדיט נוסף או כבסיס לדיון.
> מצאו את [קוד ההתנהגות שלנו](CODE_OF_CONDUCT.md), [הנחיות לתרומה](CONTRIBUTING.md), ו[הנחיות לתרגום](TRANSLATIONS.md). נשמח לקבל את המשוב הבונה שלכם!
## כל שיעור כולל
- סקיצות אופציונליות
- סרטון משלים אופציונלי
- סרטון הדרכה (חלק מהשיעורים בלבד)
- [שאלון חימום לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
- שיעור כתוב
- עבור שיעורים מבוססי פרויקט, מדריכים שלב-אחר-שלב כיצד לבנות את הפרויקט
- בדיקות ידע
- אתגר
- קריאה משלימה
- משימה
- [שאלון לאחר השיעור](https://ff-quizzes.netlify.app/en/ml/)
> **הערה לגבי שפות**: שיעורים אלו נכתבו בעיקר ב-Python, אך רבים זמינים גם ב-R. כדי להשלים שיעור ב-R, עברו לתיקיית `/solution` וחפשו שיעורי R. הם כוללים סיומת .rmd שמייצגת קובץ **R Markdown** שניתן להגדירו כקובץ שמשלב `קטעי קוד` (של R או שפות אחרות) ו`כותרת YAML` (שמנחה כיצד לעצב פלטים כמו PDF) בתוך `מסמך Markdown`. כך, הוא משמש כמסגרת כתיבה לדוגמה עבור מדעי הנתונים מכיוון שהוא מאפשר לכם לשלב את הקוד שלכם, את הפלט שלו ואת המחשבות שלכם על ידי כתיבתם ב-Markdown. יתרה מכך, ניתן לעבד מסמכי R Markdown לפורמטים כמו PDF, HTML או Word.
> **הערה לגבי שאלונים**: כל השאלונים נמצאים בתיקיית [Quiz App](../../quiz-app), עבור סך של 52 שאלונים עם שלוש שאלות כל אחד. הם מקושרים מתוך השיעורים אך ניתן להריץ את אפליקציית השאלונים באופן מקומי; עקבו אחר ההוראות בתיקיית `quiz-app` כדי לארח אותה באופן מקומי או לפרוס אותה ב-Azure.
| מספר שיעור | נושא | קבוצת שיעורים | מטרות למידה | שיעור מקושר | מחבר |
| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: |
| 01 | מבוא ללמידת מכונה | [מבוא](1-Introduction/README.md) | למדו את המושגים הבסיסיים מאחורי למידת מכונה | [שיעור](1-Introduction/1-intro-to-ML/README.md) | מוחמד |
| 02 | ההיסטוריה של למידת מכונה | [מבוא](1-Introduction/README.md) | למדו את ההיסטוריה שמאחורי התחום | [שיעור](1-Introduction/2-history-of-ML/README.md) | ג'ן ואיימי |
| 03 | הוגנות ולמידת מכונה | [מבוא](1-Introduction/README.md) | מהם הנושאים הפילוסופיים החשובים סביב הוגנות שעל הסטודנטים לשקול בעת בניית ויישום מודלים של למידת מכונה? | [שיעור](1-Introduction/3-fairness/README.md) | טומומי |
| 04 | טכניקות ללמידת מכונה | [Introduction](1-Introduction/README.md) | אילו טכניקות חוקרי למידת מכונה משתמשים כדי לבנות מודלים של למידת מכונה? | [Lesson](1-Introduction/4-techniques-of-ML/README.md) | כריס וג'ן |
| 05 | מבוא לרגרסיה | [Regression](2-Regression/README.md) | התחילו עם Python ו-Scikit-learn עבור מודלים של רגרסיה |
<ul><li>[Python](2-Regression/1-Tools/README.md)</li><li>[R](../../2-Regression/1-Tools/solution/R/lesson_1.html)</li></ul> | <ul><li>ג'ן</li><li>אריק ונג'או</li></ul> |
| 06 | מחירי דלעת בצפון אמריקה 🎃 | [Regression](2-Regression/README.md) | ויזואליזציה וניקוי נתונים כהכנה ללמידת מכונה | <ul><li>[Python](2-Regression/2-Data/README.md)</li><li>[R](../../2-Regression/2-Data/solution/R/lesson_2.html)</li></ul> | <ul><li>ג'ן</li><li>אריק ונג'או</li></ul> |
| 07 | מחירי דלעת בצפון אמריקה 🎃 | [Regression](2-Regression/README.md) | בניית מודלים של רגרסיה לינארית ופולינומית | <ul><li>[Python](2-Regression/3-Linear/README.md)</li><li>[R](../../2-Regression/3-Linear/solution/R/lesson_3.html)</li></ul> | <ul><li>ג'ן ודמיטרי</li><li>אריק ונג'או</li></ul> |
| 08 | מחירי דלעת בצפון אמריקה 🎃 | [Regression](2-Regression/README.md) | בניית מודל רגרסיה לוגיסטית | <ul><li>[Python](2-Regression/4-Logistic/README.md) </li><li>[R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)</li></ul> | <ul><li>ג'ן</li><li>אריק ונג'או</li></ul> |
| 09 | אפליקציית ווב 🔌 | [Web App](3-Web-App/README.md) | בניית אפליקציית ווב לשימוש במודל שאומן | [Python](3-Web-App/1-Web-App/README.md) | ג'ן |
| 10 | מבוא לסיווג | [Classification](4-Classification/README.md) | ניקוי, הכנה וויזואליזציה של הנתונים; מבוא לסיווג | <ul><li> [Python](4-Classification/1-Introduction/README.md) </li><li>[R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) | <ul><li>ג'ן וקאסי</li><li>אריק ונג'או</li></ul> |
| 11 | מטבחים אסיאתיים והודיים טעימים 🍜 | [Classification](4-Classification/README.md) | מבוא למסווגים | <ul><li> [Python](4-Classification/2-Classifiers-1/README.md)</li><li>[R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) | <ul><li>ג'ן וקאסי</li><li>אריק ונג'או</li></ul> |
| 12 | מטבחים אסיאתיים והודיים טעימים 🍜 | [Classification](4-Classification/README.md) | מסווגים נוספים | <ul><li> [Python](4-Classification/3-Classifiers-2/README.md)</li><li>[R](../../4-Classification/3-Classifiers-2/solution/R/lesson_12.html) | <ul><li>ג'ן וקאסי</li><li>אריק ונג'או</li></ul> |
| 13 | מטבחים אסיאתיים והודיים טעימים 🍜 | [Classification](4-Classification/README.md) | בניית אפליקציית ווב ממליצה באמצעות המודל שלכם | [Python](4-Classification/4-Applied/README.md) | ג'ן |
| 14 | מבוא לקיבוץ | [Clustering](5-Clustering/README.md) | ניקוי, הכנה וויזואליזציה של הנתונים; מבוא לקיבוץ | <ul><li> [Python](5-Clustering/1-Visualize/README.md)</li><li>[R](../../5-Clustering/1-Visualize/solution/R/lesson_14.html) | <ul><li>ג'ן</li><li>אריק ונג'או</li></ul> |
| 15 | חקר טעמי מוזיקה ניגרית 🎧 | [Clustering](5-Clustering/README.md) | חקר שיטת הקיבוץ K-Means | <ul><li> [Python](5-Clustering/2-K-Means/README.md)</li><li>[R](../../5-Clustering/2-K-Means/solution/R/lesson_15.html) | <ul><li>ג'ן</li><li>אריק ונג'או</li></ul> |
| 16 | מבוא לעיבוד שפה טבעית ☕️ | [Natural language processing](6-NLP/README.md) | למדו את היסודות של עיבוד שפה טבעית על ידי בניית בוט פשוט | [Python](6-NLP/1-Introduction-to-NLP/README.md) | סטיבן |
| 17 | משימות נפוצות בעיבוד שפה טבעית ☕️ | [Natural language processing](6-NLP/README.md) | העמיקו את הידע שלכם בעיבוד שפה טבעית על ידי הבנת משימות נפוצות הנדרשות בעת עבודה עם מבני שפה | [Python](6-NLP/2-Tasks/README.md) | סטיבן |
| 18 | תרגום וניתוח רגשות ♥️ | [Natural language processing](6-NLP/README.md) | תרגום וניתוח רגשות עם ג'יין אוסטן | [Python](6-NLP/3-Translation-Sentiment/README.md) | סטיבן |
| 19 | מלונות רומנטיים באירופה ♥️ | [Natural language processing](6-NLP/README.md) | ניתוח רגשות עם ביקורות על מלונות 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | סטיבן |
| 20 | מלונות רומנטיים באירופה ♥️ | [Natural language processing](6-NLP/README.md) | ניתוח רגשות עם ביקורות על מלונות 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | סטיבן |
| 21 | מבוא לחיזוי סדרות זמן | [Time series](7-TimeSeries/README.md) | מבוא לחיזוי סדרות זמן | [Python](7-TimeSeries/1-Introduction/README.md) | פרנצ'סקה |
| 22 | ⚡️ שימוש עולמי בחשמל ⚡️ - חיזוי סדרות זמן עם ARIMA | [Time series](7-TimeSeries/README.md) | חיזוי סדרות זמן עם ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | פרנצ'סקה |
| 23 | ⚡️ שימוש עולמי בחשמל ⚡️ - חיזוי סדרות זמן עם SVR | [Time series](7-TimeSeries/README.md) | חיזוי סדרות זמן עם Support Vector Regressor | [Python](7-TimeSeries/3-SVR/README.md) | אנירבן |
| 24 | מבוא ללמידת חיזוק | [Reinforcement learning](8-Reinforcement/README.md) | מבוא ללמידת חיזוק עם Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | דמיטרי |
| 25 | עזרו לפיטר להימנע מהזאב! 🐺 | [Reinforcement learning](8-Reinforcement/README.md) | למידת חיזוק Gym | [Python](8-Reinforcement/2-Gym/README.md) | דמיטרי |
| Postscript | תרחישים ויישומים של למידת מכונה בעולם האמיתי | [ML in the Wild](9-Real-World/README.md) | יישומים מעניינים ומרתקים של למידת מכונה קלאסית | [Lesson](9-Real-World/1-Applications/README.md) | צוות |
| Postscript | ניפוי שגיאות מודלים בלמידת מכונה באמצעות לוח מחוונים RAI | [ML in the Wild](9-Real-World/README.md) | ניפוי שגיאות מודלים בלמידת מכונה באמצעות רכיבי לוח מחוונים של AI אחראי | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | רות יעקובו |
> [מצאו את כל המשאבים הנוספים לקורס זה באוסף Microsoft Learn שלנו](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
## גישה לא מקוונת
ניתן להפעיל את התיעוד הזה לא מקוון באמצעות [Docsify](https://docsify.js.org/#/). עשו Fork למאגר זה, [התקינו את Docsify](https://docsify.js.org/#/quickstart) במחשב המקומי שלכם, ואז בתיקיית השורש של מאגר זה, הקלידו `docsify serve`. האתר יוגש על פורט 3000 ב-localhost שלכם: `localhost:3000`.
## PDFs
מצאו קובץ PDF של תוכנית הלימודים עם קישורים [כאן](https://microsoft.github.io/ML-For-Beginners/pdf/readme.pdf).
## 🎒 קורסים נוספים
הצוות שלנו מייצר קורסים נוספים! בדקו:
- [Generative AI for Beginners](https://aka.ms/genai-beginners)
- [Generative AI for Beginners .NET](https://github.com/microsoft/Generative-AI-for-beginners-dotnet)
- [Generative AI with JavaScript](https://github.com/microsoft/generative-ai-with-javascript)
- [Generative AI with Java](https://github.com/microsoft/Generative-AI-for-beginners-java)
- [AI for Beginners](https://aka.ms/ai-beginners)
- [Data Science for Beginners](https://aka.ms/datascience-beginners)
- [ML for Beginners](https://aka.ms/ml-beginners)
- [Cybersecurity for Beginners](https://github.com/microsoft/Security-101)
- [Web Dev for Beginners](https://aka.ms/webdev-beginners)
- [IoT for Beginners](https://aka.ms/iot-beginners)
- [XR Development for Beginners](https://github.com/microsoft/xr-development-for-beginners)
- [Mastering GitHub Copilot for Paired Programming](https://github.com/microsoft/Mastering-GitHub-Copilot-for-Paired-Programming)
- [Mastering GitHub Copilot for C#/.NET Developers](https://github.com/microsoft/mastering-github-copilot-for-dotnet-csharp-developers)
- [Choose Your Own Copilot Adventure](https://github.com/microsoft/CopilotAdventures)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,51 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5e1b8da31aae9cca3d53ad243fa3365a",
"translation_date": "2025-09-05T18:35:13+00:00",
"source_file": "SECURITY.md",
"language_code": "he"
}
-->
## אבטחה
מיקרוסופט מתייחסת ברצינות לאבטחת מוצרי התוכנה והשירותים שלה, כולל כל מאגרי הקוד המקוריים המנוהלים דרך הארגונים שלנו ב-GitHub, הכוללים [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), ו-[ארגוני GitHub שלנו](https://opensource.microsoft.com/).
אם אתם מאמינים שמצאתם פגיעות אבטחה באחד ממאגרי הקוד שבבעלות מיקרוסופט, אשר עומדת בהגדרת [פגיעות אבטחה של מיקרוסופט](https://docs.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)?WT.mc_id=academic-77952-leestott), אנא דווחו לנו כפי שמתואר להלן.
## דיווח על בעיות אבטחה
**אנא אל תדווחו על פגיעות אבטחה דרך בעיות ציבוריות ב-GitHub.**
במקום זאת, דווחו עליהן למרכז התגובה לאבטחת מידע של מיקרוסופט (MSRC) בכתובת [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).
אם אתם מעדיפים לשלוח דיווח ללא התחברות, שלחו דוא"ל לכתובת [secure@microsoft.com](mailto:secure@microsoft.com). אם אפשר, הצפינו את ההודעה שלכם באמצעות מפתח ה-PGP שלנו; ניתן להוריד אותו מדף [Microsoft Security Response Center PGP Key](https://www.microsoft.com/en-us/msrc/pgp-key-msrc).
אתם אמורים לקבל תגובה תוך 24 שעות. אם מסיבה כלשהי לא קיבלתם תגובה, אנא עקבו אחר הדיווח באמצעות דוא"ל כדי לוודא שההודעה המקורית שלכם התקבלה. מידע נוסף ניתן למצוא ב-[microsoft.com/msrc](https://www.microsoft.com/msrc).
אנא כללו את המידע המבוקש המפורט להלן (ככל שתוכלו לספק) כדי לעזור לנו להבין טוב יותר את מהות הבעיה והיקפה:
* סוג הבעיה (לדוגמה, גלישת חוצץ, הזרקת SQL, סקריפטים בין אתרים וכו')
* נתיבי הקבצים המלאים הקשורים להופעת הבעיה
* מיקום הקוד הפגוע (תג/ענף/מחויבות או URL ישיר)
* כל תצורה מיוחדת הנדרשת לשחזור הבעיה
* הוראות מפורטות לשחזור הבעיה
* קוד הוכחת רעיון או ניצול (אם אפשרי)
* השפעת הבעיה, כולל כיצד תוקף עשוי לנצל אותה
מידע זה יעזור לנו לטפל בדיווח שלכם במהירות רבה יותר.
אם אתם מדווחים במסגרת תוכנית באג באונטי, דיווחים מפורטים יותר עשויים להוביל לפרס גבוה יותר. אנא בקרו בדף [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) למידע נוסף על התוכניות הפעילות שלנו.
## שפות מועדפות
אנו מעדיפים שכל התקשורת תהיה באנגלית.
## מדיניות
מיקרוסופט פועלת לפי עקרון [גילוי פגיעות מתואם](https://www.microsoft.com/en-us/msrc/cvd).
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,24 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "872be8bc1b93ef1dd9ac3d6e8f99f6ab",
"translation_date": "2025-09-05T18:34:08+00:00",
"source_file": "SUPPORT.md",
"language_code": "he"
}
-->
# תמיכה
## כיצד לדווח על בעיות ולקבל עזרה
פרויקט זה משתמש ב-GitHub Issues למעקב אחר באגים ובקשות לפיצ'רים. אנא חפשו את הבעיות הקיימות לפני שאתם מדווחים על בעיות חדשות כדי להימנע מכפילויות. עבור בעיות חדשות, דווחו על הבאג או בקשת הפיצ'ר שלכם כבעיה חדשה.
לעזרה ושאלות בנוגע לשימוש בפרויקט זה, דווחו על בעיה.
## מדיניות התמיכה של Microsoft
התמיכה עבור מאגר זה מוגבלת למשאבים המפורטים לעיל.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,57 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "68dd06c685f6ce840e0acfa313352e7c",
"translation_date": "2025-09-05T19:19:54+00:00",
"source_file": "docs/_sidebar.md",
"language_code": "he"
}
-->
- מבוא
- [מבוא ללמידת מכונה](../1-Introduction/1-intro-to-ML/README.md)
- [היסטוריה של למידת מכונה](../1-Introduction/2-history-of-ML/README.md)
- [למידת מכונה והוגנות](../1-Introduction/3-fairness/README.md)
- [טכניקות בלמידת מכונה](../1-Introduction/4-techniques-of-ML/README.md)
- רגרסיה
- [כלים מקצועיים](../2-Regression/1-Tools/README.md)
- [נתונים](../2-Regression/2-Data/README.md)
- [רגרסיה לינארית](../2-Regression/3-Linear/README.md)
- [רגרסיה לוגיסטית](../2-Regression/4-Logistic/README.md)
- בניית אפליקציית אינטרנט
- [אפליקציית אינטרנט](../3-Web-App/1-Web-App/README.md)
- סיווג
- [מבוא לסיווג](../4-Classification/1-Introduction/README.md)
- [סיווגים 1](../4-Classification/2-Classifiers-1/README.md)
- [סיווגים 2](../4-Classification/3-Classifiers-2/README.md)
- [למידת מכונה יישומית](../4-Classification/4-Applied/README.md)
- אשכולות
- [הצגת הנתונים שלך](../5-Clustering/1-Visualize/README.md)
- [K-Means](../5-Clustering/2-K-Means/README.md)
- עיבוד שפה טבעית (NLP)
- [מבוא לעיבוד שפה טבעית](../6-NLP/1-Introduction-to-NLP/README.md)
- [משימות בעיבוד שפה טבעית](../6-NLP/2-Tasks/README.md)
- [תרגום וניתוח רגשות](../6-NLP/3-Translation-Sentiment/README.md)
- [ביקורות מלונות 1](../6-NLP/4-Hotel-Reviews-1/README.md)
- [ביקורות מלונות 2](../6-NLP/5-Hotel-Reviews-2/README.md)
- חיזוי סדרות זמן
- [מבוא לחיזוי סדרות זמן](../7-TimeSeries/1-Introduction/README.md)
- [ARIMA](../7-TimeSeries/2-ARIMA/README.md)
- [SVR](../7-TimeSeries/3-SVR/README.md)
- למידה מחיזוקים
- [Q-Learning](../8-Reinforcement/1-QLearning/README.md)
- [Gym](../8-Reinforcement/2-Gym/README.md)
- למידת מכונה בעולם האמיתי
- [יישומים](../9-Real-World/1-Applications/README.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,37 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b37de02054fa6c0438ede6fabe1fdfb8",
"translation_date": "2025-09-05T18:36:08+00:00",
"source_file": "for-teachers.md",
"language_code": "he"
}
-->
## למורים
האם תרצו להשתמש בתוכנית הלימודים הזו בכיתה שלכם? אתם מוזמנים לעשות זאת!
למעשה, תוכלו להשתמש בה ישירות בתוך GitHub באמצעות GitHub Classroom.
כדי לעשות זאת, בצעו fork למאגר הזה. תצטרכו ליצור מאגר עבור כל שיעור, ולכן תצטרכו להפריד כל תיקייה למאגר נפרד. כך [GitHub Classroom](https://classroom.github.com/classrooms) יוכל לזהות כל שיעור בנפרד.
הוראות [מלאות](https://github.blog/2020-03-18-set-up-your-digital-classroom-with-github-classroom/) אלו יספקו לכם רעיון כיצד להקים את הכיתה שלכם.
## שימוש במאגר כפי שהוא
אם תרצו להשתמש במאגר כפי שהוא כרגע, מבלי להשתמש ב-GitHub Classroom, גם זה אפשרי. תצטרכו לתקשר עם התלמידים שלכם איזה שיעור לעבוד עליו יחד.
בפורמט מקוון (Zoom, Teams או אחר) תוכלו ליצור חדרי עבודה עבור החידונים, ולהנחות את התלמידים כדי להכין אותם ללמידה. לאחר מכן, הזמינו את התלמידים להשתתף בחידונים ולהגיש את תשובותיהם כ-'issues' בזמן מסוים. תוכלו לעשות את אותו הדבר עם משימות, אם תרצו שהתלמידים יעבדו בשיתוף פעולה באופן פתוח.
אם אתם מעדיפים פורמט יותר פרטי, בקשו מהתלמידים לבצע fork לתוכנית הלימודים, שיעור אחר שיעור, למאגרים פרטיים משלהם ב-GitHub, ותנו לכם גישה. כך הם יוכלו להשלים חידונים ומשימות באופן פרטי ולהגיש אותם לכם דרך 'issues' במאגר הכיתה שלכם.
ישנן דרכים רבות לגרום לזה לעבוד בפורמט כיתה מקוון. אנא שתפו אותנו מה עובד הכי טוב עבורכם!
## נשמח לשמוע את דעתכם!
אנחנו רוצים שהתוכנית הזו תתאים לכם ולתלמידים שלכם. אנא שתפו אותנו [משוב](https://forms.microsoft.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR2humCsRZhxNuI79cm6n0hRUQzRVVU9VVlU5UlFLWTRLWlkyQUxORTg5WS4u).
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,127 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6d130dffca5db70d7e615f926cb1ad4c",
"translation_date": "2025-09-05T19:47:28+00:00",
"source_file": "quiz-app/README.md",
"language_code": "he"
}
-->
# חידונים
החידונים האלה הם חידוני טרום ואחרי הרצאה עבור תוכנית הלימודים של למידת מכונה בכתובת https://aka.ms/ml-beginners
## הגדרת הפרויקט
```
npm install
```
### קומפילציה וטעינה מחדש לפיתוח
```
npm run serve
```
### קומפילציה ומזעור עבור הפקה
```
npm run build
```
### בדיקת קוד ותיקון קבצים
```
npm run lint
```
### התאמת ההגדרות
ראו [הפניה להגדרות](https://cli.vuejs.org/config/).
קרדיטים: תודה לגרסה המקורית של אפליקציית החידונים הזו: https://github.com/arpan45/simple-quiz-vue
## פריסה ל-Azure
הנה מדריך שלב-אחר-שלב שיעזור לכם להתחיל:
1. עשו Fork למאגר GitHub
ודאו שקוד האפליקציה שלכם נמצא במאגר GitHub. עשו Fork למאגר הזה.
2. צרו אפליקציית אינטרנט סטטית ב-Azure
- צרו [חשבון Azure](http://azure.microsoft.com)
- עברו ל-[פורטל Azure](https://portal.azure.com)
- לחצו על "Create a resource" וחפשו "Static Web App".
- לחצו על "Create".
3. הגדרת אפליקציית האינטרנט הסטטית
- בסיסים:
- Subscription: בחרו את המנוי שלכם ב-Azure.
- Resource Group: צרו קבוצת משאבים חדשה או השתמשו בקיימת.
- Name: ספקו שם לאפליקציית האינטרנט הסטטית שלכם.
- Region: בחרו את האזור הקרוב ביותר למשתמשים שלכם.
- #### פרטי פריסה:
- Source: בחרו "GitHub".
- GitHub Account: תנו הרשאה ל-Azure לגשת לחשבון GitHub שלכם.
- Organization: בחרו את הארגון שלכם ב-GitHub.
- Repository: בחרו את המאגר שמכיל את אפליקציית האינטרנט הסטטית שלכם.
- Branch: בחרו את הענף שממנו תרצו לפרוס.
- #### פרטי בנייה:
- Build Presets: בחרו את המסגרת שבה האפליקציה שלכם נבנתה (לדוגמה, React, Angular, Vue וכו').
- App Location: ציינו את התיקייה שמכילה את קוד האפליקציה שלכם (לדוגמה, / אם היא נמצאת בשורש).
- API Location: אם יש לכם API, ציינו את מיקומו (אופציונלי).
- Output Location: ציינו את התיקייה שבה נוצר פלט הבנייה (לדוגמה, build או dist).
4. סקירה ויצירה
סקור את ההגדרות שלך ולחץ על "Create". Azure יגדיר את המשאבים הנדרשים וייצור קובץ זרימת עבודה של GitHub Actions במאגר שלך.
5. זרימת עבודה של GitHub Actions
Azure ייצור באופן אוטומטי קובץ זרימת עבודה של GitHub Actions במאגר שלך (.github/workflows/azure-static-web-apps-<name>.yml). קובץ זה יטפל בתהליך הבנייה והפריסה.
6. מעקב אחר הפריסה
עברו ללשונית "Actions" במאגר GitHub שלכם.
תוכלו לראות זרימת עבודה פועלת. זרימת עבודה זו תבנה ותפרוס את אפליקציית האינטרנט הסטטית שלכם ל-Azure.
לאחר סיום זרימת העבודה, האפליקציה שלכם תהיה זמינה בכתובת ה-URL שסופקה על ידי Azure.
### דוגמה לקובץ זרימת עבודה
הנה דוגמה לאיך קובץ זרימת העבודה של GitHub Actions עשוי להיראות:
name: Azure Static Web Apps CI/CD
```
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
jobs:
build_and_deploy_job:
runs-on: ubuntu-latest
name: Build and Deploy Job
steps:
- uses: actions/checkout@v2
- name: Build And Deploy
id: builddeploy
uses: Azure/static-web-apps-deploy@v1
with:
azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
action: "upload"
app_location: "/quiz-app" # App source code path
api_location: ""API source code path optional
output_location: "dist" #Built app content directory - optional
```
### משאבים נוספים
- [תיעוד אפליקציות אינטרנט סטטיות של Azure](https://learn.microsoft.com/azure/static-web-apps/getting-started)
- [תיעוד GitHub Actions](https://docs.github.com/actions/use-cases-and-examples/deploying/deploying-to-azure-static-web-app)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,106 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "fba3b94d88bfb9b81369b869a1e9a20f",
"translation_date": "2025-09-05T20:03:57+00:00",
"source_file": "sketchnotes/LICENSE.md",
"language_code": "he"
}
-->
זכויות, אז אתה לא יכול להטיל מגבלות על מימוש הזכויות המוענקות תחת רישיון המותאם שאתה מיישם.
סעיף 4 -- זכויות בסיס נתונים ייחודיות.
כאשר הזכויות המורשות כוללות זכויות בסיס נתונים ייחודיות החלות על השימוש שלך בחומר המורשה:
א. למען הסר ספק, סעיף 2(א)(1) מעניק לך את הזכות לחלץ, להשתמש מחדש, לשכפל ולשתף את כל או חלק משמעותי מתוכן הבסיס נתונים;
ב. אם אתה כולל את כל או חלק משמעותי מתוכן הבסיס נתונים בבסיס נתונים שבו יש לך זכויות בסיס נתונים ייחודיות, אז הבסיס נתונים שלך חייב להיות מורשה תחת תנאי רישיון זה או רישיון תואם BY-SA (כמוגדר בסעיף 1(ג)).
סעיף 5 -- אחריות כללית.
אלא אם כן מוסכם אחרת בכתב, המורשה מספק את החומר המורשה כפי שהוא, ללא אחריות מכל סוג, מפורשת או משתמעת, כולל, אך לא מוגבל, אחריות לסחירות, התאמה למטרה מסוימת, אי-הפרה, או היעדר פגמים נסתרים או אחרים, דיוק, או נוכחות או היעדר שגיאות, בין אם ניתן לגלותם או לא. חלקים מסוימים של סעיף זה עשויים שלא לחול במקרים מסוימים.
סעיף 6 -- תנאים וסיום.
א. תקופה. הזכויות המורשות מוענקות לתקופה בלתי מוגבלת תחת תנאי רישיון זה. עם זאת, אם אתה מפר את תנאי רישיון זה, הזכויות המורשות שלך מסתיימות אוטומטית.
ב. סיום. אם הזכויות המורשות שלך מסתיימות תחת סעיף 6(א), הן עשויות להיות משוחזרות:
1. באופן אוטומטי אם המורשה מודיע לך על הפרה, בתנאי שאתה מתקן את ההפרה תוך 30 ימים מיום ההודעה;
2. על ידי המורשה במפורש.
ג. המשך. סעיפים 1, 5, 6, 7, ו-8 נשארים בתוקף לאחר סיום רישיון זה.
ד. אין הגבלה על זכויות אחרות. סיום רישיון זה אינו מגביל את זכויותיך תחת כל חריג או הגבלה על זכויות יוצרים או זכויות דומות אחרות.
סעיף 7 -- תנאים נוספים.
א. המורשה לא יהיה מחויב או אחראי תחת רישיון זה לכל נזק ישיר, עקיף, מיוחד, עונשי, או תוצאתי, אלא אם כן מוסכם אחרת בכתב.
ב. אם כל תנאי רישיון זה נחשב בלתי חוקי או בלתי ניתן לאכיפה תחת החוק החל, הוא ייחשב כמתוקן במידה המינימלית הנדרשת כדי להפוך אותו חוקי וניתן לאכיפה. אם התנאי אינו ניתן לתיקון, הוא ייחשב כלא נכלל מרישיון זה מבלי להשפיע על תוקף התנאים הנותרים.
ג. אין ויתור. שום תנאי או תנאי של רישיון זה לא ייחשב כוויתור ולא ייחשב כוויתור על כל הפרה עתידית של אותו תנאי או תנאי.
סעיף 8 -- פרשנות.
א. רישיון זה אינו מפחית, מגביל, או מטיל מגבלות על כל חריג או הגבלה על זכויות יוצרים או זכויות דומות אחרות החלות על השימוש שלך בחומר המורשה.
ב. רישיון זה יפורש על פי החוק החל, ללא קשר לכל עקרונות סתירה של חוקים.
זכויות, ואז מסד הנתונים שבו יש לך זכויות מסד נתונים ייחודיות (Sui Generis Database Rights) אך לא את התכנים האישיים שלו, נחשב כחומר מותאם,
כולל לצורך סעיף 3(b); ו
ג. עליך לעמוד בתנאים שבסעיף 3(a) אם אתה משתף את כל או חלק משמעותי מתכני מסד הנתונים.
למען הסר ספק, סעיף 4 זה משלים ואינו מחליף את התחייבויותיך תחת רישיון ציבורי זה כאשר הזכויות המורשות כוללות זכויות יוצרים וזכויות דומות אחרות.
סעיף 5 -- כתב ויתור על אחריות והגבלת אחריות.
א. אלא אם כן הוסכם אחרת בנפרד על ידי מעניק הרישיון, ככל האפשר, מעניק הרישיון מציע את החומר המורשה כפי שהוא וכפי שהוא זמין, ואינו נותן הצהרות או אחריות מכל סוג שהוא בנוגע לחומר המורשה, בין אם מפורשות, משתמעות, סטטוטוריות או אחרות. זה כולל, ללא הגבלה, אחריות על כותרת, סחירות, התאמה למטרה מסוימת, אי-הפרה, היעדר פגמים סמויים או אחרים, דיוק, או נוכחות או היעדר שגיאות, בין אם ידועות או ניתנות לגילוי. במקומות שבהם כתב ויתור על אחריות אינו מותר במלואו או בחלקו, כתב ויתור זה עשוי שלא לחול עליך.
ב. ככל האפשר, בשום מקרה מעניק הרישיון לא יהיה אחראי כלפיך על פי כל תיאוריה משפטית (כולל, ללא הגבלה, רשלנות) או אחרת על כל הפסדים ישירים, מיוחדים, עקיפים, מקריים, תוצאתיים, עונשיים, דוגמתיים או אחרים, עלויות, הוצאות או נזקים הנובעים מרישיון ציבורי זה או משימוש בחומר המורשה, גם אם מעניק הרישיון הוזהר על האפשרות של הפסדים, עלויות, הוצאות או נזקים כאלה. במקומות שבהם הגבלת אחריות אינה מותרת במלואה או בחלקה, הגבלה זו עשויה שלא לחול עליך.
ג. כתב הוויתור על אחריות והגבלת האחריות המוצגים לעיל יפורשו באופן שמקרב ככל האפשר לוויתור מוחלט על כל אחריות.
סעיף 6 -- תקופה וסיום.
א. רישיון ציבורי זה חל על תקופת זכויות היוצרים וזכויות דומות המורשות כאן. עם זאת, אם אינך עומד ברישיון ציבורי זה, זכויותיך תחת רישיון ציבורי זה מסתיימות באופן אוטומטי.
ב. כאשר זכותך להשתמש בחומר המורשה הסתיימה תחת סעיף 6(a), היא מתחדשת:
1. באופן אוטומטי החל מתאריך תיקון ההפרה, בתנאי שהיא תוקנה תוך 30 ימים מגילוי ההפרה; או
2. עם חידוש מפורש על ידי מעניק הרישיון.
למען הסר ספק, סעיף 6(b) זה אינו משפיע על כל זכות שיש למעניק הרישיון לבקש תרופות להפרותיך של רישיון ציבורי זה.
ג. למען הסר ספק, מעניק הרישיון רשאי גם להציע את החומר המורשה תחת תנאים או תנאים נפרדים או להפסיק להפיץ את החומר המורשה בכל עת; עם זאת, פעולה זו לא תסיים את רישיון ציבורי זה.
ד. סעיפים 1, 5, 6, 7 ו-8 נשארים בתוקף לאחר סיום רישיון ציבורי זה.
סעיף 7 -- תנאים והגבלות נוספים.
א. מעניק הרישיון לא יהיה מחויב על ידי תנאים או הגבלות נוספים או שונים שהועברו על ידך אלא אם כן הוסכם במפורש.
ב. כל הסדרים, הבנות או הסכמים בנוגע לחומר המורשה שאינם מצוינים כאן הם נפרדים ועצמאיים מהתנאים וההגבלות של רישיון ציבורי זה.
סעיף 8 -- פרשנות.
א. למען הסר ספק, רישיון ציבורי זה אינו, ולא יפורש כמצמצם, מגביל, או מטיל תנאים על כל שימוש בחומר המורשה שניתן לבצע באופן חוקי ללא רשות תחת רישיון ציבורי זה.
ב. ככל האפשר, אם כל הוראה של רישיון ציבורי זה נחשבת כבלתי ניתנת לאכיפה, היא תתוקן באופן אוטומטי למינימום הנדרש כדי להפוך אותה לאכיפה. אם ההוראה אינה ניתנת לתיקון, היא תופרד מרישיון ציבורי זה מבלי להשפיע על אכיפת התנאים וההגבלות הנותרים.
ג. שום תנאי או הגבלה של רישיון ציבורי זה לא יוויתרו ושום אי-עמידה לא תתקבל אלא אם כן הוסכם במפורש על ידי מעניק הרישיון.
ד. שום דבר ברישיון ציבורי זה אינו מהווה או עשוי להתפרש כהגבלה או וויתור על כל זכויות יתר וחסינויות החלות על מעניק הרישיון או עליך, כולל מפני תהליכים משפטיים של כל תחום שיפוט או סמכות.
=======================================================================
Creative Commons אינה צד לרישיונות הציבוריים שלה. עם זאת, Creative Commons עשויה לבחור להחיל אחד מהרישיונות הציבוריים שלה על חומר שהיא מפרסמת ובמקרים אלה תיחשב כ"מעניק הרישיון". הטקסט של רישיונות הציבוריים של Creative Commons מוקדש לנחלת הכלל תחת CC0 Public Domain Dedication. למעט למטרות מוגבלות של ציון שחומר משותף תחת רישיון ציבורי של Creative Commons או כפי שמותר אחרת על ידי המדיניות של Creative Commons שפורסמה בכתובת creativecommons.org/policies, Creative Commons אינה מאשרת את השימוש בסימן המסחרי "Creative Commons" או כל סימן מסחרי או לוגו אחר של Creative Commons ללא הסכמה כתובה מראש, כולל, ללא הגבלה, בקשר עם כל שינוי לא מורשה של אחד מהרישיונות הציבוריים שלה או כל הסדרים, הבנות או הסכמים בנוגע לשימוש בחומר מורשה. למען הסר ספק, פסקה זו אינה חלק מהרישיונות הציבוריים.
ניתן ליצור קשר עם Creative Commons בכתובת creativecommons.org.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,21 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a88d5918c1b9da69a40d917a0840c497",
"translation_date": "2025-09-05T20:01:14+00:00",
"source_file": "sketchnotes/README.md",
"language_code": "he"
}
-->
כל הסקצ'נוטים של תכנית הלימודים זמינים להורדה כאן.
🖨 להדפסה באיכות גבוהה, גרסאות TIFF זמינות ב-[מאגר הזה](https://github.com/girliemac/a-picture-is-worth-a-1000-words/tree/main/ml/tiff).
🎨 נוצר על ידי: [Tomomi Imura](https://github.com/girliemac) (טוויטר: [@girlie_mac](https://twitter.com/girlie_mac))
[![CC BY-SA 4.0](https://img.shields.io/badge/License-CC%20BY--SA%204.0-lightgrey.svg)](https://creativecommons.org/licenses/by-sa/4.0/)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור הסמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.

@ -0,0 +1,159 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
"translation_date": "2025-09-05T19:39:30+00:00",
"source_file": "1-Introduction/1-intro-to-ML/README.md",
"language_code": "id"
}
-->
# Pengantar Pembelajaran Mesin
## [Kuis Pra-Pelajaran](https://ff-quizzes.netlify.app/en/ml/)
---
[![ML untuk Pemula - Pengantar Pembelajaran Mesin untuk Pemula](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML untuk Pemula - Pengantar Pembelajaran Mesin untuk Pemula")
> 🎥 Klik gambar di atas untuk video singkat yang membahas pelajaran ini.
Selamat datang di kursus pembelajaran mesin klasik untuk pemula! Baik Anda benar-benar baru dalam topik ini, atau seorang praktisi ML berpengalaman yang ingin menyegarkan pengetahuan di area tertentu, kami senang Anda bergabung dengan kami! Kami ingin menciptakan tempat awal yang ramah untuk studi ML Anda dan akan senang mengevaluasi, merespons, dan mengintegrasikan [masukan Anda](https://github.com/microsoft/ML-For-Beginners/discussions).
[![Pengantar ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Pengantar ML")
> 🎥 Klik gambar di atas untuk video: John Guttag dari MIT memperkenalkan pembelajaran mesin
---
## Memulai dengan Pembelajaran Mesin
Sebelum memulai kurikulum ini, Anda perlu memastikan komputer Anda siap untuk menjalankan notebook secara lokal.
- **Konfigurasikan komputer Anda dengan video ini**. Gunakan tautan berikut untuk mempelajari [cara menginstal Python](https://youtu.be/CXZYvNRIAKM) di sistem Anda dan [menyiapkan editor teks](https://youtu.be/EU8eayHWoZg) untuk pengembangan.
- **Pelajari Python**. Disarankan juga untuk memiliki pemahaman dasar tentang [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), bahasa pemrograman yang berguna bagi ilmuwan data dan yang akan kita gunakan dalam kursus ini.
- **Pelajari Node.js dan JavaScript**. Kami juga menggunakan JavaScript beberapa kali dalam kursus ini saat membangun aplikasi web, jadi Anda perlu menginstal [node](https://nodejs.org) dan [npm](https://www.npmjs.com/), serta memiliki [Visual Studio Code](https://code.visualstudio.com/) untuk pengembangan Python dan JavaScript.
- **Buat akun GitHub**. Karena Anda menemukan kami di [GitHub](https://github.com), Anda mungkin sudah memiliki akun, tetapi jika belum, buatlah satu akun dan kemudian fork kurikulum ini untuk digunakan sendiri. (Jangan ragu untuk memberi kami bintang juga 😊)
- **Jelajahi Scikit-learn**. Kenali [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), kumpulan pustaka ML yang akan kita referensikan dalam pelajaran ini.
---
## Apa itu Pembelajaran Mesin?
Istilah 'pembelajaran mesin' adalah salah satu istilah yang paling populer dan sering digunakan saat ini. Ada kemungkinan besar Anda pernah mendengar istilah ini setidaknya sekali jika Anda memiliki sedikit keterkaitan dengan teknologi, tidak peduli di bidang apa Anda bekerja. Namun, mekanisme pembelajaran mesin adalah misteri bagi kebanyakan orang. Bagi pemula pembelajaran mesin, subjek ini kadang-kadang bisa terasa membingungkan. Oleh karena itu, penting untuk memahami apa sebenarnya pembelajaran mesin itu, dan mempelajarinya langkah demi langkah melalui contoh praktis.
---
## Kurva Hype
![ml hype curve](../../../../1-Introduction/1-intro-to-ML/images/hype.png)
> Google Trends menunjukkan 'kurva hype' terbaru dari istilah 'pembelajaran mesin'
---
## Alam Semesta yang Misterius
Kita hidup di alam semesta yang penuh dengan misteri yang menakjubkan. Ilmuwan hebat seperti Stephen Hawking, Albert Einstein, dan banyak lainnya telah mendedikasikan hidup mereka untuk mencari informasi bermakna yang mengungkap misteri dunia di sekitar kita. Ini adalah kondisi manusia untuk belajar: seorang anak manusia belajar hal-hal baru dan mengungkap struktur dunia mereka tahun demi tahun saat mereka tumbuh dewasa.
---
## Otak Anak
Otak dan indra seorang anak merasakan fakta-fakta di sekitarnya dan secara bertahap mempelajari pola-pola tersembunyi dalam kehidupan yang membantu anak tersebut menyusun aturan logis untuk mengenali pola-pola yang telah dipelajari. Proses pembelajaran otak manusia membuat manusia menjadi makhluk hidup paling canggih di dunia ini. Belajar secara terus-menerus dengan menemukan pola-pola tersembunyi dan kemudian berinovasi berdasarkan pola-pola tersebut memungkinkan kita untuk menjadi lebih baik sepanjang hidup kita. Kapasitas belajar dan kemampuan berkembang ini terkait dengan konsep yang disebut [plastisitas otak](https://www.simplypsychology.org/brain-plasticity.html). Secara dangkal, kita dapat menarik beberapa kesamaan motivasi antara proses pembelajaran otak manusia dan konsep pembelajaran mesin.
---
## Otak Manusia
[Otak manusia](https://www.livescience.com/29365-human-brain.html) merasakan hal-hal dari dunia nyata, memproses informasi yang dirasakan, membuat keputusan rasional, dan melakukan tindakan tertentu berdasarkan keadaan. Inilah yang kita sebut berperilaku secara cerdas. Ketika kita memprogram tiruan dari proses perilaku cerdas ke sebuah mesin, itu disebut kecerdasan buatan (AI).
---
## Beberapa Terminologi
Meskipun istilah-istilah ini dapat membingungkan, pembelajaran mesin (ML) adalah subset penting dari kecerdasan buatan. **ML berkaitan dengan penggunaan algoritma khusus untuk menemukan informasi bermakna dan menemukan pola tersembunyi dari data yang dirasakan untuk mendukung proses pengambilan keputusan rasional**.
---
## AI, ML, Pembelajaran Mendalam
![AI, ML, pembelajaran mendalam, ilmu data](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png)
> Diagram yang menunjukkan hubungan antara AI, ML, pembelajaran mendalam, dan ilmu data. Infografik oleh [Jen Looper](https://twitter.com/jenlooper) terinspirasi oleh [grafik ini](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining)
---
## Konsep yang Akan Dibahas
Dalam kurikulum ini, kita akan membahas hanya konsep inti pembelajaran mesin yang harus diketahui oleh pemula. Kita akan membahas apa yang kita sebut 'pembelajaran mesin klasik' terutama menggunakan Scikit-learn, pustaka yang sangat baik yang banyak digunakan oleh siswa untuk mempelajari dasar-dasarnya. Untuk memahami konsep yang lebih luas tentang kecerdasan buatan atau pembelajaran mendalam, pengetahuan dasar yang kuat tentang pembelajaran mesin sangat penting, dan kami ingin menyediakannya di sini.
---
## Dalam Kursus Ini Anda Akan Belajar:
- konsep inti pembelajaran mesin
- sejarah ML
- ML dan keadilan
- teknik regresi ML
- teknik klasifikasi ML
- teknik pengelompokan ML
- teknik pemrosesan bahasa alami ML
- teknik peramalan deret waktu ML
- pembelajaran penguatan
- aplikasi dunia nyata untuk ML
---
## Apa yang Tidak Akan Dibahas
- pembelajaran mendalam
- jaringan saraf
- AI
Untuk pengalaman belajar yang lebih baik, kami akan menghindari kompleksitas jaringan saraf, 'pembelajaran mendalam' - pembangunan model berlapis-lapis menggunakan jaringan saraf - dan AI, yang akan kita bahas dalam kurikulum yang berbeda. Kami juga akan menawarkan kurikulum ilmu data yang akan datang untuk fokus pada aspek tersebut dari bidang yang lebih besar ini.
---
## Mengapa Mempelajari Pembelajaran Mesin?
Pembelajaran mesin, dari perspektif sistem, didefinisikan sebagai pembuatan sistem otomatis yang dapat mempelajari pola tersembunyi dari data untuk membantu dalam membuat keputusan yang cerdas.
Motivasi ini secara longgar terinspirasi oleh bagaimana otak manusia mempelajari hal-hal tertentu berdasarkan data yang dirasakannya dari dunia luar.
✅ Pikirkan sejenak mengapa sebuah bisnis ingin mencoba menggunakan strategi pembelajaran mesin dibandingkan dengan membuat mesin berbasis aturan yang dikodekan secara manual.
---
## Aplikasi Pembelajaran Mesin
Aplikasi pembelajaran mesin sekarang hampir ada di mana-mana, dan sama melimpahnya dengan data yang mengalir di sekitar masyarakat kita, yang dihasilkan oleh ponsel pintar, perangkat yang terhubung, dan sistem lainnya. Mengingat potensi besar algoritma pembelajaran mesin mutakhir, para peneliti telah mengeksplorasi kemampuannya untuk menyelesaikan masalah kehidupan nyata yang multi-dimensi dan multi-disiplin dengan hasil yang sangat positif.
---
## Contoh Penerapan ML
**Anda dapat menggunakan pembelajaran mesin dalam berbagai cara**:
- Untuk memprediksi kemungkinan penyakit dari riwayat medis atau laporan pasien.
- Untuk memanfaatkan data cuaca guna memprediksi peristiwa cuaca.
- Untuk memahami sentimen dari sebuah teks.
- Untuk mendeteksi berita palsu guna menghentikan penyebaran propaganda.
Keuangan, ekonomi, ilmu bumi, eksplorasi luar angkasa, teknik biomedis, ilmu kognitif, dan bahkan bidang humaniora telah mengadaptasi pembelajaran mesin untuk menyelesaikan masalah berat yang melibatkan pemrosesan data di domain mereka.
---
## Kesimpulan
Pembelajaran mesin mengotomatisasi proses penemuan pola dengan menemukan wawasan bermakna dari data dunia nyata atau data yang dihasilkan. Ini telah terbukti sangat berharga dalam aplikasi bisnis, kesehatan, dan keuangan, di antara lainnya.
Di masa depan, memahami dasar-dasar pembelajaran mesin akan menjadi keharusan bagi orang-orang dari berbagai bidang karena adopsinya yang luas.
---
# 🚀 Tantangan
Gambarkan, di atas kertas atau menggunakan aplikasi online seperti [Excalidraw](https://excalidraw.com/), pemahaman Anda tentang perbedaan antara AI, ML, pembelajaran mendalam, dan ilmu data. Tambahkan beberapa ide tentang masalah yang baik untuk diselesaikan oleh masing-masing teknik ini.
# [Kuis Pasca-Pelajaran](https://ff-quizzes.netlify.app/en/ml/)
---
# Tinjauan & Studi Mandiri
Untuk mempelajari lebih lanjut tentang bagaimana Anda dapat bekerja dengan algoritma ML di cloud, ikuti [Learning Path](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott) ini.
Ikuti [Learning Path](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) tentang dasar-dasar ML.
---
# Tugas
[Mulai dan jalankan](assignment.md)
---
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang timbul dari penggunaan terjemahan ini.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4c4698044bb8af52cfb6388a4ee0e53b",
"translation_date": "2025-09-05T19:40:40+00:00",
"source_file": "1-Introduction/1-intro-to-ML/assignment.md",
"language_code": "id"
}
-->
# Memulai dan Berjalan
## Instruksi
Dalam tugas yang tidak dinilai ini, Anda harus menyegarkan kembali pengetahuan tentang Python dan menyiapkan lingkungan Anda agar dapat menjalankan notebook.
Ikuti [Jalur Pembelajaran Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), lalu siapkan sistem Anda dengan menonton video pengantar berikut:
https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
---
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.

@ -0,0 +1,164 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
"translation_date": "2025-09-05T19:42:33+00:00",
"source_file": "1-Introduction/2-history-of-ML/README.md",
"language_code": "id"
}
-->
# Sejarah Pembelajaran Mesin
![Ringkasan Sejarah Pembelajaran Mesin dalam bentuk sketchnote](../../../../sketchnotes/ml-history.png)
> Sketchnote oleh [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Kuis Pra-Pelajaran](https://ff-quizzes.netlify.app/en/ml/)
---
[![ML untuk Pemula - Sejarah Pembelajaran Mesin](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "ML untuk Pemula - Sejarah Pembelajaran Mesin")
> 🎥 Klik gambar di atas untuk video singkat yang membahas pelajaran ini.
Dalam pelajaran ini, kita akan membahas tonggak-tonggak utama dalam sejarah pembelajaran mesin dan kecerdasan buatan.
Sejarah kecerdasan buatan (AI) sebagai bidang ilmu sangat terkait dengan sejarah pembelajaran mesin, karena algoritma dan kemajuan komputasi yang mendasari ML berkontribusi pada pengembangan AI. Penting untuk diingat bahwa, meskipun bidang-bidang ini sebagai area penelitian yang terpisah mulai terbentuk pada tahun 1950-an, [penemuan algoritmik, statistik, matematis, komputasi, dan teknis](https://wikipedia.org/wiki/Timeline_of_machine_learning) yang penting telah ada sebelumnya dan saling tumpang tindih. Faktanya, manusia telah memikirkan pertanyaan-pertanyaan ini selama [ratusan tahun](https://wikipedia.org/wiki/History_of_artificial_intelligence): artikel ini membahas dasar intelektual historis dari gagasan tentang 'mesin yang dapat berpikir.'
---
## Penemuan Penting
- 1763, 1812 [Teorema Bayes](https://wikipedia.org/wiki/Bayes%27_theorem) dan pendahulunya. Teorema ini dan aplikasinya mendasari inferensi, menggambarkan probabilitas suatu peristiwa terjadi berdasarkan pengetahuan sebelumnya.
- 1805 [Teori Kuadrat Terkecil](https://wikipedia.org/wiki/Least_squares) oleh matematikawan Prancis Adrien-Marie Legendre. Teori ini, yang akan Anda pelajari dalam unit Regresi, membantu dalam pencocokan data.
- 1913 [Rantai Markov](https://wikipedia.org/wiki/Markov_chain), dinamai dari matematikawan Rusia Andrey Markov, digunakan untuk menggambarkan urutan kemungkinan peristiwa berdasarkan keadaan sebelumnya.
- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron) adalah jenis pengklasifikasi linear yang ditemukan oleh psikolog Amerika Frank Rosenblatt yang mendasari kemajuan dalam pembelajaran mendalam.
---
- 1967 [Tetangga Terdekat](https://wikipedia.org/wiki/Nearest_neighbor) adalah algoritma yang awalnya dirancang untuk memetakan rute. Dalam konteks ML, algoritma ini digunakan untuk mendeteksi pola.
- 1970 [Backpropagation](https://wikipedia.org/wiki/Backpropagation) digunakan untuk melatih [jaringan saraf feedforward](https://wikipedia.org/wiki/Feedforward_neural_network).
- 1982 [Jaringan Saraf Rekuren](https://wikipedia.org/wiki/Recurrent_neural_network) adalah jaringan saraf buatan yang berasal dari jaringan saraf feedforward yang menciptakan grafik temporal.
✅ Lakukan sedikit penelitian. Tanggal apa lagi yang menurut Anda penting dalam sejarah ML dan AI?
---
## 1950: Mesin yang Berpikir
Alan Turing, seorang tokoh luar biasa yang dipilih [oleh publik pada tahun 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) sebagai ilmuwan terbesar abad ke-20, dianggap membantu meletakkan dasar untuk konsep 'mesin yang dapat berpikir.' Ia menghadapi skeptisisme dan kebutuhan pribadinya akan bukti empiris tentang konsep ini sebagian dengan menciptakan [Tes Turing](https://www.bbc.com/news/technology-18475646), yang akan Anda pelajari dalam pelajaran NLP kami.
---
## 1956: Proyek Penelitian Musim Panas Dartmouth
"Proyek Penelitian Musim Panas Dartmouth tentang kecerdasan buatan adalah peristiwa penting bagi kecerdasan buatan sebagai bidang," dan di sinilah istilah 'kecerdasan buatan' pertama kali diciptakan ([sumber](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)).
> Setiap aspek pembelajaran atau fitur kecerdasan lainnya pada prinsipnya dapat dijelaskan dengan sangat tepat sehingga sebuah mesin dapat dibuat untuk mensimulasikannya.
---
Peneliti utama, profesor matematika John McCarthy, berharap "untuk melanjutkan berdasarkan dugaan bahwa setiap aspek pembelajaran atau fitur kecerdasan lainnya pada prinsipnya dapat dijelaskan dengan sangat tepat sehingga sebuah mesin dapat dibuat untuk mensimulasikannya." Para peserta termasuk tokoh terkenal lainnya di bidang ini, Marvin Minsky.
Lokakarya ini dianggap telah memulai dan mendorong beberapa diskusi termasuk "kemunculan metode simbolik, sistem yang berfokus pada domain terbatas (sistem pakar awal), dan sistem deduktif versus sistem induktif." ([sumber](https://wikipedia.org/wiki/Dartmouth_workshop)).
---
## 1956 - 1974: "Tahun-tahun Emas"
Dari tahun 1950-an hingga pertengahan '70-an, optimisme tinggi bahwa AI dapat menyelesaikan banyak masalah. Pada tahun 1967, Marvin Minsky dengan percaya diri menyatakan bahwa "Dalam satu generasi ... masalah menciptakan 'kecerdasan buatan' akan secara substansial terpecahkan." (Minsky, Marvin (1967), Computation: Finite and Infinite Machines, Englewood Cliffs, N.J.: Prentice-Hall)
Penelitian pemrosesan bahasa alami berkembang pesat, pencarian disempurnakan dan dibuat lebih kuat, dan konsep 'dunia mikro' diciptakan, di mana tugas-tugas sederhana diselesaikan menggunakan instruksi bahasa biasa.
---
Penelitian didanai dengan baik oleh lembaga pemerintah, kemajuan dibuat dalam komputasi dan algoritma, dan prototipe mesin cerdas dibangun. Beberapa mesin ini termasuk:
* [Shakey the robot](https://wikipedia.org/wiki/Shakey_the_robot), yang dapat bermanuver dan memutuskan cara melakukan tugas secara 'cerdas'.
![Shakey, robot cerdas](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg)
> Shakey pada tahun 1972
---
* Eliza, 'chatterbot' awal, dapat berbicara dengan orang dan bertindak sebagai 'terapis' primitif. Anda akan belajar lebih banyak tentang Eliza dalam pelajaran NLP.
![Eliza, bot](../../../../1-Introduction/2-history-of-ML/images/eliza.png)
> Versi Eliza, chatbot
---
* "Blocks world" adalah contoh dunia mikro di mana balok dapat ditumpuk dan diurutkan, dan eksperimen dalam mengajarkan mesin untuk membuat keputusan dapat diuji. Kemajuan yang dibangun dengan pustaka seperti [SHRDLU](https://wikipedia.org/wiki/SHRDLU) membantu mendorong pemrosesan bahasa ke depan.
[![blocks world dengan SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "blocks world dengan SHRDLU")
> 🎥 Klik gambar di atas untuk video: Blocks world dengan SHRDLU
---
## 1974 - 1980: "Musim Dingin AI"
Pada pertengahan 1970-an, menjadi jelas bahwa kompleksitas membuat 'mesin cerdas' telah diremehkan dan janji-janji yang diberikan, mengingat kekuatan komputasi yang tersedia, telah dilebih-lebihkan. Pendanaan mengering dan kepercayaan pada bidang ini melambat. Beberapa masalah yang memengaruhi kepercayaan meliputi:
---
- **Keterbatasan**. Kekuatan komputasi terlalu terbatas.
- **Ledakan kombinatorial**. Jumlah parameter yang perlu dilatih tumbuh secara eksponensial seiring dengan meningkatnya permintaan pada komputer, tanpa evolusi paralel dari kekuatan dan kemampuan komputasi.
- **Kekurangan data**. Kekurangan data menghambat proses pengujian, pengembangan, dan penyempurnaan algoritma.
- **Apakah kita mengajukan pertanyaan yang tepat?**. Pertanyaan yang diajukan mulai dipertanyakan. Peneliti mulai menghadapi kritik terhadap pendekatan mereka:
- Tes Turing dipertanyakan melalui, antara lain, teori 'ruang Cina' yang menyatakan bahwa, "memprogram komputer digital mungkin membuatnya tampak memahami bahasa tetapi tidak dapat menghasilkan pemahaman nyata." ([sumber](https://plato.stanford.edu/entries/chinese-room/))
- Etika memperkenalkan kecerdasan buatan seperti "terapis" ELIZA ke dalam masyarakat diperdebatkan.
---
Pada saat yang sama, berbagai aliran pemikiran AI mulai terbentuk. Sebuah dikotomi muncul antara praktik ["AI berantakan" vs. "AI rapi"](https://wikipedia.org/wiki/Neats_and_scruffies). Laboratorium _berantakan_ mengutak-atik program selama berjam-jam hingga mendapatkan hasil yang diinginkan. Laboratorium _rapi_ "berfokus pada logika dan pemecahan masalah formal". ELIZA dan SHRDLU adalah sistem _berantakan_ yang terkenal. Pada tahun 1980-an, ketika muncul permintaan untuk membuat sistem ML dapat direproduksi, pendekatan _rapi_ secara bertahap menjadi yang terdepan karena hasilnya lebih dapat dijelaskan.
---
## Sistem Pakar 1980-an
Seiring berkembangnya bidang ini, manfaatnya bagi bisnis menjadi lebih jelas, dan pada tahun 1980-an begitu pula proliferasi 'sistem pakar'. "Sistem pakar adalah salah satu bentuk perangkat lunak kecerdasan buatan (AI) yang pertama benar-benar sukses." ([sumber](https://wikipedia.org/wiki/Expert_system)).
Jenis sistem ini sebenarnya _hibrida_, terdiri sebagian dari mesin aturan yang mendefinisikan persyaratan bisnis, dan mesin inferensi yang memanfaatkan sistem aturan untuk menyimpulkan fakta baru.
Era ini juga melihat perhatian yang semakin besar terhadap jaringan saraf.
---
## 1987 - 1993: 'Pendinginan' AI
Proliferasi perangkat keras sistem pakar yang khusus memiliki efek yang tidak menguntungkan karena menjadi terlalu khusus. Munculnya komputer pribadi juga bersaing dengan sistem besar, khusus, dan terpusat ini. Demokratisasi komputasi telah dimulai, dan akhirnya membuka jalan bagi ledakan data besar modern.
---
## 1993 - 2011
Era ini melihat babak baru bagi ML dan AI untuk dapat menyelesaikan beberapa masalah yang sebelumnya disebabkan oleh kurangnya data dan kekuatan komputasi. Jumlah data mulai meningkat pesat dan menjadi lebih tersedia secara luas, baik untuk keuntungan maupun kerugian, terutama dengan munculnya smartphone sekitar tahun 2007. Kekuatan komputasi berkembang secara eksponensial, dan algoritma berevolusi seiring waktu. Bidang ini mulai mencapai kematangan saat masa-masa bebas sebelumnya mulai mengkristal menjadi disiplin yang sebenarnya.
---
## Sekarang
Saat ini pembelajaran mesin dan AI menyentuh hampir setiap bagian dari kehidupan kita. Era ini menyerukan pemahaman yang hati-hati tentang risiko dan dampak potensial dari algoritma ini terhadap kehidupan manusia. Seperti yang dinyatakan oleh Brad Smith dari Microsoft, "Teknologi informasi menimbulkan masalah yang menyentuh inti perlindungan hak asasi manusia fundamental seperti privasi dan kebebasan berekspresi. Masalah-masalah ini meningkatkan tanggung jawab bagi perusahaan teknologi yang menciptakan produk ini. Menurut pandangan kami, masalah ini juga menyerukan regulasi pemerintah yang bijaksana dan pengembangan norma-norma tentang penggunaan yang dapat diterima" ([sumber](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)).
---
Masih harus dilihat apa yang akan terjadi di masa depan, tetapi penting untuk memahami sistem komputer ini serta perangkat lunak dan algoritma yang mereka jalankan. Kami berharap kurikulum ini akan membantu Anda mendapatkan pemahaman yang lebih baik sehingga Anda dapat memutuskan sendiri.
[![Sejarah pembelajaran mendalam](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "Sejarah pembelajaran mendalam")
> 🎥 Klik gambar di atas untuk video: Yann LeCun membahas sejarah pembelajaran mendalam dalam kuliah ini
---
## 🚀Tantangan
Telusuri salah satu momen sejarah ini dan pelajari lebih lanjut tentang orang-orang di baliknya. Ada karakter-karakter yang menarik, dan tidak ada penemuan ilmiah yang pernah dibuat dalam kekosongan budaya. Apa yang Anda temukan?
## [Kuis Pasca-Pelajaran](https://ff-quizzes.netlify.app/en/ml/)
---
## Tinjauan & Studi Mandiri
Berikut adalah item untuk ditonton dan didengarkan:
[Podcast ini di mana Amy Boyd membahas evolusi AI](http://runasradio.com/Shows/Show/739)
[![Sejarah AI oleh Amy Boyd](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "Sejarah AI oleh Amy Boyd")
---
## Tugas
[Buat garis waktu](assignment.md)
---
**Penafian**:
Dokumen ini telah diterjemahkan menggunakan layanan penerjemahan AI [Co-op Translator](https://github.com/Azure/co-op-translator). Meskipun kami berusaha untuk memberikan hasil yang akurat, harap diingat bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang otoritatif. Untuk informasi yang bersifat kritis, disarankan menggunakan jasa penerjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save