[nl,he,vi] chore(i18n): sync translations

Sync translations with latest source changes.
Languages: Dutch [nl], Hebrew [he], Vietnamese [vi]
update-translations
localizeflow[bot] 1 month ago
parent 59062d5b8e
commit 71dfe6b060

@ -101,6 +101,12 @@
"source_file": "8-Reinforcement/2-Gym/images/cartpole.png",
"language_code": "he"
},
"catplot.e73fc35fdf96242b.webp": {
"original_hash": "90cd4782a2f9b40dec8218b224b29c1c",
"translation_date": "2026-07-14T04:05:47+00:00",
"source_file": "2-Regression/2-Data/images/catplot.png",
"language_code": "he"
},
"centroid.097fde836cf6c918.webp": {
"original_hash": "c8f866ed446563d8e59087f1bca1f97d",
"translation_date": "2026-01-16T13:51:08+00:00",
@ -383,6 +389,12 @@
"source_file": "2-Regression/3-Linear/images/heatmap.png",
"language_code": "he"
},
"heatmap.bd98dce43b404c57.webp": {
"original_hash": "7f2f2fbd993018bc01346e1eb8ae692e",
"translation_date": "2026-07-14T04:06:00+00:00",
"source_file": "2-Regression/2-Data/images/heatmap.png",
"language_code": "he"
},
"hierarchical.bf59403aa43c8c47.webp": {
"original_hash": "50b9bc3298659c463ae76564ca645b12",
"translation_date": "2026-01-16T13:50:50+00:00",
@ -473,6 +485,12 @@
"source_file": "2-Regression/3-Linear/images/linear.png",
"language_code": "he"
},
"lineplot.f9034ba47b1e30ee.webp": {
"original_hash": "b3959c0ed0f02f668009c76b95c4ebbb",
"translation_date": "2026-07-14T04:06:08+00:00",
"source_file": "2-Regression/2-Data/images/lineplot.png",
"language_code": "he"
},
"lobe.2fa0806408ef9923.webp": {
"original_hash": "e6ec71dbe350aef39135dbf88bc89163",
"translation_date": "2026-01-16T13:48:09+00:00",
@ -743,6 +761,12 @@
"source_file": "2-Regression/3-Linear/images/recipes.png",
"language_code": "he"
},
"relplot.a03837d8f0329cec.webp": {
"original_hash": "4733544cb1c2e58e987087283e66b4a5",
"translation_date": "2026-07-14T04:05:52+00:00",
"source_file": "2-Regression/2-Data/images/relplot.png",
"language_code": "he"
},
"scaled.91897dfbaa26ca4a.webp": {
"original_hash": "789c70fafe6f6dd6e377a90b66e7d740",
"translation_date": "2026-01-16T14:01:14+00:00",

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

@ -101,6 +101,12 @@
"source_file": "8-Reinforcement/2-Gym/images/cartpole.png",
"language_code": "nl"
},
"catplot.e73fc35fdf96242b.webp": {
"original_hash": "90cd4782a2f9b40dec8218b224b29c1c",
"translation_date": "2026-07-14T04:05:46+00:00",
"source_file": "2-Regression/2-Data/images/catplot.png",
"language_code": "nl"
},
"centroid.097fde836cf6c918.webp": {
"original_hash": "c8f866ed446563d8e59087f1bca1f97d",
"translation_date": "2026-01-16T13:51:04+00:00",
@ -383,6 +389,12 @@
"source_file": "2-Regression/3-Linear/images/heatmap.png",
"language_code": "nl"
},
"heatmap.bd98dce43b404c57.webp": {
"original_hash": "7f2f2fbd993018bc01346e1eb8ae692e",
"translation_date": "2026-07-14T04:05:57+00:00",
"source_file": "2-Regression/2-Data/images/heatmap.png",
"language_code": "nl"
},
"hierarchical.bf59403aa43c8c47.webp": {
"original_hash": "50b9bc3298659c463ae76564ca645b12",
"translation_date": "2026-01-16T13:50:45+00:00",
@ -473,6 +485,12 @@
"source_file": "2-Regression/3-Linear/images/linear.png",
"language_code": "nl"
},
"lineplot.f9034ba47b1e30ee.webp": {
"original_hash": "b3959c0ed0f02f668009c76b95c4ebbb",
"translation_date": "2026-07-14T04:06:06+00:00",
"source_file": "2-Regression/2-Data/images/lineplot.png",
"language_code": "nl"
},
"lobe.2fa0806408ef9923.webp": {
"original_hash": "e6ec71dbe350aef39135dbf88bc89163",
"translation_date": "2026-01-16T13:48:02+00:00",
@ -743,6 +761,12 @@
"source_file": "2-Regression/3-Linear/images/recipes.png",
"language_code": "nl"
},
"relplot.a03837d8f0329cec.webp": {
"original_hash": "4733544cb1c2e58e987087283e66b4a5",
"translation_date": "2026-07-14T04:05:50+00:00",
"source_file": "2-Regression/2-Data/images/relplot.png",
"language_code": "nl"
},
"scaled.91897dfbaa26ca4a.webp": {
"original_hash": "789c70fafe6f6dd6e377a90b66e7d740",
"translation_date": "2026-01-16T14:01:14+00:00",

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@ -101,6 +101,12 @@
"source_file": "8-Reinforcement/2-Gym/images/cartpole.png",
"language_code": "vi"
},
"catplot.e73fc35fdf96242b.webp": {
"original_hash": "90cd4782a2f9b40dec8218b224b29c1c",
"translation_date": "2026-07-14T04:05:48+00:00",
"source_file": "2-Regression/2-Data/images/catplot.png",
"language_code": "vi"
},
"centroid.097fde836cf6c918.webp": {
"original_hash": "c8f866ed446563d8e59087f1bca1f97d",
"translation_date": "2026-01-16T13:51:12+00:00",
@ -383,6 +389,12 @@
"source_file": "2-Regression/3-Linear/images/heatmap.png",
"language_code": "vi"
},
"heatmap.bd98dce43b404c57.webp": {
"original_hash": "7f2f2fbd993018bc01346e1eb8ae692e",
"translation_date": "2026-07-14T04:06:04+00:00",
"source_file": "2-Regression/2-Data/images/heatmap.png",
"language_code": "vi"
},
"hierarchical.bf59403aa43c8c47.webp": {
"original_hash": "50b9bc3298659c463ae76564ca645b12",
"translation_date": "2026-01-16T13:50:55+00:00",
@ -473,6 +485,12 @@
"source_file": "2-Regression/3-Linear/images/linear.png",
"language_code": "vi"
},
"lineplot.f9034ba47b1e30ee.webp": {
"original_hash": "b3959c0ed0f02f668009c76b95c4ebbb",
"translation_date": "2026-07-14T04:06:10+00:00",
"source_file": "2-Regression/2-Data/images/lineplot.png",
"language_code": "vi"
},
"lobe.2fa0806408ef9923.webp": {
"original_hash": "e6ec71dbe350aef39135dbf88bc89163",
"translation_date": "2026-01-16T13:48:19+00:00",
@ -743,6 +761,12 @@
"source_file": "2-Regression/3-Linear/images/recipes.png",
"language_code": "vi"
},
"relplot.a03837d8f0329cec.webp": {
"original_hash": "4733544cb1c2e58e987087283e66b4a5",
"translation_date": "2026-07-14T04:05:54+00:00",
"source_file": "2-Regression/2-Data/images/relplot.png",
"language_code": "vi"
},
"scaled.91897dfbaa26ca4a.webp": {
"original_hash": "789c70fafe6f6dd6e377a90b66e7d740",
"translation_date": "2026-01-16T14:01:15+00:00",

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

@ -24,8 +24,8 @@
"language_code": "he"
},
"1-Introduction/3-fairness/README.md": {
"original_hash": "9a6b702d1437c0467e3c5c28d763dac2",
"translation_date": "2025-09-05T19:31:10+00:00",
"original_hash": "0f00d72169a0d37eecfd16d71e01700a",
"translation_date": "2026-07-14T03:58:42+00:00",
"source_file": "1-Introduction/3-fairness/README.md",
"language_code": "he"
},
@ -54,8 +54,8 @@
"language_code": "he"
},
"2-Regression/1-Tools/README.md": {
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
"translation_date": "2025-09-05T18:50:40+00:00",
"original_hash": "0b8635427b582d03ea4ab7089b93e505",
"translation_date": "2026-07-14T03:53:36+00:00",
"source_file": "2-Regression/1-Tools/README.md",
"language_code": "he"
},
@ -72,8 +72,8 @@
"language_code": "he"
},
"2-Regression/2-Data/README.md": {
"original_hash": "7c077988328ebfe33b24d07945f16eca",
"translation_date": "2025-09-05T18:54:41+00:00",
"original_hash": "a58b2c4d16c6b122643391745ac15af6",
"translation_date": "2026-07-14T03:54:42+00:00",
"source_file": "2-Regression/2-Data/README.md",
"language_code": "he"
},
@ -89,6 +89,12 @@
"source_file": "2-Regression/2-Data/solution/Julia/README.md",
"language_code": "he"
},
"2-Regression/2-Data/solution/notebook.ipynb": {
"original_hash": "96b95f8cf473481f2f371de8156f1571",
"translation_date": "2026-07-14T03:42:45+00:00",
"source_file": "2-Regression/2-Data/solution/notebook.ipynb",
"language_code": "he"
},
"2-Regression/3-Linear/README.md": {
"original_hash": "8b776e731c35b171d316d01d0e7b1369",
"translation_date": "2026-04-26T20:05:31+00:00",
@ -457,7 +463,7 @@
},
"8-Reinforcement/1-QLearning/README.md": {
"original_hash": "911efd5e595089000cb3c16fce1beab8",
"translation_date": "2025-09-05T20:12:27+00:00",
"translation_date": "2026-07-14T03:55:51+00:00",
"source_file": "8-Reinforcement/1-QLearning/README.md",
"language_code": "he"
},
@ -481,7 +487,7 @@
},
"8-Reinforcement/2-Gym/README.md": {
"original_hash": "107d5bb29da8a562e7ae72262d251a75",
"translation_date": "2025-09-05T20:19:54+00:00",
"translation_date": "2026-07-14T03:57:43+00:00",
"source_file": "8-Reinforcement/2-Gym/README.md",
"language_code": "he"
},
@ -581,6 +587,19 @@
"source_file": "TROUBLESHOOTING.md",
"language_code": "he"
},
"__translation_failures__": {
"sketchnotes/LICENSE.md": {
"original_hash": "fba3b94d88bfb9b81369b869a1e9a20f",
"source_file": "sketchnotes/LICENSE.md",
"language_code": "he",
"failure_date": "2026-07-14T03:52:44+00:00",
"status": "failed",
"error_type": "TranslationIncompleteError",
"error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.",
"translator_version": "0.20.0",
"failure_policy_version": 1
}
},
"docs/_sidebar.md": {
"original_hash": "68dd06c685f6ce840e0acfa313352e7c",
"translation_date": "2025-09-05T19:19:54+00:00",

@ -1,161 +1,167 @@
# בניית פתרונות למידת מכונה עם AI אחראי
![סיכום של AI אחראי בלמידת מכונה בסקיצה](../../../../sketchnotes/ml-fairness.png)
> סקיצה מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [שאלון לפני ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
# בניית פתרונות למידת מכונה עם בינה מלאכותית אחראית
![סיכום של בינה מלאכותית אחראית בלמידת מכונה בשרטוט](../../../../translated_images/he/ml-fairness.ef296ebec6afc98a.webp)
> שרטוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [חידון לפני ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## מבוא
בתוכנית לימודים זו, תתחילו לגלות כיצד למידת מכונה משפיעה על חיי היומיום שלנו. כבר עכשיו, מערכות ומודלים מעורבים במשימות קבלת החלטות יומיומיות, כמו אבחנות רפואיות, אישורי הלוואות או זיהוי הונאות. לכן, חשוב שהמודלים הללו יפעלו בצורה טובה ויספקו תוצאות אמינות. כמו כל יישום תוכנה, מערכות AI עשויות לאכזב או להוביל לתוצאה לא רצויה. זו הסיבה שחשוב להבין ולהסביר את ההתנהגות של מודל AI.
בתכנית לימודים זו, תתחילו לגלות כיצד למידת מכונה משפיעה וכבר משפיעה על חיי היומיום שלנו. כבר כיום, מערכות ודגמים מעורבים במשימות קבלת החלטות יומיומיות, כמו אבחנות בריאותיות, אישורי הלוואות או גילוי הונאה. לכן, חשוב שהדגמים הללו יעבדו היטב ויספקו תוצאות שניתן לסמוך עליהן. כמו כל יישום תוכנה, מערכות AI עלולות לא לעמוד בציפיות או להביא לתוצאות בלתי רצויות. לכן חיוני להיות מסוגל להבין ולהסביר את התנהגות מודל AI.
דמיינו מה יכול לקרות כאשר הנתונים שבהם אתם משתמשים לבניית המודלים חסרים ייצוג של קבוצות דמוגרפיות מסוימות, כמו גזע, מגדר, השקפה פוליטית, דת, או מייצגים אותן באופן לא פרופורציונלי. ומה לגבי מצב שבו תוצאות המודל מפורשות כך שהן מעדיפות קבוצה דמוגרפית מסוימת? מה ההשלכות עבור היישום? בנוסף, מה קורה כאשר למודל יש תוצאה שלילית שפוגעת באנשים? מי אחראי להתנהגות של מערכות AI? אלו שאלות שנחקור בתוכנית לימודים זו.
דמיינו מה עלול לקרות כאשר הנתונים בהם אתם משתמשים לבניית דגמים אלו חסרים קבוצות דמוגרפיות מסוימות, כגון גזע, מין, השקפה פוליטית, דת, או מייצגים באופן לא פרופורציונלי את אותן קבוצות. מה קורה כאשר התוצאה של המודל מפורשת לטובת דמוגרפיה מסוימת? מה תהיה ההשלכה לאפליקציה? בנוסף, מה קורה כאשר למודל יש תוצאה שלילית ופוגע באנשים? מי אחראי להתנהגות מערכת ה-AI? אלה הן כמה מהשאלות שנחקור בתכנית לימודים זו.
בשיעור זה תלמדו:
- להעלות את המודעות לחשיבות ההוגנות בלמידת מכונה ולנזקים הקשורים להוגנות.
- להכיר את הפרקטיקה של חקר חריגים ותסריטים לא שגרתיים כדי להבטיח אמינות ובטיחות.
- להכיר את הנוהג לחקור חריגים ותסריטים יוצאי דופן כדי להבטיח אמינות ובטיחות.
- להבין את הצורך להעצים את כולם על ידי עיצוב מערכות מכילות.
- לחקור את החשיבות של הגנה על פרטיות ואבטחת נתונים ואנשים.
- לראות את החשיבות של גישה שקופה להסבר התנהגות מודלים של AI.
- להיות מודעים לכך שאחריות היא חיונית לבניית אמון במערכות AI.
- לחקור כמה חשוב להגן על פרטיות ואבטחת נתונים ואנשים.
- לראות את חשיבות הגישה של "קופסת זכוכית" כדי להסביר את התנהגות דגמי ה-AI.
- להיות מודעים לאופן בו האחריות חיונית לבניית אמון במערכות AI.
## דרישות מקדימות
## דרישות מוקדמות
כדרישה מקדימה, אנא עברו על מסלול הלמידה "עקרונות AI אחראי" וצפו בסרטון הבא בנושא:
כדרישה מוקדמת, אנא עברו את מסלול הלמידה "עקרונות בינה מלאכותית אחראית" וצפו בסרטון למטה בנושא:
למדו עוד על AI אחראי על ידי מעקב אחר [מסלול הלמידה](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
למדו עוד על בינה מלאכותית אחראית במעקב אחר מסלול זה [Learning Path](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 אחראי")
[![הגישה של מיקרוסופט לבינה מלאכותית אחראית](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "הגישה של מיקרוסופט לבינה מלאכותית אחראית")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: הגישה של Microsoft ל-AI אחראי
> 🎥 לחצו על התמונה למעלה לסרטון: הגישה של מיקרוסופט לבינה מלאכותית אחראית
## הוגנות
מערכות AI צריכות להתייחס לכולם באופן הוגן ולהימנע מהשפעה שונה על קבוצות דומות של אנשים. לדוגמה, כאשר מערכות AI מספקות המלצות לטיפול רפואי, בקשות להלוואות או תעסוקה, עליהן להציע את אותן המלצות לכל מי שיש לו סימפטומים, נסיבות פיננסיות או כישורים מקצועיים דומים. כל אחד מאיתנו נושא עמו הטיות מובנות שמשפיעות על ההחלטות והפעולות שלנו. הטיות אלו יכולות להיות ניכרות בנתונים שבהם אנו משתמשים לאימון מערכות AI. לעיתים, מניפולציה כזו מתרחשת באופן לא מכוון. קשה לעיתים לדעת באופן מודע מתי אנו מכניסים הטיה לנתונים.
מערכות AI צריכות להתייחס לכולם בהוגנות ולהימנע מהשפעה שונה על קבוצות אנשים דומות. לדוגמה, כאשר מערכות AI מספקות הנחיות לטיפול רפואי, בקשות להלוואות או תעסוקה, הן צריכות לתת את אותן ההמלצות לכל מי שיש לו תסמינים דומים, מצב כלכלי דומה או הכשרה מקצועית דומה. כל אחד מאיתנו כנשא הטיות מונחות שמורשות המשפיעות על החלטותינו ופעולותינו. הטיות אלו יכולות להיות ברורות בנתונים שבהם אנו משתמשים לאימון מערכות AI. מניפולציה כזו יכולה להתרחש לפעמים בטעות. לעיתים קרובות קשה במודע לדעת מתי אתם מכניסים הטיה לנתונים.
**"חוסר הוגנות"** כולל השפעות שליליות, או "נזקים", לקבוצה של אנשים, כמו אלו המוגדרים לפי גזע, מגדר, גיל או מצב נכות. הנזקים העיקריים הקשורים להוגנות יכולים להיות מסווגים כ:
**“אי-הוגנות”** כוללת השפעות שליליות, או "נזקים", עבור קבוצת אנשים, כגון אלה המוגדרים במונחים של גזע, מין, גיל או מצב נכות. הנזקים העיקריים הקשורים להוגנות יכולים להתחלק כך:
- **הקצאה**, אם מגדר או אתניות, לדוגמה, מועדפים על פני אחרים.
- **איכות השירות**. אם מאמנים את הנתונים לתרחיש ספציפי אך המציאות מורכבת יותר, זה מוביל לשירות בעל ביצועים ירודים. לדוגמה, מתקן סבון ידיים שלא הצליח לזהות אנשים עם עור כהה. [מקור](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **השמצה**. ביקורת לא הוגנת ותיוג של משהו או מישהו. לדוגמה, טכנולוגיית תיוג תמונות שגתה בתיוג תמונות של אנשים כהי עור כגורילות.
- **ייצוג יתר או חסר**. הרעיון הוא שקבוצה מסוימת אינה נראית במקצוע מסוים, וכל שירות או פונקציה שממשיכים לקדם זאת תורמים לנזק.
- **סטראוטיפים**. שיוך קבוצה מסוימת לתכונות שהוקצו מראש. לדוגמה, מערכת תרגום בין אנגלית לטורקית עשויה לכלול אי דיוקים בשל מילים עם שיוך סטראוטיפי למגדר.
- **הקצאה**, אם מגדר או אתניות לדוגמה מועדפים על אחרים.
- **איכות השירות**. אם מאמנים את הנתונים לתרחיש ספציפי אך המציאות מורכבת יותר, זה מוביל לשירות ביצועי ירוד. לדוגמה, מתDisp מוזל יד לא הצליח לזהות אנשים עם עור כהה. [Reference](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **השמצה**. לבקר ולהתייג משהו או מישהו בצורה בלתי הוגנת. לדוגמה, טכנולוגיית סימון תמונות תויגה לשמצה כאשר סימנה בטעות תמונות של אנשים עם עור כהה ככלבים.
- **ייצוג מופרז או חסר**. הרעיון הוא שקבוצה מסוימת לא נראית במקצוע מסוים, וכל שירות או פונקציה שמקדם זאת תורם לנזק.
- **סטריאוטיפים**. לקשר קבוצה מסוימת עם תכונות מוקצות מראש. לדוגמה, מערכת תרגום שפות בין אנגלית לטורקית עלולה להכיל אי דיוקים בגלל מילים של סטריאוטיפים מגדריים.
![תרגום לטורקית](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png)
![תרגום לטורקית](../../../../translated_images/he/gender-bias-translate-en-tr.f185fd8822c2d437.webp)
> תרגום לטורקית
![תרגום חזרה לאנגלית](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png)
![תרגום חזרה לאנגלית](../../../../translated_images/he/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp)
> תרגום חזרה לאנגלית
בעת עיצוב ובדיקת מערכות AI, עלינו להבטיח שה-AI יהיה הוגן ולא יתוכנת לקבל החלטות מוטות או מפלות, שאסורות גם על בני אדם. הבטחת הוגנות ב-AI ובלמידת מכונה נותרת אתגר סוציוטכני מורכב.
בעת עיצוב ובדיקת מערכות AI, עלינו לוודא שה-AI הוגן ואינו מתוכנת לקבל החלטות מוטות או מפלות, שהאדם גם אסור לו לקבל. הבטחת הוגנות ב-AI ולמידת מכונה נשארת אתגר טכנו-חברתי מורכב.
### אמינות ובטיחות
כדי לבנות אמון, מערכות AI צריכות להיות אמינות, בטוחות ועקביות בתנאים רגילים ולא צפויים. חשוב לדעת כיצד מערכות AI יתנהגו במגוון מצבים, במיוחד כאשר מדובר בחריגים. בעת בניית פתרונות AI, יש להתמקד באופן משמעותי בטיפול במגוון רחב של נסיבות שהפתרונות עשויים להיתקל בהן. לדוגמה, רכב אוטונומי צריך לשים את בטיחות האנשים בראש סדר העדיפויות. כתוצאה מכך, ה-AI שמפעיל את הרכב צריך לשקול את כל התרחישים האפשריים שהרכב עשוי להיתקל בהם, כמו לילה, סופות רעמים או שלגים, ילדים שרצים ברחוב, חיות מחמד, עבודות בכביש וכו'. עד כמה מערכת AI יכולה להתמודד עם מגוון רחב של תנאים בצורה אמינה ובטוחה משקף את רמת הציפייה שהמדען נתונים או מפתח ה-AI לקחו בחשבון במהלך העיצוב או הבדיקה של המערכת.
כדי לבנות אמון, מערכות AI צריכות להיות אמינות, בטוחות ועקביות בתנאים נורמליים ובלתי צפויים. חשוב לדעת כיצד מערכות AI יתנהגו במגוון מצבים, במיוחד כאשר הם חריגים. כאשר בונים פתרונות AI, יש צורך להקדיש דגש משמעותי כיצד להתמודד עם מגוון רחב של נסיבות שהפתרונות AI ייתקלו בהן. לדוגמה, רכב אוטונומי חייב לשים את בטיחות האנשים בראש סדר העדיפויות. כתוצאה מכך, ה-AI שמפעיל את הרכב צריך לקחת בחשבון את כל התסריטים האפשריים בהם הרכב עלול להיתקל, כגון לילה, סופות רעמים או סופות שלגים, ילדים שרצים מעבר לכביש, חיות מחמד, עבודות בכביש וכו'. כמה טוב מערכת AI מסוגלת להתמודד עם מגוון רחב של תנאים באופן אמין ובטוח משקף את רמת הצפייה שהמדען או המפתח של ה-AI שקל במהלך העיצוב או בדיקת המערכת.
> [🎥 לחצו כאן לצפייה בסרטון: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
> [🎥 לחצו כאן לסרטון: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
### הכלה
### שיתופיות
מערכות AI צריכות להיות מעוצבות כך שיתקשרו ויעצימו את כולם. בעת עיצוב ויישום מערכות AI, מדעני נתונים ומפתחי AI מזהים ומטפלים במחסומים פוטנציאליים במערכת שיכולים להוציא אנשים באופן לא מכוון. לדוגמה, ישנם מיליארד אנשים עם מוגבלויות ברחבי העולם. עם התקדמות ה-AI, הם יכולים לגשת למגוון רחב של מידע והזדמנויות בקלות רבה יותר בחיי היומיום שלהם. על ידי טיפול במחסומים, נוצרת הזדמנות לחדש ולפתח מוצרים AI עם חוויות טובות יותר שמועילות לכולם.
מערכות AI צריכות להיות מעוצבות כדי לכלול ולהעצים את כולם. בעת עיצוב ויישום מערכות AI, מדעני נתונים ומפתחי AI מזהים ומתמודדים עם מחסומים פוטנציאליים במערכת שיכולים בטעות להוציא אנשים מחוץ. לדוגמה, ישנם מיליארד אנשים עם מוגבלויות ברחבי העולם. עם התקדמות ה-AI, הם יכולים לגשת למגוון רחב של מידע והזדמנויות בקלות רבה יותר בחיי היומיום שלהם. על ידי התמודדות עם המחסומים, נוצרות הזדמנויות לחדש ולפתח מוצרי AI עם חוויות טובות יותר שמועילות לכולם.
> [🎥 לחצו כאן לצפייה בסרטון: הכלה ב-AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
> [🎥 לחצו כאן לסרטון: שיתופיות ב-AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
### אבטחה ופרטיות
מערכות AI צריכות להיות בטוחות ולכבד את פרטיות האנשים. אנשים נותנים פחות אמון במערכות שמסכנות את פרטיותם, המידע שלהם או חייהם. בעת אימון מודלים של למידת מכונה, אנו מסתמכים על נתונים כדי להפיק את התוצאות הטובות ביותר. תוך כדי כך, יש לקחת בחשבון את מקור הנתונים ואת שלמותם. לדוגמה, האם הנתונים הוגשו על ידי משתמשים או היו זמינים לציבור? לאחר מכן, בעת עבודה עם הנתונים, חשוב לפתח מערכות AI שיכולות להגן על מידע חסוי ולהתנגד להתקפות. ככל שה-AI הופך לנפוץ יותר, הגנה על פרטיות ואבטחת מידע אישי ועסקי חשובים הופכת לקריטית ומורכבת יותר. סוגיות פרטיות ואבטחת נתונים דורשות תשומת לב מיוחדת עבור AI מכיוון שגישה לנתונים חיונית למערכות AI כדי לבצע תחזיות והחלטות מדויקות ומושכלות על אנשים.
מערכות AI צריכות להיות בטוחות ולכבד את פרטיות האנשים. אנשים סומכים פחות על מערכות שמסכנות את פרטיותם, מידעם או חייהם. כאשר מאמנים מודלים של למידת מכונה, אנו מסתמכים על נתונים כדי להפיק את התוצאות הטובות ביותר. בכך, יש לשקול את המקור והיושרה של הנתונים. לדוגמה, האם הנתונים הוגשו על ידי המשתמש או זמינים לציבור? לאחר מכן, בעת עבודה עם הנתונים, חיוני לפתח מערכות AI שיכולות להגן על מידע סודי ולהתנגד להתקפות. ככל שה-AI נעשה נפוץ יותר, ההגנה על הפרטיות ואבטחת מידע אישי ועסקי נעשות קריטיות ומורכבות יותר. סוגיות פריבטיות ואבטחת נתונים דורשות תשומת לב מיוחדת ב-AI כיוון שגישה לנתונים חיונית למערכות AI לעשות תחזיות והחלטות מדויקות ומושכלות על אנשים.
> [🎥 לחצו כאן לצפייה בסרטון: אבטחה ב-AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
> [🎥 לחצו כאן לסרטון: אבטחה ב-AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- בתעשייה עשינו התקדמות משמעותית בפרטיות ואבטחה, מונעת באופן משמעותי על ידי רגולציות כמו ה-GDPR (General Data Protection Regulation).
- עם זאת, במערכות AI עלינו להכיר במתח בין הצורך ביותר נתונים אישיים כדי להפוך את המערכות ליותר אישיות ויעילות לבין פרטיות.
- כמו עם לידת המחשבים המחוברים לאינטרנט, אנו גם רואים עלייה משמעותית במספר סוגיות האבטחה הקשורות ל-AI.
- באותו הזמן, ראינו שימוש ב-AI לשיפור האבטחה. לדוגמה, רוב סורקי האנטי-וירוס המודרניים מונעים על ידי AI היום.
- עלינו להבטיח שתהליכי מדע הנתונים שלנו ישתלבו בהרמוניה עם שיטות הפרטיות והאבטחה העדכניות ביותר.
- בתעשייה שלנו נעשו התפתחויות משמעותיות בפרטיות ואבטחה, שניזונו במידה רבה מה-GDPR (תקנת הגנת המידע הכללית).
- אך עם מערכות AI עלינו להכיר במתח בין הצורך בנתונים אישיים כדי להפוך מערכות ליותר אישיות ויעילות לבין פרטיות.
- בדומה ללידת המחשבים המחוברים עם האינטרנט, אנו רואים גם עלייה משמעותית במספר סוגיות האבטחה הקשורות ל-AI.
- במקביל, ראינו שימוש ב-AI לשיפור האבטחה. לדוגמה, רוב הסורקים המודרניים נגד וירוסים מונעים היום על ידי אלגוריתמים AI.
- עלינו להבטיח שתהליכי מדעי הנתונים שלנו משולבים בהרמוניה עם השיטות האחרונות של פרטיות ואבטחה.
### שקיפות
מערכות AI צריכות להיות מובנות. חלק קריטי בשקיפות הוא הסבר ההתנהגות של מערכות AI ושל רכיביהן. שיפור ההבנה של מערכות AI דורש שהגורמים המעורבים יבינו כיצד ולמה הן פועלות, כך שיוכלו לזהות בעיות ביצועים פוטנציאליות, חששות בטיחות ופרטיות, הטיות, פרקטיקות מפלות או תוצאות לא מכוונות. אנו גם מאמינים שמי שמשתמש במערכות AI צריך להיות כנה וגלוי לגבי מתי, למה ואיך הוא בוחר להפעיל אותן, כמו גם לגבי המגבלות של המערכות שהוא משתמש בהן. לדוגמה, אם בנק משתמש במערכת AI כדי לתמוך בהחלטות הלוואה לצרכנים, חשוב לבחון את התוצאות ולהבין אילו נתונים משפיעים על ההמלצות של המערכת. ממשלות מתחילות להסדיר את ה-AI בתעשיות שונות, ולכן מדעני נתונים וארגונים חייבים להסביר אם מערכת AI עומדת בדרישות הרגולציה, במיוחד כאשר יש תוצאה לא רצויה.
### שקיפות
מערכות AI צריכות להיות מובנות. חלק חשוב בשקיפות הוא הסבר התנהגות מערכות ה-AI והרכיבים שלהן. שיפור ההבנה של מערכות AI דורש מהמעורבים להבין כיצד ומדוע הן פועלות, כדי שיוכלו לזהות בעיות ביצועים פוטנציאליות, חששות בטיחות ופרטיות, הטיות, פרקטיקות הכללה לא ראויות או תוצאות בלתי מכוונות. אנו גם מאמינים כי אלה שמשתמשים במערכות AI צריכים להיות כנים וגלויים לגבי מתי, מדוע ואיך הם בוחרים ליישמן. כמו גם לגבי מגבלות המערכות שבהן הם משתמשים. לדוגמה, אם בנק משתמש במערכת AI לתמיכה בהחלטות ההלוואה לצרכנים, חשוב לבדוק את התוצאות ולהבין אילו נתונים משפיעים על המלצות המערכת. ממשלות מתחילות להסדיר את ה-AI ברחבי התעשיות, ולכן מדעני נתונים וארגונים חייבים להסביר אם מערכת AI עומדת בדרישות הרגולציה, במיוחד כאשר יש תוצאה לא רצויה.
> [🎥 לחצו כאן לצפייה בסרטון: שקיפות ב-AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
> [🎥 לחצו כאן לסרטון: שקיפות ב-AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- מכיוון שמערכות AI כל כך מורכבות, קשה להבין כיצד הן פועלות ולפרש את התוצאות.
- חוסר הבנה זה משפיע על האופן שבו מערכות אלו מנוהלות, מופעלות ומתועדות.
- חוסר הבנה זה משפיע יותר מכל על ההחלטות שמתקבלות באמצעות התוצאות שמערכות אלו מפיקות.
- משום שמערכות AI מורכבות כל כך, קשה להבין כיצד הן פועלות ולפרש את התוצאות.
- חוסר הבנה זה משפיע על האופן שבו מערכות אלו מנוהלות, מפעילות ומתועדות.
- חוסר ההבנה הזה חשוב אף יותר משפיע על החלטות שמתקבלות תוך שימוש בתוצאות שמערכות אלו מפיקות.
### אחריות
האנשים שמעצבים ומפעילים מערכות AI צריכים להיות אחראים לאופן שבו מערכותיהם פועלות. הצורך באחריות הוא קריטי במיוחד בטכנולוגיות שימוש רגישות כמו זיהוי פנים. לאחרונה, יש דרישה גוברת לטכנולוגיית זיהוי פנים, במיוחד מארגוני אכיפת חוק שרואים את הפוטנציאל בטכנולוגיה לשימושים כמו מציאת ילדים נעדרים. עם זאת, טכנולוגיות אלו עלולות לשמש ממשלות לסכן את חירויות היסוד של אזרחיהם על ידי, למשל, הפעלה מתמדת של מעקב על אנשים מסוימים. לכן, מדעני נתונים וארגונים חייבים להיות אחראים לאופן בו מערכת ה-AI שלהם משפיעה על יחידים או על החברה.
האנשים שמעצבים ומפעילים מערכות AI חייבים להיות אחראים לאופן שבו המערכות שלהם פועלות. הצורך באחריות הוא קריטי במיוחד בטכנולוגיות רגישות כמו זיהוי פנים. לאחרונה, ישנה דרישה גוברת לטכנולוגיית זיהוי פנים, במיוחד מארגוני אכיפת חוק שרואים את הפוטנציאל של הטכנולוגיה בשימושים כמו מציאת ילדים נעדרים. עם זאת, טכנולוגיות אלו עשויות לשמש ממשלות כדי לסכן את חירויות היסוד של אזרחיהן, למשל, על ידי הפעלת מעקב מתמשך על אנשים מסוימים. לכן, מדעני נתונים וארגונים צריכים להיות אחראים לאופן שבו מערכת ה-AI שלהם משפיעה על אנשים או על החברה.
[![חוקר בינה מוביל מזהיר מפני מעקב המוני באמצעות זיהוי פנים](../../../../translated_images/he/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "הגישה של מיקרוסופט לבינה מלאכותית אחראית")
[![חוקר AI מוביל מזהיר מפני מעקב המוני באמצעות זיהוי פנים](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "הגישה של Microsoft ל-AI אחראי")
> 🎥 לחצו על התמונה למעלה לסרטון: אזהרות ממעקב המוני באמצעות זיהוי פנים
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: אזהרות מפני מעקב המוני באמצעות זיהוי פנים
בסופו של דבר, אחת השאלות הגדולות ביותר לדור שלנו, כראשון שמביא את ה-AI לחברה, היא כיצד להבטיח שמחשבים יישארו אחראים לאנשים וכיצד להבטיח שהאנשים שמעצבים מחשבים יישארו אחראים לכל השאר.
בסופו של דבר, אחת מהשאלות הגדולות של דורנו, כדור ראשון שמביא את ה-AI לחברה, היא איך להבטיח שמחשבים יישארו אחראים בפני אנשים ואיך להבטיח שאנשים שמעצבים מחשבים יישארו אחראים בפני כולם.
## הערכת השפעה
לפני אימון מודל למידת מכונה, חשוב לבצע הערכת השפעה כדי להבין את מטרת מערכת ה-AI; מה השימוש המיועד; היכן היא תופעל; ומי יתקשר עם המערכת. אלו מועילים לבוחנים או למבקרים שמעריכים את המערכת לדעת אילו גורמים יש לקחת בחשבון בעת זיהוי סיכונים פוטנציאליים ותוצאות צפויות.
לפני אימון מודל למידת מכונה, חשוב לבצע הערכת השפעה כדי להבין את מטרת מערכת ה-AI; מה השימוש המיועד; היכן היא תופעל; ומי יתקשר עם המערכת. אלו מידע מועיל לבוחן או לבודק המעריך את המערכת לדעת אילו גורמים לקחת בחשבון בעת זיהוי סיכונים פוטנציאליים ותוצאות צפויות.
התחומים הבאים הם מוקדי תשומת לב בעת ביצוע הערכת השפעה:
להלן אזורי מיקוד בעת ביצוע הערכת השפעה:
* **השפעה שלילית על אנשים**. מודעות לכל מגבלה או דרישה, שימוש לא נתמך או כל מגבלה ידועה שמפריעה לביצועי המערכת היא חיונית כדי להבטיח שהמערכת לא תופעל באופן שעלול לגרום נזק לאנשים.
* **דרישות נתונים**. הבנת האופן והיכן המערכת תשתמש בנתונים מאפשרת למבקרים לחקור כל דרישות נתונים שיש לקחת בחשבון (למשל, תקנות GDPR או HIPPA). בנוסף, יש לבחון האם מקור או כמות הנתונים מספקים לאימון.
* **סיכום השפעה**. איסוף רשימה של נזקים פוטנציאליים שעלולים להתעורר משימוש במערכת. לאורך מחזור החיים של למידת מכונה, יש לבדוק אם הבעיות שזוהו טופלו או נפתרו.
* **מטרות ישימות** לכל אחד מששת העקרונות המרכזיים. יש להעריך אם המטרות מכל אחד מהעקרונות הושגו ואם יש פערים.
* **השפעה שלילית על יחידים**. חשוב להיות מודעים לכל מגבלה או דרישות, שימוש בלתי נתמך או כל הגבלה ידועה שמפריעה לביצועי המערכת כדי להבטיח שהמערכת לא תשמש בדרך שתווצר נזק ליחידים.
* **דרישות נתונים**. הבנת כיצד והיכן המערכת תשתמש בנתונים מאפשרת לבוחנים לחקור את דרישות הנתונים שעליכם לקחת בחשבון (למשל, תקנות GDPR או HIPAA). בנוסף, לבדוק אם מקור או כמות הנתונים מספיקה לאימון.
* **סיכום השפעה**. לאסוף רשימה של נזקים פוטנציאליים שעשויים לעלות משימוש במערכת. במהלך מחזור החיים של למידת המכונה, לבדוק האם בעיות שזוהו מומטות או מטופלות.
* **מטרות ישימות** עבור כל אחד מששת העקרונות המרכזיים. להעריך אם המטרות מכל עקרון מתקיימות והאם יש פערים.
## איתור באגים עם AI אחראי
בדומה לאיתור באגים ביישום תוכנה, איתור באגים במערכת AI הוא תהליך הכרחי לזיהוי ופתרון בעיות במערכת. ישנם גורמים רבים שיכולים להשפיע על כך שמודל לא יפעל כמצופה או באופן אחראי. רוב מדדי הביצועים המסורתיים של מודלים הם אגרגטים כמותיים של ביצועי המודל, שאינם מספיקים לניתוח כיצד מודל מפר את עקרונות ה-AI האחראי. יתרה מכך, מודל למידת מכונה הוא "קופסה שחורה" שמקשה להבין מה מניע את תוצאותיו או לספק הסבר כאשר הוא טועה. בהמשך הקורס, נלמד כיצד להשתמש בלוח המחוונים של AI אחראי כדי לעזור באיתור באגים במערכות AI. לוח המחוונים מספק כלי הוליסטי למדעני נתונים ומפתחי AI לבצע:
## איתור תקלות עם בינה מלאכותית אחראית
* **ניתוח שגיאות**. לזהות את התפלגות השגיאות של המודל שיכולה להשפיע על ההוגנות או האמינות של המערכת.
* **סקירת מודל**. לגלות היכן יש פערים בביצועי המודל בין קבוצות נתונים שונות.
* **ניתוח נתונים**. להבין את התפלגות הנתונים ולזהות כל הטיה פוטנציאלית בנתונים שעלולה להוביל לבעיות הוגנות, הכלה ואמינות.
* **הבנת מודל**. להבין מה משפיע או משפיע על תחזיות המודל. זה עוזר להסביר את התנהגות המודל, שחשובה לשקיפות ואחריות.
בדומה לאיתור תקלות בתוכנה, איתור תקלות במערכת AI הוא תהליך נחוץ של זיהוי ופתרון בעיות במערכת. ישנם גורמים רבים שעשויים להשפיע על כך שמודל לא יבצע כמצופה או בצורה אחראית. רוב מדדי הביצועים המסורתיים של מודלים הם ערכים מספריים מרכזיים של ביצועי המודל, שאינם מספקים לנתח כיצד מודל מפר את עקרונות ה-AI האחראית. נוסף על כך, מודל למידת מכונה הוא תיבת שחורה המקשה להבין מה מניע את תוצאתו או לספק הסבר כאשר הוא טועה. בהמשך הקורס, נלמד כיצד להשתמש בלוח הבקרה של בינה מלאכותית אחראית כדי לסייע באיתור תקלות במערכות AI. לוח הבקרה מספק כלי הוליסטי למדעני נתונים ומפתחי AI לבצע:
## 🚀 אתגר
* **ניתוח שגיאות**. כדי לזהות את התפלגות השגיאות של המודל אשר עלולה להשפיע על ההוגנות או האמינות של המערכת.
* **סקירת מודל**. כדי לגלות היכן קיימים פערים בביצועי המודל בקרב קבוצות נתונים.
* **ניתוח נתונים**. כדי להבין את התפלגות הנתונים ולזהות הטיות פוטנציאליות שעלולות להוביל לבעיות של הוגנות, שיתופיות ואמינות.
* **פירושיות המודל**. כדי להבין מה משפיע או משפעל את תחזיות המודל. זה מסייע בהסברת התנהגות המודל, החשובה לשקיפות ואחריות.
כדי למנוע נזקים מלהיות מוכנסים מלכתחילה, עלינו:
- לכלול מגוון של רקעים ופרספקטיבות בקרב האנשים שעובדים על מערכות
- להשקיע במאגרי נתונים שמייצגים את המגוון של החברה שלנו
- לפתח שיטות טובות יותר לאורך מחזור החיים של למידת מכונה לזיהוי ותיקון AI אחראי כאשר הוא מתרחש
## 🚀 אתגר
כדי למנוע נזקים כבר בשלב הראשוני, עלינו:
- שיהיה גיוון רקעי והשקפות בין האנשים שעובדים על המערכות
- להשקיע בסטי נתונים שמשקפים את הגיוון של החברה שלנו
- לפתח שיטות טובות יותר לאורך מחזור חיי למידת המכונה לזיהוי ותיקון בינה מלאכותית אחראית כשהיא מתרחשת
חשבו על תרחישים אמיתיים שבהם חוסר אמינות של מודל ניכר בבנייה ובשימוש במודל. מה עוד כדאי לקחת בחשבון?
חשבו על תסריטים מחיי היום-יום שבהם חוסר אמינות של מודל ניכר בבנייתו ובשימוש בו. מה עוד צריך להתחשב בו?
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## [חידון לאחר ההרצאה](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: מסגרת קוד פתוח לבניית בינה מלאכותית אחראית")
[![ערכת כלים לבינה מלאכותית אחראית: מסגרת קוד פתוח לבניית בינה מלאכותית אחראית](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "ערכת כלים לבינה מלאכותית אחראית: מסגרת קוד פתוח לבניית בינה מלאכותית אחראית")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: RAI Toolbox: מסגרת קוד פתוח לבניית בינה מלאכותית אחראית מאת בסמירה נושי, מהרנוש סמקי ואמיט שארמה
> 🎥 לחצו על התמונה למעלה לסרטון: ערכת כלים לבינה מלאכותית אחראית: מסגרת קוד פתוח לבניית בינה מלאכותית אחראית מאת בסמירה נושי, מהרנווש סמאקי, ואמיט שרמה
בנוסף, קראו:
בנוסף, קראו:
- מרכז המשאבים של Microsoft בנושא בינה מלאכותית אחראית: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- מרכז המשאבים של מיקרוסופט לבינה מלאכותית אחראית: [משאבי בינה מלאכותית אחראית 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/)
- קבוצת המחקר FATE של מיקרוסופט: [FATE: הוגנות, אחריות, שקיפות ואתיקה בבינה מלאכותית - מחקר מיקרוסופט](https://www.microsoft.com/research/theme/fate/)
RAI Toolbox:
ערכת כלים לבינה מלאכותית אחראית:
- [מאגר GitHub של Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox)
- [מאגר GitHub של ערכת כלים לבינה מלאכותית אחראית](https://github.com/microsoft/responsible-ai-toolbox)
קראו על הכלים של Azure Machine Learning להבטחת הוגנות:
קראו על כלי Azure Machine Learning להבטחת הוגנות:
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
## משימה
## מטלה
[חקור את RAI Toolbox](assignment.md)
[חקור את ערכת הכלים לבינה מלאכותית אחראית](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,120 +1,121 @@
# התחילו עם Python ו-Scikit-learn עבור מודלים של רגרסיה
# התחילו עם פייתון ו-Scikit-learn למודלי רגרסיה
![סיכום של רגרסיות בסקצ'נוט](../../../../sketchnotes/ml-regression.png)
![סיכום של רגרסיות בסקצ'נוט](../../../../translated_images/he/ml-regression.4e4f70e3b3ed446e.webp)
> סקצ'נוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
> סקטצ'נוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
## [מבחן טרום-הרצאה](https://ff-quizzes.netlify.app/en/ml/)
> ### [השיעור הזה זמין גם ב-R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
> ### [שיעור זה זמין ב-R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
## מבוא
## مقدّمة
בארבעת השיעורים הללו, תלמדו כיצד לבנות מודלים של רגרסיה. נדון במה הם משמשים בקרוב. אבל לפני שתתחילו, ודאו שיש לכם את הכלים הנכונים כדי להתחיל את התהליך!
בארבעת השיעורים האלה תגלה כיצד לבנות מודלי רגרסיה. נדון במה הם מיועדים בקרוב. אבל לפני שתגשים משהו, ודא שיש לך את הכלים המתאימים להתחלת התהליך!
בשיעור הזה תלמדו:
בשיעור זה תלמד כיצד:
- להגדיר את המחשב שלכם למשימות למידת מכונה מקומיות.
- לעבוד עם מחברות Jupyter.
- להגדיר את המחשב שלך למשימות למידת מכונה מקומיות.
- לעבוד עם פנקסי Jupyter.
- להשתמש ב-Scikit-learn, כולל התקנה.
- לחקור רגרסיה ליניארית באמצעות תרגיל מעשי.
- לחקור את הרגרסיה הליניארית באמצעות תרגיל מעשי.
## התקנות והגדרות
[![ML למתחילים - הגדרת הכלים שלכם לבניית מודלים של למידת מכונה](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML למתחילים - הגדרת הכלים שלכם לבניית מודלים של למידת מכונה")
[![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) שימושיות שיכולות להקל על ההגדרה עבור חלק מהמשתמשים.
1. **התקן את פייתון**. ודא ש-[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).
עם זאת, שימושים שונים של Python דורשים גרסאות שונות של התוכנה. לכן, כדאי להשתמש בסביבת עבודה וירטואלית ([virtual environment](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.
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 באמצעות עבודה עם אוסף זה של [מודולים ללמידה](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 עם Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "הגדר Python עם Visual Studio Code")
>
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון: שימוש ב-Python בתוך VS Code.
> 🎥 לחץ על התמונה למעלה לסרטון: שימוש ב-Python בתוך VS Code.
3. **התקינו Scikit-learn**, על ידי מעקב אחר [ההוראות הללו](https://scikit-learn.org/stable/install.html). מכיוון שאתם צריכים לוודא שאתם משתמשים ב-Python 3, מומלץ להשתמש בסביבה וירטואלית. שימו לב, אם אתם מתקינים את הספרייה הזו על Mac עם M1, יש הוראות מיוחדות בעמוד המקושר למעלה.
3. **התקן את Scikit-learn**, על ידי עקיבה אחרי [הוראות אלה](https://scikit-learn.org/stable/install.html). מכיוון שעליך לוודא שאתה משתמש ב-Python 3, מומלץ שתשתמש בסביבה וירטואלית. שים לב, אם אתה מתקין את הספרייה הזו על מחשב M1 של Mac, יש הוראות מיוחדות בדף המקושר לעיל.
4. **התקינו Jupyter Notebook**. תצטרכו [להתקין את חבילת Jupyter](https://pypi.org/project/jupyter/).
1. **התקן את Jupyter Notebook**. תצטרך [להתקין את חבילת Jupyter](https://pypi.org/project/jupyter/).
## סביבת העבודה שלכם ללמידת מכונה
## סביבת הפיתוח שלך ללמידת מכונה
אתם הולכים להשתמש ב-**מחברות** כדי לפתח את קוד ה-Python שלכם וליצור מודלים של למידת מכונה. סוג קובץ זה הוא כלי נפוץ עבור מדעני נתונים, וניתן לזהות אותו לפי הסיומת `.ipynb`.
תשתמש ב-**פנקסים (notebooks)** לפיתוח קוד פייתון ולבניית מודלי למידת מכונה. קובץ מסוג זה הוא כלי נפוץ למדעני נתונים, וניתן לזהות אותם לפי הסיומת שלהם `.ipynb`.
מחברות הן סביבה אינטראקטיבית שמאפשרת למפתח גם לקודד וגם להוסיף הערות ולכתוב תיעוד סביב הקוד, מה שמאוד מועיל עבור פרויקטים ניסיוניים או מחקריים.
פנקסים הם סביבה אינטראקטיבית שמאפשרת למפתח גם לקודד וגם להוסיף הערות ולכתוב תיעוד סביב הקוד, דבר שעוזר מאוד בפרויקטים ניסיוניים או מחקריים.
[![ML למתחילים - הגדרת מחברות Jupyter כדי להתחיל לבנות מודלים של רגרסיה](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML למתחילים - הגדרת מחברות Jupyter כדי להתחיל לבנות מודלים של רגרסיה")
[![ML למתחילים - התקן פנקסי Jupyter כדי להתחיל לבנות מודלי רגרסיה](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML למתחילים - התקן פנקסי Jupyter כדי להתחיל לבנות מודלי רגרסיה")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על ביצוע התרגיל הזה.
> 🎥 לחץ על התמונה למעלה לסרטון קצר שמראה את התרגיל.
### תרגיל - עבודה עם מחברת
### תרגיל - עבודה עם פנקס
בתיקייה הזו, תמצאו את הקובץ _notebook.ipynb_.
בתיקייה זו תמצא את הקובץ _notebook.ipynb_.
1. פתחו את _notebook.ipynb_ ב-Visual Studio Code.
1. פתח את הקובץ _notebook.ipynb_ ב-Visual Studio Code.
שרת Jupyter יתחיל עם Python 3+. תמצאו אזורים במחברת שניתן `להריץ`, חלקי קוד. תוכלו להריץ בלוק קוד על ידי בחירת האייקון שנראה כמו כפתור הפעלה.
יופעל שרת Jupyter עם פייתון 3+. תמצא אזורים בפנקס שניתן `להריץ`, קטעי קוד. אתה יכול להריץ קוד על ידי בחירת האייקון שנראה כמו כפתור הפעלה.
2. בחרו את האייקון `md` והוסיפו קצת Markdown, ואת הטקסט הבא **# ברוכים הבאים למחברת שלכם**.
1. בחר באייקון `md` והוסף קצת מרקדאון, עם הטקסט הבא **# Welcome to your notebook**.
לאחר מכן, הוסיפו קצת קוד Python.
לאחר מכן, הוסף קצת קוד פייתון.
3. הקלידו **print('hello notebook')** בבלוק הקוד.
4. בחרו את החץ כדי להריץ את הקוד.
1. הקלד **print('hello notebook')** בקטע הקוד.
1. בחר בחץ כדי להריץ את הקוד.
אתם אמורים לראות את ההצהרה המודפסת:
תראה את ההצהרה המודפסת:
```output
hello notebook
```
![VS Code עם מחברת פתוחה](../../../../2-Regression/1-Tools/images/notebook.jpg)
![VS Code עם פנקס פתוח](../../../../translated_images/he/notebook.4a3ee31f396b8832.webp)
אתם יכולים לשלב את הקוד שלכם עם הערות כדי לתעד את המחברת בעצמכם.
אתה יכול לסרוג את הקוד שלך עם הערות לתיעוד פנקס עצמאי.
✅ חשבו לרגע כמה שונה סביבת העבודה של מפתחי אתרים מזו של מדעני נתונים.
✅ חשוב לרגע איך הסביבה של מפתח ווב שונה מאוד מזו של מדען נתונים.
## התחלה עם Scikit-learn
## התחלת עבודה עם Scikit-learn
עכשיו ש-Python מוגדר בסביבה המקומית שלכם, ואתם מרגישים בנוח עם מחברות Jupyter, בואו נרגיש בנוח גם עם Scikit-learn (יש להגות `sci` כמו `science`). Scikit-learn מספקת [API נרחב](https://scikit-learn.org/stable/modules/classes.html#api-ref) שיעזור לכם לבצע משימות למידת מכונה.
כעת שפייתון מוגדר במחשב המקומי שלך, ואתה רגיל עם פנקסי Jupyter, נעבור להיות נוחים גם עם Scikit-learn (מבוטא `sci` כמו במילה `science`). Scikit-learn מציעה [API נרחב](https://scikit-learn.org/stable/modules/classes.html#api-ref) כדי לעזור לך לבצע משימות ML.
לפי [האתר שלהם](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn היא ספריית למידת מכונה בקוד פתוח שתומכת בלמידה מונחית ולמידה לא מונחית. היא גם מספקת כלים שונים להתאמת מודלים, עיבוד נתונים, בחירת מודלים והערכה, ועוד הרבה כלי עזר."
בהתאם ל-[אתר שלהם](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn היא ספריית קוד פתוח ללמידת מכונה שתומכת בלמידה מפוקחת ובלמידה לא מפוקחת. היא גם מספקת כלים שונים להתאמת מודלים, טרום-עיבוד נתונים, בחירת מודלים והערכה, ורבות אחרות."
בקורס הזה, תשתמשו ב-Scikit-learn ובכלים נוספים כדי לבנות מודלים של למידת מכונה לביצוע מה שאנחנו מכנים 'למידת מכונה מסורתית'. נמנענו בכוונה מרשתות נוירונים ולמידה עמוקה, שכן הם מכוסים טוב יותר בתוכנית הלימודים שלנו 'AI למתחילים' שתצא בקרוב.
בקורס זה תשתמש ב-Scikit-learn וכלים אחרים לבניית מודלי למידת מכונה לביצוע מה שאנו קוראים 'משימות למידת מכונה מסורתיות'. הימנענו במכוון מרשתות עצביות ולמידה עמוקה, שכן הם מטופלים טוב יותר בקורס הקרוב שלנו 'AI למתחילים'.
Scikit-learn הופכת את בניית המודלים והערכתם לשימוש לפשוטה. היא מתמקדת בעיקר בשימוש בנתונים מספריים וכוללת כמה מערכי נתונים מוכנים לשימוש ככלי למידה. היא גם כוללת מודלים מוכנים לסטודנטים לנסות. בואו נחקור את תהליך טעינת הנתונים המובנים מראש ושימוש באומדן מובנה למודל למידת מכונה הראשון עם Scikit-learn באמצעות נתונים בסיסיים.
Scikit-learn מקלה על בניית מודלים והערכתם לשימוש. היא מתמקדת בעיקר בשימוש בנתונים מספריים וכוללת כמה מערכי נתונים מוכנים לשימוש ככלי למידה. היא כוללת גם מודלים מוכנים שמאפשרים לתלמידים לנסות. בוא נחקור תחילה את תהליך טעינת נתונים מוכנים לשימוש ושימוש באסטרטגיה מובנית למודל ML ראשון עם 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.
> מדריך זה הושפע מ-[דוגמת הרגרסיה הליניארית](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")
> 🎥 לחצו על התמונה למעלה לצפייה בסרטון קצר על ביצוע התרגיל הזה.
[![ML למתחילים - פרויקט הרגרסיה הליניארית הראשון שלך בפייתון](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML למתחילים - פרויקט הרגרסיה הליניארית הראשון שלך בפייתון")
בקובץ _notebook.ipynb_ המשויך לשיעור הזה, נקו את כל התאים על ידי לחיצה על אייקון 'פח האשפה'.
> 🎥 לחץ על התמונה למעלה לסרטון קצר שמראה תרגיל זה.
בקטע הזה, תעבדו עם מערך נתונים קטן על סוכרת שמובנה ב-Scikit-learn לצורכי למידה. דמיינו שאתם רוצים לבדוק טיפול עבור חולי סוכרת. מודלים של למידת מכונה עשויים לעזור לכם לקבוע אילו חולים יגיבו טוב יותר לטיפול, בהתבסס על שילובים של משתנים. אפילו מודל רגרסיה בסיסי מאוד, כאשר הוא מוצג בצורה חזותית, עשוי להראות מידע על משתנים שיעזרו לכם לארגן את הניסויים הקליניים התיאורטיים שלכם.
בקובץ _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).
- **matplotlib**. זהו [כלי גרפים](https://matplotlib.org/) שימושי ואנו נשתמש בו ליצירת גרף קווים.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) היא ספרייה שימושית לניהול נתונים מספריים בפייתון.
- **sklearn**. זו ספריית [Scikit-learn](https://scikit-learn.org/stable/user_guide.html).
ייבאו כמה ספריות שיעזרו לכם במשימות.
ייבא כמה ספריות שיעזרו במשימות שלך.
1. הוסיפו ייבוא על ידי הקלדת הקוד הבא:
1. הוסף ייבואים על ידי הקלדת הקוד הבא:
```python
import matplotlib.pyplot as plt
@ -122,26 +123,26 @@ Scikit-learn הופכת את בניית המודלים והערכתם לשימו
from sklearn import datasets, linear_model, model_selection
```
למעלה אתם מייבאים `matplotlib`, `numpy`, ואתם מייבאים `datasets`, `linear_model` ו-`model_selection` מ-`sklearn`. `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 משתנים תכונה, שחלקם כוללים:
מערך הנתונים המובנה [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) כולל 442 דגימות מידע על סוכרת, עם 10 משתני תכונות, חלקם כוללים:
- גיל: גיל בשנים
- BMI: מדד מסת גוף
- BP: לחץ דם ממוצע
- S1 TC: תאי T (סוג של תאי דם לבנים)
- bmi: מדד מסת גוף
- לחץ דם: לחץ דם ממוצע
- s1 tc: תאי T (סוג של תאי דם לבנים)
✅ מערך הנתונים הזה כולל את מושג 'מין' כמשתנה תכונה חשוב למחקר על סוכרת. מערכי נתונים רפואיים רבים כוללים סוג זה של סיווג בינארי. חשבו קצת על איך סיווגים כאלה עשויים להוציא חלקים מסוימים מהאוכלוסייה מטיפולים.
✅ מערך זה כולל את המשתנה 'מין' כמשתנה חשוב למחקר סביב סוכרת. מערכות רפואיות רבות כוללות סיווג בינארי כזה. חשוב לחשוב כיצד קטגוריזציות כאלה עשויות להוציא חלקים מסוימים של אוכלוסייה מהטיפולים.
עכשיו, טענו את נתוני X ו-y.
עכשיו, טען את הנתונים של X ו-y.
> 🎓 זכרו, זו למידה מונחית, ואנחנו צריכים מטרה בשם 'y'.
> 🎓 זכור, זו למידה מפוקחת, ונדרש משתנה מטרה מוכר בשם 'y'.
בתא קוד חדש, טענו את מערך הנתונים של סוכרת על ידי קריאה ל-`load_diabetes()`. הקלט `return_X_y=True` מסמן ש-`X` יהיה מטריצת נתונים, ו-`y` יהיה יעד הרגרסיה.
בתא קוד חדש, טען את מערך הנתונים של סוכרת על ידי קריאה ל-`load_diabetes()`. הפרמטר `return_X_y=True` מציין ש-`X` יהיה מטריצת נתונים, ו-`y` יהיה משתנה המטרה של הרגרסיה.
1. הוסיפו כמה פקודות הדפסה כדי להציג את הצורה של מטריצת הנתונים והאלמנט הראשון שלה:
1. הוסף כמה פקודות הדפסה להראות את מימדי מטריצת הנתונים ואת האלמנט הראשון שלה:
```python
X, y = datasets.load_diabetes(return_X_y=True)
@ -149,9 +150,9 @@ Scikit-learn הופכת את בניית המודלים והערכתם לשימו
print(X[0])
```
מה שאתם מקבלים בתגובה הוא טופל. מה שאתם עושים הוא להקצות את שני הערכים הראשונים של הטופל ל-`X` ו-`y` בהתאמה. למדו יותר [על טופלים](https://wikipedia.org/wiki/Tuple).
מה שמוחזר הוא זוג ערכים (tuple). אתה מקצה את שני הערכים הראשונים של הזוג ל-`X` ול-`y` בהתאמה. למד עוד על [tuples](https://wikipedia.org/wiki/Tuple).
אתם יכולים לראות שלנתונים האלה יש 442 פריטים בצורת מערכים של 10 אלמנטים:
ניתן לראות שמדובר ב-442 פריטים במערכי 10 אלמנטים:
```text
(442, 10)
@ -159,39 +160,39 @@ Scikit-learn הופכת את בניית המודלים והערכתם לשימו
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ חשבו קצת על הקשר בין הנתונים ליעד הרגרסיה. רגרסיה ליניארית חוזה קשרים בין תכונה X למשתנה יעד y. האם תוכלו למצוא את [היעד](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) עבור מערך הנתונים של סוכרת בתיעוד? מה מערך הנתונים הזה מדגים, בהתחשב ביעד?
✅ חשוב לחשוב על הקשר בין הנתונים למשתנה המטרה ברגרסיה. הרגרסיה הליניארית מנבאת קשרים בין תכונת X למשתנה המטרה y. האם תוכל למצוא את [המטרה](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) של מערך הסוכרת בתיעוד? מה מערך הנתונים מדגים, בהתחשב במטרה זו?
2. לאחר מכן, בחרו חלק ממערך הנתונים הזה כדי לשרטט על ידי בחירת העמודה השלישית של מערך הנתונים. תוכלו לעשות זאת על ידי שימוש באופרטור `:` כדי לבחור את כל השורות, ואז לבחור את העמודה השלישית באמצעות האינדקס (2). תוכלו גם לשנות את צורת הנתונים להיות מערך דו-ממדי - כפי שנדרש לשרטוט - על ידי שימוש ב-`reshape(n_rows, n_columns)`. אם אחד הפרמטרים הוא -1, הממד המתאים מחושב אוטומטית.
2. עכשיו בחר חלק ממערך הנתונים לציור על ידי בחירת העמודה השלישית. ניתן לעשות זאת באמצעות האופרטור `:` לבחירת כל השורות, ואז בחירת העמודה השלישית באמצעות האינדקס (2). אפשר גם לעצב את הנתונים כמערך דו-ממדי - כנדרש לציור - באמצעות `reshape(n_rows, n_columns)`. אם אחד הפרמטרים הוא -1, המימד המקביל מחושב אוטומטית.
```python
X = X[:, 2]
X = X.reshape((-1,1))
```
✅ בכל זמן, הדפיסו את הנתונים כדי לבדוק את צורתם.
✅ בכל עת, הדפס את הנתונים כדי לבדוק את צורתם.
3. עכשיו כשיש לכם נתונים מוכנים לשרטוט, תוכלו לראות אם מכונה יכולה לעזור לקבוע חלוקה הגיונית בין המספרים במערך הנתונים הזה. כדי לעשות זאת, עליכם לפצל גם את הנתונים (X) וגם את היעד (y) לסטי בדיקה ואימון. ל-Scikit-learn יש דרך פשוטה לעשות זאת; תוכלו לפצל את נתוני הבדיקה שלכם בנקודה נתונה.
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()`:
4. עכשיו אתה מוכן לאמן את המודל שלך! טען את מודל הרגרסיה הליניארית ואמן אותו עם קבוצות האימון X ו-y באמצעות `model.fit()`:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` היא פונקציה שתראו בהרבה ספריות למידת מכונה כמו TensorFlow.
`model.fit()` היא פונקציה שתראה בהרבה ספריות ML כגון TensorFlow
5. לאחר מכן, צרו תחזית באמצעות נתוני הבדיקה, באמצעות הפונקציה `predict()`. זה ישמש לציור הקו בין קבוצות הנתונים של המודל.
5. לאחר מכן, צור חיזוי באמצעות נתוני הבדיקה, באמצעות הפונקציה `predict()`. היא תשמש לשרטוט קו בין קבוצות הנתונים.
```python
y_pred = model.predict(X_test)
```
6. עכשיו הגיע הזמן להציג את הנתונים בגרף. Matplotlib הוא כלי מאוד שימושי למשימה הזו. צרו גרף פיזור של כל נתוני הבדיקה של X ו-y, והשתמשו בתחזית כדי לצייר קו במקום המתאים ביותר, בין קבוצות הנתונים של המודל.
6. עכשיו הזמן להציג את הנתונים בגרף. Matplotlib הוא כלי מאוד שימושי למשימה זו. צור גרף פיזור של כל נתוני הבדיקה X ו-y, והשתמש בחיזוי כדי לשרטט קו במקום המתאים ביותר, בין קבוצות הנתונים של המודל.
```python
plt.scatter(X_test, y_test, color='black')
@ -202,29 +203,32 @@ Scikit-learn הופכת את בניית המודלים והערכתם לשימו
plt.show()
```
![גרף פיזור שמציג נקודות נתונים סביב סוכרת](../../../../2-Regression/1-Tools/images/scatterplot.png)
✅ תחשבו קצת על מה שקורה כאן. קו ישר עובר דרך הרבה נקודות קטנות של נתונים, אבל מה הוא עושה בדיוק? האם אתם יכולים לראות איך אפשר להשתמש בקו הזה כדי לחזות איפה נקודת נתונים חדשה ולא מוכרת צריכה להתאים ביחס לציר ה-y של הגרף? נסו לנסח במילים את השימוש המעשי של המודל הזה.
![גרף פיזור המציג נקודות מידע סביב סוכרת](../../../../translated_images/he/scatterplot.ad8b356bcbb33be6.webp)
מזל טוב, יצרתם את מודל הרגרסיה הליניארית הראשון שלכם, ביצעתם תחזית באמצעותו, והצגתם אותה בגרף!
✅ חשוב קצת על מה שקורה כאן. קו ישר עובר דרך נקודות נתונים קטנות רבות, אבל מה הוא בעצם עושה? האם אתה רואה כיצד אתה אמור להיות מסוגל להשתמש בקו הזה כדי לחזות היכן נקודת נתונים חדשה ובלתי נראית צריכה להתאים ביחס לציר ה- y של הגרף? נסה לנסח במילים את השימוש המעשי במודל זה.
מזל טוב, בנית את מודל הרגרסיה הליניארית הראשון שלך, יצרת באמצעותו תחזית והצגת אותה בגרף!
---
## 🚀אתגר
צרו גרף עבור משתנה אחר מתוך מערך הנתונים הזה. רמז: ערכו את השורה הזו: `X = X[:,2]`. בהתחשב במטרת מערך הנתונים הזה, מה אתם יכולים לגלות על התקדמות מחלת הסוכרת?
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
הצג משתנה שונה ממערכת הנתונים הזו. רמז: ערוך את השורה הזו: `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://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) כדי להעמיק את ההבנה שלכם.
קרא עוד על מושג הרגרסיה וחשוב על אילו סוגי שאלות ניתן לענות באמצעות טכניקה זו. עשה את [המדריך הזה](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) כדי להעמיק את הבנתך.
## משימה
[מערך נתונים אחר](assignment.md)
[מערכת נתונים שונה](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,60 +1,60 @@
# בניית מודל רגרסיה באמצעות Scikit-learn: הכנת ויזואליזציה של נתונים
# לבנות מודל רגרסיה באמצעות Scikit-learn: להכין ול визуализировать נתונים
![אינפוגרפיקה של ויזואליזציה של נתונים](../../../../2-Regression/2-Data/images/data-visualization.png)
![אינפוגרפיקה של ויזואליזציית נתונים](../../../../translated_images/he/data-visualization.54e56dded7c1a804.webp)
אינפוגרפיקה מאת [Dasani Madipalli](https://twitter.com/dasani_decoded)
אינפוגרפיקה מאת [דאסאני מדיפאלי](https://twitter.com/dasani_decoded)
## [שאלון לפני השיעור](https://ff-quizzes.netlify.app/en/ml/)
## [חידון מקדים להרצאה](https://ff-quizzes.netlify.app/en/ml/)
> ### [השיעור הזה זמין גם ב-R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
> ### [שיעור זה זמין גם ב-R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
## מבוא
עכשיו, כשיש לך את הכלים הדרושים כדי להתחיל לבנות מודלים של למידת מכונה באמצעות Scikit-learn, אתה מוכן להתחיל לשאול שאלות על הנתונים שלך. כשאתה עובד עם נתונים ומיישם פתרונות ML, חשוב מאוד להבין איך לשאול את השאלה הנכונה כדי למצות את הפוטנציאל של מערך הנתונים שלך.
עכשיו כשאתה מוכן עם הכלים שאתה צריך כדי להתחיל להתמודד עם בניית מודל למידת מכונה עם Scikit-learn, אתה מוכן להתחיל לשאול שאלות לגבי הנתונים שלך. כשהינך עובד עם נתונים ומיישם פתרונות למידת מכונה, חשוב מאוד להבין איך לשאול את השאלה הנכונה כדי לפתוח כראוי את הפוטנציאל של קבוצת הנתונים שלך.
בשיעור זה תלמד:
- איך להכין את הנתונים שלך לבניית מודלים.
- איך להשתמש ב-Matplotlib לויזואליזציה של נתונים.
- איך להכין את הנתונים שלך לבניית מודל.
- איך להשתמש ב-Matplotlib לוויזואליזציית נתונים.
- איך להשתמש ב-Seaborn לוויזואליזציית נתונים יותר הבעה.
## לשאול את השאלה הנכונה על הנתונים שלך
## לשאול את השאלה הנכונה בנוגע לנתונים שלך
השאלה שאתה רוצה לענות עליה תקבע איזה סוג של אלגוריתמים ML תשתמש. איכות התשובה שתקבל תהיה תלויה מאוד באופי הנתונים שלך.
השאלה שאתה צריך לקבל עליה תשובה תכתיב איזה סוג של אלגוריתמי למידת מכונה תשתמש. ואיכות התשובה שתקבל תלויה במידה רבה בטבע הנתונים שלך.
תסתכל על [הנתונים](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) שסופקו לשיעור הזה. אתה יכול לפתוח את קובץ ה-.csv הזה ב-VS Code. מבט מהיר מראה מיד שיש בו ערכים חסרים ותערובת של נתונים טקסטואליים ומספריים. יש גם עמודה מוזרה בשם 'Package' שבה הנתונים הם תערובת של 'sacks', 'bins' וערכים אחרים. למעשה, הנתונים די מבולגנים.
עיין ב-[הנתונים](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) שסופקו לשיעור זה. תוכל לפתוח את קובץ ה-.csv הזה ב-VS Code. מבט מהיר מראה מיד שיש רווחים וערבוב של מחרוזות ונתונים מספריים. יש גם עמודה מוזרה שנקראת 'Package' שבה הנתונים הם תערובת בין 'שקים', 'מכלים' וערכים אחרים. הנתונים, למעשה, מעט מבולגנים.
[![ML למתחילים - איך לנתח ולנקות מערך נתונים](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML למתחילים - איך לנתח ולנקות מערך נתונים")
[![למידת מכונה למתחילים - איך לנתח ולנקות קבוצת נתונים](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "למידת מכונה למתחילים - איך לנתח ולנקות קבוצת נתונים")
> 🎥 לחץ על התמונה למעלה לצפייה בסרטון קצר שמסביר איך להכין את הנתונים לשיעור הזה.
> 🎥 לחץ על התמונה למעלה לסרטון קצר שעובר על הכנת הנתונים לשיעור זה.
למעשה, זה לא מאוד נפוץ לקבל מערך נתונים שמוכן לחלוטין לשימוש ליצירת מודל 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) שמופצים על ידי משרד החקלאות של ארצות הברית.
בתיקיה זו תמצא קובץ .csv בתיקיה ראשית `data` בשם [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) הכולל 1757 שורות של נתונים על שוק הדלעות, מסווג לפי קבוצות לפי עיר. אלה נתונים גולמיים שהופקו מדוחות סטנדרטיים של שוקי המסחרי ייחודיים [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) שמופצים על ידי משרד החקלאות של ארצות הברית.
### הכנת נתונים
### הכנת הנתונים
הנתונים האלה הם נחלת הכלל. ניתן להוריד אותם בקבצים נפרדים רבים, לפי עיר, מאתר ה-USDA. כדי להימנע ממספר רב של קבצים נפרדים, איחדנו את כל נתוני הערים לגיליון אלקטרוני אחד, כך שכבר _הכנו_ את הנתונים מעט. עכשיו, בואו נסתכל מקרוב על הנתונים.
נתונים אלה הם ברשות הציבור. ניתן להורידם בקבצים נפרדים רבים, לכל עיר בנפרד, מאתר USDA. כדי למנוע יותר מדי קבצים נפרדים, איחדנו את כל הנתונים של הערים לטבלת נתונים אחת, כך שכבר הכנו קצת את הנתונים. לאחר מכן, נבחן את הנתונים מקרוב.
### נתוני הדלעות - מסקנות ראשוניות
### נתוני הדלעות - מסקנות מוקדמות
מה אתה שם לב לגבי הנתונים האלה? כבר ראית שיש תערובת של טקסטים, מספרים, ערכים חסרים וערכים מוזרים שצריך להבין.
מה אתה מבחין בנתונים האלה? כבר ראית שיש תערובת של מחרוזות, מספרים, חללים וערכים מוזרים שצריך להבין אותם.
איזו שאלה אפשר לשאול על הנתונים האלה, באמצעות טכניקת רגרסיה? מה דעתך על "לחזות את המחיר של דלעת למכירה במהלך חודש נתון". מבט נוסף על הנתונים מראה שיש כמה שינויים שצריך לעשות כדי ליצור את מבנה הנתונים הדרוש למשימה.
איזו שאלה אפשר לשאול את הנתונים האלה, באמצעות טכניקת רגרסיה? מה דעתך על "לחזות את מחיר דלעת למכירה בחודש מסוים". כשאתה מסתכל שוב על הנתונים, יש כמה שינויים שצריך לבצע כדי ליצור מבנה נתונים הנדרש למשימה.
## תרגיל - ניתוח נתוני דלעות
## תרגיל - ניתוח נתוני הדלעות
נשתמש ב-[Pandas](https://pandas.pydata.org/), (שמתייחס ל-'Python Data Analysis'), כלי מאוד שימושי לעיצוב נתונים, כדי לנתח ולהכין את נתוני הדלעות הללו.
בואו נשתמש ב-[Pandas](https://pandas.pydata.org/) (השם הוא קיצור של `Python Data Analysis`), כלי מאוד שימושי לעיצוב נתונים, כדי לנתח ולהכין את נתוני הדלעות.
### תחילה, בדוק אם חסרים תאריכים
### קודם כל, בדוק אם יש תאריכים חסרים
תחילה תצטרך לנקוט צעדים כדי לבדוק תאריכים חסרים:
קודם כל תצטרך לנקוט צעדים כדי לבדוק אם יש תאריכים חסרים:
1. המר את התאריכים לפורמט חודש (מדובר בתאריכים אמריקאיים, אז הפורמט הוא `MM/DD/YYYY`).
2. הפק את החודש לעמודה חדשה.
1. המרה של התאריכים לפורמט חודשי (אלו תאריכים אמריקאים, כך שהפורמט הוא `MM/DD/YYYY`).
2. חילוץ החודש לעמודה חדשה.
פתח את הקובץ _notebook.ipynb_ ב-Visual Studio Code וייבא את הגיליון האלקטרוני ל-DataFrame חדש של Pandas.
פתח את קובץ _notebook.ipynb_ ב-Visual Studio Code וייבא את הגיליון הנתונים למערך נתונים חדש של Pandas.
1. השתמש בפונקציה `head()` כדי לצפות בחמש השורות הראשונות.
@ -64,28 +64,28 @@
pumpkins.head()
```
באיזו פונקציה היית משתמש כדי לצפות בחמש השורות האחרונות?
איזו פונקציה תשתמש כדי לראות את חמש השורות האחרונות?
1. בדוק אם יש נתונים חסרים ב-DataFrame הנוכחי:
1. בדוק אם יש נתונים חסרים במערך הנתונים הנוכחי:
```python
pumpkins.isnull().sum()
```
יש נתונים חסרים, אבל אולי זה לא משנה למשימה הנוכחית.
ישנם נתונים חסרים, אך אולי זה לא יהיה משמעותי למשימה הנוכחית.
1. כדי להפוך את ה-DataFrame שלך לקל יותר לעבודה, בחר רק את העמודות שאתה צריך, באמצעות פונקציית `loc` שמחלצת מה-DataFrame המקורי קבוצת שורות (שנמסרות כפרמטר ראשון) ועמודות (שנמסרות כפרמטר שני). הביטוי `:` במקרה הזה אומר "כל השורות".
1. כדי להקל על העבודה עם מערך הנתונים שלך, בחר רק את העמודות שאתה צריך, באמצעות הפונקציה `loc` שמחלצת מהמערך המקורי קבוצה של שורות (כפרמטר ראשון) ועמודות (כפרמטר שני). הביטוי `:` במקרה זה אומר "כל השורות".
```python
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.loc[:, columns_to_select]
```
### שנית, קבע את המחיר הממוצע של דלעת
### שנית, חשב את מחיר הדלעת הממוצע
חשוב איך לקבוע את המחיר הממוצע של דלעת בחודש נתון. אילו עמודות היית בוחר למשימה הזו? רמז: תצטרך 3 עמודות.
חשוב כיצד לחשב את המחיר הממוצע לדלעת בחודש מסוים. אילו עמודות תבחר למשימה זו? רמז: תצטרך 3 עמודות.
פתרון: קח את הממוצע של העמודות `Low Price` ו-`High Price` כדי למלא את עמודת המחיר החדשה, והמר את עמודת התאריך כך שתציג רק את החודש. למרבה המזל, לפי הבדיקה לעיל, אין נתונים חסרים עבור תאריכים או מחירים.
פתרון: קח את הממוצע של עמודות `Low Price` ו-`High Price` כדי למלא את עמודת המחיר החדשה, והמר את עמודת התאריך כך שתציג רק את החודש. למזלינו, לפי הבדיקה הנ"ל, אין נתונים חסרים לגבי תאריכים או מחירים.
1. כדי לחשב את הממוצע, הוסף את הקוד הבא:
@ -96,37 +96,37 @@
```
אתה מוזמן להדפיס כל נתון שתרצה לבדוק באמצעות `print(month)`.
ניתן להדפיס כל נתון שברצונך לבדוק באמצעות `print(month)`.
2. עכשיו, העתק את הנתונים שהומרו ל-DataFrame חדש של Pandas:
2. עכשיו, העתק את הנתונים שהומרו למערך נתונים חדש של 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', חלקן לפי דלעת, חלקן לפי פאונד, וחלקן בקופסאות גדולות עם רוחבים משתנים.
אם תסתכל על עמודת `Package`, דלעות נמכרות בהרכב שונה במידה רבה. חלק נמכרו במידות '1 1/9 בושהל'ות', וחלק במידות '1/2 בושהל'ות', חלק לדלעת בודדת, חלק לפי פאונד, וחלק בקופסאות גדולות ברוחבים משתנים.
> נראה שדלעות מאוד קשה לשקול באופן עקבי
> נראה כי דלעות מאוד קשות לשקילה בעקביות
כשחוקרים את הנתונים המקוריים, מעניין שכל דבר עם `Unit of Sale` השווה ל-'EACH' או 'PER BIN' גם יש לו סוג `Package` לפי אינץ', לפי bin, או 'each'. נראה שדלעות מאוד קשה לשקול באופן עקבי, אז בואו נסנן אותן על ידי בחירת דלעות בלבד עם המחרוזת 'bushel' בעמודת `Package`.
בחינה מעמיקה של הנתונים המקוריים, מעניין שכל דבר עם `Unit of Sale` שווה ל-'EACH' או 'PER BIN' יש גם את סוג ה-`Package` לפי אינץ', לפי מכל, או 'לכל אחד'. נראה כי דלעות קשות מאוד לשקילה בעקביות, אז נסנן אותן על ידי בחירת רק דלעות שמכילות את המחרוזת 'bushel' בעמודת ה-`Package` שלהן.
1. הוסף מסנן בראש הקובץ, מתחת לייבוא הראשוני של ה-.csv:
1. הוסף פילטר בראש הקובץ, מתחת לייבוא ה-.csv ההתחלתי:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
אם תדפיס את הנתונים עכשיו, תוכל לראות שאתה מקבל רק את 415 השורות בערך שמכילות דלעות לפי bushel.
אם תדפיס את הנתונים עכשיו, תוכל לראות שאתה מקבל רק את כ-415 השורות של נתוני דלעות לפי בושהל.
### אבל רגע! יש עוד משהו שצריך לעשות
### אבל חכה! יש עוד משהו שצריך לעשות
שמת לב שהכמות של bushel משתנה לפי שורה? אתה צריך לנרמל את התמחור כך שתראה את התמחור לפי bushel, אז תעשה קצת חישובים כדי לסטנדרט אותו.
האם שמת לב שכמות הבושהל משתנה בין שורה לשורה? אתה צריך לנרמל את התמחור כך שתראה את המחירים לפי בושהל, אז בצע כמה חישובים כדי לאחד את זה.
1. הוסף את השורות האלה אחרי הבלוק שיוצר את ה-DataFrame החדש של הדלעות:
1. הוסף את השורות האלה אחרי בלוק יצירת מערך הנתונים new_pumpkins:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
@ -134,38 +134,38 @@
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 של דלעות, עם זאת, מראה כמה חשוב להבין את אופי הנתונים שלך!
✅ לפי [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), משקל הבושהל תלוי בסוג התוצרת, מאחר שזהו מדד נפח. "בושהל של עגבניות, למשל, אמור לשקול 56 פאונד... עלים וירקות תופסים יותר נפח עם פחות משקל, אז בושהל של תרד שוקל רק 20 פאונד." זה די מסובך! לא נטריד את עצמנו בהמרת בושהל לפאונד, במקום זאת נמחיר לפי בושהל. כל הלימוד הזה של בושהלים של דלעות מראה כמה חשוב להבין את טבע הנתונים שלך!
עכשיו, אתה יכול לנתח את התמחור ליחידה בהתבסס על מדידת ה-bushel שלהם. אם תדפיס את הנתונים פעם נוספת, תוכל לראות איך הם סטנדרטיים.
עכשיו, תוכל לנתח את התמחור ליחידה בהתבסס על מדידת הבושהל שלהם. אם תדפיס את הנתונים פעם נוספת, ניתן לראות כיצד זה מנורמל.
שמת לב שדלעות שנמכרות לפי חצי bushel הן מאוד יקרות? האם תוכל להבין למה? רמז: דלעות קטנות יקרות הרבה יותר מדלעות גדולות, כנראה בגלל שיש הרבה יותר מהן בכל bushel, בהתחשב במקום הלא מנוצל שנלקח על ידי דלעת פאי גדולה וחלולה אחת.
האם שמת לב שדלעות שנמכרות בחצי בושהל יקרות מאוד? תוכל להבין למה? רמז: דלעות קטנות הרבה יותר יקרות מדלעות גדולות, כנראה בגלל שיש הרבה יותר מהן בבושהל, בהתחשב במקום הלא מנוצל שמכילה דלעת עוגה גדולה ומחוררת אחת.
## אסטרטגיות ויזואליזציה
חלק מתפקידו של מדען הנתונים הוא להציג את האיכות והאופי של הנתונים שהוא עובד איתם. לשם כך, הם לעיתים קרובות יוצרים ויזואליזציות מעניינות, כמו גרפים, תרשימים ומפות, שמציגים היבטים שונים של הנתונים. בדרך זו, הם יכולים להראות באופן חזותי קשרים ופערים שקשה לחשוף בדרך אחרת.
חלק מתפקיד מדען הנתונים הוא להמחיש את איכות וטבע הנתונים שהם עובדים איתם. לשם כך, הם לעיתים יוצרים ויזואליזציות מעניינות, תרשימים, גרפים וטבלאות, המראים היבטים שונים של הנתונים. כך הם יכולים להראות בצורה ויזואלית קשרים ופערים שקשה לגלות בדרך אחרת.
[![ML למתחילים - איך לויזואליזציה של נתונים עם Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML למתחילים - איך לויזואליזציה של נתונים עם Matplotlib")
[![למידת מכונה למתחילים - איך להמחיש נתונים עם Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "למידת מכונה למתחילים - איך להמחיש נתונים עם Matplotlib")
> 🎥 לחץ על התמונה למעלה לצפייה בסרטון קצר שמסביר איך לויזואליזציה של הנתונים לשיעור הזה.
> 🎥 לחץ על התמונה למעלה לסרטון קצר שעובר על ויזואליזציית הנתונים לשיעור זה.
ויזואליזציות יכולות גם לעזור לקבוע את טכניקת הלמידת מכונה המתאימה ביותר לנתונים. למשל, תרשים פיזור שנראה כמו קו יכול להצביע על כך שהנתונים מתאימים לתרגיל רגרסיה ליניארית.
ויזואליזציות יכולות גם לעזור לקבוע את טכניקת למידת המכונה המתאימה ביותר לנתונים. תרשים פיזור שנראה עוקב אחר קו, למשל, מצביע שהנתונים הם מועמדים טובים לתרגיל רגרסיה ליניארית.
אחת מספריות הויזואליזציה שעובדות היטב במחברות Jupyter היא [Matplotlib](https://matplotlib.org/) (שגם ראית בשיעור הקודם).
ספריית ויזואליזציית נתונים אחת שעובדת טוב במחברות Jupyter היא [Matplotlib](https://matplotlib.org/) (שכבר ראית בשיעור הקודם).
> קבל עוד ניסיון עם ויזואליזציה של נתונים ב-[המדריכים האלה](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
> השג יותר ניסיון בוויזואליזציות נתונים ב-[המדריכים האלה](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
## תרגיל - להתנסות עם Matplotlib
## תרגיל - התנסה ב-Matplotlib
נסה ליצור כמה גרפים בסיסיים כדי להציג את ה-DataFrame החדש שיצרת. מה יראה גרף קו בסיסי?
נסה ליצור כמה תרשימים בסיסיים כדי להציג את מערך הנתונים החדש שיצרת זה עתה. מה תרשים קו בסיסי יציג?
1. ייבא את Matplotlib בראש הקובץ, מתחת לייבוא של Pandas:
1. ייבא את Matplotlib בראש הקובץ, מתחת לייבוא Pandas:
```python
import matplotlib.pyplot as plt
```
1. הרץ מחדש את כל המחברת כדי לרענן.
1. בתחתית המחברת, הוסף תא כדי לשרטט את הנתונים כקופסה:
1. הרץ מחדש את כל המחברת לרענון.
1. בתחתית המחברת, הוסף תא כדי לצייר את הנתונים כ-box plot:
```python
price = new_pumpkins.Price
@ -174,15 +174,15 @@
plt.show()
```
![תרשים פיזור שמראה את הקשר בין מחיר לחודש](../../../../2-Regression/2-Data/images/scatterplot.png)
![תרשים פיזור המציג קשר בין מחיר לחודש](../../../../translated_images/he/scatterplot.b6868f44cbd2051c.webp)
האם זה גרף שימושי? האם משהו בו מפתיע אותך?
האם תרשים זה שימושי? האם משהו בו מפתיע אותך?
זה לא מאוד שימושי מכיוון שכל מה שהוא עושה זה להציג את הנתונים שלך כפריסה של נקודות בחודש נתון.
זה אינו שימושי במיוחד כי כל מה שהוא עושה הוא להציג את הנתונים שלך כהתפרסות נקודות בחודש נתון.
### להפוך את זה לשימושי
### להפוך אותו לשימושי
כדי לקבל גרפים שמציגים נתונים שימושיים, בדרך כלל צריך לקבץ את הנתונים בצורה כלשהי. בואו ננסה ליצור גרף שבו ציר ה-y מציג את החודשים והנתונים מדגימים את התפלגות הנתונים.
כדי שתרשימים יציגו נתונים שימושיים, בדרך כלל צריך לקבץ את הנתונים בצורה מסוימת. בוא ננסה ליצור תרשים שבו ציר ה-y מראה את החודשים והנתונים מראים את התפלגות הנתונים.
1. הוסף תא ליצירת תרשים עמודות מקובץ:
@ -191,21 +191,96 @@
plt.ylabel("Pumpkin Price")
```
![תרשים עמודות שמראה את הקשר בין מחיר לחודש](../../../../2-Regression/2-Data/images/barchart.png)
![תרשים עמודות המראה קשר בין מחיר לחודש](../../../../translated_images/he/barchart.a833ea9194346d76.webp)
זו ויזואליזציית נתונים שימושית יותר! נראה שהיא מצביעה שהמחיר הכי גבוה לדלעות הוא בספטמבר ואוקטובר. האם זה עונה על הציפייה שלך? למה או למה לא?
## תרגיל - התנסה ב-Seaborn
Matplotlib עוצמתי, אבל לפעמים נדרש הרבה קוד כדי ליצור תרשים מחודד. [Seaborn](https://seaborn.pydata.org/) היא ספרייה שבנויה _על גבי_ Matplotlib שמיועדת לוויזואליזציית נתונים סטטיסטית. היא עובדת ישירות עם מערכי הנתונים של Pandas, מיישמת סגנונות ברירת מחדל מושכים, ומאפשרת ליצור תרשימים אינפורמטיביים בפחות קוד. מכיוון ש-Seaborn מחזירה אובייקטים של Matplotlib, עדיין אפשר להשתמש בכל מה שכבר יודעים על Matplotlib כדי לכוונן את התוצאה.
> אם עדיין לא התקנת את Seaborn, התקן אותה באמצעות `pip install seaborn`.
1. ייבא את Seaborn בראש המחברת, מתחת ליבואים האחרים. נהוג לייבא אותה כ-`sns`:
```python
import seaborn as sns
```
### תרשימי פיזור להראות קשרים
חלק גדול מחקר הנתונים לפני בניית מודל הוא חיפוש _קשרים_ בין משתנים. [תרשים פיזור](https://en.wikipedia.org/wiki/Scatter_plot) הוא אחד הכלים הטובים לכך: אם הנקודות נראות מעקבות אחר קו, שני המשתנים עשויים להיות מתואמים, וזה סימן טוב שמודל רגרסיה ליניארית יכול לעבוד.
1. צור מחדש את תרשים פיזור המחיר-לחודש מהפעם הקודמת, הפעם באמצעות [`relplot()`](https://seaborn.pydata.org/generated/seaborn.relplot.html) של Seaborn (תרשים יחסי), שעובד ישירות עם עמודות מערך הנתונים שלך:
```python
sns.relplot(x="Price", y="Month", data=new_pumpkins)
```
![תרשים פיזור Seaborn המראה קשר בין מחיר לחודש](../../../../translated_images/he/relplot.a03837d8f0329cec.webp)
שים לב כיצד מעבירים את _שמות העמודות_ ואת מערך הנתונים, ו-Seaborn מטפל בתוויות הצירים בשבילך.
2. אפשר לעבור לתרשים קו על ידי העברת `kind="line"`. Seaborn אפילו מציירת רצועה מוצללת שמציגה את תחום האמון סביב הקו:
```python
sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins)
```
![תרשים קו Seaborn המראה קשר בין מחיר לחודש](../../../../translated_images/he/lineplot.f9034ba47b1e30ee.webp)
הנתונים הספציפיים האלה די רעשניים, אז תרשים קו לא הבחירה הברורה ביותר כאן — אבל הוא מראה כמה קל לשנות סוגי תרשימים ב-Seaborn.
### תרשימי עמודות להראות התפלגויות
קודם סידרת את הנתונים בעצמך כדי ליצור תרשים עמודות עם Matplotlib. הפונקציה [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html) (תרשים קטגורי) של Seaborn יכולה לבצע את הסידור והאגרגציה עבורך. כבררת מחדל `kind="bar"` מציגה את הממוצע של כל קטגוריה יחד עם קו שחור המציין את מרווח האמון.
1. צור תרשים עמודות של מחיר ממוצע לכל חודש:
```python
sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar")
```
![תרשים עמודות של Seaborn המציג את התפלגות המחירים לפי חודש](../../../../translated_images/he/catplot.e73fc35fdf96242b.webp)
זה מאשר את מה שראית עם Matplotlib — המחירים בשיא סביב ספטמבר ואוקטובר — אך Seaborn גם ממחיש כמה המחיר _משתנה_ בתוך כל חודש.
### מפות חום להראות קורלציות
תרשימי פיזור משווים שני משתנים בכל פעם. כשיש לך כמה עמודות מספריות, [מפת חום](https://en.wikipedia.org/wiki/Heat_map) מאפשרת לך לראות את עוצמת הקשר בין _כל_ זוג עמודות בבת אחת. זהו דרך נפוצה לזהות אילו תכונות קשורות ביותר לפני שבוחרים מה להכניס למודל (ואותו סוג תרשים משמש לאחר מכן להצגת מטריצות בילבול במיון).
1. בנה מטריצת קורלציה עם Pandas, ואז צייר אותה עם [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html) של Seaborn. האפשרות `annot=True` מדפיסה את ערכי הקורלציה בכל תא:
```python
correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()
sns.heatmap(correlations, annot=True, cmap="coolwarm")
```
![מפת חום של Seaborn המציגה קורלציות בין העמודות המספריות](../../../../translated_images/he/heatmap.bd98dce43b404c57.webp)
ערכים הקרובים ל-`1` (או `-1`) מצביעים על כך שהעמודות קשורות _בקו ישר_ בצורה חזקה. שים לב כיצד `Low Price` ו-`High Price` כמעט מושלמות בקורלציה ביניהן. מצד שני, `Month` מציגה קורלציה ליניארית חלשה למחיר — למרות שתרשים העמודות לעיל חשף שיא עונתי ברור בספטמבר ואוקטובר. זו מוסכמה חשובה: מקדם הקורלציה מודד רק קשרים _בקו ישר_, ולכן הוא עלול לפספס תבניות עונתיות או לא ליניאריות. ✅ מדוע כדאי להסתכל הן על מפת חום *והן* על תרשימים כמו תרשים העמודות לפני שקובעים אילו עמודות להשתמש בהם?
### Matplotlib או Seaborn?
שתי הספריות שכדאי להכיר:
- **Matplotlib** נותנת לך שליטה מדויקת על כל אלמנט בתרשים והיא הבסיס שעליו כמעט כל ספריית דיווח בפייתון מבוססת.
- **Seaborn** מספקת פונקציות ברמת אבחנה גבוהה יותר וערכות ברירת מחדל אטרקטיביות לתרשימים סטטיסטיים, עובדת ישירות עם dataframes, ולעיתים מהירה יותר לניתוח נתונים חקרני.
זהו ויזואליזציה נתונים שימושית יותר! נראה שהיא מצביעה על כך שהמחיר הגבוה ביותר לדלעות מתרחש בספטמבר ובאוקטובר. האם זה תואם את הציפיות שלך? למה או למה לא?
זרימת עבודה נפוצה היא להשתמש ב-Seaborn כדי לחקור את הנתונים במהירות, ואז לעבור ל-Matplotlib כשצריך להתאים את הפרטים.
---
## 🚀אתגר
חקור את סוגי הויזואליזציה השונים ש-Matplotlib מציעה. אילו סוגים הם המתאימים ביותר לבעיות רגרסיה?
חקור את סוגי הויזואליזציה השונים ש-Matplotlib ו-Seaborn מציעים. אילו סוגים מתאימים ביותר לבעיות רגרסיה?
## [שאלון אחרי השיעור](https://ff-quizzes.netlify.app/en/ml/)
## [חידון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## סקירה ולימוד עצמי
תסתכל על הדרכים הרבות לויזואליזציה של נתונים. צור רשימה של הספריות השונות הזמינות וציין אילו מהן מתאימות לסוגי משימות מסוימים, למשל ויזואליזציות דו-ממדיות לעומת תלת-ממדיות. מה אתה מגלה?
עיין בדרכים הרבות להמחיש נתונים. ערוך רשימה של ספריות שונות הזמינות וציין אילו טובות למשימות שונות, למשל ויזואליזציות דו-ממדיות לעומת תלת-ממדיות. מה גילית?
## משימה
@ -213,5 +288,7 @@
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -4,7 +4,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## רגרסיה לינארית לדלעות - שיעור 2\n"
"## רגרסיה ליניארית לדליים - שיעור 2\n"
]
},
{
@ -222,6 +222,7 @@
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
"\n",
"pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
@ -385,18 +386,78 @@
"plt.ylabel(\"Pumpkin Price\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ויזואליזציה עם Seaborn\n",
"\n",
"[Seaborn](https://seaborn.pydata.org/) מבוסס על Matplotlib ופועל ישירות עם dataframes, מה שמאפשר ליצור במהירות גרפים סטטיסטיים אסתטיים עם מעט מאוד קוד.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### תרשימי פיזור להצגת קשרים\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.relplot(x=\"Price\", y=\"Month\", data=new_pumpkins)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.relplot(x=\"Price\", y=\"Month\", kind=\"line\", data=new_pumpkins)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### תרשימי עמודות להצגת התפלגויות\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### מפות חום להצגת מתאמים\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
"source": [
"correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()\n",
"sns.heatmap(correlations, annot=True, cmap=\"coolwarm\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**כתב ויתור**: \nמסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). בעוד שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.\n"
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**כתב ויתור**:\nמסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
@ -426,13 +487,7 @@
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "95726f0b8283628d5356a4f8eb8b4b76",
"translation_date": "2025-09-04T07:11:32+00:00",
"source_file": "2-Regression/2-Data/solution/notebook.ipynb",
"language_code": "he"
}
"orig_nbformat": 2
},
"nbformat": 4,
"nbformat_minor": 2

@ -1,47 +1,47 @@
# מבוא ללמידת חיזוק ולמידת Q
# מבוא ללמידת חיזוק ו-Q-Learning
![סיכום למידת חיזוק בלמידת מכונה בסקצ'נוט](../../../../sketchnotes/ml-reinforcement.png)
> סקצ'נוט מאת [Tomomi Imura](https://www.twitter.com/girlie_mac)
![סיכום של למידת חיזוק בלמידת מכונה בבישול](../../../../translated_images/he/ml-reinforcement.94024374d63348db.webp)
> בישול של [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/)
## [בחן טרם ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## דרישות מוקדמות והגדרות
## תנאים מוקדמים והתקנה
בשיעור זה, נתנסה בקוד בפייתון. עליכם להיות מסוגלים להריץ את הקוד של Jupyter Notebook מהשיעור הזה, בין אם במחשב שלכם או בענן.
בשיעור זה ננסה קוד בפייתון. עליך להיות מסוגל להריץ את קוד מחברת Jupyter של שיעור זה, במחשב שלך או בענן כלשהו.
ניתן לפתוח את [מחברת השיעור](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) ולעבור על השיעור כדי לבנות.
ניתן לפתוח את [מחברת השיעור](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), שמשמש בקוד המחברת. הוסיפו אותו לאותה תיקייה כמו המחברת.
> **הערה:** אם אתה פותח את הקוד מהענן, עליך גם להוריד את קובץ [`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). נשתמש ב**למידת חיזוק** כדי לאפשר לפטר לחקור את סביבתו, לאסוף תפוחים טעימים ולהימנע ממפגש עם הזאב.
בשיעור זה נחקור את עולמו של **[פיטר והזאב](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, בהשראת סיפור מוסיקלי מאת קומפוזיטור רוסי, [סרגיי פרוקופייב](https://en.wikipedia.org/wiki/Sergei_Prokofiev). נשתמש ב**למידת חיזוק** כדי לאפשר לפיטר לחקור את הסביבה שלו, לאסוף תפוחים טעימים ולהימנע מפגישה עם הזאב.
**למידת חיזוק** (RL) היא טכניקת למידה שמאפשרת לנו ללמוד התנהגות אופטימלית של **סוכן** בסביבה מסוימת על ידי ביצוע ניסויים רבים. סוכן בסביבה זו צריך שיהיה לו **מטרה**, שמוגדרת על ידי **פונקציית תגמול**.
**למידת חיזוק** (RL) היא טכניקת למידה שמאפשרת לנו ללמוד התנהגות אופטימלית של **סוכן** בסביבה מסוימת על ידי הרצת ניסויים רבים. לסוכן בסביבה זו אמור להיות **מטרה**, המוגדרת על ידי **פונקציית תגמול**.
## הסביבה
לצורך הפשטות, נניח שעולמו של פטר הוא לוח מרובע בגודל `width` x `height`, כמו זה:
לצורך פשטות, נחשיב את עולמו של פיטר כלוח מרובע בגודל `width` x `height`, כך:
![הסביבה של פטר](../../../../8-Reinforcement/1-QLearning/images/environment.png)
![סביבתו של פיטר](../../../../translated_images/he/environment.40ba3cb66256c93f.webp)
כל תא בלוח הזה יכול להיות:
כל תא בלוח זה יכול להיות:
* **קרקע**, שעליה פטר ויצורים אחרים יכולים ללכת.
* **קרקע**, שעליה פיטר ויצורים אחרים יכולים ללכת.
* **מים**, שעליהם כמובן אי אפשר ללכת.
* **עץ** או **דשא**, מקום שבו אפשר לנוח.
* **תפוח**, שמייצג משהו שפטר ישמח למצוא כדי להאכיל את עצמו.
* **עץ** או **דשא**, מקום למנוחה.
* **תפוח**, המייצג משהו שפיטר ישמח למצוא כדי להאכיל את עצמו.
* **זאב**, שהוא מסוכן ויש להימנע ממנו.
ישנו מודול פייתון נפרד, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), שמכיל את הקוד לעבודה עם הסביבה הזו. מכיוון שהקוד הזה אינו חשוב להבנת המושגים שלנו, נייבא את המודול ונשתמש בו כדי ליצור את הלוח לדוגמה (בלוק קוד 1):
יש מודול פייתון נפרד, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), שמכיל את הקוד לעבודה עם הסביבה הזו. מכיוון שקוד זה אינו חשוב להבנת המושגים שלנו, נייבא את המודול ונשתמש בו כדי ליצור את לוח הדוגמה (בלוק קוד 1):
```python
from rlboard import *
@ -52,63 +52,63 @@ m.randomize(seed=13)
m.plot()
```
הקוד הזה אמור להדפיס תמונה של הסביבה הדומה לזו שמוצגת למעלה.
קוד זה אמור להדפיס תמונה של הסביבה הדומה לזו למעלה.
## פעולות ומדיניות
בדוגמה שלנו, המטרה של פטר תהיה למצוא תפוח, תוך הימנעות מהזאב ומכשולים אחרים. לשם כך, הוא יכול למעשה להסתובב עד שימצא תפוח.
בדוגמה שלנו, המטרה של פיטר היא למצוא תפוח, תוך הימנעות מהזאב וממכשולים אחרים. לשם כך, הוא יכול פשוט ללכת סביב עד שימצא תפוח.
לכן, בכל מיקום, הוא יכול לבחור בין אחת מהפעולות הבאות: למעלה, למטה, שמאלה וימינה.
לכן, בכל מיקום, הוא יכול לבחור בין הפעולות הבאות: למעלה, למטה, שמאלה וימינה.
נגדיר את הפעולות הללו כמילון, ונמפה אותן לזוגות של שינויי קואורדינטות מתאימים. לדוגמה, תנועה ימינה (`R`) תתאים לזוג `(1,0)`. (בלוק קוד 2):
נגדיר את הפעולות הללו כמילון, ונתאים אותן לזוגות של שינויים מתאימים בקואורדינטות. לדוגמה, הליכה ימינה (`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).
בואו קודם נפתור את הבעיה שלנו על ידי יישום אסטרטגיית הליכה אקראית. בהליכה אקראית נבחר אקראית את הפעולה הבאה מתוך הפעולות המותרות, עד שנגיע לתפוח (בלוק קוד 3).
1. יישמו את ההליכה האקראית עם הקוד הבא:
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
n = 0 # מספר הצעדים
# קבע מיקום התחלתי
if start_position:
m.human = start_position
else:
m.random_start()
while True:
if m.at() == Board.Cell.apple:
return n # success!
return n # הצלחה!
if m.at() in [Board.Cell.wolf, Board.Cell.water]:
return -1 # eaten by wolf or drowned
return -1 # נאכל על ידי זאב או שט בלבול
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
m.move(a) # בצע את התנועה בפועל
break
n+=1
walk(m,random_policy)
```
הקריאה ל-`walk` אמורה להחזיר את אורך המסלול המתאים, שיכול להשתנות מריצה אחת לאחרת.
הקריאה ל-`walk` אמורה להחזיר את אורך המסלול המתאים, שיכול להשתנות בין ריצה לריצה.
1. הריצו את ניסוי ההליכה מספר פעמים (נניח, 100), והדפיסו את הסטטיסטיקות המתקבלות (בלוק קוד 4):
1. הרץ את ניסוי ההליכה מספר פעמים (נאמר 100), והדפיס את הסטטיסטיקות המתקבלות (בלוק קוד 4):
```python
def print_statistics(policy):
@ -125,17 +125,17 @@ action_idx = { a : i for i,a in enumerate(actions.keys()) }
print_statistics(random_policy)
```
שימו לב שאורך המסלול הממוצע הוא סביב 30-40 צעדים, שזה די הרבה, בהתחשב בכך שהמרחק הממוצע לתפוח הקרוב ביותר הוא סביב 5-6 צעדים.
יש לשים לב שאורך הממוצע של מסלול הוא בין 30 ל-40 צעדים, שזה די הרבה, בהתחשב בכך שהמרחק הממוצע לתפוח הקרוב הוא כ-5-6 צעדים.
תוכלו גם לראות כיצד נראית תנועתו של פטר במהלך ההליכה האקראית:
ניתן גם לראות כיצד נראית התנועה של פיטר במהלך ההליכה האקראית:
![הליכה אקראית של פטר](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif)
![הליכה אקראית של פיטר](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif)
## פונקציית תגמול
כדי להפוך את המדיניות שלנו לאינטליגנטית יותר, עלינו להבין אילו מהלכים הם "טובים" יותר מאחרים. לשם כך, עלינו להגדיר את המטרה שלנו.
כדי להפוך את המדיניות שלנו לחכמה יותר, עלינו להבין אילו מהלכים "טובים יותר" מאחרים. לשם כך, עלינו להגדיר את המטרה שלנו.
המטרה יכולה להיות מוגדרת במונחים של **פונקציית תגמול**, שתחזיר ערך ניקוד עבור כל מצב. ככל שהמספר גבוה יותר, כך פונקציית התגמול טובה יותר. (בלוק קוד 5)
המטרה יכולה להיות מוגדרת במונחים של **פונקציית תגמול**, אשר תחזיר ערך ניקוד עבור כל מצב. ככל שהמספר גבוה יותר, פונקציית התגמול טובה יותר. (בלוק קוד 5)
```python
move_reward = -0.1
@ -154,39 +154,115 @@ def reward(m,pos=None):
return move_reward
```
דבר מעניין לגבי פונקציות תגמול הוא שבמקרים רבים, *אנו מקבלים תגמול משמעותי רק בסוף המשחק*. משמעות הדבר היא שהאלגוריתם שלנו צריך לזכור "צעדים טובים" שהובילו לתגמול חיובי בסוף, ולהגדיל את חשיבותם. באופן דומה, כל המהלכים שמובילים לתוצאות רעות צריכים להיות מדוכאים.
דבר מעניין לגבי פונקציות תגמול הוא שבמרבית המקרים, *ניתן לנו תגמול משמעותי רק בסוף המשחק*. משמעות הדבר היא שהאלגוריתם שלנו צריך איכשהו לזכור צעדים "טובים" שהובילו לתגמול חיובי בסוף, ולהגביר את משמעותם. באופן דומה, כל המהלכים שבהם התוצאות רעות צריכים להיות מ discouraged.
## למידת Q
## Q-Learning
האלגוריתם שנדון בו כאן נקרא **למידת Q**. באלגוריתם זה, המדיניות מוגדרת על ידי פונקציה (או מבנה נתונים) שנקראת **טבלת Q**. היא מתעדת את "הטוב" של כל אחת מהפעולות במצב נתון.
אלגוריתם שנדון כאן נקרא **Q-Learning**. באלגוריתם זה, המדיניות מוגדרת על ידי פונקציה (או מבנה נתונים) שנקרא **טבלת Q**. היא רושמת את "האיכות" של כל פעולות בכל מצב נתון.
היא נקראת טבלת Q מכיוון שלעתים קרובות נוח לייצג אותה כטבלה, או מערך רב-ממדי. מכיוון שלוח המשחק שלנו הוא בגודל `width` x `height`, נוכל לייצג את טבלת Q באמצעות מערך numpy עם צורה `width` x `height` x `len(actions)`: (בלוק קוד 6)
היא נקראת טבלת 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)`.
שימו לב שאנו מאתחלים את כל הערכים בטבלת Q בערך שווה, במקרה שלנו - 0.25. זה מתאים למדיניות "הליכה אקראית", מכיוון שכל המהלכים בכל מצב הם באותה מידה טובים. ניתן להעביר את טבלת Q לפונקציית `plot` כדי להמחיש את הטבלה על הלוח: `m.plot(Q)`.
![הסביבה של פטר](../../../../8-Reinforcement/1-QLearning/images/env_init.png)
![סביבתו של פיטר](../../../../translated_images/he/env_init.04e8f26d2d60089e.webp)
במרכז כל תא יש "חץ" שמצביע על כיוון התנועה המועדף. מכיוון שכל הכיוונים שווים, מוצגת נקודה.
במרכז כל תא יש "חץ" שמצביע על הכיוון המועדף לתנועה. כיוון שכל הכיוונים שווים, מוצג נקודה.
כעת עלינו להריץ את הסימולציה, לחקור את הסביבה שלנו, וללמוד חלוקה טובה יותר של ערכי טבלת Q, שתאפשר לנו למצוא את הדרך לתפוח הרבה יותר מהר.
עכשיו עלינו להריץ את הסימולציה, לחקור את הסביבה שלנו, וללמוד התפלגות טובה יותר של ערכי טבלת Q, שתאפשר לנו למצוא את הדרך לתפוח מהר יותר.
## מהות למידת Q: משוואת בלמן
## מהות Q-Learning: משוואת בלמן
ברגע שנתחיל לזוז, לכל פעולה יהיה תגמול מתאים, כלומר נוכל באופן תיאורטי לבחור את הפעולה הבאה על סמך התגמול המיידי הגבוה ביותר. עם זאת, ברוב המצבים, המהלך לא ישיג את מטרתנו להגיע לתפוח, ולכן לא נוכל להחליט מיד איזה כיוון טוב יותר.
ברגע שנתחיל לזוז, כל פעולה תקבל תגמול מתאים, כלומר נוכל תיאורטית לבחור את הפעולה הבאה על בסיס התגמול המיידי הגבוה ביותר. אולם ברוב המצבים, המהלך לא ישיג את מטרתנו של להגיע לתפוח, ולכן איננו יכולים להחליט מייד איזה כיוון הוא טוב יותר.
> זכרו שזה לא התוצאה המיידית שחשובה, אלא התוצאה הסופית, שנקבל בסוף הסימולציה.
כדי לקחת בחשבון את התגמול המושהה, עלינו להשתמש בעקרונות של **[תכנות דינמי](https://en.wikipedia.org/wiki/Dynamic_programming)**, שמאפשרים לנו לחשוב על הבעיה שלנו באופן רקורסיבי.
על מנת להתחשב בתגמול המאוחר הזה, עלינו להשתמש בעקרונות **[תכנות דינמי](https://en.wikipedia.org/wiki/Dynamic_programming)**, שמאפשרים לנו לחשוב על בעיה באופן רקורסיבי.
נניח שאנחנו נמצאים כעת במצב *s*, ורוצים לעבור למצב הבא *s'*. על ידי כך, נקבל את התגמול המיידי *r(s,a)*, שמוגדר על ידי פונקציית התגמול, בתוספת תגמול עתידי כלשהו. אם נניח שטבלת Q שלנו משקפת נכון את "האטרקטיביות" של כל פעולה, אז במצב *s'* נבחר פעולה *a* שתואמת לערך המקסימלי של *Q(s',a')*. לכן, התגמול העתידי הטוב ביותר שנוכל לקבל במצב *s* יוגדר כ-`max`
נניח שאנו כעת במצב *s*, ואנו רוצים לעבור למצב הבא *s'*. באמצעות המעבר נקבל את התגמול המיידי *r(s,a)*, המוגדר על ידי פונקציית התגמול, בתוספת תגמול עתידי כלשהו. אם נניח שטבלת Q שלנו משקפת נכונה את "המשיכה" של כל פעולה, אז במצב *s'* נבחר פעולה *a* המתאימה לערך המקסימלי של *Q(s',a')*. לכן, התגמול העתידי הטוב ביותר שנוכל לקבל במצב *s* יוגדר כ-`max`<sub>a'</sub>*Q(s',a')* (מקסימום מחושב על כל הפעולות האפשריות *a'* במצב *s'*).
נוסחת בלמן לחישוב ערך טבלת Q במצב *s*, עבור פעולה *a*, היא:
<img src="../../../../translated_images/he/bellman-equation.7c0c4c722e5a6b7c.webp"/>
כאן γ הוא מה שנקרא **מקדם הנחה** שקובע עד כמה יש להעדיף את התגמול הנוכחי על פני תגמול עתידי ולהפך.
## אלגוריתם למידה
בהתבסס על המשוואה שלמעלה, נכתוב כעת קוד מזויף לאלגוריתם הלמידה שלנו:
* אתחל את טבלת Q עם ערכים שווים לכל המצבים והפעולות
* הגדר שיעור למידה α ← 1
* חזור על הסימולציה מספר פעמים
1. התחל במיקום אקראי
1. חזור
1. בחר פעולה *a* במצב *s*
2. בצע את הפעולה על ידי מעבר למצב חדש *s'*
3. אם נתקלת בתנאי סוף משחק, או שהתגמול הכולל קטן מדי - יצא מהסימולציה
4. חשב תגמול *r* במצב החדש
5. עדכן את פונקציית Q לפי משוואת בלמן: *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ max<sub>a'</sub>Q(s',a'))*
6. *s* ← *s'*
7. עדכן את התגמול הכולל והקטן את α.
## ניצול מול חקר
באלגוריתם שלעיל לא ציינו בדיוק כיצד לבחור פעולה בשלב 2.1. אם נבחר את הפעולה באופן אקראי, נחקור אקראית את הסביבה, ויש סיכוי גבוה שנמות לעיתים קרובות ונבדוק אזורים שאליהם בדרך כלל לא היינו הולכים. גישה חלופית תהיה **לנצל** את ערכי טבלת Q שכבר ידועים, ובכך לבחור את הפעולה הטובה ביותר (עם ערך טבלת Q גבוה יותר) במצב *s*. עם זאת, זה ימנע מאיתנו לחקור מצבים אחרים, וקיים סיכוי שלא נמצא את הפתרון האופטימלי.
לכן, הגישה הטובה ביותר היא ליצור איזון בין חקר לניצול. זה יכול להיעשות על ידי בחירת הפעולה במצב *s* עם הסתברויות פרופורציונליות לערכים בטבלת Q. בתחילה, כאשר ערכי טבלת Q כולם זהים, זה יתאים לבחירה אקראית, אך ככל שנלמד יותר על הסביבה שלנו, נהיה יותר סבירים לעקוב אחרי המסלול האופטימלי תוך מתן אפשרות לסוכן לבחור את הנתיב הלא נבדק מדי פעם.
## יישום בפייתון
אנו מוכנים כעת ליישם את אלגוריתם הלמידה. לפני כן, אנו צריכים פונקציה שתמיר מספרים שרירותיים בטבלת Q לווקטור של הסתברויות עבור הפעולות המתאימות.
1. צור פונקציה `probs()`:
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
```
אנו מוסיפים כמה `eps` לווקטור המקורי כדי להימנע מחלוקה באפס במקרה הראשוני, כאשר כל רכיבי הווקטור זהים.
הרץ את אלגוריתם הלמידה לאורך 5000 ניסויים, המכונים גם ** epochs **: (בלוק קוד 8)
```python
for epoch in range(5000):
# בחר נקודה התחלתית
m.random_start()
# התחל לנוע
n=0
cum_reward = 0
while True:
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
dpos = actions[a]
m.move(dpos,check_correctness=False) # אנו מאפשרים לשחקן לזוז מחוץ ללוח, מה שמסיים את הפרק
r = reward(m)
cum_reward += r
if r==end_reward or cum_reward < -1000:
lpath.append(n)
break
alpha = np.exp(-n / 10e5)
gamma = 0.5
ai = action_idx[a]
Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max())
n+=1
```
לאחר ביצוע האלגוריתם, טבלת Q אמורה להתעדכן בערכים המגדירים את המשיכה של פעולות שונות בכל שלב. נוכל לנסות להמחיש את טבלת Q על ידי ציור וקטור בכל תא שיצביע בכיוון הרצוי לתנועה. לצורך פשטות, אנו מציירים מעגל קטן במקום ראש חץ.
<img src="../../../../translated_images/he/learned.ed28bcd8484b5287.webp"/>
## בדיקת המדיניות
מכיוון ש-Q-Table מציג את "האטרקטיביות" של כל פעולה בכל מצב, קל מאוד להשתמש בו כדי להגדיר ניווט יעיל בעולם שלנו. במקרה הפשוט ביותר, ניתן לבחור את הפעולה המתאימה לערך הגבוה ביותר ב-Q-Table: (בלוק קוד 9)
מכיוון שטבלת Q מפרטת את ה"משיכה" של כל פעולה בכל מצב, קל לשימוש בה כדי להגדיר ניווט יעיל בעולם שלנו. בפשטות, ניתן לבחור את הפעולה המתאימה לערך הגבוה ביותר בטבלת Q: (בלוק קוד 9)
```python
def qpolicy_strict(m):
@ -198,17 +274,18 @@ def qpolicy_strict(m):
walk(m,qpolicy_strict)
```
> אם תנסו את הקוד למעלה מספר פעמים, ייתכן שתשימו לב שלפעמים הוא "נתקע", ותצטרכו ללחוץ על כפתור ה-STOP במחברת כדי להפסיק אותו. זה קורה מכיוון שיכולות להיות מצבים שבהם שני מצבים "מצביעים" זה על זה מבחינת ערך Q אופטימלי, ובמקרה כזה הסוכן ימשיך לנוע בין אותם מצבים ללא סוף.
> אם תנסו את הקוד למעלה מספר פעמים, ייתכן שתבחינו שברגעים מסוימים הוא "נתקע", ותצטרכו ללחוץ על כפתור העצור במחברת כדי להפסיק אותו. זה קורה מאחר שיכולות להיות מצבים בהם שני המצבים "מצביעים" זה על זה מבחינת ערך Q אופטימלי, ובמקרה כזה הסוכנים מוצאים את עצמם נעים בין אותם מצבים ללא הגבלה.
## 🚀אתגר
> **משימה 1:** שנו את הפונקציה `walk` כך שתוגבל אורך המסלול המרבי למספר מסוים של צעדים (לדוגמה, 100), וצפו בקוד למעלה מחזיר את הערך הזה מדי פעם.
> **משימה 1:** שנו את פונקציית `walk` כך שתמנע מהאורך המקסימלי של המסלול לעבור מספר מסוים של צעדים (נניח, 100), וצפו בקוד למעלה מחזיר ערך זה מעת לעת.
> **משימה 2:** שנו את הפונקציה `walk` כך שלא תחזור למקומות שבהם כבר הייתה בעבר. זה ימנע מ-`walk` להיכנס ללולאה, אך עדיין ייתכן שהסוכן ימצא את עצמו "תקוע" במקום שממנו אינו יכול לברוח.
> **משימה 2:** שנו את פונקציית `walk` כך שהיא לא תחזור למקומות בהם כבר הייתה בעבר. זה ימנע מ-`walk` להיכנס ללופים, אולם הסוכן עדיין עלול להיתקע במקום ממנו הוא לא יכול להיחלץ.
## ניווט
מדיניות ניווט טובה יותר תהיה זו שהשתמשנו בה במהלך האימון, שמשלבת ניצול וחקר. במדיניות זו, נבחר כל פעולה עם הסתברות מסוימת, פרופורציונלית לערכים ב-Q-Table. אסטרטגיה זו עדיין עשויה לגרום לסוכן לחזור למיקום שכבר חקר, אך כפי שניתן לראות מהקוד למטה, היא מביאה למסלול ממוצע קצר מאוד למיקום הרצוי (זכרו ש-`print_statistics` מריץ את הסימולציה 100 פעמים): (בלוק קוד 10)
מדיניות ניווט טובה יותר תהיה זו שהשתמשנו בה בזמן האימון, שמשלבת ניצול וחיפוש. במדיניות זו נבחר כל פעולה עם הסתברות מסוימת, בפרופורציה לערכים בטבלת Q. אסטרטגיה זו יכולה עדיין לגרום לסוכן לחזור למקום שכבר חקר, אבל, כפי שרואים מהקוד למטה, היא מביאה לאורך ממוצע קצר מאוד למסלול למיקום הרצוי (זכרו ש-`print_statistics` מפעילה את הסימולציה 100 פעמים): (בלוק קוד 10)
```python
def qpolicy(m):
@ -220,28 +297,32 @@ def qpolicy(m):
print_statistics(qpolicy)
```
לאחר הרצת הקוד הזה, אתם אמורים לקבל אורך מסלול ממוצע קטן בהרבה מאשר קודם, בטווח של 3-6.
לאחר הרצת הקוד הזה, אתם אמורים לקבל אורך מסלול ממוצע קטן בהרבה מאשר קודם, בתחום של 3-6.
## חקירת תהליך הלמידה
כפי שציינו, תהליך הלמידה הוא איזון בין חקר לבין ניצול הידע שנצבר על מבנה מרחב הבעיה. ראינו שהתוצאות של הלמידה (היכולת לעזור לסוכן למצוא מסלול קצר למטרה) השתפרו, אך גם מעניין לצפות כיצד אורך המסלול הממוצע מתנהג במהלך תהליך הלמידה:
כפי שציינו, תהליך הלמידה הוא איזון בין חקר למידת הידע שנצבר אודות מבנה מרחב הבעיה. ראינו שהתוצאות של הלמידה (היכולת לעזור לסוכן למצוא מסלול קצר למטרה) השתפרו, אך מעניין גם לעקוב כיצד אורך המסלול הממוצע מתנהג במהלך תהליך הלמידה:
<img src="../../../../translated_images/he/lpathlen1.0534784add58d4eb.webp"/>
## סיכום הלמידות:
את תהליך הלמידה ניתן לסכם כך:
- **אורך המסלול הממוצע עולה**. מה שאנו רואים כאן הוא שבתחילה, אורך המסלול הממוצע עולה. זה כנראה נובע מכך שכאשר איננו יודעים דבר על הסביבה, אנו נוטים להיתקע במצבים גרועים, כמו מים או זאב. ככל שאנו לומדים יותר ומתחילים להשתמש בידע הזה, אנו יכולים לחקור את הסביבה לזמן ארוך יותר, אך עדיין איננו יודעים היטב היכן נמצאים התפוחים.
- **אורך המסלול הממוצע עולה**. מה שאנחנו רואים כאן הוא שבתתחילה, אורך המסלול הממוצע עולה. זה ככל הנראה נובע מכך שכאשר איננו יודעים דבר על הסביבה, אנחנו עלולים להיכנס למצבים לא טובים, כמו מים או זאב. ככל שלומדים יותר ומתחילים להשתמש בידע זה, ניתן לחקור את הסביבה לאורך זמן רב יותר, אך עדיין אנו לא יודעים היטב איפה התפוחים נמצאים.
- **אורך המסלול יורד ככל שאנו לומדים יותר**. ברגע שאנו לומדים מספיק, קל יותר לסוכן להשיג את המטרה, ואורך המסלול מתחיל לרדת. עם זאת, אנו עדיין פתוחים לחקר, ולכן לעיתים קרובות אנו סוטים מהמסלול הטוב ביותר ובוחנים אפשרויות חדשות, מה שגורם למסלול להיות ארוך יותר מהאופטימלי.
- **אורך המסלול מתקצר ככל שמלמדים יותר**. ברגע שלומדים מספיק, הסוכן מצליח להשיג את המטרה ביתר קלות, ואורך המסלול מתחיל להתקצר. עם זאת, אנחנו עדיין פתוחים לחקר, ולכן לעיתים הולכים עם סיבוב מהמסלול הטוב ביותר ובודקים אופציות חדשות, מה שגורם לאורך המסלול להיות ארוך יותר מהאופטימלי.
- **אורך המסלול עולה באופן פתאומי**. מה שאנו גם רואים בגרף הוא שבשלב מסוים, האורך עלה באופן פתאומי. זה מצביע על האופי הסטוכסטי של התהליך, ועל כך שבשלב מסוים אנו יכולים "לקלקל" את מקדמי ה-Q-Table על ידי החלפתם בערכים חדשים. באופן אידיאלי, יש למזער זאת על ידי הפחתת קצב הלמידה (לדוגמה, לקראת סוף האימון, אנו משנים את ערכי ה-Q-Table רק במידה קטנה).
- **אורך המסלול עולה בפתאומיות**. בנוסף אנחנו מבחינים בגרף שכמה פעמים האורך עלה בפתאומיות. זה מצביע על אופיו האקראי של התהליך, ועל כך שבנקודה מסוימת יכול להתקלקל טבלת ה-Q על ידי כתיבה מחדש של ערכים חדשים. יש להפחית זאת ככל הניתן על ידי הקטנת קצב הלמידה (לדוגמה, לקראת סוף האימון, אנו מעדכנים את ערכי טבלת ה-Q על ידי ערך קטן בלבד).
בסך הכל, חשוב לזכור שההצלחה והאיכות של תהליך הלמידה תלויים באופן משמעותי בפרמטרים, כמו קצב הלמידה, דעיכת קצב הלמידה, ופקטור ההנחה. אלו נקראים לעיתים קרובות **היפר-פרמטרים**, כדי להבדילם מ-**פרמטרים**, שאותם אנו ממטבים במהלך האימון (לדוגמה, מקדמי Q-Table). תהליך מציאת הערכים הטובים ביותר להיפר-פרמטרים נקרא **אופטימיזציה של היפר-פרמטרים**, והוא ראוי לנושא נפרד.
בסך הכול, חשוב לזכור שהצלחת ותוצאות תהליך הלמידה תלויות במידה רבה בפרמטרים כמו קצב הלמידה, דעיכת קצב הלמידה, וגורם ההנחה. אלו קרויים לעיתים **היפרפרמטרים**, כדי להבדיל אותם מ-**פרמטרים**, אותם אנו עושים אופטימיזציה במהלך האימון (לדוגמה, ערכי טבלת ה-Q). תהליך מציאת ערכי ההיפרפרמטר הטובים נקרא **אופטימיזציית היפרפרמטרים**, ומגיע לו נושא נפרד.
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## [חידון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## משימה
[עולם מציאותי יותר](assignment.md)
## מטלה
[עולם יותר ריאליסטי](assignment.md)
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,14 +1,34 @@
## דרישות מקדימות
# גלישת CartPole
בשיעור הזה נשתמש בספרייה בשם **OpenAI Gym** כדי לדמות **סביבות** שונות. ניתן להריץ את הקוד של השיעור הזה באופן מקומי (למשל, מ-Visual Studio Code), ובמקרה כזה הסימולציה תיפתח בחלון חדש. כאשר מריצים את הקוד אונליין, ייתכן שתצטרכו לבצע כמה התאמות בקוד, כפי שמתואר [כאן](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7).
הבעיה שפתרנו בשיעור הקודם עשויה להיראות כבעיה משחקית, שלא ממש ישימה במצבים אמיתיים. זה לא המקרה, כי בעיות רבות מהעולם האמיתי חולקות תרחיש זה - כולל משחק שחמט או גו. הן דומות, כי יש לנו גם לוח עם חוקים נתונים ו**סטייט בדידה**.
## [חידון לפני ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## מבוא
בשיעור זה ניישם את אותם עקרונות של Q-Learning על בעיה עם **סטייט רציף**, כלומר סטייט הנתון על ידי מספר ממשי אחד או יותר. נתמודד עם הבעיה הבאה:
> **בעיה**: אם פיטר רוצה להימלט מהזאב, הוא צריך להיות מסוגל לנוע מהר יותר. נראה כיצד פיטר יכול ללמוד לגלוש, במיוחד לשמור על איזון, תוך שימוש ב-Q-Learning.
![הבריחה הגדולה!](../../../../translated_images/he/escape.18862db9930337e3.webp)
> פיטר וחבריו מגלים יצירתיות כדי להימלט מהזאב! תמונה מאת [Jen Looper](https://twitter.com/jenlooper)
נשתמש בגרסה מפושטת של שמירת איזון הידועה כבעיית **CartPole**. בעולם ה-cartpole יש לנו מחליק אופקי שיכול לנוע שמאלה או ימינה, והמטרה היא לאזן קורה אנכית על גבי המחליק.
<img alt="cartpole" src="../../../../translated_images/he/cartpole.b5609cc0494a14f7.webp" width="200"/>
## דרישות מוקדמות
בשיעור זה נשתמש בספרייה בשם **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.
בשיעור הקודם, חוקי המשחק והסטייט נקבעו על ידי מחלקת `Board` שהגדרנו בעצמנו. כאן נשתמש ב**סביבת סימולציה** מיוחדת, שתחקה את הפיזיקה שמאחורי הקורה המשמרת איזון. אחת מסביבות הסימולציה הפופולריות ביותר לאימון אלגוריתמים של למידה מחוזקת נקראת [Gym](https://gym.openai.com/), שמתוחזקת על ידי [OpenAI](https://openai.com/). באמצעות Gym זה, נוכל ליצור סביבות שונות, מסימולציית cartpole ועד למשחקי אטארי.
> **הערה**: ניתן לראות סביבות נוספות הזמינות ב-OpenAI Gym [כאן](https://gym.openai.com/envs/#classic_control).
> **הערה**: ניתן לראות סביבות נוספות זמינות מתוך OpenAI Gym [כאן](https://gym.openai.com/envs/#classic_control).
ראשית, נתקין את ה-Gym ונייבא את הספריות הנדרשות (קוד בלוק 1):
ראשית, נתקין את gym ונייבא את הספריות הנדרשות (קוד בלוק 1):
```python
import sys
@ -20,15 +40,15 @@ import numpy as np
import random
```
## תרגיל - אתחול סביבת CartPole
## תרגיל - אתחול סביבה ל-cartpole
כדי לעבוד עם בעיית איזון מוט ה-CartPole, עלינו לאתחל את הסביבה המתאימה. כל סביבה מקושרת ל:
כדי לעבוד עם בעיית שמירת האיזון ב-cartpole, יש לאתחל את הסביבה המתאימה. כל סביבה מקושרת ל:
- **מרחב תצפיות** שמגדיר את מבנה המידע שאנו מקבלים מהסביבה. עבור בעיית ה-CartPole, אנו מקבלים את מיקום המוט, מהירות ועוד ערכים נוספים.
- **מרחב תצפית** שמגדיר את מבנה המידע שנקבל מהסביבה. עבור בעיית ה-cartpole, נקבל את מיקום הקורה, מהירות וערכים נוספים.
- **מרחב פעולות** שמגדיר פעולות אפשריות. במקרה שלנו מרחב הפעולות הוא דיסקרטי, ומורכב משתי פעולות - **שמאלה** ו-**ימינה**. (קוד בלוק 2)
- **מרחב פעולה** שמגדיר פעולות אפשריות. במקרה שלנו מרחב הפעולה הוא בדידי, וכולל שתי פעולות - **שמאל** ו-**ימין**. (קוד בלוק 2)
1. כדי לאתחל, הקלידו את הקוד הבא:
1. לאתחל, הקלד את הקוד הבא:
```python
env = gym.make("CartPole-v1")
@ -37,11 +57,11 @@ import random
print(env.action_space.sample())
```
כדי לראות איך הסביבה עובדת, נריץ סימולציה קצרה של 100 צעדים. בכל צעד, נספק אחת מהפעולות לביצוע - בסימולציה הזו פשוט נבחר פעולה באופן אקראי מתוך `action_space`.
כדי לראות כיצד הסביבה פועלת, נריץ סימולציה קצרה של 100 צעדים. בכל צעד נספק פעולה אחת לביצוע - בסימולציה הזו אנו פשוט בוחרים פעולה באקראי מתוך `action_space`.
1. הריצו את הקוד הבא וראו מה מתקבל.
1. הרץ את הקוד למטה וראה לאן זה מוביל.
✅ זכרו שמומלץ להריץ את הקוד הזה בהתקנה מקומית של Python! (קוד בלוק 3)
✅ זכור שמומלץ להריץ קוד זה בהתקנת פייתון מקומית! (קוד בלוק 3)
```python
env.reset()
@ -52,11 +72,11 @@ import random
env.close()
```
אתם אמורים לראות משהו דומה לתמונה הזו:
תראה משהו דומה לתמונה הזו:
![CartPole ללא איזון](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif)
![cartpole לא מאזין](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif)
1. במהלך הסימולציה, עלינו לקבל תצפיות כדי להחליט כיצד לפעול. למעשה, פונקציית הצעד מחזירה תצפיות נוכחיות, פונקציית תגמול ודגל שמציין האם יש טעם להמשיך את הסימולציה או לא: (קוד בלוק 4)
1. במהלך הסימולציה, אנו זקוקים לתצפיות כדי להחליט איך לפעול. בפועל, הפונקציה step מחזירה את התצפיות הנוכחיות, את פונקציית התגמול, ואת הדגל done שמצביע האם יש טעם להמשיך בסימולציה או לא: (קוד בלוק 4)
```python
env.reset()
@ -69,7 +89,7 @@ import random
env.close()
```
בסופו של דבר תראו משהו כזה בתוצאות המחברת:
תראה משהו כזה ביציאת המחברת:
```text
[ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0
@ -82,43 +102,43 @@ import random
[ 0.17617249 0.35602306 -0.21873684 -0.90998894] -> 1.0
```
וקטור התצפיות שמוחזר בכל צעד של הסימולציה מכיל את הערכים הבאים:
וקטור התצפיות שמוחזר בכל צעד מכיל את הערכים הבאים:
- מיקום העגלה
- מהירות העגלה
- זווית המוט
- קצב הסיבוב של המוט
- זווית הקורה
- קצב סיבוב הקורה
1. קבלו את הערכים המינימליים והמקסימליים של המספרים הללו: (קוד בלוק 5)
1. קבל ערך מינימום ומקסימום של המספרים האלה: (קוד בלוק 5)
```python
print(env.observation_space.low)
print(env.observation_space.high)
```
ייתכן שתשימו לב שערך התגמול בכל צעד של הסימולציה הוא תמיד 1. זאת מכיוון שהמטרה שלנו היא לשרוד כמה שיותר זמן, כלומר לשמור על המוט במצב אנכי סביר למשך הזמן הארוך ביותר.
ייתכן גם שתבחין שערך התגמול בכל צעד בסימולציה תמיד הוא 1. זה מכיוון שהמטרה שלנו היא לשרוד כמה שיותר זמן, כלומר לשמור על הקורה במצב אנכי סביר במשך זמן ממושך.
✅ למעשה, סימולציית CartPole נחשבת לפתרון אם נצליח להגיע לתגמול ממוצע של 195 לאורך 100 ניסיונות רצופים.
✅ למעשה, סימולציית CartPole נחשבת לפתרונה אם נצליח לקבל תגמול ממוצע של 195 על 100 ניסיונות עוקבים.
## דיסקרטיזציה של מצב
## בדידת סטייט
בלמידת Q, עלינו לבנות טבלת Q שמגדירה מה לעשות בכל מצב. כדי לעשות זאת, עלינו שהמצב יהיה **דיסקרטי**, כלומר יכיל מספר סופי של ערכים דיסקרטיים. לכן, עלינו למצוא דרך **לדסקרט** את התצפיות שלנו, ולמפות אותן לקבוצה סופית של מצבים.
ב-Q-Learning, צריך לבנות טבלת Q שמגדירה מה לעשות בכל סטייט. כדי לעשות זאת, הסטייט צריך להיות **בדידי**, כלומר להכיל מספר סופי של ערכים בדידים. לכן, יש צורך איכשהו **לבדד** את התצפיות שלנו, ולמפות אותן למערכת סופית של סטייטים.
יש כמה דרכים לעשות זאת:
- **חלוקה לבינים**. אם אנו יודעים את הטווח של ערך מסוים, נוכל לחלק את הטווח למספר **בינים**, ואז להחליף את הערך במספר הבין שאליו הוא שייך. ניתן לעשות זאת באמצעות המתודה [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) של numpy. במקרה זה, נדע בדיוק את גודל המצב, מכיוון שהוא תלוי במספר הבינים שנבחר לדיגיטציה.
- **חלוקה לתאים (bins)**. אם אנו יודעים את התחום של ערך מסוים, נוכל לחלק תחום זה למספר **תאים**, ואז להחליף את הערך במספר התא שאליו הוא שייך. ניתן לעשות זאת באמצעות השיטה [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) של numpy. במקרה זה, נדע בדיוק את גודל הסטייט, כי הוא תלוי במספר התאים שנבחר.
✅ ניתן להשתמש באינטרפולציה ליניארית כדי להביא ערכים לתחום סופי מסוים (נניח, מ-20- עד 20), ואז להמיר את המספרים לשלמים על ידי עיגול. זה נותן לנו פחות שליטה על גודל הסטייט, במיוחד אם איננו יודעים את טווחי הקלט המדויקים. למשל, במקרה שלנו 2 מתוך 4 ערכים אינם מוגבלים עליונה/תחתונה, מה שעלול לגרום למספר אינסופי של סטייטים.
✅ ניתן להשתמש באינטרפולציה ליניארית כדי להביא ערכים לטווח סופי (למשל, מ-20- עד 20), ואז להמיר מספרים לשלמים על ידי עיגול. זה נותן לנו פחות שליטה על גודל המצב, במיוחד אם איננו יודעים את הטווחים המדויקים של ערכי הקלט. לדוגמה, במקרה שלנו 2 מתוך 4 הערכים אינם מוגבלים בטווח העליון/תחתון שלהם, מה שעשוי להוביל למספר אינסופי של מצבים.
בדוגמה שלנו, נלך עם הגישה השנייה. כפי שתבחין מאוחר יותר, למרות חוסר הגבלות עליונות/תחתונות, הערכים הללו לעיתים נדירות יוצאים מטווחים סופיים מסוימים, ולכן הסטייטים עם ערכים קיצוניים יהיו נדירים מאוד.
בדוגמה שלנו, נבחר בגישה השנייה. כפי שתשימו לב מאוחר יותר, למרות שהטווחים העליונים/תחתונים אינם מוגדרים, הערכים הללו לעיתים רחוקות לוקחים ערכים מחוץ לטווחים סופיים מסוימים, ולכן מצבים עם ערכים קיצוניים יהיו נדירים מאוד.
1. הנה הפונקציה שתיקח את התצפית מהמודל שלנו ותפיק טופס של 4 ערכים שלמים: (קוד בלוק 6)
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)
1. בוא נבדוק גם שיטת בדידה אחרת באמצעות תאים: (קוד בלוק 7)
```python
def create_bins(i,num):
@ -126,39 +146,39 @@ import random
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
ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # טווחי ערכים עבור כל פרמטר
nbins = [20,20,10,10] # מספר תיבות עבור כל פרמטר
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` ולראות אם יש הבדל.
1. עכשיו נריץ סימולציה קצרה ונבחן את הערכים הבדידים הללו מהסביבה. הרגש חופשי לנסות גם את `discretize` וגם את `discretize_bins` ולראות אם יש הבדל.
`discretize_bins` מחזירה את מספר הבין, שהוא מבוסס על 0. לכן עבור ערכי משתנה קלט סביב 0 היא מחזירה את המספר מאמצע הטווח (10). ב-`discretize`, לא דאגנו לטווח ערכי הפלט, מה שמאפשר להם להיות שליליים, ולכן ערכי המצב אינם מוזזים, ו-0 מתאים ל-0. (קוד בלוק 8)
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))
#הדפס את תוצאות החלוקה למרחבים בדידים (obs)
print(discretize(obs))
env.close()
```
✅ בטלו את ההערה בשורה שמתחילה ב-env.render אם אתם רוצים לראות איך הסביבה מתבצעת. אחרת, תוכלו להריץ אותה ברקע, מה שמהיר יותר. נשתמש בהרצה "בלתי נראית" זו במהלך תהליך למידת Q.
✅ בטל את ההערה בשורה שמתחילה ב-env.render אם ברצונך לראות כיצד הסביבה מתבצעת. אחרת אפשר להריץ אותה ברקע, וזה מהיר יותר. נשתמש בהרצה "בלתי נראית" זו במהלך תהליך ה-Q-Learning.
## מבנה טבלת Q
בשיעור הקודם, המצב היה זוג פשוט של מספרים מ-0 עד 8, ולכן היה נוח לייצג את טבלת Q באמצעות טנזור numpy עם צורה של 8x8x2. אם נשתמש בדיסקרטיזציה באמצעות בינים, גודל וקטור המצב שלנו גם ידוע, ולכן נוכל להשתמש באותה גישה ולייצג מצב באמצעות מערך בצורת 20x20x10x10x2 (כאן 2 הוא הממד של מרחב הפעולות, והמידות הראשונות מתאימות למספר הבינים שבחרנו להשתמש עבור כל אחד מהפרמטרים במרחב התצפיות).
בשיעור הקודם, היה הסטייט זוג פשוט של מספרים מ-0 עד 8, ולכן היה נוח לייצג את טבלת Q בטנסור numpy עם צורה 8x8x2. אם נשתמש בבידוד תאים, גודל וקטור הסטייט שלנו ידוע גם כן, ולכן נוכל להשתמש בגישה דומה ולייצג את הסטייט במערך בצורה 20x20x10x10x2 (כאן 2 היא מימד מרחב הפעולה, והמימדים הראשונים מתאימים למספר התאים שבחרנו לכל אחד מהפרמטרים במרחב התצפית).
עם זאת, לפעמים המידות המדויקות של מרחב התצפיות אינן ידועות. במקרה של פונקציית `discretize`, לעולם לא נוכל להיות בטוחים שהמצב שלנו נשאר בתוך גבולות מסוימים, מכיוון שחלק מהערכים המקוריים אינם מוגבלים. לכן, נשתמש בגישה מעט שונה ונייצג את טבלת Q באמצעות מילון.
עם זאת, לפעמים מימדי מרחב התצפיות המדויקים אינם ידועים. במקרה של הפונקציה `discretize` אולי לא נדע שהסטייט ישאר במסגרת גבולות מסוימים, מכיוון שחלק מהערכים המקוריים אינם מוגבלים. לכן, נשתמש בגישה שונה מעט ונייצג את טבלת ה-Q כמילון.
1. השתמשו בזוג *(state,action)* כמפתח המילון, והערך יתאים לערך הכניסה בטבלת Q. (קוד בלוק 9)
1. השתמש בזוג *(state,action)* כמפתח מילון, והערך יתאים לערך טבלת Q. (קוד בלוק 9)
```python
Q = {}
@ -168,38 +188,38 @@ import random
return [Q.get((state,a),0) for a in actions]
```
כאן אנו גם מגדירים פונקציה `qvalues()`, שמחזירה רשימה של ערכי טבלת Q עבור מצב נתון שמתאים לכל הפעולות האפשריות. אם הכניסה אינה קיימת בטבלת Q, נחזיר 0 כברירת מחדל.
כאן גם מגדירים פונקציה `qvalues()`, שמחזירה רשימת ערכי טבלת Q עבור סטייט נתון התואמת לכל הפעולות האפשריות. אם הכניסה אינה קיימת בטבלה, נחזיר 0 כברירת מחדל.
## בואו נתחיל בלמידת Q
## נתחיל ב-Q-Learning
עכשיו אנחנו מוכנים ללמד את פיטר לשמור על איזון!
עכשיו אנו מוכנים ללמד את פיטר לשמור על איזון!
1. ראשית, נגדיר כמה היפרפרמטרים: (קוד בלוק 10)
1. ראשית, נגדיר כמה היפר-פרמטרים: (קוד בלוק 10)
```python
# hyperparameters
# היפר-פרמטרים
alpha = 0.3
gamma = 0.9
epsilon = 0.90
```
כאן, `alpha` הוא **קצב הלמידה** שמגדיר באיזו מידה עלינו להתאים את הערכים הנוכחיים של טבלת Q בכל צעד. בשיעור הקודם התחלנו עם 1, ואז הפחתנו את `alpha` לערכים נמוכים יותר במהלך האימון. בדוגמה הזו נשמור אותו קבוע רק לשם הפשטות, ואתם יכולים להתנסות בהתאמת ערכי `alpha` מאוחר יותר.
כאן, `alpha` הוא **קצב הלמידה** שמגדיר באיזו מידה יש להתאים את הערכים הנוכחיים של טבלת Q בכל צעד. בשיעור הקודם התחלנו ב-1, ואז הורדנו את `alpha` לערכים נמוכים יותר במהלך האימון. בדוגמה זו נשמור אותו קבוע למען הפשטות, ואתם יכולים להתנסות בהמשך בהתאמות בערכי `alpha`.
`gamma` הוא **גורם ההנחה** שמראה באיזו מידה עלינו להעדיף תגמול עתידי על פני תגמול נוכחי.
`gamma` הוא **מקדם הנחה** שמראה באיזו מידה יש להעדיף תגמול עתידי על פני תגמול נוכחי.
`epsilon` הוא **גורם החקר/ניצול** שקובע האם עלינו להעדיף חקר על פני ניצול או להפך. באלגוריתם שלנו, נבחר באחוז `epsilon` מהמקרים את הפעולה הבאה לפי ערכי טבלת Q, ובשאר המקרים נבצע פעולה אקראית. זה יאפשר לנו לחקור אזורים במרחב החיפוש שמעולם לא ראינו קודם.
`epsilon` הוא **מקדם חקירה/ניצול** שמכתיב האם להעדיף חקירה או ניצול. באלגוריתם שלנו נבחר באחוז `epsilon` מהרצות את הפעולה על פי ערכי טבלת Q, ובשאר המקרים נבחר פעולה אקראית. זה יאפשר לנו לחקור אזורים במרחב החיפוש שמעולם לא ראינו.
מבחינת איזון - בחירת פעולה אקראית (חקר) תפעל כמו מכה אקראית בכיוון הלא נכון, והמוט יצטרך ללמוד כיצד להתאושש מה"טעויות" הללו.
בהקשר של שמירת איזון - בחירת פעולה אקראית (חקירה) תתנהל כמו מכה אקראית בכיוון הלא נכון, והקורה תצטרך ללמוד איך להתאושש מאיזון בעקבות "שגיאות" אלו.
### שיפור האלגוריתם
ניתן גם לבצע שני שיפורים באלגוריתם שלנו מהשיעור הקודם:
- **חישוב תגמול מצטבר ממוצע**, לאורך מספר סימולציות. נדפיס את ההתקדמות כל 5000 איטרציות, ונחשב את התגמול המצטבר הממוצע לאורך פרק הזמן הזה. המשמעות היא שאם נקבל יותר מ-195 נקודות - נוכל להחשיב את הבעיה כפתורה, באיכות גבוהה אף יותר מהנדרש.
נוכל גם לבצע שני שיפורים באלגוריתם שלנו מהשיעור הקודם:
- **חישוב התוצאה המצטברת הממוצעת המקסימלית**, `Qmax`, ונשמור את טבלת Q המתאימה לתוצאה זו. כאשר תריצו את האימון תבחינו שלפעמים התוצאה המצטברת הממוצעת מתחילה לרדת, ואנו רוצים לשמור את ערכי טבלת Q המתאימים למודל הטוב ביותר שנצפה במהלך האימון.
- **חישוב ממוצע תגמול מצטבר**, על פני מספר סימולציות. נדפיס את ההתקדמות כל 5000 איטרציות, ונחשב את ממוצע התגמול המצטבר לאורך תקופה זו. משמעות הדבר היא שאם נקבל יותר מ-195 נקודות - נוכל להחשיב את הבעיה כפתורה, באיכות אפילו גבוהה יותר מהנדרש.
- **חישוב ממוצע תוצאה מצטברת מקסימלית**, `Qmax`, ונשמור את טבלת Q המתאימה לתוצאה הזו. במהלך האימון תבחין שעיתים ממוצע התוצאה מתחיל לרדת, ואנחנו רוצים לשמור את ערכי טבלת Q שמתאימים למודל הטוב ביותר שנצפה במהלך האימון.
1. אספו את כל התגמולים המצטברים בכל סימולציה בוקטור `rewards` לצורך גרפיקה מאוחרת יותר. (קוד בלוק 11)
1. אסוף את כל תגמולי המצטברים בכל סימולציה במערך `rewards` לצורך הצגה גרפית מאוחרת יותר. (קוד בלוק 11)
```python
def probs(v,eps=1e-4):
@ -214,15 +234,15 @@ import random
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
# ניצול - בחר את הפעולה בהתאם להסתברויות בטבלת Q
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)
@ -231,7 +251,7 @@ import random
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:
@ -240,25 +260,25 @@ import random
cum_rewards=[]
```
מה שתשימו לב מהתוצאות הללו:
מה שאולי תבחין מהתוצאות האלה:
- **קרוב למטרה שלנו**. אנו קרובים מאוד להשגת המטרה של קבלת 195 תגמולים מצטברים לאורך 100+ ריצות רצופות של הסימולציה, או שאולי כבר השגנו אותה! גם אם נקבל מספרים קטנים יותר, עדיין איננו יודעים, מכיוון שאנו מחשבים ממוצע לאורך 5000 ריצות, ורק 100 ריצות נדרשות בקריטריון הרשמי.
- **קרוב למטרה שלנו**. אנו מאוד קרובים להשיג את המטרה של 195 תגמולים מצטברים על פני 100+ הרצות רצופות של הסימולציה, ואולי אפילו השגנו זאת! אפילו אם נקבל מספרים נמוכים יותר, לא נדע בוודאות, כי אנו מחשבים ממוצע על פני 5000 הרצות, ובקריטריון הרשמי נדרשות רק 100 הרצות.
- **התגמול מתחיל לרדת**. לפעמים התגמול מתחיל לרדת, מה שמצביע על כך שאולי "הורסים" ערכים שכבר נלמדו בטבלת Q עם אלו שמחמירים את המצב.
- **התגמול מתחיל לרדת**. לפעמים התגמול מתחיל לרדת, מה שאומר שאנו יכולים "להרוס" ערכים שכבר נלמדו בטבלת Q עם כאלה שמחמירים את המצב.
תופעה זו נראית בבהירות גדולה יותר אם נציג גרף של תהליך האימון.
תצפית זו ברורה יותר אם נגרף את התקדמות האימון.
## הצגת התקדמות האימון
## גרפיקה של התקדמות האימון
במהלך האימון, אספנו את ערך התגמול המצטבר בכל אחת מהאיטרציות לוקטור `rewards`. הנה איך זה נראה כשאנו מגרפים אותו מול מספר האיטרציות:
במהלך האימון אספנו את ערך התגמול המצטבר בכל איטרציה לתוך מערך `rewards`. כך זה נראה כאשר מציגים את הגרף כפונקציה של מספר האיטרציה:
```python
plt.plot(rewards)
```
![התקדמות גולמית](../../../../8-Reinforcement/2-Gym/images/train_progress_raw.png)
![התקדמות גולמית](../../../../translated_images/he/train_progress_raw.2adfdf2daea09c59.webp)
מהגרף הזה, לא ניתן להסיק דבר, מכיוון שבשל טבעו של תהליך האימון הסטוכסטי, אורך הסשנים משתנה מאוד. כדי להבין יותר את הגרף הזה, נוכל לחשב את **הממוצע הרץ** לאורך סדרת ניסויים, נאמר 100. ניתן לעשות זאת בנוחות באמצעות `np.convolve`: (קוד בלוק 12)
מהגרף הזה אי אפשר להסיק דבר, כי בשל אופיו הסטוכסטי של תהליך האימון, אורך סשני האימון משתנה במידה רבה. כדי להבין טוב יותר את הגרף, נחשב את ה**ממוצע הנע** על פני סדרה של ניסויים, נניח 100. זה נעשה בנוחות באמצעות `np.convolve`: (קוד בלוק 12)
```python
def running_average(x,window):
@ -267,21 +287,24 @@ def running_average(x,window):
plt.plot(running_average(rewards,100))
```
![התקדמות האימון](../../../../8-Reinforcement/2-Gym/images/train_progress_runav.png)
![התקדמות האימון](../../../../translated_images/he/train_progress_runav.c71694a8fa9ab359.webp)
## שינוי היפר-פרמטרים
כדי להפוך את הלמידה ליציבה יותר, כדאי להתאים חלק מההיפר-פרמטרים במהלך האימון. במיוחד:
- **לקצב הלמידה**, `alpha`, כדאי להתחיל בערכים קרובים ל-1, ואז להמשיך ולהוריד את הפרמטר. עם הזמן, נקבל ערכי הסתברות טובים בטבלת Q, ולכן נרצה להתאים אותם במעט ולא להחליף לגמרי בערכים חדשים.
## שינוי היפרפרמטרים
- **להגדיל את אפסילון**. כדאי להגדיל את `epsilon` בהדרגה, כדי לחקור פחות ולהנצל יותר. כנראה הגיוני להתחיל בערך נמוך של `epsilon`, ולהגיע כמעט ל-1.
כדי להפוך את הלמידה ליציבה יותר, הגיוני להתאים כמה מההיפרפרמטרים שלנו במהלך האימון. במיוחד:
> **משימה 1**: שחק עם ערכי ההיפר-פרמטרים וראה אם אתה יכול להשיג תגמול מצטבר גבוה יותר. האם אתה מגיע מעל 195?
- **עבור קצב הלמידה**, `alpha`, נוכל להתחיל עם ערכים קרובים ל-1, ואז להמשיך להקטין את הפרמטר. עם הזמן, נקבל ערכי הסתברות טובים בטבלת Q, ולכן עלינו להתאים אותם בעדינות, ולא להחליף לחלוטין בערכים חדשים.
- **הגדלת epsilon**. ייתכן שנרצה להגדיל את `epsilon` בהדרגה, כדי לחקור פחות ולנצל יותר. כנראה הגיוני להתחיל עם ערך נמוך של `epsilon`, ולהתקדם כמעט עד 1.
> **משימה 1**: נסו לשחק עם ערכי ההיפרפרמטרים ולבדוק אם אתם מצליחים להשיג תגמול מצטבר גבוה יותר. האם אתם מגיעים מעל 195?
> **משימה 2**: כדי לפתור את הבעיה באופן פורמלי, עליכם להגיע ל-195 תגמול ממוצע לאורך 100 ריצות רצופות. מדדו זאת במהלך האימון וודאו שהבעיה נפתרה באופן פורמלי!
> **משימה 2**: כדי לפתור את הבעיה באופן פורמלי, עליך לקבל ממוצע תגמולים של 195 לאורך 100 הרצות רצופות. מדוד זאת במהלך האימון וודא שפתרת את הבעיה באופן פורמלי!
## לראות את התוצאה בפעולה
יהיה מעניין לראות כיצד המודל המאומן מתנהג בפועל. בואו נריץ את הסימולציה ונשתמש באותה אסטרטגיית בחירת פעולות כמו במהלך האימון, על ידי דגימה בהתאם להתפלגות ההסתברות ב-Q-Table: (בלוק קוד 13)
יהיה מעניין לראות בפועל כיצד המודל המאומן מתנהג. בואו נפעיל את הסימולציה ונעקוב אחרי אסטרטגיית בחירת הפעולה כפי שבוצעה באימון, על ידי דגימה לפי התפלגות ההסתברות בטבלת Q: (בלוק קוד 13)
```python
obs = env.reset()
@ -295,30 +318,32 @@ while not done:
env.close()
```
אתם אמורים לראות משהו כזה:
אמור לראות משהו כזה:
![a balancing cartpole](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif)
![עגלת איזון פנדולום](../../../../8-Reinforcement/2-Gym/images/cartpole-balance.gif)
---
## 🚀אתגר
> **משימה 3**: כאן השתמשנו בעותק הסופי של Q-Table, שייתכן שאינו הטוב ביותר. זכרו ששמרנו את ה-Q-Table עם הביצועים הטובים ביותר במשתנה `Qbest`! נסו את אותו הדוגמה עם ה-Q-Table הטוב ביותר על ידי העתקת `Qbest` ל-`Q` ובדקו אם אתם מבחינים בהבדל.
> **משימה 3**: כאן השתמשנו בגירסה הסופית של טבלת Q, שייתכן ואינה הטובה ביותר. זכור ששמרנו את טבלת Q הביצועית הטובה ביותר במשתנה `Qbest`! נסה את אותו הדוגמה עם טבלת Q הטובה ביותר על ידי העתקת `Qbest` ל-`Q` וראה אם אתה מבחין בהבדל.
> **משימה 4**: כאן לא בחרנו את הפעולה הטובה ביותר בכל שלב, אלא דגמנו לפי התפלגות ההסתברות המתאימה. האם יהיה הגיוני יותר תמיד לבחור את הפעולה הטובה ביותר, עם הערך הגבוה ביותר ב-Q-Table? ניתן לעשות זאת באמצעות פונקציית `np.argmax` כדי למצוא את מספר הפעולה המתאים לערך הגבוה ביותר ב-Q-Table. יישמו את האסטרטגיה הזו ובדקו אם היא משפרת את האיזון.
> **משימה 4**: כאן לא בחרנו תמיד את הפעולה הטובה ביותר בכל שלב, אלא דגמנו על פי התפלגות ההסתברות המתאימה. האם הגיוני יותר לבחור תמיד את הפעולה הטובה ביותר, זו עם הערך הגבוה ביותר בטבלת Q? ניתן לעשות זאת על ידי שימוש בפונקציה `np.argmax` כדי למצוא את מספר הפעולה התואם לערך הגבוה ביותר בטבלת Q. יישם את האסטרטגיה הזו וראה אם זה משפר את האיזון.
## [שאלון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## [חידון לאחר ההרצאה](https://ff-quizzes.netlify.app/en/ml/)
## משימה
[אמן מכונית הרים](assignment.md)
[אמן רכב הרים](assignment.md)
## סיכום
למדנו כעת כיצד לאמן סוכנים להשיג תוצאות טובות רק על ידי מתן פונקציית תגמול שמגדירה את מצב המשחק הרצוי, ועל ידי מתן הזדמנות לחקור את מרחב החיפוש בצורה חכמה. יישמנו בהצלחה את אלגוריתם Q-Learning במקרים של סביבות דיסקרטיות ורציפות, אך עם פעולות דיסקרטיות.
למדנו כעת כיצד לאמן סוכנים להשיג תוצאות טובות על ידי מתן פונקציית תגמולים המגדירה את מצב המשחק הרצוי, ועל ידי מתן הזדמנות לחקור בחוכמה את מרחב החיפוש. יישמנו בהצלחה את אלגוריתם Q-Learning במקרים של סביבות דיסקרטיות ורציפות, אך עם פעולות דיסקרטיות.
חשוב גם ללמוד מצבים שבהם מצב הפעולה הוא רציף, וכאשר מרחב התצפית מורכב הרבה יותר, כמו התמונה ממסך משחק Atari. בבעיות אלו לעיתים קרובות נדרש להשתמש בטכניקות למידת מכונה חזקות יותר, כמו רשתות נוירונים, כדי להשיג תוצאות טובות. נושאים מתקדמים אלו הם הנושא של קורס הבינה המלאכותית המתקדם שלנו שיבוא בהמשך.
חשוב גם ללמוד מצבים בהם מצב הפעולה הוא רציף, וכאשר מרחב התצפית מורכב יותר, כמו בתמונה ממסך המשחק אתרי. בבעיות כאלה לעיתים קרובות נדרש להשתמש בטכניקות למידת מכונה מתקדמות יותר, כגון רשתות עצביות, כדי להשיג תוצאות טובות. נושאים מתקדמים אלה הם נושא הקורס המתקדם שלנו בבינה מלאכותית שבדרך.
---
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום מבוסס בינה מלאכותית [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש להיות מודעים לכך שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. עבור מידע קריטי, מומלץ להשתמש בתרגום מקצועי על ידי אדם. איננו נושאים באחריות לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**כתב ויתור**:
מסמך זה תורגם באמצעות שירות תרגום אוטומטי [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עלולים להכיל שגיאות או אי-דיוקים. יש להחשיב את המסמך המקורי בשפתו הטבעית כמקור הסמכות. למידע קריטי מומלץ להשתמש בתרגום מקצועי על ידי מתרגם אדם. אנו לא אחראים לכל אי-הבנה או פירוש שגוי הנובע מהשימוש בתרגום זה.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -24,8 +24,8 @@
"language_code": "nl"
},
"1-Introduction/3-fairness/README.md": {
"original_hash": "9a6b702d1437c0467e3c5c28d763dac2",
"translation_date": "2025-09-05T19:30:29+00:00",
"original_hash": "0f00d72169a0d37eecfd16d71e01700a",
"translation_date": "2026-07-14T03:49:28+00:00",
"source_file": "1-Introduction/3-fairness/README.md",
"language_code": "nl"
},
@ -54,8 +54,8 @@
"language_code": "nl"
},
"2-Regression/1-Tools/README.md": {
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
"translation_date": "2025-09-05T18:50:01+00:00",
"original_hash": "0b8635427b582d03ea4ab7089b93e505",
"translation_date": "2026-07-14T03:46:49+00:00",
"source_file": "2-Regression/1-Tools/README.md",
"language_code": "nl"
},
@ -72,8 +72,8 @@
"language_code": "nl"
},
"2-Regression/2-Data/README.md": {
"original_hash": "7c077988328ebfe33b24d07945f16eca",
"translation_date": "2025-09-05T18:54:08+00:00",
"original_hash": "a58b2c4d16c6b122643391745ac15af6",
"translation_date": "2026-07-14T03:47:44+00:00",
"source_file": "2-Regression/2-Data/README.md",
"language_code": "nl"
},
@ -89,6 +89,12 @@
"source_file": "2-Regression/2-Data/solution/Julia/README.md",
"language_code": "nl"
},
"2-Regression/2-Data/solution/notebook.ipynb": {
"original_hash": "96b95f8cf473481f2f371de8156f1571",
"translation_date": "2026-07-14T03:42:35+00:00",
"source_file": "2-Regression/2-Data/solution/notebook.ipynb",
"language_code": "nl"
},
"2-Regression/3-Linear/README.md": {
"original_hash": "8b776e731c35b171d316d01d0e7b1369",
"translation_date": "2026-04-26T20:04:09+00:00",
@ -457,7 +463,7 @@
},
"8-Reinforcement/1-QLearning/README.md": {
"original_hash": "911efd5e595089000cb3c16fce1beab8",
"translation_date": "2025-09-05T20:11:11+00:00",
"translation_date": "2026-07-14T03:48:40+00:00",
"source_file": "8-Reinforcement/1-QLearning/README.md",
"language_code": "nl"
},
@ -581,6 +587,19 @@
"source_file": "TROUBLESHOOTING.md",
"language_code": "nl"
},
"__translation_failures__": {
"sketchnotes/LICENSE.md": {
"original_hash": "fba3b94d88bfb9b81369b869a1e9a20f",
"source_file": "sketchnotes/LICENSE.md",
"language_code": "nl",
"failure_date": "2026-07-14T03:45:59+00:00",
"status": "failed",
"error_type": "TranslationIncompleteError",
"error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.",
"translator_version": "0.20.0",
"failure_policy_version": 1
}
},
"docs/_sidebar.md": {
"original_hash": "68dd06c685f6ce840e0acfa313352e7c",
"translation_date": "2025-09-05T19:19:44+00:00",

@ -1,155 +1,159 @@
# Machine Learning-oplossingen bouwen met verantwoorde AI
![Samenvatting van verantwoorde AI in Machine Learning in een sketchnote](../../../../sketchnotes/ml-fairness.png)
> Sketchnote door [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/)
# Het bouwen van Machine Learning-oplossingen met verantwoordelijke AI
![Samenvatting van verantwoordelijke AI in Machine Learning in een schetsnotitie](../../../../translated_images/nl/ml-fairness.ef296ebec6afc98a.webp)
> Schetsnotitie door [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Voor-college quiz](https://ff-quizzes.netlify.app/en/ml/)
## Introductie
In dit curriculum ontdek je hoe machine learning ons dagelijks leven beïnvloedt. Systemen en modellen spelen nu al een rol in dagelijkse besluitvormingsprocessen, zoals medische diagnoses, leninggoedkeuringen of het opsporen van fraude. Het is daarom belangrijk dat deze modellen goed functioneren en betrouwbare resultaten leveren. Net zoals bij elke softwaretoepassing kunnen AI-systemen niet aan verwachtingen voldoen of ongewenste uitkomsten hebben. Daarom is het essentieel om het gedrag van een AI-model te begrijpen en uit te leggen.
In dit lesprogramma begin je te ontdekken hoe machine learning onze dagelijkse levens kan en doet beïnvloeden. Zelfs nu al zijn systemen en modellen betrokken bij dagelijkse besluitvormingstaken, zoals diagnoses in de gezondheidszorg, leninggoedkeuringen of het opsporen van fraude. Het is dus belangrijk dat deze modellen goed functioneren om uitkomsten te bereiken die betrouwbaar zijn. Net als bij elke softwaretoepassing zullen AI-systemen verwachtingen niet altijd waarmaken of een ongewenst resultaat geven. Daarom is het essentieel om het gedrag van een AI-model te kunnen begrijpen en uitleggen.
Stel je voor wat er kan gebeuren als de gegevens die je gebruikt om deze modellen te bouwen bepaalde demografische gegevens missen, zoals ras, geslacht, politieke overtuiging, religie, of als ze deze disproportioneel vertegenwoordigen. Wat gebeurt er als de output van het model wordt geïnterpreteerd om een bepaalde demografische groep te bevoordelen? Wat zijn de gevolgen voor de toepassing? En wat gebeurt er als het model een nadelige uitkomst heeft en schadelijk is voor mensen? Wie is verantwoordelijk voor het gedrag van AI-systemen? Dit zijn enkele vragen die we in dit curriculum zullen verkennen.
Stel je voor wat er kan gebeuren als de data die je gebruikt om deze modellen te bouwen bepaalde demografische groepen mist, zoals ras, geslacht, politieke opvatting, religie, of die dergelijke groepen onevenredig vertegenwoordigt. Wat als de output van het model zo wordt geïnterpreteerd dat deze sommige demografische groepen bevoordeelt? Wat zijn de gevolgen voor de toepassing? Bovendien, wat gebeurt er wanneer het model een nadelige uitkomst heeft en schadelijk is voor mensen? Wie is verantwoordelijk voor het gedrag van het AI-systeem? Dit zijn enkele vragen die we in dit lesprogramma zullen verkennen.
In deze les leer je:
In deze les zul je:
- Het belang van eerlijkheid in machine learning en de schade die oneerlijkheid kan veroorzaken.
- Het verkennen van uitschieters en ongebruikelijke scenario's om betrouwbaarheid en veiligheid te waarborgen.
- Het belang van inclusieve systemen ontwerpen om iedereen te empoweren.
- Hoe cruciaal het is om de privacy en veiligheid van gegevens en mensen te beschermen.
- Het belang van een transparante aanpak om het gedrag van AI-modellen uit te leggen.
- Hoe verantwoordelijkheid essentieel is om vertrouwen in AI-systemen op te bouwen.
- Je bewust maken van het belang van eerlijkheid in machine learning en de aan eerlijkheid gerelateerde schaden.
- Vertrouwd raken met de praktijk van het onderzoeken van outliers en ongebruikelijke scenarios om betrouwbaarheid en veiligheid te waarborgen.
- Inzicht krijgen in de noodzaak om iedereen te versterken door inclusieve systemen te ontwerpen.
- Verkennen hoe belangrijk het is om de privacy en veiligheid van data en mensen te beschermen.
- Het belang zien van een open aanpak om het gedrag van AI-modellen uit te leggen.
- Bewust zijn van hoe verantwoordelijkheid essentieel is om vertrouwen in AI-systemen op te bouwen.
## Vereisten
## Vereiste voorkennis
Als vereiste, volg het "Responsible AI Principles" leerpad en bekijk de onderstaande video over dit onderwerp:
Als vereiste, doorloop je het Leertraject "Principes van Verantwoordelijke AI" en bekijk je de onderstaande video over dit onderwerp:
Leer meer over verantwoorde AI via dit [leerpad](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
Leer meer over Verantwoordelijke AI door dit [Leertraject](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott) te volgen.
[![Microsoft's Approach to Responsible AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft's Approach to Responsible AI")
[![Microsofts Benadering van Verantwoordelijke AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Microsoft's Approach to Responsible AI")
> 🎥 Klik op de afbeelding hierboven voor een video: Microsoft's Approach to Responsible AI
> 🎥 Klik op de afbeelding hierboven voor een video: Microsofts Benadering van Verantwoordelijke AI
## Eerlijkheid
AI-systemen moeten iedereen eerlijk behandelen en vermijden dat vergelijkbare groepen mensen verschillend worden beïnvloed. Bijvoorbeeld, wanneer AI-systemen advies geven over medische behandelingen, leningaanvragen of werkgelegenheid, moeten ze dezelfde aanbevelingen doen aan iedereen met vergelijkbare symptomen, financiële omstandigheden of professionele kwalificaties. Elk van ons draagt inherente vooroordelen met zich mee die onze beslissingen en acties beïnvloeden. Deze vooroordelen kunnen zichtbaar zijn in de gegevens die we gebruiken om AI-systemen te trainen. Dergelijke manipulatie kan soms onbedoeld gebeuren. Het is vaak moeilijk om bewust te weten wanneer je vooroordelen in gegevens introduceert.
AI-systemen moeten iedereen eerlijk behandelen en voorkomen dat vergelijkbare groepen mensen op verschillende manieren worden beïnvloed. Bijvoorbeeld, wanneer AI-systemen richtlijnen geven over medische behandelingen, leningaanvragen of werkgelegenheid, moeten ze aan iedereen met vergelijkbare symptomen, financiële omstandigheden of professionele kwalificaties dezelfde aanbevelingen doen. Wij mensen dragen allen aangeboren vooroordelen mee die onze beslissingen en acties beïnvloeden. Deze vooroordelen kunnen zichtbaar zijn in de data die we gebruiken om AI-systemen te trainen. Dergelijke manipulatie kan soms onbedoeld gebeuren. Het is vaak moeilijk bewust te weten wanneer je vooringenomenheid in data introduceert.
**"Oneerlijkheid"** omvat negatieve gevolgen, of "schade", voor een groep mensen, zoals die gedefinieerd in termen van ras, geslacht, leeftijd of handicapstatus. De belangrijkste vormen van schade gerelateerd aan eerlijkheid kunnen worden geclassificeerd als:
**“Oneerlijkheid”** omvat negatieve effecten, of “schade”, voor een groep mensen, bijvoorbeeld gedefinieerd op basis van ras, geslacht, leeftijd of handicapstatus. De belangrijkste aan eerlijkheid gerelateerde schaden kunnen worden ingedeeld als:
- **Toewijzing**, bijvoorbeeld als een geslacht of etniciteit wordt bevoordeeld boven een andere.
- **Kwaliteit van dienstverlening**. Als je gegevens traint voor één specifiek scenario, maar de werkelijkheid veel complexer is, leidt dit tot een slecht presterende dienst. Bijvoorbeeld een handzeepdispenser die mensen met een donkere huid niet lijkt te kunnen detecteren. [Referentie](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **Denigratie**. Het oneerlijk bekritiseren en labelen van iets of iemand. Bijvoorbeeld, een beeldlabeltechnologie die berucht is om het verkeerd labelen van afbeeldingen van mensen met een donkere huid als gorilla's.
- **Over- of ondervertegenwoordiging**. Het idee dat een bepaalde groep niet wordt gezien in een bepaald beroep, en elke dienst of functie die dat blijft promoten, draagt bij aan schade.
- **Stereotypering**. Het associëren van een bepaalde groep met vooraf toegewezen eigenschappen. Bijvoorbeeld, een taalvertalingssysteem tussen Engels en Turks kan onnauwkeurigheden hebben door woorden met stereotypische associaties met geslacht.
- **Toewijzing**, als bijvoorbeeld een geslacht of etniciteit boven een ander wordt bevoordeeld.
- **Kwaliteit van dienstverlening**. Als je data traint voor één specifiek scenario maar de werkelijkheid veel complexer is, leidt dat tot een slecht presterende dienst. Bijvoorbeeld een handzeepdispenser die mensen met een donkere huid niet lijkt te kunnen detecteren. [Referentie](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **Beschimpen**. Onrechtvaardig iets of iemand bekritiseren en labelen. Bijvoorbeeld, een technologie voor beeldherkenning die berucht is omdat die beelden van mensen met een donkere huid als gorillas labelde.
- **Over- of ondervertegenwoordiging**. Het idee is dat een bepaalde groep niet wordt gezien in een bepaald beroep, en elke dienst of functie die dat promoot draagt bij aan schade.
- **Stereotypering**. Een bepaalde groep associëren met vooropgezette eigenschappen. Bijvoorbeeld, een vertaalsysteem tussen Engels en Turks kan onnauwkeurigheden bevatten door stereotypische associaties met geslacht.
![vertaling naar Turks](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png)
![vertaling naar Turks](../../../../translated_images/nl/gender-bias-translate-en-tr.f185fd8822c2d437.webp)
> vertaling naar Turks
![vertaling terug naar Engels](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png)
![vertaling terug naar Engels](../../../../translated_images/nl/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp)
> vertaling terug naar Engels
Bij het ontwerpen en testen van AI-systemen moeten we ervoor zorgen dat AI eerlijk is en niet geprogrammeerd is om bevooroordeelde of discriminerende beslissingen te nemen, die ook verboden zijn voor mensen. Eerlijkheid garanderen in AI en machine learning blijft een complexe sociaal-technische uitdaging.
Bij het ontwerpen en testen van AI-systemen moeten we ervoor zorgen dat AI eerlijk is en niet geprogrammeerd is om bevooroordeelde of discriminerende beslissingen te nemen, iets wat mensen ook niet mogen doen. Het garanderen van eerlijkheid in AI en machine learning blijft een complexe sociotechnische uitdaging.
### Betrouwbaarheid en veiligheid
Om vertrouwen op te bouwen, moeten AI-systemen betrouwbaar, veilig en consistent zijn onder normale en onverwachte omstandigheden. Het is belangrijk om te weten hoe AI-systemen zich gedragen in verschillende situaties, vooral wanneer ze uitschieters zijn. Bij het bouwen van AI-oplossingen moet er veel aandacht worden besteed aan hoe om te gaan met een breed scala aan omstandigheden waarmee de AI-oplossingen te maken kunnen krijgen. Bijvoorbeeld, een zelfrijdende auto moet de veiligheid van mensen als topprioriteit stellen. Als gevolg hiervan moet de AI die de auto aandrijft rekening houden met alle mogelijke scenario's waarmee de auto te maken kan krijgen, zoals nacht, onweer of sneeuwstormen, kinderen die de straat oversteken, huisdieren, wegwerkzaamheden, enzovoort. Hoe goed een AI-systeem een breed scala aan omstandigheden betrouwbaar en veilig kan verwerken, weerspiegelt het niveau van anticipatie dat de datawetenschapper of AI-ontwikkelaar heeft overwogen tijdens het ontwerp of de test van het systeem.
Om vertrouwen op te bouwen, moeten AI-systemen betrouwbaar, veilig en consistent zijn onder normale en onvoorziene omstandigheden. Het is belangrijk om te weten hoe AI-systemen zich in verschillende situaties gedragen, vooral bij outliers. Bij het bouwen van AI-oplossingen moet er veel aandacht zijn voor het omgaan met een grote diversiteit aan omstandigheden die de AI-oplossingen kunnen tegenkomen. Bijvoorbeeld, een zelfrijdende auto moet de veiligheid van mensen als hoogste prioriteit hebben. Daardoor moet de AI van de auto alle mogelijke scenarios overwegen, zoals nacht, onweersbuien of sneeuwstormen, kinderen die de straat oversteken, huisdieren, wegwerkzaamheden enzovoorts. Hoe goed een AI-systeem een breed scala aan omstandigheden op betrouwbare en veilige wijze kan behandelen, weerspiegelt het niveau van anticipatie van de data scientist of AI-ontwikkelaar tijdens het ontwerp en testen van het systeem.
> [🎥 Klik hier voor een video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
### Inclusiviteit
AI-systemen moeten worden ontworpen om iedereen te betrekken en te empoweren. Bij het ontwerpen en implementeren van AI-systemen identificeren en aanpakken datawetenschappers en AI-ontwikkelaars potentiële barrières in het systeem die mensen onbedoeld kunnen uitsluiten. Bijvoorbeeld, er zijn 1 miljard mensen met een handicap wereldwijd. Met de vooruitgang van AI kunnen zij gemakkelijker toegang krijgen tot een breed scala aan informatie en kansen in hun dagelijks leven. Door de barrières aan te pakken, ontstaan er mogelijkheden om te innoveren en AI-producten te ontwikkelen met betere ervaringen die iedereen ten goede komen.
AI-systemen moeten zo worden ontworpen dat ze iedereen betrekken en versterken. Bij het ontwerpen en implementeren van AI-systemen identificeren en adresseren datawetenschappers en AI-ontwikkelaars potentiële barrières in het systeem die mensen onbedoeld kunnen uitsluiten. Er zijn bijvoorbeeld 1 miljard mensen met een handicap wereldwijd. Met de vooruitgang van AI kunnen ze gemakkelijker toegang krijgen tot een breed scala aan informatie en kansen in hun dagelijks leven. Door barrières weg te nemen, creëren we kansen om te innoveren en AI-producten te ontwikkelen met betere ervaringen die iedereen ten goede komen.
> [🎥 Klik hier voor een video: inclusiviteit in AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
### Veiligheid en privacy
### Beveiliging en privacy
AI-systemen moeten veilig zijn en de privacy van mensen respecteren. Mensen hebben minder vertrouwen in systemen die hun privacy, informatie of leven in gevaar brengen. Bij het trainen van machine learning-modellen vertrouwen we op gegevens om de beste resultaten te produceren. Daarbij moet rekening worden gehouden met de herkomst en integriteit van de gegevens. Bijvoorbeeld, zijn de gegevens door gebruikers ingediend of openbaar beschikbaar? Vervolgens, bij het werken met de gegevens, is het cruciaal om AI-systemen te ontwikkelen die vertrouwelijke informatie kunnen beschermen en aanvallen kunnen weerstaan. Naarmate AI steeds vaker voorkomt, wordt het beschermen van privacy en het beveiligen van belangrijke persoonlijke en zakelijke informatie steeds belangrijker en complexer. Privacy- en gegevensbeveiligingskwesties vereisen speciale aandacht voor AI, omdat toegang tot gegevens essentieel is voor AI-systemen om nauwkeurige en geïnformeerde voorspellingen en beslissingen over mensen te maken.
AI-systemen moeten veilig zijn en de privacy van mensen respecteren. Mensen hebben minder vertrouwen in systemen die hun privacy, informatie of leven in gevaar brengen. Bij het trainen van machine learning modellen vertrouwen we op data om de beste resultaten te leveren. Daarbij moet rekening worden gehouden met de herkomst van de data en de integriteit ervan. Bijvoorbeeld, is de data door gebruikers ingediend of is het openbaar beschikbaar? Vervolgens is het cruciaal om bij het werken met data AI-systemen te ontwikkelen die vertrouwelijke informatie kunnen beschermen en bestand zijn tegen aanvallen. Naarmate AI meer voorkomt, wordt het steeds belangrijker en complexer om privacy te beschermen en belangrijke persoonlijke en bedrijfsinformatie te beveiligen. Privacy- en dataveiligheidskwesties vergen speciale aandacht bij AI omdat toegang tot data essentieel is voor AI-systemen om nauwkeurige en geïnformeerde voorspellingen en beslissingen over mensen te maken.
> [🎥 Klik hier voor een video: veiligheid in AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
> [🎥 Klik hier voor een video: beveiliging in AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- Als industrie hebben we aanzienlijke vooruitgang geboekt op het gebied van privacy en veiligheid, grotendeels gestimuleerd door regelgeving zoals de GDPR (General Data Protection Regulation).
- Toch moeten we bij AI-systemen de spanning erkennen tussen de behoefte aan meer persoonlijke gegevens om systemen persoonlijker en effectiever te maken en privacy.
- Net zoals bij de geboorte van verbonden computers met het internet, zien we ook een enorme toename van het aantal beveiligingsproblemen met betrekking tot AI.
- Tegelijkertijd hebben we gezien dat AI wordt gebruikt om de beveiliging te verbeteren. Bijvoorbeeld, de meeste moderne antivirusprogramma's worden tegenwoordig aangedreven door AI-heuristieken.
- We moeten ervoor zorgen dat onze data science-processen harmonieus samengaan met de nieuwste privacy- en beveiligingspraktijken.
- Als industrie hebben we aanzienlijke vooruitgang geboekt op het gebied van privacy en beveiliging, mede aangedreven door regelgeving zoals de AVG (Algemene Verordening Gegevensbescherming).
- Toch moeten we bij AI-systemen erkennen dat er een spanning bestaat tussen de behoefte aan meer persoonlijke data om systemen persoonlijker en effectiever te maken en privacy.
- Net als bij de komst van verbonden computers met het internet, zien we ook een grote toename van beveiligingsproblemen gerelateerd aan AI.
- Tegelijkertijd wordt AI gebruikt om beveiliging te verbeteren. Bijvoorbeeld, de meeste moderne antivirus scanners worden tegenwoordig aangestuurd door AI-heuristieken.
- We moeten ervoor zorgen dat onze Data Science-processen harmonieus samengaan met de nieuwste privacy- en beveiligingspraktijken.
### Transparantie
AI-systemen moeten begrijpelijk zijn. Een cruciaal onderdeel van transparantie is het uitleggen van het gedrag van AI-systemen en hun componenten. Het verbeteren van het begrip van AI-systemen vereist dat belanghebbenden begrijpen hoe en waarom ze functioneren, zodat ze potentiële prestatieproblemen, veiligheids- en privacykwesties, vooroordelen, uitsluitingspraktijken of onbedoelde uitkomsten kunnen identificeren. We geloven ook dat degenen die AI-systemen gebruiken eerlijk en open moeten zijn over wanneer, waarom en hoe ze ervoor kiezen om ze in te zetten. Evenals de beperkingen van de systemen die ze gebruiken. Bijvoorbeeld, als een bank een AI-systeem gebruikt om zijn beslissingen over consumentenkredieten te ondersteunen, is het belangrijk om de uitkomsten te onderzoeken en te begrijpen welke gegevens de aanbevelingen van het systeem beïnvloeden. Overheden beginnen AI in verschillende sectoren te reguleren, dus datawetenschappers en organisaties moeten uitleggen of een AI-systeem voldoet aan de regelgeving, vooral wanneer er een ongewenste uitkomst is.
### Transparantie
AI-systemen moeten begrijpelijk zijn. Een cruciaal onderdeel van transparantie is het uitleggen van het gedrag van AI-systemen en hun componenten. Het verbeteren van het begrip van AI-systemen vereist dat belanghebbenden begrijpen hoe en waarom ze functioneren, zodat ze potentiële prestatieproblemen, veiligheids- en privacyzorgen, vooroordelen, uitsluitingspraktijken of onbedoelde uitkomsten kunnen identificeren. Wij vinden ook dat degenen die AI-systemen gebruiken eerlijk en open moeten zijn over wanneer, waarom en hoe ze ervoor kiezen die te implementeren. En over de beperkingen van de systemen die ze gebruiken. Bijvoorbeeld, als een bank een AI-systeem gebruikt om zijn consumentenleningsbeslissingen te ondersteunen, is het belangrijk de uitkomsten te onderzoeken en te begrijpen welke data de aanbevelingen van het systeem beïnvloeden. Overheden beginnen AI industriebreed te reguleren, dus datawetenschappers en organisaties moeten uitleggen of een AI-systeem aan de regelgeving voldoet, vooral als er een ongewenste uitkomst is.
> [🎥 Klik hier voor een video: transparantie in AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- Omdat AI-systemen zo complex zijn, is het moeilijk te begrijpen hoe ze werken en de resultaten te interpreteren.
- Dit gebrek aan begrip beïnvloedt de manier waarop deze systemen worden beheerd, operationeel worden gemaakt en gedocumenteerd.
- Dit gebrek aan begrip beïnvloedt nog belangrijker de beslissingen die worden genomen op basis van de resultaten die deze systemen produceren.
- Omdat AI-systemen zo complex zijn, is het moeilijk om te begrijpen hoe ze werken en de resultaten te interpreteren.
- Dit gebrek aan begrip beïnvloedt de manier waarop deze systemen worden beheerd, in productie worden genomen en worden gedocumenteerd.
- Dit gebrek aan begrip beïnvloedt vooral de beslissingen die worden genomen op basis van de uitkomsten van deze systemen.
### Verantwoordelijkheid
### Verantwoordingsplicht
De mensen die AI-systemen ontwerpen en inzetten moeten verantwoordelijk zijn voor hoe hun systemen functioneren. De behoefte aan verantwoordelijkheid is vooral cruciaal bij gevoelige technologieën zoals gezichtsherkenning. Onlangs is er een groeiende vraag naar gezichtsherkenningstechnologie, vooral van wetshandhavingsorganisaties die de potentie van de technologie zien bij toepassingen als het vinden van vermiste kinderen. Deze technologieën zouden echter ook kunnen worden gebruikt door een overheid om fundamentele vrijheden van hun burgers in gevaar te brengen, bijvoorbeeld door voortdurende surveillance van specifieke personen mogelijk te maken. Daarom moeten datawetenschappers en organisaties verantwoordelijk zijn voor de impact van hun AI-systeem op individuen of de samenleving.
De mensen die AI-systemen ontwerpen en implementeren moeten verantwoordelijk zijn voor hoe hun systemen functioneren. De behoefte aan verantwoordelijkheid is vooral cruciaal bij gevoelige technologieën zoals gezichtsherkenning. Recentelijk is er een groeiende vraag naar gezichtsherkenningstechnologie, vooral van wetshandhavingsorganisaties die het potentieel van de technologie zien in toepassingen zoals het vinden van vermiste kinderen. Deze technologieën kunnen echter mogelijk door een overheid worden gebruikt om de fundamentele vrijheden van haar burgers in gevaar te brengen, bijvoorbeeld door voortdurende surveillance van specifieke individuen mogelijk te maken. Daarom moeten datawetenschappers en organisaties verantwoordelijk zijn voor hoe hun AI-systeem individuen of de samenleving beïnvloedt.
[![Toonaangevende AI-onderzoeker waarschuwt voor massale surveillance via gezichtsherkenning](../../../../translated_images/nl/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft's Approach to Responsible AI")
[![Leading AI Researcher Warns of Mass Surveillance Through Facial Recognition](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Microsoft's Approach to Responsible AI")
> 🎥 Klik op de afbeelding hierboven voor een video: Waarschuwingen voor massale surveillance via gezichtsherkenning
> 🎥 Klik op de afbeelding hierboven voor een video: Waarschuwingen over massale surveillance door gezichtsherkenning
Uiteindelijk is een van de grootste vragen voor onze generatie, als de eerste generatie die AI in de samenleving brengt, hoe we kunnen waarborgen dat computers verantwoordelijk blijven tegenover mensen en hoe we kunnen garanderen dat de mensen die computers ontwerpen verantwoordelijk blijven tegenover iedereen.
Uiteindelijk is een van de grootste vragen voor onze generatie, als de eerste generatie die AI naar de samenleving brengt, hoe we ervoor kunnen zorgen dat computers verantwoordelijk blijven tegenover mensen en hoe we ervoor kunnen zorgen dat de mensen die computers ontwerpen verantwoordelijk blijven tegenover iedereen.
## Impactbeoordeling
## Impactanalyse
Voor het trainen van een machine learning model is het belangrijk een impactbeoordeling uit te voeren om het doel van het AI-systeem te begrijpen; wat het beoogde gebruik is; waar het wordt ingezet; en wie er met het systeem zal communiceren. Dit is nuttig voor beoordelaars of testers die het systeem evalueren, zodat zij weten welke factoren in acht genomen moeten worden bij het identificeren van potentiële risicos en verwachte gevolgen.
Voordat je een machine learning-model traint, is het belangrijk om een impactanalyse uit te voeren om het doel van het AI-systeem te begrijpen; wat het beoogde gebruik is; waar het zal worden ingezet; en wie met het systeem zal omgaan. Dit is nuttig voor beoordelaars of testers die het systeem evalueren om te weten welke factoren ze in overweging moeten nemen bij het identificeren van potentiële risico's en verwachte gevolgen.
De volgende aandachtsgebieden zijn belangrijk bij het uitvoeren van een impactbeoordeling:
De volgende gebieden zijn van belang bij het uitvoeren van een impactanalyse:
* **Nadelige impact op individuen**. Bewust zijn van beperkingen of vereisten, ongeoorloofd gebruik of bekende beperkingen die het systeem bij de prestaties belemmeren, is essentieel om te voorkomen dat het systeem op een manier wordt gebruikt die schade kan veroorzaken aan individuen.
* **Data vereisten**. Begrijpen hoe en waar het systeem data zal gebruiken stelt beoordelaars in staat om op de hoogte te zijn van eventuele datavereisten waar je rekening mee moet houden (bijv. AVG of HIPAA regelgeving). Daarnaast moet worden onderzocht of de bron of hoeveelheid data voldoende is voor training.
* **Samenvatting van impact**. Verzamel een lijst met mogelijke schaden die kunnen ontstaan door het gebruik van het systeem. Tijdens de gehele ML levenscyclus moet worden bekeken of de geïdentificeerde problemen worden gemitigeerd of aangepakt.
* **Toepasselijke doelstellingen** voor elk van de zes kernprincipes. Beoordeel of de doelstellingen van elk principe worden gehaald en of er hiaten zijn.
* **Nadelige impact op individuen**. Bewust zijn van eventuele beperkingen of vereisten, niet-ondersteund gebruik of bekende beperkingen die de prestaties van het systeem belemmeren, is essentieel om ervoor te zorgen dat het systeem niet op een manier wordt gebruikt die individuen kan schaden.
* **Gegevensvereisten**. Begrijpen hoe en waar het systeem gegevens zal gebruiken stelt beoordelaars in staat om eventuele gegevensvereisten te onderzoeken waar je rekening mee moet houden (bijv. GDPR- of HIPPA-gegevensreguleringen). Daarnaast moet worden onderzocht of de bron of hoeveelheid gegevens voldoende is voor training.
* **Samenvatting van impact**. Verzamel een lijst van potentiële schade die kan ontstaan door het gebruik van het systeem. Tijdens de ML-levenscyclus moet worden beoordeeld of de geïdentificeerde problemen worden aangepakt of opgelost.
* **Toepasbare doelen** voor elk van de zes kernprincipes. Beoordeel of de doelen van elk van de principes worden gehaald en of er hiaten zijn.
## Debuggen met verantwoorde AI
## Debuggen met verantwoordelijke AI
Net zoals bij het debuggen van een softwaretoepassing, is het debuggen van een AI-systeem een noodzakelijk proces om problemen in het systeem te identificeren en op te lossen. Er zijn veel factoren die ervoor kunnen zorgen dat een model niet presteert zoals verwacht of niet verantwoordelijk is. De meeste traditionele modelprestatiemetrics zijn kwantitatieve aggregaten van de prestaties van een model, die niet voldoende zijn om te analyseren hoe een model de principes van verantwoorde AI schendt. Bovendien is een machine learning-model een black box, wat het moeilijk maakt om te begrijpen wat de uitkomst beïnvloedt of uitleg te geven wanneer het een fout maakt. Later in deze cursus leren we hoe we het Responsible AI-dashboard kunnen gebruiken om AI-systemen te debuggen. Het dashboard biedt een holistisch hulpmiddel voor datawetenschappers en AI-ontwikkelaars om:
Net als bij debuggen van een softwareapplicatie is het debuggen van een AI-systeem een noodzakelijk proces om problemen in het systeem te identificeren en op te lossen. Er zijn veel factoren die kunnen beïnvloeden dat een model niet presteert zoals verwacht of verantwoord. De meeste traditionele modelprestatiemaatstaven zijn kwantitatieve totalen van de prestatie van een model, die onvoldoende zijn om te analyseren hoe een model de principes van verantwoordelijke AI schendt. Bovendien is een machine learning model een black box, wat het moeilijk maakt te begrijpen wat het resultaat drijft of uitleg te geven wanneer het een fout maakt. Later in deze cursus leren we hoe de Responsible AI dashboard kan worden gebruikt om AI-systemen te debuggen. Het dashboard biedt een holistisch instrument voor datawetenschappers en AI-ontwikkelaars om:
* **Foutanalyse**. Om de foutverdeling van het model te identificeren die de eerlijkheid of betrouwbaarheid van het systeem kan beïnvloeden.
* **Modeloverzicht**. Om te ontdekken waar er verschillen zijn in de prestaties van het model over verschillende datacohorten.
* **Gegevensanalyse**. Om de gegevensverdeling te begrijpen en eventuele potentiële vooroordelen in de gegevens te identificeren die kunnen leiden tot problemen met eerlijkheid, inclusiviteit en betrouwbaarheid.
* **Modelinterpretatie**. Om te begrijpen wat de voorspellingen van het model beïnvloedt. Dit helpt bij het uitleggen van het gedrag van het model, wat belangrijk is voor transparantie en verantwoordelijkheid.
* **Model overzicht**. Om te ontdekken waar er verschillen zijn in de prestaties van het model over data cohorts.
* **Data analyse**. Om de data distributie te begrijpen en mogelijke vooringenomenheid in de data te identificeren die kunnen leiden tot problemen met eerlijkheid, inclusiviteit en betrouwbaarheid.
* **Model interpreteerbaarheid**. Om te begrijpen wat de voorspellingen van het model beïnvloedt of drijft. Dit helpt bij het uitleggen van het gedrag van het model, wat belangrijk is voor transparantie en verantwoordelijkheid.
## 🚀 Uitdaging
Om schade te voorkomen voordat deze wordt geïntroduceerd, moeten we:
## 🚀 Uitdaging
Om te voorkomen dat schade wordt veroorzaakt, zouden we:
- een diversiteit aan achtergronden en perspectieven hebben onder de mensen die aan systemen werken
- investeren in datasets die de diversiteit van onze samenleving weerspiegelen
- betere methoden ontwikkelen gedurende de hele machine learning-levenscyclus om verantwoorde AI te detecteren en te corrigeren wanneer deze optreedt
- een diversiteit aan achtergronden en perspectieven moeten hebben bij de mensen die aan systemen werken.
- investeren in datasets die de diversiteit van onze samenleving weerspiegelen.
- betere methoden moeten ontwikkelen gedurende de hele machine learning levenscyclus om verantwoordelijke AI te detecteren en te corrigeren wanneer het voorkomt.
Denk na over real-life scenario's waarin de onbetrouwbaarheid van een model duidelijk is in modelbouw en gebruik. Wat moeten we nog meer overwegen?
Denk na over scenarios uit het echte leven waarin de onbetrouwbaarheid van een model duidelijk is tijdens het bouwen en gebruiken van modellen. Wat zouden we nog meer moeten overwegen?
## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/)
## [Na-college quiz](https://ff-quizzes.netlify.app/en/ml/)
## Review & Zelfstudie
In deze les heb je enkele basisconcepten geleerd over eerlijkheid en oneerlijkheid in machine learning.
Bekijk deze workshop om dieper in te gaan op de onderwerpen:
In deze les heb je enkele basisprincipes geleerd van de concepten eerlijkheid en oneerlijkheid in machine learning.
Bekijk deze workshop om dieper in de onderwerpen te duiken:
- Op zoek naar verantwoorde AI: Principes in de praktijk brengen door Besmira Nushi, Mehrnoosh Sameki en Amit Sharma
- In de zoektocht naar verantwoordelijke AI: Principes in praktijk brengen door Besmira Nushi, Mehrnoosh Sameki en Amit Sharma
[![Responsible AI Toolbox: Een open-source framework voor het bouwen van verantwoorde AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Een open-source framework voor het bouwen van verantwoorde AI")
[![Responsible AI Toolbox: An open-source framework for building responsible AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: An open-source framework for building responsible AI")
> 🎥 Klik op de afbeelding hierboven voor een video: RAI Toolbox: Een open-source framework voor het bouwen van verantwoorde AI door Besmira Nushi, Mehrnoosh Sameki en Amit Sharma
> 🎥 Klik op de afbeelding hierboven voor een video: RAI Toolbox: An open-source framework for building responsible AI door Besmira Nushi, Mehrnoosh Sameki, en Amit Sharma
Lees ook:
Lees ook:
- Microsofts RAI resource center: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- Microsofts RAI resource center: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- Microsofts FATE onderzoeksgroep: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
- Microsofts FATE research group: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
RAI Toolbox:
RAI Toolbox:
- [Responsible AI Toolbox GitHub repository](https://github.com/microsoft/responsible-ai-toolbox)
Lees meer over de tools van Azure Machine Learning om eerlijkheid te waarborgen:
Lees over Azure Machine Learning's tools om eerlijkheid te waarborgen:
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
## Opdracht
@ -157,5 +161,7 @@ Lees meer over de tools van Azure Machine Learning om eerlijkheid te waarborgen:
---
**Disclaimer**:
Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Disclaimer**:
Dit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,120 +1,121 @@
# Aan de slag met Python en Scikit-learn voor regressiemodellen
![Samenvatting van regressies in een sketchnote](../../../../sketchnotes/ml-regression.png)
![Samenvatting van regressies in een sketchnote](../../../../translated_images/nl/ml-regression.4e4f70e3b3ed446e.webp)
> Sketchnote door [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Pre-quiz voor de les](https://ff-quizzes.netlify.app/en/ml/)
## [Pre-lezing quiz](https://ff-quizzes.netlify.app/en/ml/)
> ### [Deze les is beschikbaar in R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
> ### [Deze les is ook beschikbaar in R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
## Introductie
In deze vier lessen ontdek je hoe je regressiemodellen kunt bouwen. We zullen binnenkort bespreken waarvoor deze modellen worden gebruikt. Maar voordat je iets doet, zorg ervoor dat je de juiste tools hebt om aan de slag te gaan!
In deze vier lessen ontdek je hoe je regressiemodellen bouwt. We zullen binnenkort bespreken waar deze voor dienen. Maar voordat je iets doet, zorg ervoor dat je de juiste tools klaar hebt staan om aan het proces te beginnen!
In deze les leer je:
In deze les leer je hoe je:
- Je computer configureren voor lokale machine learning-taken.
- Werken met Jupyter-notebooks.
- Scikit-learn gebruiken, inclusief installatie.
- Lineaire regressie verkennen met een praktische oefening.
- Je computer configureert voor lokale machine learning taken.
- Werkt met Jupyter Notebooks.
- Scikit-learn gebruikt, inclusief installatie.
- Lineaire regressie onderzoekt via een praktische oefening.
## Installaties en configuraties
[![ML voor beginners - Stel je tools in om Machine Learning-modellen te bouwen](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML voor beginners - Stel je tools in om Machine Learning-modellen te bouwen")
[![ML voor beginners - Stel je tools klaar om Machine Learning modellen te bouwen](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML voor beginners - Stel je tools klaar om Machine Learning modellen te bouwen")
> 🎥 Klik op de afbeelding hierboven voor een korte video over het configureren van je computer voor ML.
> 🎥 Klik op de afbeelding hierboven voor een korte video waarin wordt uitgelegd hoe je je computer configureert voor ML.
1. **Installeer Python**. Zorg ervoor dat [Python](https://www.python.org/downloads/) op je computer is geïnstalleerd. Je zult Python gebruiken voor veel data science- en machine learning-taken. De meeste computersystemen hebben al een Python-installatie. Er zijn ook handige [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) beschikbaar om de installatie voor sommige gebruikers te vergemakkelijken.
1. **Installeer Python**. Zorg ervoor dat [Python](https://www.python.org/downloads/) op je computer is geïnstalleerd. Je zult Python voor veel data science en machine learning taken gebruiken. De meeste computersystemen hebben al een Python-installatie. Er zijn ook handige [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) beschikbaar om de installatie voor sommige gebruikers te vergemakkelijken.
Sommige toepassingen van Python vereisen echter een specifieke versie van de software, terwijl andere een andere versie vereisen. Om deze reden is het handig om te werken binnen een [virtuele omgeving](https://docs.python.org/3/library/venv.html).
Sommige toepassingen van Python vereisen echter een specifieke versie van de software, terwijl andere een andere versie nodig hebben. Daarom is het handig om binnen een [virtuele omgeving](https://docs.python.org/3/library/venv.html) te werken.
2. **Installeer Visual Studio Code**. Zorg ervoor dat Visual Studio Code op je computer is geïnstalleerd. Volg deze instructies om [Visual Studio Code te installeren](https://code.visualstudio.com/) voor de basisinstallatie. Je gaat Python gebruiken in Visual Studio Code tijdens deze cursus, dus het kan handig zijn om je kennis op te frissen over hoe je [Visual Studio Code configureert](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) voor Python-ontwikkeling.
2. **Installeer Visual Studio Code**. Zorg dat je Visual Studio Code op je computer hebt geïnstalleerd. Volg deze instructies om [Visual Studio Code te installeren](https://code.visualstudio.com/) voor de basisinstallatie. Je gaat in deze cursus Python gebruiken in Visual Studio Code, dus het is handig om te leren hoe je [Visual Studio Code configureert](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) voor Python-ontwikkeling.
> Maak jezelf vertrouwd met Python door deze verzameling [Learn-modules](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) door te nemen.
> Maak je vertrouwd met Python door deze verzameling van [Learn modules](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott) door te lopen
>
> [![Python instellen met Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Python instellen met Visual Studio Code")
>
> 🎥 Klik op de afbeelding hierboven voor een video: Python gebruiken binnen VS Code.
3. **Installeer Scikit-learn** door de [instructies hier](https://scikit-learn.org/stable/install.html) te volgen. Omdat je Python 3 moet gebruiken, wordt aanbevolen om een virtuele omgeving te gebruiken. Let op, als je deze bibliotheek installeert op een M1 Mac, zijn er speciale instructies op de pagina hierboven.
3. **Installeer Scikit-learn** door [deze instructies](https://scikit-learn.org/stable/install.html) te volgen. Omdat je moet zorgen dat je Python 3 gebruikt, wordt aanbevolen een virtuele omgeving te gebruiken. Let op, als je deze bibliotheek op een M1 Mac installeert, staan er speciale instructies op de gelinkte pagina.
4. **Installeer Jupyter Notebook**. Je moet het [Jupyter-pakket installeren](https://pypi.org/project/jupyter/).
1. **Installeer Jupyter Notebook**. Je moet het [Jupyter-pakket installeren](https://pypi.org/project/jupyter/).
## Je ML-ontwikkelomgeving
Je gaat **notebooks** gebruiken om je Python-code te ontwikkelen en machine learning-modellen te maken. Dit type bestand is een veelgebruikt hulpmiddel voor datawetenschappers en kan worden herkend aan hun extensie `.ipynb`.
Je gaat **notebooks** gebruiken om je Python-code te ontwikkelen en machine learning modellen te maken. Dit type bestand is een veelgebruikt hulpmiddel voor datawetenschappers en ze zijn te herkennen aan hun achtervoegsel of extensie `.ipynb`.
Notebooks zijn een interactieve omgeving waarmee de ontwikkelaar zowel kan coderen als notities en documentatie rond de code kan toevoegen, wat erg handig is voor experimentele of onderzoeksgerichte projecten.
Notebooks zijn een interactieve omgeving die de ontwikkelaar toestaat om zowel code te schrijven als aantekeningen te maken en documentatie rond de code te schrijven, wat erg handig is voor experimentele of onderzoeksgerichte projecten.
[![ML voor beginners - Stel Jupyter Notebooks in om regressiemodellen te bouwen](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML voor beginners - Stel Jupyter Notebooks in om regressiemodellen te bouwen")
[![ML voor beginners - Stel Jupyter Notebooks in om met regressiemodellen te beginnen](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML voor beginners - Stel Jupyter Notebooks in om met regressiemodellen te beginnen")
> 🎥 Klik op de afbeelding hierboven voor een korte video over deze oefening.
> 🎥 Klik op de afbeelding hierboven voor een korte video waarin deze oefening wordt doorlopen.
### Oefening - werken met een notebook
### Oefening - werk met een notebook
In deze map vind je het bestand _notebook.ipynb_.
1. Open _notebook.ipynb_ in Visual Studio Code.
Een Jupyter-server zal starten met Python 3+. Je zult gebieden in de notebook vinden die kunnen worden `uitgevoerd`, stukjes code. Je kunt een codeblok uitvoeren door het pictogram te selecteren dat eruitziet als een afspeelknop.
Een Jupyter-server zal starten met Python 3+ actief. Je vindt delen van de notebook die je kunt `runnen`, stukjes code. Je kunt een codeblok uitvoeren door te klikken op het icoon dat eruitziet als een play-knop.
2. Selecteer het `md`-pictogram en voeg een beetje markdown toe, en de volgende tekst **# Welkom bij je notebook**.
1. Selecteer het `md`-icoon en voeg wat markdown toe, en de volgende tekst **# Welkom in je notebook**.
Voeg vervolgens wat Python-code toe.
3. Typ **print('hello notebook')** in het codeblok.
4. Selecteer de pijl om de code uit te voeren.
1. Typ **print('hello notebook')** in het codeblok.
1. Selecteer de pijl om de code uit te voeren.
Je zou de geprinte verklaring moeten zien:
Je zou het volgende geprinte statement moeten zien:
```output
hello notebook
```
![VS Code met een notebook geopend](../../../../2-Regression/1-Tools/images/notebook.jpg)
![VS Code met een open notebook](../../../../translated_images/nl/notebook.4a3ee31f396b8832.webp)
Je kunt je code afwisselen met opmerkingen om de notebook zelf te documenteren.
Je kunt je code afwisselen met commentaar om zo de notebook zelf te documenteren.
✅ Denk even na over hoe anders de werkomgeving van een webontwikkelaar is in vergelijking met die van een datawetenschapper.
✅ Denk eens na over hoe verschillend de werkomgeving van een webontwikkelaar is ten opzichte van die van een datawetenschapper.
## Aan de slag met Scikit-learn
Nu Python is ingesteld in je lokale omgeving en je vertrouwd bent met Jupyter-notebooks, laten we even vertrouwd raken met Scikit-learn (uitgesproken als `sci` zoals in `science`). Scikit-learn biedt een [uitgebreide API](https://scikit-learn.org/stable/modules/classes.html#api-ref) om je te helpen ML-taken uit te voeren.
Nu Python is geïnstalleerd in je lokale omgeving en je comfortabel bent met Jupyter Notebooks, laten we ook vertrouwd raken met Scikit-learn (uitgesproken als `sci` zoals in `science`). Scikit-learn biedt een [uitgebreide API](https://scikit-learn.org/stable/modules/classes.html#api-ref) om je te helpen bij ML-taken.
Volgens hun [website](https://scikit-learn.org/stable/getting_started.html): "Scikit-learn is een open source machine learning-bibliotheek die zowel supervised als unsupervised learning ondersteunt. Het biedt ook verschillende tools voor modelaanpassing, gegevensvoorverwerking, modelselectie en evaluatie, en vele andere hulpmiddelen."
Volgens hun [website](https://scikit-learn.org/stable/getting_started.html) is "Scikit-learn een open source machine learning bibliotheek die zowel supervised als unsupervised learning ondersteunt. Het biedt ook diverse tools voor model fitting, datavoorbewerking, modelselectie en evaluatie, en vele andere hulpmiddelen."
In deze cursus gebruik je Scikit-learn en andere tools om machine learning-modellen te bouwen voor wat we 'traditionele machine learning'-taken noemen. We hebben bewust neurale netwerken en deep learning vermeden, omdat deze beter worden behandeld in ons komende 'AI voor Beginners'-curriculum.
In deze cursus gebruik je Scikit-learn en andere tools om machine learning modellen te bouwen voor wat wij 'traditionele machine learning' taken noemen. We hebben bewust neurale netwerken en deep learning buiten beschouwing gelaten, aangezien deze beter worden behandeld in onze komende 'AI voor Beginners' curriculum.
Scikit-learn maakt het eenvoudig om modellen te bouwen en te evalueren voor gebruik. Het richt zich voornamelijk op het gebruik van numerieke gegevens en bevat verschillende kant-en-klare datasets die kunnen worden gebruikt als leermiddelen. Het bevat ook vooraf gebouwde modellen die studenten kunnen proberen. Laten we het proces verkennen van het laden van vooraf verpakte gegevens en het gebruik van een ingebouwde estimator om een eerste ML-model te maken met Scikit-learn met enkele basisgegevens.
Scikit-learn maakt het eenvoudig om modellen te bouwen en te evalueren voor gebruik. Het richt zich voornamelijk op het werken met numerieke data en bevat verschillende kant-en-klare datasets als leermaterialen. Het bevat ook voorgebouwde modellen die studenten kunnen uitproberen. Laten we het proces verkennen van het laden van voorverpakte data en het gebruiken van een ingebouwde estimator om het eerste ML-model met Scikit-learn te maken met wat basisdata.
## Oefening - je eerste Scikit-learn notebook
> Deze tutorial is geïnspireerd door het [lineaire regressievoorbeeld](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) op de website van Scikit-learn.
> Deze tutorial is geïnspireerd op het [lineaire regressie voorbeeld](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) op de website van Scikit-learn.
[![ML voor beginners - Je eerste lineaire regressieproject in Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML voor beginners - Je eerste lineaire regressieproject in Python")
> 🎥 Klik op de afbeelding hierboven voor een korte video over deze oefening.
> 🎥 Klik op de afbeelding hierboven voor een korte video waarin deze oefening wordt doorlopen.
In het bestand _notebook.ipynb_ dat bij deze les hoort, verwijder je alle cellen door op het 'prullenbak'-pictogram te drukken.
In het _notebook.ipynb_-bestand dat bij deze les hoort, maak je alle cellen leeg door op het 'prullenbak'-icoon te drukken.
In deze sectie werk je met een kleine dataset over diabetes die is ingebouwd in Scikit-learn voor leermiddelen. Stel je voor dat je een behandeling voor diabetespatiënten wilde testen. Machine learning-modellen kunnen je helpen bepalen welke patiënten beter op de behandeling zouden reageren, op basis van combinaties van variabelen. Zelfs een heel eenvoudig regressiemodel, wanneer gevisualiseerd, kan informatie tonen over variabelen die je zouden helpen je theoretische klinische proeven te organiseren.
In deze sectie werk je met een kleine dataset over diabetes, die ingebouwd is in Scikit-learn voor leerdoeleinden. Stel je voor dat je een behandeling voor diabetespatiënten wilt testen. Machine Learning modellen kunnen je helpen bepalen welke patiënten beter op de behandeling zouden reageren, op basis van combinaties van variabelen. Zelfs een heel eenvoudig regressiemodel kan, zodra het gevisualiseerd is, informatie tonen over variabelen die je kunnen helpen je theoretische klinische proeven te organiseren.
✅ Er zijn veel soorten regressiemethoden, en welke je kiest hangt af van het antwoord dat je zoekt. Als je de waarschijnlijke lengte van een persoon van een bepaalde leeftijd wilt voorspellen, gebruik je lineaire regressie, omdat je op zoek bent naar een **numerieke waarde**. Als je wilt ontdekken of een type keuken als veganistisch moet worden beschouwd, zoek je naar een **categorie-indeling**, dus gebruik je logistische regressie. Je leert later meer over logistische regressie. Denk eens na over enkele vragen die je aan gegevens kunt stellen, en welke van deze methoden meer geschikt zou zijn.
✅ Er zijn veel soorten regressiemethoden, en welke je kiest hangt af van het antwoord dat je zoekt. Wil je bijvoorbeeld de waarschijnlijke lengte voorspellen voor een persoon van een bepaalde leeftijd, dan gebruik je lineaire regressie, omdat je op zoek bent naar een **numerieke waarde**. Ben je geïnteresseerd in het ontdekken of een type keuken als veganistisch beschouwd moet worden, dan zoek je een **categorie-toewijzing** en gebruik je logistische regressie. Daar leer je later meer over. Denk eens na over vragen die je aan data kunt stellen en welke van deze methoden daar het meest geschikt voor zou zijn.
Laten we aan de slag gaan met deze taak.
Laten we aan deze taak beginnen.
### Bibliotheken importeren
Voor deze taak importeren we enkele bibliotheken:
- **matplotlib**. Dit is een handige [grafiektool](https://matplotlib.org/) en we zullen het gebruiken om een lijnplot te maken.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) is een handige bibliotheek voor het omgaan met numerieke gegevens in Python.
- **matplotlib**. Het is een handig [grafiekhulpmiddel](https://matplotlib.org/) en we gebruiken het om een lijngrafiek te maken.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) is een nuttige bibliotheek voor het omgaan met numerieke data in Python.
- **sklearn**. Dit is de [Scikit-learn](https://scikit-learn.org/stable/user_guide.html) bibliotheek.
Importeer enkele bibliotheken om je taken te ondersteunen.
Importeer enkele bibliotheken om je taken te helpen uitvoeren.
1. Voeg imports toe door de volgende code te typen:
1. Voeg de imports toe door de volgende code te typen:
```python
import matplotlib.pyplot as plt
@ -122,26 +123,26 @@ Importeer enkele bibliotheken om je taken te ondersteunen.
from sklearn import datasets, linear_model, model_selection
```
Hierboven importeer je `matplotlib`, `numpy` en je importeert `datasets`, `linear_model` en `model_selection` van `sklearn`. `model_selection` wordt gebruikt voor het splitsen van gegevens in trainings- en testsets.
Boven importeer je `matplotlib`, `numpy` en je importeert `datasets`, `linear_model` en `model_selection` uit `sklearn`. `model_selection` wordt gebruikt om data te splitsen in trainings- en testsets.
### De diabetes-dataset
### De diabetes dataset
De ingebouwde [diabetes-dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) bevat 442 gegevensmonsters over diabetes, met 10 kenmerkvariabelen, waaronder:
De ingebouwde [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) bevat 442 datapunten over diabetes, met 10 kenmerkenvariabelen, waarvan enkele zijn:
- leeftijd: leeftijd in jaren
- bmi: body mass index
- bp: gemiddelde bloeddruk
- s1 tc: T-cellen (een type witte bloedcellen)
✅ Deze dataset bevat het concept 'geslacht' als een kenmerkvariabele die belangrijk is voor onderzoek naar diabetes. Veel medische datasets bevatten dit type binaire classificatie. Denk eens na over hoe categorisaties zoals deze bepaalde delen van de bevolking kunnen uitsluiten van behandelingen.
✅ Deze dataset bevat het concept 'geslacht' als een kenmerkvariabele die belangrijk is voor onderzoek naar diabetes. Veel medische datasets bevatten dit soort binaire classificaties. Denk eens na over hoe dergelijke categorisaties sommige delen van een bevolking zouden kunnen uitsluiten van behandelingen.
Laad nu de X- en y-gegevens.
Laad nu de X- en y-data in.
> 🎓 Onthoud, dit is supervised learning, en we hebben een benoemde 'y'-doelvariabele nodig.
> 🎓 Onthoud, dit is supervised learning, en we hebben een benoemde 'y' target nodig.
In een nieuwe codecel laad je de diabetes-dataset door `load_diabetes()` aan te roepen. De input `return_X_y=True` geeft aan dat `X` een gegevensmatrix zal zijn en `y` de regressiedoelvariabele.
Laad in een nieuwe codecel de diabetes dataset door `load_diabetes()` aan te roepen. De invoer `return_X_y=True` geeft aan dat `X` een datamatrix zal zijn en `y` het regressiedoel.
1. Voeg enkele printopdrachten toe om de vorm van de gegevensmatrix en het eerste element ervan te tonen:
1. Voeg wat printcommando's toe om de vorm van de datamatrix en het eerste element te tonen:
```python
X, y = datasets.load_diabetes(return_X_y=True)
@ -149,9 +150,9 @@ In een nieuwe codecel laad je de diabetes-dataset door `load_diabetes()` aan te
print(X[0])
```
Wat je terugkrijgt als antwoord, is een tuple. Wat je doet, is de twee eerste waarden van de tuple toewijzen aan respectievelijk `X` en `y`. Leer meer [over tuples](https://wikipedia.org/wiki/Tuple).
Wat je terugkrijgt als antwoord is een tuple. Wat je doet is de twee eerste waarden van de tuple toewijzen aan respectievelijk `X` en `y`. Leer meer [over tuples](https://wikipedia.org/wiki/Tuple).
Je kunt zien dat deze gegevens 442 items bevatten, gevormd in arrays van 10 elementen:
Je kunt zien dat deze data 442 items bevat die zijn gevormd als arrays van 10 elementen:
```text
(442, 10)
@ -159,39 +160,39 @@ In een nieuwe codecel laad je de diabetes-dataset door `load_diabetes()` aan te
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ Denk eens na over de relatie tussen de gegevens en de regressiedoelvariabele. Lineaire regressie voorspelt relaties tussen kenmerk X en doelvariabele y. Kun je de [doelvariabele](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) voor de diabetes-dataset vinden in de documentatie? Wat demonstreert deze dataset, gezien die doelvariabele?
✅ Denk eens na over de relatie tussen de data en het regressiedoel. Lineaire regressie voorspelt relaties tussen kenmerk X en doelvariabele y. Kun je het [doel](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) voor de diabetes dataset in de documentatie vinden? Wat laat deze dataset zien, gezien dat doel?
2. Selecteer vervolgens een deel van deze dataset om te plotten door de 3e kolom van de dataset te selecteren. Je kunt dit doen door de `:`-operator te gebruiken om alle rijen te selecteren en vervolgens de 3e kolom te selecteren met behulp van de index (2). Je kunt de gegevens ook opnieuw vormgeven tot een 2D-array - zoals vereist voor het plotten - door `reshape(n_rows, n_columns)` te gebruiken. Als een van de parameters -1 is, wordt de overeenkomstige dimensie automatisch berekend.
2. Selecteer vervolgens een deel van deze dataset om te plotten door de 3e kolom van de dataset te kiezen. Je kunt dit doen door met het `:`-operator alle rijen te selecteren en dan de 3e kolom te selecteren met index (2). Je kunt de data ook herschikken naar een 2D-array, wat nodig is voor plotten, door `reshape(n_rows, n_columns)` te gebruiken. Als één van de parameters -1 is, wordt die dimensie automatisch berekend.
```python
X = X[:, 2]
X = X.reshape((-1,1))
```
✅ Print op elk moment de gegevens om de vorm ervan te controleren.
✅ Print op elk moment de data om de vorm te controleren.
3. Nu je gegevens klaar hebt om te plotten, kun je zien of een machine kan helpen een logische splitsing te bepalen tussen de cijfers in deze dataset. Om dit te doen, moet je zowel de gegevens (X) als de doelvariabele (y) splitsen in test- en trainingssets. Scikit-learn heeft een eenvoudige manier om dit te doen; je kunt je testgegevens op een bepaald punt splitsen.
3. Nu je data klaar is om geplot te worden, kun je kijken of een machine kan helpen een logische scheiding te bepalen tussen de getallen in deze dataset. Om dit te doen, moet je zowel de data (X) als het doel (y) splitsen in test- en trainingsets. Scikit-learn heeft hier een eenvoudige manier voor; je kunt je testdata op een gegeven punt splitsen.
```python
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
```
4. Nu ben je klaar om je model te trainen! Laad het lineaire regressiemodel en train het met je X- en y-trainingssets met behulp van `model.fit()`:
4. Nu ben je klaar om je model te trainen! Laad het lineaire regressiemodel en train het met je X en y trainingssets via `model.fit()`:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` is een functie die je vaak zult zien in ML-bibliotheken zoals TensorFlow.
`model.fit()` is een functie die je in veel ML-bibliotheken zoals TensorFlow zult zien
5. Maak vervolgens een voorspelling met behulp van testgegevens, met behulp van de functie `predict()`. Dit zal worden gebruikt om de lijn te tekenen tussen de gegevensgroepen.
5. Maak daarna een voorspelling met de testdata, met de functie `predict()`. Dit wordt gebruikt om de lijn te tekenen tussen de datagroepen
```python
y_pred = model.predict(X_test)
```
6. Nu is het tijd om de gegevens in een plot te tonen. Matplotlib is een zeer handig hulpmiddel voor deze taak. Maak een scatterplot van alle X- en y-testgegevens en gebruik de voorspelling om een lijn te tekenen op de meest geschikte plaats, tussen de gegevensgroepen van het model.
6. Nu is het tijd om de data te tonen in een grafiek. Matplotlib is een erg handig hulpmiddel hiervoor. Maak een spreidingsdiagram van alle X- en y-testdata, en gebruik de voorspelling om een lijn te tekenen op de meest geschikte plek, tussen de model-data-groepen.
```python
plt.scatter(X_test, y_test, color='black')
@ -202,22 +203,24 @@ In een nieuwe codecel laad je de diabetes-dataset door `load_diabetes()` aan te
plt.show()
```
![een scatterplot die datapunten rond diabetes toont](../../../../2-Regression/1-Tools/images/scatterplot.png)
✅ Denk eens na over wat hier gebeurt. Een rechte lijn loopt door veel kleine datapunten, maar wat doet die precies? Kun je zien hoe je deze lijn zou moeten kunnen gebruiken om te voorspellen waar een nieuw, onbekend datapunt zou moeten passen in relatie tot de y-as van de plot? Probeer in woorden uit te leggen wat het praktische nut van dit model is.
![een spreidingsdiagram met datapunten rond diabetes](../../../../translated_images/nl/scatterplot.ad8b356bcbb33be6.webp)
✅ Denk even na over wat hier gebeurt. Er loopt een rechte lijn door veel kleine datapunten, maar wat doet die lijn precies? Zie je hoe je deze lijn zou kunnen gebruiken om te voorspellen waar een nieuw, onbekend datapunt zou moeten passen in relatie tot de y-as van de plot? Probeer in woorden te vatten wat het praktische gebruik van dit model is.
Gefeliciteerd, je hebt je eerste lineaire regressiemodel gebouwd, er een voorspelling mee gemaakt en deze weergegeven in een plot!
Gefeliciteerd, je hebt je eerste lineaire regressiemodel gebouwd, een voorspelling ermee gemaakt, en deze weergegeven in een plot!
---
## 🚀Uitdaging
Plot een andere variabele uit deze dataset. Tip: bewerk deze regel: `X = X[:,2]`. Gezien de target van deze dataset, wat kun je ontdekken over de progressie van diabetes als ziekte?
## [Post-lecture quiz](https://ff-quizzes.netlify.app/en/ml/)
Plot een andere variabele uit deze dataset. Tip: bewerk deze regel: `X = X[:,2]`. Gezien het doel van deze dataset, wat kun je ontdekken over de progressie van diabetes als ziekte?
## [Quiz na de les](https://ff-quizzes.netlify.app/en/ml/)
## Review & Zelfstudie
In deze tutorial heb je gewerkt met eenvoudige lineaire regressie, in plaats van univariate of multivariate lineaire regressie. Lees wat meer over de verschillen tussen deze methoden, of bekijk [deze video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef).
In deze tutorial werkte je met eenvoudige lineaire regressie, in plaats van univariate of meervoudige lineaire regressie. Lees wat over de verschillen tussen deze methoden, of bekijk [deze video](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef)
Lees meer over het concept van regressie en denk na over wat voor soort vragen met deze techniek beantwoord kunnen worden. Volg [deze tutorial](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) om je begrip te verdiepen.
Lees meer over het concept regressie en denk na over wat voor soort vragen met deze techniek beantwoord kunnen worden. Volg deze [tutorial](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) om je begrip te verdiepen.
## Opdracht
@ -225,5 +228,7 @@ Lees meer over het concept van regressie en denk na over wat voor soort vragen m
---
**Disclaimer**:
Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Disclaimer**:
Dit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,62 +1,62 @@
# Bouw een regressiemodel met Scikit-learn: data voorbereiden en visualiseren
![Infographic over datavisualisatie](../../../../2-Regression/2-Data/images/data-visualization.png)
![Data visualisatie infographic](../../../../translated_images/nl/data-visualization.54e56dded7c1a804.webp)
Infographic door [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/en/ml/)
## [Pre-college quiz](https://ff-quizzes.netlify.app/en/ml/)
> ### [Deze les is beschikbaar in R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
> ### [Deze les is ook beschikbaar in R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
## Introductie
## Inleiding
Nu je beschikt over de tools die je nodig hebt om te beginnen met het bouwen van machine learning-modellen met Scikit-learn, ben je klaar om vragen te stellen over je data. Het is erg belangrijk om te leren hoe je de juiste vragen stelt om de mogelijkheden van je dataset optimaal te benutten.
Nu je de tools hebt geïnstalleerd die je nodig hebt om te beginnen met machine learning modelbouw in Scikit-learn, ben je klaar om vragen te stellen aan je data. Terwijl je met data werkt en ML-oplossingen toepast, is het heel belangrijk om te weten hoe je de juiste vraag stelt om het potentieel van je dataset goed te benutten.
In deze les leer je:
- Hoe je je data voorbereidt voor het bouwen van modellen.
- Hoe je je data voorbereidt voor modelbouw.
- Hoe je Matplotlib gebruikt voor datavisualisatie.
- Hoe je Seaborn gebruikt voor expressievere datavisualisatie.
## De juiste vraag stellen over je data
## Stel de juiste vraag aan je data
De vraag die je wilt beantwoorden, bepaalt welk type ML-algoritme je zult gebruiken. De kwaliteit van het antwoord dat je terugkrijgt, hangt sterk af van de aard van je data.
De vraag die je beantwoord wilt krijgen bepaalt welk type ML-algoritmen je zult gebruiken. En de kwaliteit van het antwoord dat je terugkrijgt hangt sterk af van de aard van je data.
Bekijk de [data](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) die voor deze les is verstrekt. Je kunt dit .csv-bestand openen in VS Code. Een snelle blik laat meteen zien dat er lege velden zijn en een mix van tekst en numerieke data. Er is ook een vreemde kolom genaamd 'Package' waarin de data varieert tussen 'sacks', 'bins' en andere waarden. De data is eigenlijk een beetje rommelig.
Bekijk eens de [data](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) die bij deze les hoort. Je kunt dit .csv-bestand openen in VS Code. Een snelle blik laat meteen zien dat er lege velden en een mix van tekst en numerieke gegevens zijn. Er is ook een vreemde kolom genaamd 'Package' waar de data een mix is van 'sacks', 'bins' en andere waarden. De data is eigenlijk een beetje rommelig.
[![ML voor beginners - Hoe een dataset analyseren en opschonen](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML voor beginners - Hoe een dataset analyseren en opschonen")
[![ML voor beginners - Hoe een dataset te analyseren en schoon te maken](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML voor beginners - Hoe een dataset te analyseren en schoon te maken")
> 🎥 Klik op de afbeelding hierboven voor een korte video over het voorbereiden van de data voor deze les.
Het is eigenlijk niet gebruikelijk om een dataset te krijgen die volledig klaar is om direct een ML-model mee te maken. In deze les leer je hoe je een ruwe dataset voorbereidt met standaard Python-bibliotheken. Je leert ook verschillende technieken om de data te visualiseren.
Het is niet heel gebruikelijk dat je een dataset krijgt die direct klaar is voor gebruik om een ML-model van te maken. In deze les leer je hoe je een ruwe dataset kunt voorbereiden met standaard Python-bibliotheken. Je leert ook verschillende technieken om de data te visualiseren.
## Casestudy: 'de pompoenmarkt'
In deze map vind je een .csv-bestand in de root `data`-map genaamd [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), dat 1757 regels data bevat over de pompoenmarkt, gegroepeerd per stad. Dit is ruwe data afkomstig van de [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) van het Amerikaanse ministerie van Landbouw.
In deze map vind je een .csv-bestand in de hoofdmap `data` genaamd [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) met 1757 regels data over de markt voor pompoenen, gegroepeerd per stad. Dit is ruwe data afkomstig van de [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) verspreid door het Amerikaanse Ministerie van Landbouw.
### Data voorbereiden
Deze data is openbaar beschikbaar. Het kan worden gedownload in veel afzonderlijke bestanden, per stad, van de USDA-website. Om te voorkomen dat er te veel afzonderlijke bestanden zijn, hebben we alle stadsdata samengevoegd in één spreadsheet. We hebben de data dus al een beetje _voorbereid_. Laten we nu eens beter naar de data kijken.
Deze data is publiek domein. Het kan per stad in veel losse bestanden van de USDA-website worden gedownload. Om niet te veel losse bestanden te hebben, hebben we alle staddata samengevoegd in één spreadsheet, daarmee hebben we de data dus al een beetje _voorbereid_. Laten we nu de data eens nader bekijken.
### De pompoendata - eerste conclusies
Wat valt je op aan deze data? Je hebt al gezien dat er een mix is van tekst, cijfers, lege velden en vreemde waarden die je moet interpreteren.
Welke vraag kun je stellen over deze data, met behulp van een regressietechniek? Wat dacht je van "Voorspel de prijs van een pompoen die te koop is in een bepaalde maand". Als je opnieuw naar de data kijkt, zijn er enkele wijzigingen die je moet aanbrengen om de datastructuur te creëren die nodig is voor deze taak.
Wat valt je op aan deze data? Je hebt al gezien dat er een mix is van teksten, cijfers, lege plekken en vreemde waarden die je moet begrijpen.
Welke vraag kun je aan deze data stellen met een regressietechniek? Wat dacht je van "Voorspel de prijs van een pompoen die te koop is in een bepaalde maand"? Als je nog eens naar de data kijkt, moet je enkele aanpassingen doen om de datastructuur geschikt te maken voor deze taak.
## Oefening - analyseer de pompoendata
Laten we [Pandas](https://pandas.pydata.org/) gebruiken (de naam staat voor `Python Data Analysis`), een zeer handige tool voor het vormgeven van data, om deze pompoendata te analyseren en voor te bereiden.
Laten we [Pandas](https://pandas.pydata.org/) gebruiken, (de naam staat voor `Python Data Analysis`), een handig hulpmiddel voor het vormgeven van data, om deze pompoendata te analyseren en voor te bereiden.
### Eerst, controleer op ontbrekende datums
### Controleer eerst op ontbrekende datums
Je moet eerst stappen ondernemen om te controleren op ontbrekende datums:
Je moet eerst stappen zetten om te controleren op ontbrekende datums:
1. Converteer de datums naar een maandformaat (dit zijn Amerikaanse datums, dus het formaat is `MM/DD/YYYY`).
2. Haal de maand uit de datum en plaats deze in een nieuwe kolom.
1. Zet de datums om naar een maandformaat (dit zijn Amerikaanse datums, de notatie is `MM/DD/YYYY`).
2. Haal de maand uit de datum en zet dit in een nieuwe kolom.
Open het _notebook.ipynb_-bestand in Visual Studio Code en importeer de spreadsheet in een nieuwe Pandas-dataframe.
Open het bestand _notebook.ipynb_ in Visual Studio Code en importeer de spreadsheet in een nieuwe Pandas dataframe.
1. Gebruik de functie `head()` om de eerste vijf rijen te bekijken.
1. Gebruik de `head()` functie om de eerste vijf rijen te bekijken.
```python
import pandas as pd
@ -72,22 +72,22 @@ Open het _notebook.ipynb_-bestand in Visual Studio Code en importeer de spreadsh
pumpkins.isnull().sum()
```
Er is ontbrekende data, maar misschien maakt dat niet uit voor de taak.
Er is data ontbreekt, maar misschien is dat niet erg voor de taak die je wilt doen.
1. Om je dataframe gemakkelijker te maken om mee te werken, selecteer je alleen de kolommen die je nodig hebt, met behulp van de `loc`-functie. Deze functie haalt een groep rijen (eerste parameter) en kolommen (tweede parameter) uit de originele dataframe. De uitdrukking `:` hieronder betekent "alle rijen".
1. Om het werken met je dataframe makkelijker te maken, selecteer alleen de kolommen die je nodig hebt, met de `loc` functie die uit de originele dataframe een groep rijen (als eerste parameter) en kolommen (als tweede parameter) haalt. In het voorbeeld hieronder betekent `:` "alle rijen".
```python
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.loc[:, columns_to_select]
```
### Vervolgens, bepaal de gemiddelde prijs van een pompoen
### Bepaal vervolgens de gemiddelde prijs van een pompoen
Denk na over hoe je de gemiddelde prijs van een pompoen in een bepaalde maand kunt bepalen. Welke kolommen zou je kiezen voor deze taak? Hint: je hebt 3 kolommen nodig.
Denk na over hoe je de gemiddelde prijs van een pompoen in een bepaalde maand kunt bepalen. Welke kolommen heb je daarvoor nodig? Tip: je hebt er 3 nodig.
Oplossing: neem het gemiddelde van de kolommen `Low Price` en `High Price` om de nieuwe kolom Price te vullen, en converteer de kolom Date zodat deze alleen de maand toont. Gelukkig is er volgens de bovenstaande controle geen ontbrekende data voor datums of prijzen.
Oplossing: neem het gemiddelde van de kolommen `Low Price` en `High Price` om een nieuwe kolom Price te vullen, en zet de kolom Date om zodat alleen de maand staat. Gelukkig, zoals hierboven gecheckt, ontbreken er geen datums of prijzen.
1. Om het gemiddelde te berekenen, voeg je de volgende code toe:
1. Voeg deze code toe om het gemiddelde te berekenen:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
@ -96,37 +96,37 @@ Oplossing: neem het gemiddelde van de kolommen `Low Price` en `High Price` om de
```
✅ Voel je vrij om data te printen die je wilt controleren met `print(month)`.
✅ Voel je vrij om data te printen met `print(month)` om het te controleren.
2. Kopieer nu je geconverteerde data naar een nieuwe Pandas-dataframe:
2. Kopieer je geconverteerde data naar een nieuwe Pandas dataframe:
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
Als je je dataframe print, zie je een schone, overzichtelijke dataset waarop je je nieuwe regressiemodel kunt bouwen.
Als je deze dataframe print, zie je een schone, nette dataset waarop je je regressiemodel kunt bouwen.
### Maar wacht! Er is iets vreemds hier
### Maar wacht! Hier is iets vreemds
Als je naar de kolom `Package` kijkt, zie je dat pompoenen in veel verschillende configuraties worden verkocht. Sommige worden verkocht in '1 1/9 bushel'-maten, andere in '1/2 bushel'-maten, sommige per pompoen, sommige per pond, en sommige in grote dozen met verschillende breedtes.
Als je kijkt naar de `Package` kolom, zie je dat pompoenen in allerlei soorten verpakkingen verkocht worden. Sommige worden verkocht in '1 1/9 bushel' maten, sommige in '1/2 bushel' maten, sommige per pompoen, sommige per pond, en sommige in grote dozen met verschillende breedtes.
> Pompoenen lijken erg moeilijk consistent te wegen
> Pompoenen lijken erg moeilijk consistent te wegen.
Als je in de originele data duikt, is het interessant dat alles met `Unit of Sale` gelijk aan 'EACH' of 'PER BIN' ook een `Package`-type heeft per inch, per bin, of 'each'. Pompoenen lijken erg moeilijk consistent te wegen, dus laten we ze filteren door alleen pompoenen te selecteren met de string 'bushel' in hun `Package`-kolom.
Als je dieper in de originele data duikt, is het interessant dat alles met `Unit of Sale` 'EACH' of 'PER BIN' ook het `Package` type per inch, per bin, of 'each' heeft. Pompoenen zijn kennelijk erg lastig om consistent te wegen, dus we gaan ze filteren door alleen pompoenen te selecteren met de string 'bushel' in de `Package` kolom.
1. Voeg een filter toe bovenaan het bestand, onder de initiële .csv-import:
1. Voeg bovenaan het bestand onder de CSV-import een filter toe:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
Als je de data nu print, zie je dat je alleen de ongeveer 415 rijen data krijgt die pompoenen per bushel bevatten.
Als je nu de data print, zie je dat je nu ongeveer 415 regels met pompoenen per bushel krijgt.
### Maar wacht! Er is nog iets dat je moet doen
### Maar wacht! Er is nog iets te doen
Heb je gemerkt dat de bushelhoeveelheid varieert per rij? Je moet de prijzen normaliseren zodat je de prijs per bushel toont. Doe wat wiskunde om dit te standaardiseren.
Heb je gemerkt dat het aantal bushel per regel verschilt? Je moet de prijzen normaliseren zodat je de prijs per bushel laat zien; doe daarom wat rekenwerk om dit te standaardiseren.
1. Voeg deze regels toe na het blok dat de nieuwe_pumpkins dataframe maakt:
1. Voeg deze regels toe na de code die de new_pumpkins dataframe maakt:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
@ -134,38 +134,38 @@ Heb je gemerkt dat de bushelhoeveelheid varieert per rij? Je moet de prijzen nor
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
```
✅ Volgens [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) hangt het gewicht van een bushel af van het type product, omdat het een volumemeting is. "Een bushel tomaten, bijvoorbeeld, zou 56 pond moeten wegen... Bladeren en groenten nemen meer ruimte in met minder gewicht, dus een bushel spinazie weegt slechts 20 pond." Het is allemaal behoorlijk ingewikkeld! Laten we ons niet druk maken over het maken van een bushel-naar-pond-conversie, en in plaats daarvan prijzen per bushel. Al deze studie van bushels pompoenen laat echter zien hoe belangrijk het is om de aard van je data te begrijpen!
✅ Volgens [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308) hangt het gewicht van een bushel af van het soort product, want het is een volumemaat. "Een bushel tomaten weegt bijvoorbeeld 56 pond... Bladeren en groente nemen meer ruimte in, maar wegen minder, dus een bushel spinazie weegt slechts 20 pond." Het is allemaal vrij ingewikkeld! We doen geen poging een bushel naar pond conversie te maken, maar prijzen puur per bushel. Deze studie over bushels pompoenen toont wel aan hoe belangrijk het is om de aard van je data goed te begrijpen!
Nu kun je de prijs per eenheid analyseren op basis van hun bushelmeting. Als je de data nog een keer print, zie je hoe het is gestandaardiseerd.
Nu kun je de prijs per eenheid analyseren gebaseerd op hun bushel-maat. Als je de data nogmaals print, zie je dat het gestandaardiseerd is.
✅ Heb je gemerkt dat pompoenen die per halve bushel worden verkocht erg duur zijn? Kun je achterhalen waarom? Hint: kleine pompoenen zijn veel duurder dan grote, waarschijnlijk omdat er veel meer van zijn per bushel, gezien de ongebruikte ruimte die wordt ingenomen door één grote holle taartpompoen.
✅ Heb je gemerkt dat pompoenen per half bushel erg duur zijn? Kun je bedenken waarom? Tip: kleine pompoenen zijn veel prijziger dan grote, waarschijnlijk omdat er meer kleine pompoenen in een bushel passen, gezien de ongebruikte ruimte die één grote holle pompoen inneemt.
## Visualisatiestrategieën
Een deel van de rol van een datawetenschapper is om de kwaliteit en aard van de data waarmee ze werken te demonstreren. Om dit te doen, maken ze vaak interessante visualisaties, zoals grafieken, diagrammen en plots, die verschillende aspecten van de data laten zien. Op deze manier kunnen ze visueel relaties en hiaten tonen die anders moeilijk te ontdekken zijn.
Een deel van het werk van een data scientist is het aantonen van de kwaliteit en aard van de data waarmee ze werken. Daartoe maken ze vaak interessante visualisaties, ofwel grafieken, diagrammen en charts die verschillende aspecten van de data laten zien. Zo kunnen ze visueel relaties en gaten tonen die anders moeilijk te ontdekken zijn.
[![ML voor beginners - Hoe data visualiseren met Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML voor beginners - Hoe data visualiseren met Matplotlib")
> 🎥 Klik op de afbeelding hierboven voor een korte video over het visualiseren van de data voor deze les.
> 🎥 Klik op de afbeelding hierboven voor een korte video over het visualiseren van data voor deze les.
Visualisaties kunnen ook helpen bij het bepalen van de meest geschikte machine learning-techniek voor de data. Een scatterplot die een lijn lijkt te volgen, geeft bijvoorbeeld aan dat de data een goede kandidaat is voor een lineaire regressieoefening.
Visualisaties kunnen ook helpen bepalen welke machine learning techniek het best bij de data past. Een scatterplot die een lijn volgt, bijvoorbeeld, geeft aan dat de data goed geschikt is voor een lineaire regressie.
Een datavisualisatiebibliotheek die goed werkt in Jupyter-notebooks is [Matplotlib](https://matplotlib.org/) (die je ook in de vorige les hebt gezien).
Een datavisualisatiebibliotheek die goed werkt in Jupyter notebooks is [Matplotlib](https://matplotlib.org/) (die je ook al in de vorige les zag).
> Krijg meer ervaring met datavisualisatie in [deze tutorials](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
> Verwerf meer ervaring met datavisualisatie via [deze tutorials](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
## Oefening - experimenteren met Matplotlib
## Oefening - experimenteer met Matplotlib
Probeer enkele basisplots te maken om de nieuwe dataframe die je net hebt gemaakt weer te geven. Wat zou een eenvoudige lijnplot laten zien?
Probeer eenvoudige grafieken te maken om de nieuwe dataframe die je zojuist hebt gemaakt weer te geven. Wat zou een basis lijngrafiek laten zien?
1. Importeer Matplotlib bovenaan het bestand, onder de Pandas-import:
1. Importeer Matplotlib bovenaan het bestand, onder de Pandas import:
```python
import matplotlib.pyplot as plt
```
1. Voer het hele notebook opnieuw uit om te verversen.
1. Voeg onderaan het notebook een cel toe om de data als een boxplot weer te geven:
1. Voeg onderaan het notebook een cel toe om de data als boxplot te maken:
```python
price = new_pumpkins.Price
@ -174,44 +174,121 @@ Probeer enkele basisplots te maken om de nieuwe dataframe die je net hebt gemaak
plt.show()
```
![Een scatterplot die de relatie tussen prijs en maand toont](../../../../2-Regression/2-Data/images/scatterplot.png)
![Een scatterplot die de relatie prijs tot maand toont](../../../../translated_images/nl/scatterplot.b6868f44cbd2051c.webp)
Is dit een nuttige plot? Verrast iets je eraan?
Is dit een nuttige grafiek? Verrast je iets eraan?
Het is niet bijzonder nuttig, omdat het alleen je data als een spreiding van punten in een bepaalde maand weergeeft.
Het is niet bijzonder nuttig, want het toont alleen je data verspreid in de maanden.
### Maak het nuttig
Om grafieken nuttige data te laten weergeven, moet je de data meestal op een bepaalde manier groeperen. Laten we proberen een plot te maken waarbij de y-as de maanden toont en de data de verdeling van de data laat zien.
Om inzichtelijke grafieken te krijgen, moet je meestal de gegevens groeperen. Laten we proberen een grafiek te maken waarbij de y-as de maanden laat zien, en de data de verdeling ervan toont.
1. Voeg een cel toe om een gegroepeerde staafdiagram te maken:
1. Voeg een cel toe om een gegroepeerde staafgrafiek te maken:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![Een staafdiagram die de relatie tussen prijs en maand toont](../../../../2-Regression/2-Data/images/barchart.png)
![Een staafgrafiek die de relatie prijs tot maand toont](../../../../translated_images/nl/barchart.a833ea9194346d76.webp)
Dit is een nuttigere datavisualisatie! Het lijkt erop dat de hoogste prijs voor pompoenen optreedt in september en oktober. Komt dit overeen met je verwachting? Waarom wel of niet?
## Oefening - experimenteer met Seaborn
Matplotlib is krachtig, maar het kan veel code vragen om een gepolijste grafiek te maken. [Seaborn](https://seaborn.pydata.org/) is een bibliotheek gebouwd _bovenop_ Matplotlib, ontworpen voor statistische datavisualisatie. Het werkt direct met Pandas dataframes, hanteert aantrekkelijke standaardstijlen en maakt het mogelijk informatieve grafieken met veel minder code te maken. Omdat Seaborn Matplotlib-objecten teruggeeft, kun je nog steeds alles wat je van Matplotlib weet gebruiken om het resultaat aan te passen.
> Als je Seaborn nog niet geïnstalleerd hebt, installeer het dan met `pip install seaborn`.
1. Importeer Seaborn bovenaan het notebook, onder de andere imports. Het wordt conventioneel geïmporteerd als `sns`:
```python
import seaborn as sns
```
### Scatterplots om relaties te tonen
Een groot deel van het verkennen van data vóór het bouwen van een model is het zoeken naar _relaties_ tussen variabelen. Een [scatterplot](https://nl.wikipedia.org/wiki/Scatterplot_(grafiek)) is daarvoor een van de beste hulpmiddelen: als de punten op een lijn lijken te vallen, zijn de twee variabelen mogelijk gecorreleerd, wat een goed teken is dat een lineair regressiemodel kan werken.
1. Maak de prijs-tot-maand scatterplot opnieuw, dit keer met Seaborns [`relplot()`](https://seaborn.pydata.org/generated/seaborn.relplot.html) (relationele plot), die direct met je dataframekolommen werkt:
```python
sns.relplot(x="Price", y="Month", data=new_pumpkins)
```
![Een Seaborn scatterplot die prijs tot maand relatie toont](../../../../translated_images/nl/relplot.a03837d8f0329cec.webp)
Let op hoe je de _kolomnamen_ en de dataframe doorgeeft, en Seaborn regelt automatisch de aslabels.
2. Je kunt overschakelen naar een lijngrafiek door `kind="line"` door te geven. Seaborn tekent zelfs een schaduwband die het betrouwbaarheidsinterval rond de lijn toont:
```python
sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins)
```
![Een Seaborn lijngrafiek die prijs tot maand relatie toont](../../../../translated_images/nl/lineplot.f9034ba47b1e30ee.webp)
Deze data is vrij ruisend, dus een lijngrafiek is hier niet de duidelijkste keuze — maar het laat zien hoe makkelijk je in Seaborn van grafiektype kunt wisselen.
### Staafgrafieken om verdelingen te tonen
Eerder groepeerde je de gegevens handmatig om een staafdiagram te maken met Matplotlib. Seaborns [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html) (categorische plot) kan de groepering en aggregatie voor je doen. Standaard toont `kind="bar"` het gemiddelde van elke categorie samen met een zwarte lijn die het betrouwbaarheidsinterval aangeeft.
1. Maak een staafdiagram van de gemiddelde prijs per maand:
```python
sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar")
```
![Een Seaborn staafdiagram dat de prijsverdeling per maand toont](../../../../translated_images/nl/catplot.e73fc35fdf96242b.webp)
Dit bevestigt wat je al zag met Matplotlib — prijzen pieken rond september en oktober — maar Seaborn visualiseert ook hoeveel de prijs _varieert_ binnen elke maand.
### Heatmaps om correlaties te tonen
Scatterplots vergelijken telkens twee variabelen. Wanneer je meerdere numerieke kolommen hebt, laat een [heatmap](https://en.wikipedia.org/wiki/Heat_map) je de sterkte van de relatie tussen _elk_ paar kolommen tegelijk zien. Dit is een gebruikelijke manier om te zien welke kenmerken het meest gecorreleerd zijn voordat je kiest wat je in een model stopt (en hetzelfde soort grafiek wordt later gebruikt om verwarringsmatrices in classificatie weer te geven).
1. Bouw een correlatiematrix met Pandas en teken deze daarna met Seaborns [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html). De optie `annot=True` toont de correlatiewaarden in elke cel:
```python
correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()
sns.heatmap(correlations, annot=True, cmap="coolwarm")
```
![Een Seaborn heatmap die correlaties tussen de numerieke kolommen toont](../../../../translated_images/nl/heatmap.bd98dce43b404c57.webp)
Waarden dichtbij `1` (of `-1`) betekenen dat de kolommen sterk _lineair_ gecorreleerd zijn. Merk op hoe `Low Price` en `High Price` bijna perfect gecorreleerd zijn. `Month` daarentegen toont slechts een zwakke lineaire correlatie met de prijs — ook al onthulde het staafdiagram hierboven een duidelijke seizoenspiek in september en oktober. Dat is een belangrijke les: de correlatiecoëfficiënt meet alleen _rechte-lijn_ relaties, dus kan seizoensgebonden of anderszins niet-lineaire patronen missen. ✅ Waarom is het nuttig om zowel een heatmap *als* grafieken zoals het staafdiagram te bekijken voordat je beslist welke kolommen je gebruikt?
### Matplotlib of Seaborn?
Beide bibliotheken zijn de moeite waard om te kennen:
- **Matplotlib** geeft je fijne controle over elk element van een grafiek en is de basis waar bijna elke andere Python-plotbibliotheek op bouwt.
- **Seaborn** biedt hoger-niveau functies en aantrekkelijke standaardinstellingen voor statistische grafieken, werkt rechtstreeks met dataframes, en is vaak sneller voor verkennende data-analyse.
Dit is een nuttigere datavisualisatie! Het lijkt erop dat de hoogste prijs voor pompoenen in september en oktober voorkomt. Voldoet dat aan je verwachting? Waarom wel of niet?
Een gangbare werkwijze is om Seaborn te gebruiken om snel je data te verkennen en daarna naar Matplotlib te schakelen als je de details moet aanpassen.
---
## 🚀Uitdaging
Verken de verschillende soorten visualisaties die Matplotlib biedt. Welke soorten zijn het meest geschikt voor regressieproblemen?
Verken de verschillende soorten visualisaties die Matplotlib en Seaborn bieden. Welke types zijn het meest geschikt voor regressieproblemen?
## [Quiz na de les](https://ff-quizzes.netlify.app/en/ml/)
## [Quiz na de lezing](https://ff-quizzes.netlify.app/en/ml/)
## Review & Zelfstudie
Bekijk de vele manieren om data te visualiseren. Maak een lijst van de verschillende beschikbare bibliotheken en noteer welke het beste zijn voor bepaalde soorten taken, bijvoorbeeld 2D-visualisaties versus 3D-visualisaties. Wat ontdek je?
Bekijk de vele manieren om data te visualiseren. Maak een lijst van de beschikbare bibliotheken en noteer welke het beste zijn voor bepaalde soorten taken, bijvoorbeeld 2D-visualisaties versus 3D-visualisaties. Wat ontdek je?
## Opdracht
[Visualisatie verkennen](assignment.md)
[Verkenning van visualisatie](assignment.md)
---
**Disclaimer**:
Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Disclaimer**:
Dit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -3,7 +3,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"## Lineaire regressie voor pompoenen - Les 2\n"
]
},
{
"cell_type": "code",
@ -220,6 +222,7 @@
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
"\n",
"pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
@ -383,18 +386,78 @@
"plt.ylabel(\"Pumpkin Price\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Visualiseren met Seaborn\n",
"\n",
"[Seaborn](https://seaborn.pydata.org/) is gebouwd bovenop Matplotlib en werkt direct met dataframes, wat het snel maakt om aantrekkelijke statistische grafieken te maken met zeer weinig code.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Spreidingsdiagrammen om relaties te tonen\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.relplot(x=\"Price\", y=\"Month\", data=new_pumpkins)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.relplot(x=\"Price\", y=\"Month\", kind=\"line\", data=new_pumpkins)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Staafdiagrammen om verdelingen te tonen\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
"source": [
"sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Disclaimer**: \nDit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n"
"### Heatmaps om correlaties te tonen\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()\n",
"sns.heatmap(correlations, annot=True, cmap=\"coolwarm\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Disclaimer**:\nDit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
@ -424,13 +487,7 @@
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "95726f0b8283628d5356a4f8eb8b4b76",
"translation_date": "2025-09-06T11:53:18+00:00",
"source_file": "2-Regression/2-Data/solution/notebook.ipynb",
"language_code": "nl"
}
"orig_nbformat": 2
},
"nbformat": 4,
"nbformat_minor": 2

@ -1,47 +1,47 @@
# Introductie tot Reinforcement Learning en Q-Learning
![Samenvatting van reinforcement in machine learning in een sketchnote](../../../../sketchnotes/ml-reinforcement.png)
![Samenvatting van reinforcement in machine learning in een sketchnote](../../../../translated_images/nl/ml-reinforcement.94024374d63348db.webp)
> Sketchnote door [Tomomi Imura](https://www.twitter.com/girlie_mac)
Reinforcement learning draait om drie belangrijke concepten: de agent, enkele toestanden, en een set acties per toestand. Door een actie uit te voeren in een bepaalde toestand, krijgt de agent een beloning. Stel je opnieuw het computerspel Super Mario voor. Jij bent Mario, je bevindt je in een level van het spel, naast een klifrand. Boven je hangt een munt. Jij als Mario, in een level, op een specifieke positie ... dat is jouw toestand. Eén stap naar rechts zetten (een actie) brengt je over de rand, wat je een lage numerieke score oplevert. Maar als je op de springknop drukt, scoor je een punt en blijf je in leven. Dat is een positieve uitkomst en zou je een positieve numerieke score moeten opleveren.
Reinforcement learning omvat drie belangrijke concepten: de agent, enkele toestanden, en een set acties per toestand. Door een actie uit te voeren in een bepaalde toestand, krijgt de agent een beloning. Stel je opnieuw het computerspel Super Mario voor. Jij bent Mario, je bevindt je in een spellevel, staand naast een afgrond. Boven je is een munt. Jij bent Mario, in een spellevel, op een specifieke positie ... dat is jouw toestand. Een stap naar rechts zetten (een actie) zou je over de rand doen vallen, en dat zou je een lage numerieke score geven. Maar als je op de springknop drukt, scoor je een punt en blijf je in leven. Dat is een positieve uitkomst en zou je een positieve numerieke score moeten opleveren.
Met behulp van reinforcement learning en een simulator (het spel) kun je leren hoe je het spel speelt om de beloning te maximaliseren, namelijk in leven blijven en zoveel mogelijk punten scoren.
Door gebruik te maken van reinforcement learning en een simulator (het spel), kun je leren hoe je het spel speelt om de beloning te maximaliseren, namelijk in leven blijven en zoveel mogelijk punten scoren.
[![Introductie tot Reinforcement Learning](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
[![Intro tot Reinforcement Learning](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
> 🎥 Klik op de afbeelding hierboven om Dmitry te horen praten over Reinforcement Learning
> 🎥 Klik op de afbeelding hierboven om Dmitry over Reinforcement Learning te horen praten
## [Pre-lecture quiz](https://ff-quizzes.netlify.app/en/ml/)
## [Pre-college quiz](https://ff-quizzes.netlify.app/en/ml/)
## Vereisten en Setup
In deze les gaan we experimenteren met wat code in Python. Je moet in staat zijn om de Jupyter Notebook-code uit deze les uit te voeren, ofwel op je computer of ergens in de cloud.
In deze les gaan we experimenteren met code in Python. Je zou in staat moeten zijn om de Jupyter Notebook-code van deze les uit te voeren, hetzij op je computer, hetzij ergens in de cloud.
Je kunt [het lesnotebook](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) openen en door deze les lopen om het op te bouwen.
Je kunt [de lesnotebook openen](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) en deze les doorlopen om te bouwen.
> **Opmerking:** Als je deze code vanuit de cloud opent, moet je ook het bestand [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) ophalen, dat wordt gebruikt in de notebook-code. Voeg het toe aan dezelfde map als het notebook.
> **Opmerking:** Als je deze code vanuit de cloud opent, moet je ook het bestand [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py) ophalen, dat in de notebookcode wordt gebruikt. Voeg het toe aan dezelfde map als de notebook.
## Introductie
In deze les verkennen we de wereld van **[Peter en de Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, geïnspireerd door een muzikaal sprookje van de Russische componist [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). We gebruiken **Reinforcement Learning** om Peter zijn omgeving te laten verkennen, smakelijke appels te verzamelen en de wolf te vermijden.
In deze les verkennen we de wereld van **[Peter en de Wolf](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, geïnspireerd door een muzikaal sprookje van een Russische componist, [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). We zullen **Reinforcement Learning** gebruiken om Peter zijn omgeving te laten verkennen, smakelijke appels te verzamelen en de wolf te vermijden.
**Reinforcement Learning** (RL) is een leertechniek waarmee we het optimale gedrag van een **agent** in een bepaalde **omgeving** kunnen leren door veel experimenten uit te voeren. Een agent in deze omgeving moet een **doel** hebben, gedefinieerd door een **beloningsfunctie**.
**Reinforcement Learning** (RL) is een leertechniek die ons in staat stelt optimaal gedrag van een **agent** in een bepaalde **omgeving** te leren door veel experimenten uit te voeren. Een agent in deze omgeving zou een **doel** moeten hebben, gedefinieerd door een **beloningsfunctie**.
## De omgeving
Voor de eenvoud beschouwen we Peters wereld als een vierkant bord van grootte `breedte` x `hoogte`, zoals dit:
Voor de eenvoud nemen we aan dat de wereld van Peter een vierkant bord is van grootte `breedte` x `hoogte`, zoals dit:
![Peters Omgeving](../../../../8-Reinforcement/1-QLearning/images/environment.png)
![Peter's Omgeving](../../../../translated_images/nl/environment.40ba3cb66256c93f.webp)
Elke cel op dit bord kan zijn:
Elke cel in dit bord kan zijn:
* **grond**, waarop Peter en andere wezens kunnen lopen.
* **water**, waarop je uiteraard niet kunt lopen.
* een **boom** of **gras**, een plek waar je kunt uitrusten.
* een **appel**, iets wat Peter graag zou vinden om zichzelf te voeden.
* een **boom** of **gras**, een plek waar je kunt rusten.
* een **appel**, die iets vertegenwoordigt dat Peter graag vindt om zichzelf te voeden.
* een **wolf**, die gevaarlijk is en vermeden moet worden.
Er is een apart Python-module, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), die de code bevat om met deze omgeving te werken. Omdat deze code niet belangrijk is voor het begrijpen van onze concepten, importeren we de module en gebruiken we deze om het voorbeeldbord te maken (codeblok 1):
Er is een aparte Python-module, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), die de code bevat om met deze omgeving te werken. Omdat deze code niet belangrijk is voor het begrijpen van onze concepten, importeren we de module en gebruiken deze om het voorbeeldbord te maken (codeblok 1):
```python
from rlboard import *
@ -52,63 +52,63 @@ m.randomize(seed=13)
m.plot()
```
Deze code zou een afbeelding van de omgeving moeten afdrukken die lijkt op de bovenstaande.
Deze code zou een afbeelding van de omgeving moeten printen die lijkt op de bovenstaande.
## Acties en beleid
In ons voorbeeld is Peters doel om een appel te vinden, terwijl hij de wolf en andere obstakels vermijdt. Om dit te doen, kan hij in principe rondlopen totdat hij een appel vindt.
In ons voorbeeld zou Peters doel zijn om een appel te vinden, terwijl hij de wolf en andere obstakels vermijdt. Hiervoor kan hij in principe rondlopen totdat hij een appel vindt.
Daarom kan hij op elke positie kiezen uit een van de volgende acties: omhoog, omlaag, links en rechts.
Daarom kan hij op elke positie kiezen tussen een van de volgende acties: omhoog, omlaag, links en rechts.
We definiëren die acties als een dictionary en koppelen ze aan paren van bijbehorende coördinatenwijzigingen. Bijvoorbeeld, naar rechts bewegen (`R`) zou overeenkomen met een paar `(1,0)`. (codeblok 2):
We definiëren deze acties als een woordenboek en koppelen ze aan paren van bijbehorende coördinatenveranderingen. Bijvoorbeeld, naar rechts bewegen (`R`) komt overeen met het paar `(1,0)`. (codeblok 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()) }
```
Samenvattend zijn de strategie en het doel van dit scenario als volgt:
Samengevat zijn de strategie en het doel van dit scenario als volgt:
- **De strategie**, van onze agent (Peter) wordt gedefinieerd door een zogenaamde **policy**. Een policy is een functie die de actie retourneert in een bepaalde toestand. In ons geval wordt de toestand van het probleem weergegeven door het bord, inclusief de huidige positie van de speler.
- **De strategie**, van onze agent (Peter) wordt gedefinieerd door een zogenaamde **policy**. Een policy is een functie die de actie retourneert bij een gegeven toestand. In ons geval wordt de toestand van het probleem gerepresenteerd door het bord, inclusief de huidige positie van de speler.
- **Het doel**, van reinforcement learning is uiteindelijk een goed beleid te leren dat ons in staat stelt het probleem efficiënt op te lossen. Als basislijn beschouwen we echter het eenvoudigste beleid, genaamd **random walk**.
- **Het doel** van reinforcement learning is uiteindelijk een goede policy te leren die ons in staat stelt het probleem efficiënt op te lossen. Als uitgangspunt nemen we de eenvoudigste policy, genaamd **random walk**.
## Random walk
Laten we eerst ons probleem oplossen door een random walk-strategie te implementeren. Bij random walk kiezen we willekeurig de volgende actie uit de toegestane acties, totdat we de appel bereiken (codeblok 3).
Laten we ons probleem eerst oplossen door een random walk strategie te implementeren. Bij random walk kiezen we willekeurig de volgende actie uit de toegestane acties, totdat we de appel bereiken (codeblok 3).
1. Implementeer de random walk met de onderstaande code:
1. Implementeer de random walk met onderstaande code:
```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
n = 0 # aantal stappen
# stel beginpositie in
if start_position:
m.human = start_position
else:
m.random_start()
while True:
if m.at() == Board.Cell.apple:
return n # success!
return n # succes!
if m.at() in [Board.Cell.wolf, Board.Cell.water]:
return -1 # eaten by wolf or drowned
return -1 # opgegeten door wolf of verdronken
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
m.move(a) # voer de daadwerkelijke beweging uit
break
n+=1
walk(m,random_policy)
```
De oproep naar `walk` zou de lengte van het bijbehorende pad moeten retourneren, wat kan variëren van de ene run tot de andere.
De aanroep naar `walk` zou de lengte van het bijbehorende pad moeten teruggeven, wat per uitvoering kan variëren.
1. Voer het walk-experiment een aantal keren uit (bijvoorbeeld 100) en druk de resulterende statistieken af (codeblok 4):
1. Voer het loopexperiment een aantal keer uit (zeg 100), en print de resulterende statistieken (codeblok 4):
```python
def print_statistics(policy):
@ -125,7 +125,7 @@ Laten we eerst ons probleem oplossen door een random walk-strategie te implement
print_statistics(random_policy)
```
Merk op dat de gemiddelde lengte van een pad ongeveer 30-40 stappen is, wat behoorlijk veel is, gezien het feit dat de gemiddelde afstand tot de dichtstbijzijnde appel ongeveer 5-6 stappen is.
Merk op dat de gemiddelde lengte van een pad rond de 30-40 stappen ligt, wat vrij veel is, gezien het feit dat de gemiddelde afstand naar de dichtstbijzijnde appel ongeveer 5-6 stappen is.
Je kunt ook zien hoe Peters beweging eruitziet tijdens de random walk:
@ -133,9 +133,9 @@ Laten we eerst ons probleem oplossen door een random walk-strategie te implement
## Beloningsfunctie
Om ons beleid intelligenter te maken, moeten we begrijpen welke bewegingen "beter" zijn dan andere. Om dit te doen, moeten we ons doel definiëren.
Om onze policy intelligenter te maken, moeten we begrijpen welke zetten "beter" zijn dan andere. Hiervoor moeten we ons doel definiëren.
Het doel kan worden gedefinieerd in termen van een **beloningsfunctie**, die een scorewaarde retourneert voor elke toestand. Hoe hoger het getal, hoe beter de beloningsfunctie. (codeblok 5)
Het doel kan worden gedefinieerd in termen van een **beloningsfunctie**, die voor elke toestand een scorewaarde teruggeeft. Hoe hoger het getal, hoe beter de beloningsfunctie. (codeblok 5)
```python
move_reward = -0.1
@ -154,39 +154,115 @@ def reward(m,pos=None):
return move_reward
```
Een interessant aspect van beloningsfuncties is dat in de meeste gevallen *we alleen een substantiële beloning krijgen aan het einde van het spel*. Dit betekent dat ons algoritme op de een of andere manier "goede" stappen moet onthouden die leiden tot een positieve beloning aan het einde, en hun belang moet vergroten. Evenzo moeten alle bewegingen die tot slechte resultaten leiden worden ontmoedigd.
Een interessant aspect van beloningsfuncties is dat in de meeste gevallen *we slechts een substantiële beloning krijgen aan het einde van het spel*. Dit betekent dat ons algoritme op de een of andere manier "goede" stappen die leiden tot een positieve beloning aan het einde moet onthouden en hun belang moet vergroten. Op dezelfde manier moeten alle zetten die tot slechte resultaten leiden worden ontmoedigd.
## Q-Learning
Een algoritme dat we hier zullen bespreken, heet **Q-Learning**. In dit algoritme wordt het beleid gedefinieerd door een functie (of een datastructuur) genaamd een **Q-Table**. Het registreert de "kwaliteit" van elke actie in een bepaalde toestand.
Een algoritme dat we hier zullen bespreken heet **Q-Learning**. Hierbij wordt de policy gedefinieerd door een functie (of datastructuur) genaamd een **Q-Table**. Deze registreert de "goede" waarde van elke actie in een gegeven toestand.
Het wordt een Q-Table genoemd omdat het vaak handig is om het weer te geven als een tabel of een multidimensionale array. Omdat ons bord afmetingen heeft van `breedte` x `hoogte`, kunnen we de Q-Table weergeven met behulp van een numpy-array met vorm `breedte` x `hoogte` x `len(actions)`: (codeblok 6)
Het wordt Q-Table genoemd omdat het vaak handig is om het te representeren als een tabel, of een multidimensionale array. Omdat ons bord dimensies `breedte` x `hoogte` heeft, kunnen we de Q-Table representeren met een numpy array met vorm `breedte` x `hoogte` x `len(actions)`: (codeblok 6)
```python
Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
```
Merk op dat we alle waarden van de Q-Table initialiseren met een gelijke waarde, in ons geval - 0.25. Dit komt overeen met het "random walk"-beleid, omdat alle bewegingen in elke toestand even goed zijn. We kunnen de Q-Table doorgeven aan de `plot`-functie om de tabel op het bord te visualiseren: `m.plot(Q)`.
Merk op dat we alle waarden van de Q-Table initialiseren met een gelijke waarde, in ons geval - 0.25. Dit komt overeen met de "random walk" policy, omdat alle zetten in elke toestand even goed zijn. We kunnen de Q-Table doorgeven aan de functie `plot` om de tabel op het bord te visualiseren: `m.plot(Q)`.
![Peters Omgeving](../../../../8-Reinforcement/1-QLearning/images/env_init.png)
![Peter's Omgeving](../../../../translated_images/nl/env_init.04e8f26d2d60089e.webp)
In het midden van elke cel staat een "pijl" die de voorkeursrichting van beweging aangeeft. Omdat alle richtingen gelijk zijn, wordt een stip weergegeven.
In het midden van elke cel bevindt zich een "pijl" die de voorkeurrichting van beweging aangeeft. Omdat alle richtingen gelijk zijn, wordt er een stip getoond.
Nu moeten we de simulatie uitvoeren, onze omgeving verkennen en een betere verdeling van Q-Table-waarden leren, waarmee we veel sneller het pad naar de appel kunnen vinden.
Nu moeten we de simulatie uitvoeren, onze omgeving verkennen, en een betere verdeling van Q-Table waarden leren, die ons in staat stelt het pad naar de appel veel sneller te vinden.
## Essentie van Q-Learning: Bellman-vergelijking
## Essentie van Q-Learning: Bellman Vergelijking
Zodra we beginnen te bewegen, heeft elke actie een bijbehorende beloning, d.w.z. we kunnen theoretisch de volgende actie selecteren op basis van de hoogste directe beloning. Echter, in de meeste toestanden zal de beweging ons doel om de appel te bereiken niet bereiken, en dus kunnen we niet onmiddellijk beslissen welke richting beter is.
Zodra we beginnen te bewegen, zal elke actie een bijbehorende beloning hebben, d.w.z. we kunnen theoretisch de volgende actie selecteren op basis van de hoogste onmiddellijke beloning. Maar in de meeste toestanden zal de zet ons doel om de appel te bereiken niet behalen, en kunnen we niet direct beslissen welke richting beter is.
> Onthoud dat het niet het directe resultaat is dat telt, maar eerder het uiteindelijke resultaat, dat we aan het einde van de simulatie zullen verkrijgen.
> Onthoud dat het niet het onmiddellijke resultaat is dat telt, maar het uiteindelijke resultaat, dat we verkrijgen aan het einde van de simulatie.
Om rekening te houden met deze vertraagde beloning, moeten we de principes van **[dynamisch programmeren](https://en.wikipedia.org/wiki/Dynamic_programming)** gebruiken, waarmee we ons probleem recursief kunnen benaderen.
Om rekening te houden met deze vertraagde beloning, moeten we de principes van **[dynamische programmering](https://en.wikipedia.org/wiki/Dynamic_programming)** gebruiken, die ons in staat stellen om het probleem recursief te benaderen.
Stel dat we nu in toestand *s* zijn en we willen naar de volgende toestand *s'* gaan. Door dit te doen, ontvangen we de directe beloning *r(s,a)*, gedefinieerd door de beloningsfunctie, plus een toekomstige beloning. Als we aannemen dat onze Q-Table correct de "aantrekkelijkheid" van elke actie weergeeft, dan zullen we in toestand *s'* een actie *a* kiezen die overeenkomt met de maximale waarde van *Q(s',a')*. Dus de best mogelijke toekomstige beloning die we in toestand *s* zouden kunnen krijgen, wordt gedefinieerd als `max`
Stel dat we nu in toestand *s* zijn, en we willen naar de volgende toestand *s'* gaan. Door dit te doen ontvangen we de onmiddellijke beloning *r(s,a)*, gedefinieerd door de beloningsfunctie, plus een toekomstige beloning. Als we veronderstellen dat onze Q-Table correct de "aantrekkelijkheid" van elke actie weerspiegelt, dan kiezen we in toestand *s'* een actie *a* die overeenkomt met de maximale waarde van *Q(s',a')*. Zo wordt de beste mogelijke toekomstige beloning die we in toestand *s* kunnen krijgen gedefinieerd als `max`<sub>a'</sub>*Q(s',a')* (maximaal hier wordt berekend over alle mogelijke acties *a'* in toestand *s'*).
## Controle van het beleid
Dit geeft de **Bellman-formule** om de waarde van de Q-Table in toestand *s*, gegeven actie *a*, te berekenen:
Aangezien de Q-Table de "aantrekkelijkheid" van elke actie in elke staat weergeeft, is het vrij eenvoudig om deze te gebruiken om efficiënte navigatie in onze wereld te definiëren. In het eenvoudigste geval kunnen we de actie selecteren die overeenkomt met de hoogste waarde in de Q-Table: (code block 9)
<img src="../../../../translated_images/nl/bellman-equation.7c0c4c722e5a6b7c.webp"/>
Hier is γ de zogenaamde **discount factor** die bepaalt in welke mate je de huidige beloning moet prefereerden boven de toekomstige beloning en omgekeerd.
## Leeralgoritme
Gegeven bovenstaande vergelijking, kunnen we nu pseudocode schrijven voor ons leeralgoritme:
* Initialiseer Q-Table Q met gelijke waarden voor alle toestanden en acties
* Stel leersnelheid α ← 1 in
* Herhaal simulatie vele keren
1. Start op een willekeurige positie
1. Herhaal
1. Selecteer een actie *a* in toestand *s*
2. Voer actie uit door naar nieuwe toestand *s'* te gaan
3. Als het einde-van-spel conditie is bereikt, of totale beloning te klein is - verlaat simulatie
4. Bereken beloning *r* in de nieuwe toestand
5. Update Q-Functie volgens Bellman vergelijking: *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ max<sub>a'</sub>Q(s',a'))*
6. *s* ← *s'*
7. Update de totale beloning en verlaag α.
## Exploit vs. explore
In bovenstaande algoritme hebben we niet gespecificeerd hoe we precies een actie moeten kiezen bij stap 2.1. Als we de actie willekeurig kiezen, zullen we de omgeving willekeurig **verkennen**, en is het vrij waarschijnlijk dat we vaak zullen sterven en gebieden ontdekken waar we normaal niet zouden komen. Een alternatief is om de Q-Table waarden al te **exploitën** die we al kennen, en daarom de beste actie (met hogere Q-Table waarde) te kiezen in toestand *s*. Dit voorkomt echter dat we andere toestanden verkennen, en het is waarschijnlijk dat we de optimale oplossing niet zullen vinden.
Dus is de beste aanpak om een balans te vinden tussen exploratie en exploitatie. Dit kan gedaan worden door de actie in toestand *s* te kiezen met waarschijnlijkheden evenredig aan de waarden in de Q-Table. Aan het begin, wanneer alle Q-Table waarden gelijk zijn, komt dit overeen met een willekeurige selectie, maar naarmate we meer leren over onze omgeving, zullen we waarschijnlijk meer de optimale route volgen terwijl we de agent af en toe toestaan het onontdekte pad te kiezen.
## Python implementatie
We zijn nu klaar om het leeralgoritme te implementeren. Voordat we dat doen, hebben we ook een functie nodig die willekeurige getallen in de Q-Table omzet in een vector van waarschijnlijkheden voor de bijbehorende acties.
1. Maak een functie `probs()`:
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
```
We voegen een paar `eps` toe aan de oorspronkelijke vector om deling door 0 te voorkomen in het begin, wanneer alle componenten van de vector identiek zijn.
Voer het leeralgoritme uit met 5000 experimenten, ook wel **epochs** genoemd: (codeblok 8)
```python
for epoch in range(5000):
# Kies beginpunt
m.random_start()
# Begin met reizen
n=0
cum_reward = 0
while True:
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
dpos = actions[a]
m.move(dpos,check_correctness=False) # we staan de speler toe zich buiten het bord te verplaatsen, wat de aflevering beëindigt
r = reward(m)
cum_reward += r
if r==end_reward or cum_reward < -1000:
lpath.append(n)
break
alpha = np.exp(-n / 10e5)
gamma = 0.5
ai = action_idx[a]
Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max())
n+=1
```
Na het uitvoeren van dit algoritme zou de Q-Table geüpdatet moeten zijn met waarden die de aantrekkelijkheid van verschillende acties in elke stap definiëren. We kunnen proberen de Q-Table te visualiseren door een vector te tekenen in elke cel die in de gewenste bewegingsrichting wijst. Voor eenvoud tekenen we een kleine cirkel in plaats van een pijlpunt.
<img src="../../../../translated_images/nl/learned.ed28bcd8484b5287.webp"/>
## Het beleid controleren
Omdat de Q-Table de "aantrekkelijkheid" van elke actie in elke toestand weergeeft, is het vrij eenvoudig om deze te gebruiken voor efficiënte navigatie in onze wereld. In het eenvoudigste geval kunnen we de actie kiezen die overeenkomt met de hoogste Q-Table waarde: (codeblok 9)
```python
def qpolicy_strict(m):
@ -198,17 +274,18 @@ def qpolicy_strict(m):
walk(m,qpolicy_strict)
```
> Als je de bovenstaande code meerdere keren probeert, merk je misschien dat deze soms "vastloopt" en dat je op de STOP-knop in het notebook moet drukken om het te onderbreken. Dit gebeurt omdat er situaties kunnen zijn waarin twee staten elkaar "aanwijzen" in termen van optimale Q-waarde, waardoor de agent eindeloos tussen die staten blijft bewegen.
> Als je de bovenstaande code meerdere keren probeert, merk je misschien dat het soms "hangt" en dat je op de STOP-knop in het notebook moet drukken om het te onderbreken. Dit gebeurt omdat er situaties kunnen zijn waarin twee toestanden "naar elkaar wijzen" in termen van optimale Q-waarde, waardoor de agent uiteindelijk tussen die toestanden blijft bewegen zonder einde.
## 🚀Uitdaging
> **Taak 1:** Pas de `walk`-functie aan om de maximale lengte van het pad te beperken tot een bepaald aantal stappen (bijvoorbeeld 100), en kijk hoe de bovenstaande code deze waarde van tijd tot tijd retourneert.
> **Taak 1:** Pas de `walk`-functie aan om de maximale lengte van het pad te beperken tot een bepaald aantal stappen (zeg 100), en bekijk hoe de bovenstaande code deze waarde van tijd tot tijd retourneert.
> **Taak 2:** Pas de `walk`-functie aan zodat deze niet terugkeert naar plaatsen waar hij eerder is geweest. Dit voorkomt dat `walk` in een lus terechtkomt, maar de agent kan nog steeds "vast" komen te zitten op een locatie waaruit hij niet kan ontsnappen.
> **Taak 2:** Pas de `walk`-functie aan zodat deze niet teruggaat naar plaatsen waar hij al eerder is geweest. Dit voorkomt dat `walk` blijft rondlopen, maar de agent kan wel nog steeds "gevangen" raken op een plek waaruit hij niet kan ontsnappen.
## Navigatie
Een betere navigatiebeleid zou het beleid zijn dat we tijdens de training hebben gebruikt, dat exploitatie en exploratie combineert. In dit beleid selecteren we elke actie met een bepaalde waarschijnlijkheid, evenredig aan de waarden in de Q-Table. Deze strategie kan er nog steeds toe leiden dat de agent terugkeert naar een positie die hij al heeft verkend, maar zoals je kunt zien in de onderstaande code, resulteert dit in een zeer kort gemiddeld pad naar de gewenste locatie (onthoud dat `print_statistics` de simulatie 100 keer uitvoert): (code block 10)
Een beter navigatiebeleid zou het beleid zijn dat we tijdens training gebruikten, dat exploitatie en exploratie combineert. Bij dit beleid selecteren we elke actie met een bepaalde waarschijnlijkheid, evenredig aan de waarden in de Q-Table. Deze strategie kan er nog steeds toe leiden dat de agent terugkeert naar een positie die hij al onderzocht heeft, maar zoals je kunt zien in de onderstaande code, resulteert het in een erg korte gemiddelde route naar de gewenste locatie (onthoud dat `print_statistics` de simulatie 100 keer uitvoert): (code block 10)
```python
def qpolicy(m):
@ -220,28 +297,32 @@ def qpolicy(m):
print_statistics(qpolicy)
```
Na het uitvoeren van deze code zou je een veel kleinere gemiddelde padlengte moeten krijgen dan voorheen, in de orde van 3-6.
Na het uitvoeren van deze code zou je een veel kortere gemiddelde padlengte moeten krijgen dan eerder, binnen het bereik van 3-6.
## Onderzoek naar het leerproces
Zoals we hebben vermeld, is het leerproces een balans tussen exploratie en het benutten van opgedane kennis over de structuur van de probleemruimte. We hebben gezien dat de resultaten van het leren (het vermogen om een agent te helpen een kort pad naar het doel te vinden) zijn verbeterd, maar het is ook interessant om te observeren hoe de gemiddelde padlengte zich gedraagt tijdens het leerproces:
Zoals we hebben genoemd, is het leerproces een balans tussen exploratie en exploitatie van opgedane kennis over de structuur van de probleemruimte. We hebben gezien dat de leerresultaten (het vermogen van een agent om een kort pad naar het doel te vinden) zijn verbeterd, maar het is ook interessant om te observeren hoe de gemiddelde padlengte zich gedraagt tijdens het leerproces:
<img src="../../../../translated_images/nl/lpathlen1.0534784add58d4eb.webp"/>
De leerresultaten kunnen als volgt worden samengevat:
De leerpunten kunnen worden samengevat als:
- **Gemiddelde padlengte neemt toe**. Wat we hier zien, is dat in het begin de gemiddelde padlengte toeneemt. Dit komt waarschijnlijk doordat we, wanneer we niets weten over de omgeving, geneigd zijn vast te lopen in slechte staten, zoals water of een wolf. Naarmate we meer leren en deze kennis beginnen te gebruiken, kunnen we de omgeving langer verkennen, maar we weten nog steeds niet goed waar de appels zijn.
- **De gemiddelde padlengte neemt toe**. Wat we hier zien is dat in het begin de gemiddelde padlengte toeneemt. Dit komt waarschijnlijk doordat wanneer we niets weten van de omgeving, we gemakkelijk vast kunnen komen te zitten in slechte toestanden, zoals water of wolf. Naarmate we meer leren en deze kennis toepassen, kunnen we de omgeving langer verkennen, maar we weten nog niet goed waar de appels liggen.
- **Padlengte neemt af naarmate we meer leren**. Zodra we genoeg leren, wordt het gemakkelijker voor de agent om het doel te bereiken, en de padlengte begint af te nemen. We staan echter nog steeds open voor exploratie, dus we wijken vaak af van het beste pad en verkennen nieuwe opties, waardoor het pad langer wordt dan optimaal.
- **Padlengte neemt af naarmate we meer leren**. Zodra we genoeg geleerd hebben, wordt het voor de agent makkelijker om het doel te bereiken, en begint de padlengte te dalen. We staan echter nog open voor exploratie, dus we wijken vaak af van het beste pad en verkennen nieuwe opties, waardoor het pad langer wordt dan optimaal.
- **Lengte neemt abrupt toe**. Wat we ook op deze grafiek zien, is dat op een bepaald moment de lengte abrupt toenam. Dit geeft de stochastische aard van het proces aan, en dat we op een bepaald moment de Q-Table-coëfficiënten kunnen "bederven" door ze te overschrijven met nieuwe waarden. Dit zou idealiter moeten worden geminimaliseerd door de leersnelheid te verlagen (bijvoorbeeld tegen het einde van de training passen we de Q-Table-waarden slechts met een kleine waarde aan).
- **Lengte neemt plotseling toe**. Wat we ook in deze grafiek zien is dat de lengte op een gegeven moment abrupt toenam. Dit wijst op het stochastische karakter van het proces, en dat we op een gegeven moment de Q-Table-waarden kunnen "bederven" doordat we ze overschrijven met nieuwe waarden. Dit zou idealiter moeten worden beperkt door het verlagen van het leerpercentage (bijvoorbeeld, tegen het einde van de training passen we de Q-Table-waarden slechts licht aan).
Over het algemeen is het belangrijk om te onthouden dat het succes en de kwaliteit van het leerproces sterk afhankelijk zijn van parameters, zoals leersnelheid, afname van de leersnelheid en de discontofactor. Deze worden vaak **hyperparameters** genoemd, om ze te onderscheiden van **parameters**, die we optimaliseren tijdens de training (bijvoorbeeld Q-Table-coëfficiënten). Het proces van het vinden van de beste hyperparameterwaarden wordt **hyperparameteroptimalisatie** genoemd, en dit verdient een apart onderwerp.
Over het algemeen is het belangrijk te onthouden dat het succes en de kwaliteit van het leerproces sterk afhangen van parameters zoals het leerpercentage, afname van het leerpercentage, en de discontovoet. Deze worden vaak **hyperparameters** genoemd, ter onderscheid van **parameters**, die we optimaliseren tijdens het trainen (bijvoorbeeld de Q-Table-waarden). Het proces van het vinden van de beste hyperparameterwaarden heet **hyperparameteroptimalisatie**, en verdient een apart onderwerp.
## [Quiz na de les](https://ff-quizzes.netlify.app/en/ml/)
## [Quiz na de lezing](https://ff-quizzes.netlify.app/en/ml/)
## Opdracht
[Een Meer Realistische Wereld](assignment.md)
## Opdracht
[Een meer realistische wereld](assignment.md)
---
**Disclaimer**:
Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we ons best doen om nauwkeurigheid te garanderen, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Disclaimer**:
Dit document is vertaald met behulp van de AI vertaaldienst [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u er rekening mee te houden dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -24,8 +24,8 @@
"language_code": "vi"
},
"1-Introduction/3-fairness/README.md": {
"original_hash": "9a6b702d1437c0467e3c5c28d763dac2",
"translation_date": "2025-09-05T19:31:55+00:00",
"original_hash": "0f00d72169a0d37eecfd16d71e01700a",
"translation_date": "2026-07-14T04:05:36+00:00",
"source_file": "1-Introduction/3-fairness/README.md",
"language_code": "vi"
},
@ -54,8 +54,8 @@
"language_code": "vi"
},
"2-Regression/1-Tools/README.md": {
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
"translation_date": "2025-09-05T18:51:21+00:00",
"original_hash": "0b8635427b582d03ea4ab7089b93e505",
"translation_date": "2026-07-14T04:03:00+00:00",
"source_file": "2-Regression/1-Tools/README.md",
"language_code": "vi"
},
@ -72,8 +72,8 @@
"language_code": "vi"
},
"2-Regression/2-Data/README.md": {
"original_hash": "7c077988328ebfe33b24d07945f16eca",
"translation_date": "2025-09-05T18:55:18+00:00",
"original_hash": "a58b2c4d16c6b122643391745ac15af6",
"translation_date": "2026-07-14T04:03:51+00:00",
"source_file": "2-Regression/2-Data/README.md",
"language_code": "vi"
},
@ -89,6 +89,12 @@
"source_file": "2-Regression/2-Data/solution/Julia/README.md",
"language_code": "vi"
},
"2-Regression/2-Data/solution/notebook.ipynb": {
"original_hash": "96b95f8cf473481f2f371de8156f1571",
"translation_date": "2026-07-14T03:42:56+00:00",
"source_file": "2-Regression/2-Data/solution/notebook.ipynb",
"language_code": "vi"
},
"2-Regression/3-Linear/README.md": {
"original_hash": "8b776e731c35b171d316d01d0e7b1369",
"translation_date": "2026-04-26T20:06:44+00:00",
@ -457,7 +463,7 @@
},
"8-Reinforcement/1-QLearning/README.md": {
"original_hash": "911efd5e595089000cb3c16fce1beab8",
"translation_date": "2025-09-05T20:13:42+00:00",
"translation_date": "2026-07-14T04:04:47+00:00",
"source_file": "8-Reinforcement/1-QLearning/README.md",
"language_code": "vi"
},
@ -581,6 +587,19 @@
"source_file": "TROUBLESHOOTING.md",
"language_code": "vi"
},
"__translation_failures__": {
"sketchnotes/LICENSE.md": {
"original_hash": "fba3b94d88bfb9b81369b869a1e9a20f",
"source_file": "sketchnotes/LICENSE.md",
"language_code": "vi",
"failure_date": "2026-07-14T04:01:32+00:00",
"status": "failed",
"error_type": "TranslationIncompleteError",
"error_message": "Markdown translation remained incomplete for chunk 1.1.1 of 'LICENSE.md', and the chunk could not be split further.",
"translator_version": "0.20.0",
"failure_policy_version": 1
}
},
"docs/_sidebar.md": {
"original_hash": "68dd06c685f6ce840e0acfa313352e7c",
"translation_date": "2025-09-05T19:20:06+00:00",

@ -1,159 +1,167 @@
# Xây dựng giải pháp Machine Learning với AI có trách nhiệm
![Tóm tắt về AI có trách nhiệm trong Machine Learning qua sketchnote](../../../../sketchnotes/ml-fairness.png)
# Xây dựng các giải pháp Machine Learning với AI có trách nhiệm
![Tóm tắt AI có trách nhiệm trong Machine Learning dưới dạng sketchnote](../../../../translated_images/vi/ml-fairness.ef296ebec6afc98a.webp)
> Sketchnote bởi [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Câu hỏi trước bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## [Trắc nghiệm trước bài học](https://ff-quizzes.netlify.app/en/ml/)
## Giới thiệu
Trong chương trình học này, bạn sẽ bắt đầu khám phá cách mà machine learning có thể và đang ảnh hưởng đến cuộc sống hàng ngày của chúng ta. Ngay cả hiện tại, các hệ thống và mô hình đã tham gia vào các nhiệm vụ ra quyết định hàng ngày, chẳng hạn như chẩn đoán y tế, phê duyệt khoản vay hoặc phát hiện gian lận. Vì vậy, điều quan trọng là các mô hình này phải hoạt động tốt để cung cấp kết quả đáng tin cậy. Giống như bất kỳ ứng dụng phần mềm nào, các hệ thống AI cũng có thể không đáp ứng được kỳ vọng hoặc tạo ra kết quả không mong muốn. Đó là lý do tại sao việc hiểu và giải thích hành vi của một mô hình AI là rất cần thiết.
Trong chương trình này, bạn sẽ bắt đầu khám phá cách mà machine learning có thể và đang ảnh hưởng đến cuộc sống hàng ngày của chúng ta. Ngay cả bây giờ, các hệ thống và mô hình đã tham gia vào các nhiệm vụ ra quyết định hàng ngày, như chẩn đoán y tế, phê duyệt khoản vay hoặc phát hiện gian lận. Vì vậy, việc các mô hình này hoạt động tốt để cung cấp kết quả đáng tin cậy là rất quan trọng. Giống như bất kỳ ứng dụng phần mềm nào, hệ thống AI cũng có thể không đáp ứng được kỳ vọng hoặc có kết quả không mong muốn. Đó là lý do tại sao điều quan trọng là phải có khả năng hiểu và giải thích hành vi của một mô hình AI.
Hãy tưởng tượng điều gì có thể xảy ra khi dữ liệu bạn sử dụng để xây dựng các mô hình này thiếu các nhóm nhân khẩu học nhất định, chẳng hạn như chủng tộc, giới tính, quan điểm chính trị, tôn giáo, hoặc đại diện không cân đối cho các nhóm nhân khẩu học đó. Điều gì xảy ra khi đầu ra của mô hình được diễn giải để ưu tiên một số nhóm nhân khẩu học? Hậu quả đối với ứng dụng là gì? Ngoài ra, điều gì xảy ra khi mô hình có kết quả bất lợi và gây hại cho con người? Ai sẽ chịu trách nhiệm cho hành vi của hệ thống AI? Đây là một số câu hỏi mà chúng ta sẽ khám phá trong chương trình học này.
Hãy tưởng tượng điều gì có thể xảy ra khi dữ liệu bạn sử dụng để xây dựng các mô hình này thiếu một số nhóm dân số nhất định, chẳng hạn như chủng tộc, giới tính, quan điểm chính trị, tôn giáo, hoặc đại diện không cân đối các nhóm dân số đó. Sẽ ra sao khi kết quả của mô hình bị diễn giải để ưu tiên một nhóm dân số nào đó? Hậu quả đối với ứng dụng là gì? Thêm vào đó, chuyện gì xảy ra khi mô hình có kết quả tiêu cực và gây hại cho con người? Ai sẽ chịu trách nhiệm về hành vi của hệ thống AI? Đây là một số câu hỏi mà chúng ta sẽ khám phá trong chương trình này.
Trong bài học này, bạn sẽ:
- Nâng cao nhận thức về tầm quan trọng của sự công bằng trong machine learning và các tác hại liên quan đến sự không công bằng.
- Làm quen với việc khám phá các trường hợp ngoại lệ và tình huống bất thường để đảm bảo độ tin cậy và an toàn.
- Hiểu về nhu cầu trao quyền cho mọi người bằng cách thiết kế các hệ thống toàn diện.
- Nâng cao nhận thức về tầm quan trọng của sự công bằng trong machine learning và các tác hại liên quan đến công bằng.
- Làm quen với việc khám phá các ngoại lệ và các kịch bản bất thường để đảm bảo độ tin cậy và an toàn.
- Hiểu về nhu cầu trao quyền cho mọi người bằng cách thiết kế các hệ thống bao gồm.
- Khám phá tầm quan trọng của việc bảo vệ quyền riêng tư và an ninh của dữ liệu và con người.
- Thấy được sự cần thiết của cách tiếp cận "hộp kính" để giải thích hành vi của các mô hình AI.
- Nhận thức rằng trách nhiệm là yếu tố thiết yếu để xây dựng niềm tin vào các hệ thống AI.
- Thấy được tầm quan trọng của cách tiếp cận hộp kính để giải thích hành vi của các mô hình AI.
- Nhận thức về tầm quan trọng của trách nhiệm giải trình để xây dựng niềm tin trong các hệ thống AI.
## Điều kiện tiên quyết
## Yêu cầu trước
Trước khi bắt đầu, hãy tham gia lộ trình học "Nguyên tắc AI có trách nhiệm" và xem video dưới đây về chủ đề này:
Là yêu cầu trước, vui lòng hoàn thành "Nguyên tắc AI có trách nhiệm" trong Hành trình Học tập và xem video dưới đây về chủ đề này:
Tìm hiểu thêm về AI có trách nhiệm qua [Lộ trình học](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
Tìm hiểu thêm về AI có trách nhiệm bằng cách theo dõi [Hành trình Học tập](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
[![Cách tiếp cận của Microsoft đối với AI có trách nhiệm](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Cách tiếp cận của Microsoft đối với AI có trách nhiệm")
[![Cách tiếp cận AI có trách nhiệm của Microsoft](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Cách tiếp cận AI có trách nhiệm của Microsoft")
> 🎥 Nhấp vào hình ảnh trên để xem video: Cách tiếp cận của Microsoft đối với AI có trách nhiệm
> 🎥 Nhấn vào hình trên để xem video: Cách tiếp cận AI có trách nhiệm của Microsoft
## Công bằng
Các hệ thống AI nên đối xử công bằng với mọi người và tránh ảnh hưởng đến các nhóm tương tự theo cách khác nhau. Ví dụ, khi các hệ thống AI cung cấp hướng dẫn về điều trị y tế, đơn xin vay vốn, hoặc việc làm, chúng nên đưa ra các khuyến nghị giống nhau cho mọi người có triệu chứng, hoàn cảnh tài chính, hoặc trình độ chuyên môn tương tự. Mỗi chúng ta, với tư cách là con người, đều mang theo những định kiến di truyền ảnh hưởng đến quyết định và hành động của mình. Những định kiến này có thể xuất hiện trong dữ liệu mà chúng ta sử dụng để huấn luyện các hệ thống AI. Đôi khi, sự thao túng này xảy ra một cách vô tình. Thường rất khó để nhận thức rõ ràng khi bạn đang đưa định kiến vào dữ liệu.
Hệ thống AI nên đối xử công bằng với mọi người và tránh ảnh hưởng đến các nhóm người tương tự theo các cách khác nhau. Ví dụ, khi hệ thống AI cung cấp hướng dẫn về điều trị y tế, hồ sơ vay vốn hoặc tuyển dụng, chúng nên đưa ra các khuyến nghị giống nhau cho tất cả mọi người có các triệu chứng, hoàn cảnh tài chính hoặc trình độ chuyên môn tương tự. Mỗi chúng ta, với tư cách là con người, mang trong mình những thiên kiến thừa kế ảnh hưởng đến quyết định và hành động của mình. Những thiên kiến này có thể hiển nhiên trong dữ liệu mà chúng ta sử dụng để huấn luyện các hệ thống AI. Việc thao túng như vậy đôi khi xảy ra một cách vô ý. Thường thì rất khó để nhận biết một cách có ý thức khi bạn đang thêm thiên kiến vào dữ liệu.
**“Sự không công bằng”** bao gồm các tác động tiêu cực, hay “tác hại”, đối với một nhóm người, chẳng hạn như những người được định nghĩa theo chủng tộc, giới tính, tuổi tác, hoặc tình trạng khuyết tật. Các tác hại chính liên quan đến sự không công bằng có thể được phân loại như sau:
**“Sự không công bằng”** bao gồm các tác động tiêu cực, hay “tác hại”, đối với một nhóm người, chẳng hạn như những người được xác định theo chủng tộc, giới tính, tuổi tác hoặc tình trạng khuyết tật. Các tác hại liên quan đến công bằng chính có thể được phân loại như:
- **Phân bổ**, nếu một giới tính hoặc dân tộc, chẳng hạn, được ưu tiên hơn nhóm khác.
- **Chất lượng dịch vụ**. Nếu bạn huấn luyện dữ liệu cho một kịch bản cụ thể nhưng thực tế phức tạp hơn nhiều, điều này dẫn đến dịch vụ hoạt động kém. Ví dụ, một máy phân phối xà phòng không thể nhận diện người có làn da tối màu. [Tham khảo](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **Phỉ báng**. Chỉ trích và gán nhãn không công bằng cho một thứ hoặc một người. Ví dụ, công nghệ gán nhãn hình ảnh từng gán nhãn sai hình ảnh của người da tối màu là khỉ đột.
- **Đại diện quá mức hoặc thiếu đại diện**. Ý tưởng rằng một nhóm nhất định không được nhìn thấy trong một nghề nghiệp nào đó, và bất kỳ dịch vụ hoặc chức năng nào tiếp tục thúc đẩy điều đó đều góp phần gây hại.
- **Định kiến**. Gắn một nhóm nhất định với các thuộc tính được gán trước. Ví dụ, một hệ thống dịch ngôn ngữ giữa tiếng Anh và tiếng Thổ Nhĩ Kỳ có thể gặp sai sót do các từ có liên kết định kiến với giới tính.
- **Phân bổ**, nếu một giới tính hoặc dân tộc nào đó được ưu tiên hơn những người khác.
- **Chất lượng dịch vụ**. Nếu bạn huấn luyện dữ liệu cho một kịch bản cụ thể nhưng thực tế phức tạp hơn nhiều, dẫn đến dịch vụ hoạt động kém. Ví dụ, một vòi xà phòng tự động không thể nhận biết được những người có làn da tối màu. [Tham khảo](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **Gièm pha**. Phê bình và gán nhãn không công bằng cho điều gì đó hoặc ai đó. Ví dụ, công nghệ gán nhãn hình ảnh đã bị chỉ trích khi gán nhãn sai các hình ảnh người da đen thành khỉ đột.
- **Đại diện quá mức hoặc thiếu đại diện**. Ý tưởng là một nhóm người nào đó không được nhìn thấy trong một nghề nghiệp nhất định, và bất kỳ dịch vụ hoặc chức năng nào cứ tiếp tục thúc đẩy điều này đều góp phần gây hại.
- **Định kiến**. Liên kết một nhóm người với các thuộc tính được gán sẵn. Ví dụ, một hệ thống dịch ngôn ngữ giữa tiếng Anh và tiếng Thổ Nhĩ Kỳ có thể có sự không chính xác do các từ có liên quan đến các định kiến giới tính.
![dịch sang tiếng Thổ Nhĩ Kỳ](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png)
![dịch sang tiếng Thổ Nhĩ Kỳ](../../../../translated_images/vi/gender-bias-translate-en-tr.f185fd8822c2d437.webp)
> dịch sang tiếng Thổ Nhĩ Kỳ
![dịch lại sang tiếng Anh](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png)
> dịch lại sang tiếng Anh
![dịch ngược lại tiếng Anh](../../../../translated_images/vi/gender-bias-translate-tr-en.4eee7e3cecb8c70e.webp)
> dịch ngược lại tiếng Anh
Khi thiết kế và kiểm tra các hệ thống AI, chúng ta cần đảm bảo rằng AI công bằng và không được lập trình để đưa ra các quyết định thiên vị hoặc phân biệt đối xử, điều mà con người cũng bị cấm thực hiện. Đảm bảo sự công bằng trong AI và machine learning vẫn là một thách thức xã hội-kỹ thuật phức tạp.
Khi thiết kế và thử nghiệm các hệ thống AI, ta cần đảm bảo AI công bằng và không bị lập trình để đưa ra các quyết định thiên vị hoặc phân biệt đối xử, điều mà con người cũng bị cấm làm. Đảm bảo công bằng trong AI và machine learning vẫn là một thách thức xã hội-kỹ thuật phức tạp.
### Độ tin cậy và an toàn
Để xây dựng niềm tin, các hệ thống AI cần phải đáng tin cậy, an toàn, và nhất quán trong điều kiện bình thường và bất ngờ. Điều quan trọng là phải biết các hệ thống AI sẽ hoạt động như thế nào trong nhiều tình huống khác nhau, đặc biệt là khi chúng gặp các trường hợp ngoại lệ. Khi xây dựng các giải pháp AI, cần tập trung đáng kể vào cách xử lý một loạt các tình huống mà các giải pháp AI có thể gặp phải. Ví dụ, một chiếc xe tự lái cần đặt sự an toàn của con người lên hàng đầu. Do đó, AI điều khiển xe cần xem xét tất cả các kịch bản có thể xảy ra như ban đêm, giông bão, bão tuyết, trẻ em chạy qua đường, thú cưng, công trình đường bộ, v.v. Mức độ mà một hệ thống AI có thể xử lý một loạt các điều kiện một cách đáng tin cậy và an toàn phản ánh mức độ dự đoán mà nhà khoa học dữ liệu hoặc nhà phát triển AI đã xem xét trong quá trình thiết kế hoặc kiểm tra hệ thống.
> [🎥 Nhấp vào đây để xem video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
Để xây dựng lòng tin, các hệ thống AI cần đáng tin cậy, an toàn và nhất quán dưới các điều kiện bình thường và bất ngờ. Việc biết hệ thống AI sẽ hoạt động như thế nào trong nhiều tình huống khác nhau, đặc biệt là khi có ngoại lệ, rất quan trọng. Khi xây dựng các giải pháp AI, cần tập trung lớn vào cách xử lý đa dạng các hoàn cảnh mà giải pháp AI có thể gặp phải. Ví dụ, một chiếc xe tự lái cần đặt an toàn của người dân lên hàng đầu. Do đó, AI điều khiển xe cần cân nhắc tất cả các kịch bản có thể xảy ra như ban đêm, giông bão hoặc bão tuyết, trẻ con chạy qua đường, thú cưng, công trường xây dựng v.v. Mức độ tốt của hệ thống AI trong việc xử lý nhiều điều kiện đa dạng một cách tin cậy và an toàn phản ánh mức độ tiên liệu mà nhà khoa học dữ liệu hay nhà phát triển AI đã cân nhắc trong quá trình thiết kế hoặc thử nghiệm hệ thống.
### Tính toàn diện
> [🎥 Nhấn vào đây để xem video: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
Các hệ thống AI nên được thiết kế để thu hút và trao quyền cho mọi người. Khi thiết kế và triển khai các hệ thống AI, các nhà khoa học dữ liệu và nhà phát triển AI cần xác định và giải quyết các rào cản tiềm năng trong hệ thống có thể vô tình loại trừ một số người. Ví dụ, có 1 tỷ người khuyết tật trên toàn thế giới. Với sự phát triển của AI, họ có thể dễ dàng tiếp cận một loạt thông tin và cơ hội trong cuộc sống hàng ngày. Bằng cách giải quyết các rào cản, điều này tạo ra cơ hội đổi mới và phát triển các sản phẩm AI với trải nghiệm tốt hơn, mang lại lợi ích cho tất cả mọi người.
### Tính bao gồm
> [🎥 Nhấp vào đây để xem video: tính toàn diện trong AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
Hệ thống AI nên được thiết kế để thu hút và trao quyền cho mọi người. Khi thiết kế và triển khai hệ thống AI, các nhà khoa học dữ liệu và nhà phát triển AI xác định và giải quyết các rào cản tiềm ẩn trong hệ thống có thể vô tình loại trừ mọi người. Ví dụ, trên thế giới có 1 tỷ người khuyết tật. Với sự tiến bộ của AI, họ có thể tiếp cận nhiều thông tin và cơ hội hơn trong cuộc sống hàng ngày dễ dàng hơn. Bằng cách xử lý các rào cản này, nó tạo ra cơ hội đổi mới và phát triển các sản phẩm AI với trải nghiệm tốt hơn mang lại lợi ích cho tất cả mọi người.
### An ninh và quyền riêng tư
> [🎥 Nhấn vào đây để xem video: tính bao gồm trong AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
Các hệ thống AI nên an toàn và tôn trọng quyền riêng tư của mọi người. Mọi người ít tin tưởng vào các hệ thống đặt quyền riêng tư, thông tin, hoặc cuộc sống của họ vào rủi ro. Khi huấn luyện các mô hình machine learning, chúng ta dựa vào dữ liệu để tạo ra kết quả tốt nhất. Trong quá trình này, nguồn gốc và tính toàn vẹn của dữ liệu phải được xem xét. Ví dụ, dữ liệu có được người dùng cung cấp hay công khai? Tiếp theo, trong khi làm việc với dữ liệu, điều quan trọng là phải phát triển các hệ thống AI có thể bảo vệ thông tin bí mật và chống lại các cuộc tấn công. Khi AI trở nên phổ biến hơn, việc bảo vệ quyền riêng tư và đảm bảo an ninh cho thông tin cá nhân và doanh nghiệp quan trọng ngày càng trở nên cấp thiết và phức tạp. Các vấn đề về quyền riêng tư và bảo mật dữ liệu đòi hỏi sự chú ý đặc biệt đối với AI vì việc truy cập dữ liệu là rất cần thiết để các hệ thống AI đưa ra dự đoán và quyết định chính xác, có thông tin về con người.
### Bảo mật và quyền riêng tư
> [🎥 Nhấp vào đây để xem video: an ninh trong AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
Hệ thống AI cần an toàn và tôn trọng quyền riêng tư của con người. Mọi người ít tin tưởng vào những hệ thống mà đặt quyền riêng tư, thông tin hoặc cuộc sống của họ vào nguy cơ. Khi huấn luyện các mô hình machine learning, ta dựa vào dữ liệu để tạo ra kết quả tốt nhất. Do đó, nguồn gốc dữ liệu và tính toàn vẹn phải được xem xét. Ví dụ, dữ liệu có phải do người dùng cung cấp hay là dữ liệu công khai? Tiếp theo, khi làm việc với dữ liệu, việc phát triển các hệ thống AI có thể bảo vệ thông tin bảo mật và chống lại các cuộc tấn công là rất quan trọng. Khi AI trở nên phổ biến hơn, việc bảo vệ quyền riêng tư và bảo mật thông tin cá nhân và kinh doanh quan trọng càng trở nên phức tạp hơn. Các vấn đề về quyền riêng tư và bảo mật dữ liệu đòi hỏi sự chú ý đặc biệt đối với AI vì việc truy cập dữ liệu là cần thiết để các hệ thống AI đưa ra các dự đoán và quyết định chính xác, có căn cứ về con người.
- Ngành công nghiệp đã đạt được những tiến bộ đáng kể trong quyền riêng tư và bảo mật, được thúc đẩy đáng kể bởi các quy định như GDPR (Quy định chung về bảo vệ dữ liệu).
- Tuy nhiên, với các hệ thống AI, chúng ta phải thừa nhận sự căng thẳng giữa nhu cầu về dữ liệu cá nhân để làm cho các hệ thống trở nên cá nhân hóa và hiệu quả hơn và quyền riêng tư.
- Giống như sự ra đời của máy tính kết nối với internet, chúng ta cũng đang chứng kiến sự gia tăng lớn về số lượng các vấn đề bảo mật liên quan đến AI.
- Đồng thời, chúng ta đã thấy AI được sử dụng để cải thiện an ninh. Ví dụ, hầu hết các trình quét virus hiện đại đều được điều khiển bởi các thuật toán AI.
- Chúng ta cần đảm bảo rằng các quy trình khoa học dữ liệu của mình hòa hợp với các thực tiễn bảo mật và quyền riêng tư mới nhất.
> [🎥 Nhấn vào đây để xem video: bảo mật trong AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
### Tính minh bạch
- Là một ngành, chúng ta đã đạt được tiến bộ quan trọng trong quyền riêng tư & bảo mật, được thúc đẩy đáng kể bởi các quy định như GDPR (Quy định Bảo vệ Dữ liệu Chung).
- Tuy nhiên với các hệ thống AI, chúng ta phải thừa nhận sự căng thẳng giữa nhu cầu có nhiều dữ liệu cá nhân hơn để làm hệ thống cá nhân hóa và hiệu quả hơn và quyền riêng tư.
- Cũng giống như với sự ra đời của các máy tính kết nối internet, chúng ta cũng đang thấy sự gia tăng lớn các vấn đề bảo mật liên quan đến AI.
- Đồng thời, AI cũng được dùng để cải thiện bảo mật. Ví dụ, hầu hết các phần mềm quét virus hiện đại ngày nay được điều khiển bằng các thuật toán AI.
- Chúng ta cần đảm bảo quy trình Khoa học Dữ liệu của mình kết hợp hài hòa với các thực hành bảo mật và quyền riêng tư mới nhất.
Các hệ thống AI nên dễ hiểu. Một phần quan trọng của tính minh bạch là giải thích hành vi của các hệ thống AI và các thành phần của chúng. Việc cải thiện sự hiểu biết về các hệ thống AI đòi hỏi các bên liên quan phải hiểu cách thức và lý do chúng hoạt động để có thể xác định các vấn đề về hiệu suất tiềm năng, lo ngại về an toàn và quyền riêng tư, định kiến, các thực tiễn loại trừ, hoặc kết quả không mong muốn. Chúng tôi cũng tin rằng những người sử dụng các hệ thống AI nên trung thực và cởi mở về thời điểm, lý do, và cách họ chọn triển khai chúng, cũng như những hạn chế của các hệ thống mà họ sử dụng. Ví dụ, nếu một ngân hàng sử dụng hệ thống AI để hỗ trợ các quyết định cho vay tiêu dùng, điều quan trọng là phải kiểm tra kết quả và hiểu dữ liệu nào ảnh hưởng đến các khuyến nghị của hệ thống. Các chính phủ đang bắt đầu điều chỉnh AI trong các ngành công nghiệp, vì vậy các nhà khoa học dữ liệu và tổ chức phải giải thích liệu hệ thống AI có đáp ứng các yêu cầu quy định hay không, đặc biệt là khi có kết quả không mong muốn.
> [🎥 Nhấp vào đây để xem video: tính minh bạch trong AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
### Minh bạch
Các hệ thống AI cần dễ hiểu. Một phần thiết yếu của minh bạch là giải thích hành vi của các hệ thống AI và các thành phần của chúng. Cải thiện sự hiểu biết về các hệ thống AI yêu cầu các bên liên quan nhận thức được cách và lý do hoạt động của chúng để có thể xác định các vấn đề tiềm ẩn về hiệu suất, an toàn và quyền riêng tư, thiên kiến, các thực hành loại trừ, hoặc kết quả không mong muốn. Chúng tôi cũng tin rằng những người sử dụng hệ thống AI nên trung thực và minh bạch về khi nào, tại sao và cách họ chọn triển khai chúng, cũng như các giới hạn của hệ thống họ sử dụng. Ví dụ, nếu một ngân hàng sử dụng hệ thống AI để hỗ trợ quyết định cho vay tiêu dùng, thì việc xem xét kết quả và hiểu biết dữ liệu nào ảnh hưởng đến các khuyến nghị của hệ thống là rất quan trọng. Chính phủ đang bắt đầu điều chỉnh AI trên nhiều ngành, vì vậy các nhà khoa học dữ liệu và tổ chức phải giải thích liệu hệ thống AI có đáp ứng các yêu cầu về quy định hay không, đặc biệt khi có kết quả không mong muốn.
- Vì các hệ thống AI rất phức tạp, nên rất khó để hiểu cách chúng hoạt động và diễn giải kết quả.
- Sự thiếu hiểu biết này ảnh hưởng đến cách các hệ thống này được quản lý, vận hành, và ghi chép.
- Quan trọng hơn, sự thiếu hiểu biết này ảnh hưởng đến các quyết định được đưa ra dựa trên kết quả mà các hệ thống này tạo ra.
> [🎥 Nhấn vào đây để xem video: minh bạch trong AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
### Trách nhiệm
- Vì các hệ thống AI rất phức tạp, nên rất khó hiểu cách thức chúng hoạt động và giải thích kết quả.
- Thiếu hiểu biết này ảnh hưởng đến cách các hệ thống được quản lý, vận hành và ghi chép.
- Thiếu hiểu biết này, quan trọng hơn, ảnh hưởng đến các quyết định được đưa ra dựa trên kết quả mà các hệ thống này tạo ra.
Những người thiết kế và triển khai các hệ thống AI phải chịu trách nhiệm về cách các hệ thống của họ hoạt động. Nhu cầu về trách nhiệm đặc biệt quan trọng với các công nghệ nhạy cảm như nhận diện khuôn mặt. Gần đây, đã có nhu cầu ngày càng tăng đối với công nghệ nhận diện khuôn mặt, đặc biệt từ các tổ chức thực thi pháp luật, những người thấy tiềm năng của công nghệ này trong các ứng dụng như tìm kiếm trẻ em mất tích. Tuy nhiên, các công nghệ này có thể được sử dụng bởi một chính phủ để đặt các quyền tự do cơ bản của công dân vào rủi ro, chẳng hạn như cho phép giám sát liên tục các cá nhân cụ thể. Do đó, các nhà khoa học dữ liệu và tổ chức cần chịu trách nhiệm về cách hệ thống AI của họ ảnh hưởng đến cá nhân hoặc xã hội.
### Trách nhiệm giải trình
Những người thiết kế và triển khai hệ thống AI phải chịu trách nhiệm về cách hệ thống của họ vận hành. Nhu cầu về trách nhiệm giải trình là đặc biệt quan trọng với các công nghệ sử dụng nhạy cảm như nhận diện khuôn mặt. Gần đây, có sự gia tăng nhu cầu về công nghệ nhận diện khuôn mặt, đặc biệt từ các tổ chức thực thi pháp luật, những người thấy tiềm năng của công nghệ trong các ứng dụng như tìm kiếm trẻ em mất tích. Tuy nhiên, công nghệ này có thể bị chính phủ dùng để đe dọa các quyền tự do cơ bản của công dân, ví dụ như cho phép giám sát liên tục những cá nhân cụ thể. Do đó, các nhà khoa học dữ liệu và tổ chức cần chịu trách nhiệm về cách hệ thống AI của họ ảnh hưởng đến cá nhân hoặc xã hội.
[![Nhà nghiên cứu AI hàng đầu cảnh báo về giám sát hàng loạt qua nhận diện khuôn mặt](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Cách tiếp cận của Microsoft đối với AI có trách nhiệm")
[![Nhà nghiên cứu AI hàng đầu cảnh báo về giám sát hàng loạt qua nhận diện khuôn mặt](../../../../translated_images/vi/accountability.41d8c0f4b85b6231.webp)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Cách tiếp cận AI có trách nhiệm của Microsoft")
> 🎥 Nhấp vào hình ảnh trên để xem video: Cảnh báo về giám sát hàng loạt qua nhận diện khuôn mặt
> 🎥 Nhấn vào hình trên để xem video: Cảnh báo về giám sát hàng loạt qua nhận diện khuôn mặt
Cuối cùng, một trong những câu hỏi lớn nhất cho thế hệ của chúng ta, với tư cách là thế hệ đầu tiên đưa AI vào xã hội, là làm thế nào để đảm bảo rằng máy tính sẽ luôn chịu trách nhiệm trước con người và làm thế nào để đảm bảo rằng những người thiết kế máy tính chịu trách nhiệm trước tất cả mọi người.
Cuối cùng, một trong những câu hỏi lớn nhất đối với thế hệ chúng ta, là thế hệ đầu tiên đưa AI vào xã hội, là làm thế nào để chắc chắn rằng máy tính sẽ luôn chịu trách nhiệm với con người và làm thế nào để đảm bảo những người thiết kế máy tính luôn chịu trách nhiệm với tất cả mọi người.
## Đánh giá tác động
Trước khi huấn luyện một mô hình machine learning, điều quan trọng là phải thực hiện đánh giá tác động để hiểu mục đích của hệ thống AI; mục đích sử dụng dự kiến; nơi nó sẽ được triển khai; và ai sẽ tương tác với hệ thống. Những điều này rất hữu ích cho người đánh giá hoặc kiểm tra hệ thống để biết các yếu tố cần xem xét khi xác định các rủi ro tiềm năng và hậu quả dự kiến.
Trước khi huấn luyện một mô hình machine learning, việc tiến hành đánh giá tác động là rất quan trọng để hiểu mục đích của hệ thống AI; mục đích sử dụng dự định; nơi nó sẽ được triển khai; và ai sẽ tương tác với hệ thống. Điều này giúp người đánh giá hoặc kiểm thử hiểu các yếu tố cần cân nhắc khi xác định các rủi ro tiềm ẩn và hậu quả mong đợi.
Các lĩnh vực cần tập trung khi thực hiện đánh giá tác động bao gồm:
Các lĩnh vực cần tập trung khi tiến hành đánh giá tác động bao gồm:
* **Tác động bất lợi đến cá nhân**. Nhận thức về bất kỳ hạn chế hoặc yêu cầu nào, việc sử dụng không được hỗ trợ hoặc bất kỳ giới hạn nào biết đến cản trở hiệu suất hệ thống là rất quan trọng để đảm bảo hệ thống không được sử dụng theo cách có thể gây hại cho cá nhân.
* **Yêu cầu dữ liệu**. Hiểu cách và nơi hệ thống sẽ sử dụng dữ liệu giúp người đánh giá khám phá bất kỳ yêu cầu dữ liệu nào cần lưu ý (ví dụ, các quy định dữ liệu GDPR hoặc HIPAA). Thêm vào đó, xem xét nguồn gốc hoặc số lượng dữ liệu có đủ lớn để đào tạo không.
* **Tóm tắt tác động**. Tập hợp danh sách các tổn hại tiềm ẩn có thể phát sinh từ việc sử dụng hệ thống. Trong suốt vòng đời ML, kiểm tra xem các vấn đề đã được giảm thiểu hoặc xử lý chưa.
* **Mục tiêu áp dụng** cho mỗi sáu nguyên tắc cốt lõi. Đánh giá xem các mục tiêu của từng nguyên tắc có được đáp ứng không và có khoảng trống nào không.
* **Tác động bất lợi đối với cá nhân**. Nhận thức về bất kỳ hạn chế hoặc yêu cầu nào, việc sử dụng không được hỗ trợ hoặc bất kỳ giới hạn nào đã biết cản trở hiệu suất của hệ thống là rất quan trọng để đảm bảo rằng hệ thống không được sử dụng theo cách có thể gây hại cho cá nhân.
* **Yêu cầu dữ liệu**. Hiểu cách và nơi hệ thống sẽ sử dụng dữ liệu cho phép người đánh giá khám phá bất kỳ yêu cầu dữ liệu nào cần lưu ý (ví dụ: các quy định về dữ liệu GDPR hoặc HIPPA). Ngoài ra, kiểm tra xem nguồn hoặc số lượng dữ liệu có đủ để huấn luyện hay không.
* **Tóm tắt tác động**. Thu thập danh sách các tác hại tiềm năng có thể phát sinh từ việc sử dụng hệ thống. Trong suốt vòng đời ML, xem xét liệu các vấn đề đã xác định có được giảm thiểu hoặc giải quyết hay không.
* **Mục tiêu áp dụng** cho từng nguyên tắc cốt lõi. Đánh giá xem các mục tiêu từ mỗi nguyên tắc có được đáp ứng hay không và liệu có bất kỳ khoảng trống nào.
## Gỡ lỗi với AI có trách nhiệm
Tương tự như việc gỡ lỗi một ứng dụng phần mềm, gỡ lỗi một hệ thống AI là một quá trình cần thiết để xác định và giải quyết các vấn đề trong hệ thống. Có nhiều yếu tố có thể ảnh hưởng đến việc một mô hình không hoạt động như mong đợi hoặc không có trách nhiệm. Hầu hết các chỉ số hiệu suất mô hình truyền thống là các tổng hợp định lượng về hiệu suất của mô hình, không đủ để phân tích cách một mô hình vi phạm các nguyên tắc AI có trách nhiệm. Hơn nữa, một mô hình machine learning là một hộp đen, khiến việc hiểu điều gì thúc đẩy kết quả của nó hoặc cung cấp lời giải thích khi nó mắc lỗi trở nên khó khăn. Sau này trong khóa học, chúng ta sẽ học cách sử dụng bảng điều khiển AI có trách nhiệm để giúp gỡ lỗi các hệ thống AI. Bảng điều khiển cung cấp một công cụ toàn diện cho các nhà khoa học dữ liệu và nhà phát triển AI để thực hiện:
Tương tự như gỡ lỗi một ứng dụng phần mềm, gỡ lỗi hệ thống AI là quá trình cần thiết để xác định và giải quyết các vấn đề trong hệ thống. Có nhiều yếu tố ảnh hưởng đến việc một mô hình không hoạt động như mong đợi hoặc không có trách nhiệm. Hầu hết các chỉ số hiệu suất mô hình truyền thống là tổng hợp định lượng hiệu suất mô hình, không đủ để phân tích cách mô hình vi phạm các nguyên tắc AI có trách nhiệm. Hơn nữa, một mô hình machine learning là một hộp đen khiến khó hiểu điều gì thúc đẩy kết quả hoặc cung cấp lời giải thích khi nó mắc sai lầm. Trong khóa học này, chúng ta sẽ học cách sử dụng bảng điều khiển Responsible AI để giúp gỡ lỗi các hệ thống AI. Bảng điều khiển cung cấp công cụ toàn diện cho các nhà khoa học dữ liệu và nhà phát triển AI thực hiện:
* **Phân tích lỗi**. Để xác định phân bố lỗi của mô hình có thể ảnh hưởng đến sự công bằng hoặc độ tin cậy của hệ thống.
* **Tổng quan về mô hình**. Để khám phá nơi có sự chênh lệch trong hiệu suất của mô hình trên các nhóm dữ liệu.
* **Phân tích dữ liệu**. Để hiểu phân bố dữ liệu và xác định bất kỳ định kiến tiềm năng nào trong dữ liệu có thể dẫn đến các vấn đề về công bằng, tính toàn diện, và độ tin cậy.
* **Giải thích mô hình**. Để hiểu điều gì ảnh hưởng hoặc tác động đến các dự đoán của mô hình. Điều này giúp giải thích hành vi của mô hình, điều quan trọng đối với tính minh bạch và trách nhiệm.
* **Tổng quan mô hình**. Để phát hiện nơi có sự chênh lệch về hiệu suất của mô hình trên các nhóm dữ liệu.
* **Phân tích dữ liệu**. Để hiểu phân bố dữ liệu và xác định bất kỳ thiên kiến tiềm ẩn nào trong dữ liệu có thể dẫn đến các vấn đề về công bằng, bao gồm, và độ tin cậy.
* **Khả năng giải thích mô hình**. Để hiểu điều gì ảnh hưởng hoặc tác động đến dự đoán của mô hình. Điều này giúp giải thích hành vi của mô hình, rất quan trọng cho tính minh bạch và trách nhiệm giải trình.
## 🚀 Thử thách
Để ngăn chặn các tác hại được đưa vào ngay từ đầu, chúng ta nên:
## 🚀 Thử thách
Để ngăn chặn các tác hại được tạo ra ngay từ đầu, chúng ta nên:
- có sự đa dạng về nền tảng và quan điểm giữa những người làm việc trên các hệ thống
- đầu tư vào các tập dữ liệu phản ánh sự đa dạng của xã hội chúng ta
- phát triển các phương pháp tốt hơn trong suốt vòng đời machine learning để phát hiện và sửa chữa AI có trách nhiệm khi xảy ra
- có sự đa dạng về nền tảng và quan điểm trong những người làm việc trên các hệ thống
- đầu tư vào các bộ dữ liệu phản ánh sự đa dạng của xã hội chúng ta
- phát triển các phương pháp tốt hơn trong suốt vòng đời machine learning để phát hiện và sửa chữa AI có trách nhiệm khi xảy ra
Hãy nghĩ về các tình huống thực tế nơi sự không đáng tin cậy của mô hình trở nên rõ ràng trong việc xây dựng và sử dụng mô hình. Chúng ta còn cần xem xét điều gì nữa?
Hãy nghĩ về các kịch bản thực tế nơi sự không đáng tin cậy của một mô hình trở nên rõ ràng trong việc xây dựng và sử dụng mô hình. Chúng ta còn nên cân nhắc điều gì khác?
## [Câu hỏi sau bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## [Trắc nghiệm sau bài học](https://ff-quizzes.netlify.app/en/ml/)
## Ôn tập & Tự học
Xem hội thảo này để tìm hiểu sâu hơn về các chủ đề:
Trong bài học này, bạn đã học được một số kiến thức cơ bản về các khái niệm công bằng và không công bằng trong học máy.
Xem hội thảo này để tìm hiểu sâu hơn về các chủ đề:
- Theo đuổi AI có trách nhiệm: Đưa các nguyên tắc vào thực tiễn bởi Besmira Nushi, Mehrnoosh Sameki và Amit Sharma
- Theo đuổi AI có trách nhiệm: Đem các nguyên tắc vào thực tiễn bởi Besmira Nushi, Mehrnoosh Sameki và Amit Sharma
[![Responsible AI Toolbox: Một khung nguồn mở để xây dựng AI có trách nhiệm](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Một khung nguồn mở để xây dựng AI có trách nhiệm")
[![Responsible AI Toolbox: An open-source framework for building responsible AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: An open-source framework for building responsible AI")
> 🎥 Nhấp vào hình ảnh trên để xem video: RAI Toolbox: Một khung nguồn mở để xây dựng AI có trách nhiệm bởi Besmira Nushi, Mehrnoosh Sameki và Amit Sharma
> 🎥 Nhấp vào hình ảnh trên để xem video: RAI Toolbox: Một khung làm việc mã nguồn mở để xây dựng AI có trách nhiệm bởi Besmira Nushi, Mehrnoosh Sameki và Amit Sharma
Ngoài ra, hãy đọc:
Ngoài ra, hãy đọc:
- Trung tâm tài nguyên RAI của Microsoft: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- Trung tâm tài nguyên RAI của Microsoft: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- Nhóm nghiên cứu FATE của Microsoft: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
- Nhóm nghiên cứu FATE của Microsoft: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
RAI Toolbox:
Hộp công cụ RAI:
- [Kho lưu trữ GitHub của Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox)
- [Kho GitHub Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox)
Tìm hiểu về các công cụ của Azure Machine Learning để đảm bảo tính công bằng:
Đọc về các công cụ của Azure Machine Learning để đảm bảo công bằng:
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
## Bài tập
[Khám phá RAI Toolbox](assignment.md)
[Khám phá Hộp công cụ RAI](assignment.md)
---
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,53 +1,53 @@
# Bắt đầu với Python và Scikit-learn cho các mô hình hồi quy
![Tóm tắt về hồi quy trong một sketchnote](../../../../sketchnotes/ml-regression.png)
![Tóm tắt các hồi quy trong một sketchnote](../../../../translated_images/vi/ml-regression.4e4f70e3b3ed446e.webp)
> Sketchnote bởi [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Câu hỏi trước bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## [Bài kiểm tra trước bài học](https://ff-quizzes.netlify.app/en/ml/)
> ### [Bài học này có sẵn bằng R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
> ### [Bài học này có phiên bản bằng R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
## Giới thiệu
Trong bốn bài học này, bạn sẽ khám phá cách xây dựng các mô hình hồi quy. Chúng ta sẽ thảo luận về mục đích của chúng trong thời gian ngắn. Nhưng trước khi bắt đầu, hãy đảm bảo rằng bạn đã chuẩn bị đúng công cụ để bắt đầu quá trình!
Trong bốn bài học này, bạn sẽ khám phá cách xây dựng các mô hình hồi quy. Chúng ta sẽ nói về mục đích sử dụng của chúng trong chốc lát. Nhưng trước khi bạn làm bất cứ điều gì, hãy đảm bảo bạn có các công cụ phù hợp để bắt đầu quá trình!
Trong bài học này, bạn sẽ học cách:
- Cấu hình máy tính của bạn cho các tác vụ học máy cục bộ.
- Làm việc với Jupyter notebooks.
- Sử dụng Scikit-learn, bao gồm cả việc cài đặt.
- Khám phá hồi quy tuyến tính thông qua một bài tập thực hành.
- Làm việc với Jupyter Notebooks.
- Sử dụng Scikit-learn, bao gồm cả cài đặt.
- Khám phá hồi quy tuyến tính với một bài tập thực hành.
## Cài đặt và cấu hình
[![ML cho người mới bắt đầu - Cài đặt công cụ để xây dựng mô hình học máy](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML cho người mới bắt đầu - Cài đặt công cụ để xây dựng mô hình học máy")
[![ML dành cho người mới - Thiết lập công cụ sẵn sàng xây dựng các mô hình Machine Learning](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "ML dành cho người mới - Thiết lập công cụ sẵn sàng xây dựng các mô hình Machine Learning")
> 🎥 Nhấp vào hình ảnh trên để xem video ngắn hướng dẫn cấu hình máy tính của bạn cho ML.
> 🎥 Nhấp vào hình ảnh trên để xem video ngắn hướng dẫn cấu hình máy tính cho ML.
1. **Cài đặt Python**. Đảm bảo rằng [Python](https://www.python.org/downloads/) đã được cài đặt trên máy tính của bạn. Bạn sẽ sử dụng Python cho nhiều tác vụ khoa học dữ liệu và học máy. Hầu hết các hệ thống máy tính đều đã có sẵn Python. Ngoài ra, có các [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) hữu ích để giúp một số người dùng dễ dàng cài đặt.
1. **Cài đặt Python**. Đảm bảo rằng [Python](https://www.python.org/downloads/) đã được cài đặt trên máy tính của bạn. Bạn sẽ sử dụng Python cho nhiều tác vụ khoa học dữ liệu và học máy. Hầu hết các hệ thống máy tính đã bao gồm sẵn một phiên bản Python. Có các [Bộ công cụ Mã Python](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott) hữu ích để hỗ trợ thiết lập cho một số người dùng.
Tuy nhiên, một số ứng dụng của Python yêu cầu một phiên bản cụ thể của phần mềm, trong khi các ứng dụng khác yêu cầu phiên bản khác. Vì lý do này, việc làm việc trong một [môi trường ảo](https://docs.python.org/3/library/venv.html) là rất hữu ích.
Một số cách sử dụng Python, tuy nhiên, đòi hỏi phiên bản phần mềm khác nhau. Vì lý do đó, việc làm việc trong một [môi trường ảo](https://docs.python.org/3/library/venv.html) là hữu ích.
2. **Cài đặt Visual Studio Code**. Đảm bảo rằng bạn đã cài đặt Visual Studio Code trên máy tính của mình. Làm theo hướng dẫn này để [cài đặt Visual Studio Code](https://code.visualstudio.com/) cơ bản. Bạn sẽ sử dụng Python trong Visual Studio Code trong khóa học này, vì vậy bạn có thể muốn tìm hiểu cách [cấu hình Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) cho phát triển Python.
2. **Cài đặt Visual Studio Code**. Đảm bảo bạn đã cài đặt Visual Studio Code trên máy tính. Làm theo hướng dẫn để [cài đặt Visual Studio Code](https://code.visualstudio.com/) cho việc cài đặt cơ bản. Bạn sẽ sử dụng Python trong Visual Studio Code trong khóa học này, vì vậy bạn có thể muốn làm quen cách [cấu hình Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) cho phát triển Python.
> Làm quen với Python bằng cách làm theo bộ sưu tập [Learn modules](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott)
>
> [![Cài đặt Python với Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Cài đặt Python với Visual Studio Code")
>
> 🎥 Nhấp vào hình ảnh trên để xem video: sử dụng Python trong VS Code.
> Làm quen với Python bằng cách làm qua bộ sưu tập [các modul học tập](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott)
>
> [![Cài đặt Python với Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Cài đặt Python với Visual Studio Code")
>
> 🎥 Nhấp vào hình ảnh trên để xem video: sử dụng Python trong VS Code.
3. **Cài đặt Scikit-learn**, bằng cách làm theo [hướng dẫn này](https://scikit-learn.org/stable/install.html). Vì bạn cần đảm bảo rằng mình sử dụng Python 3, nên khuyến nghị sử dụng môi trường ảo. Lưu ý, nếu bạn đang cài đặt thư viện này trên Mac M1, có các hướng dẫn đặc biệt trên trang liên kết trên.
3. **Cài đặt Scikit-learn**, theo [hướng dẫn này](https://scikit-learn.org/stable/install.html). Vì bạn cần đảm bảo sử dụng Python 3, nên khuyến nghị sử dụng môi trường ảo. Lưu ý, nếu bạn cài thư viện này trên Mac M1, có hướng dẫn đặc biệt trên trang liên kết bên trên.
4. **Cài đặt Jupyter Notebook**. Bạn sẽ cần [cài đặt gói Jupyter](https://pypi.org/project/jupyter/).
1. **Cài đặt Jupyter Notebook**. Bạn sẽ cần [cài gói Jupyter](https://pypi.org/project/jupyter/).
## Môi trường tác giả ML của bạn
## Môi trường soạn thảo ML của bạn
Bạn sẽ sử dụng **notebooks** để phát triển mã Python và tạo các mô hình học máy. Loại tệp này là công cụ phổ biến cho các nhà khoa học dữ liệu, và chúng có thể được nhận diện bởi phần mở rộng `.ipynb`.
Bạn sẽ sử dụng **notebooks** để phát triển mã Python và tạo các mô hình học máy. Đây là loại tệp phổ biến cho các nhà khoa học dữ liệu, và chúng được nhận diện bằng phần hậu tố hoặc phần mở rộng `.ipynb`.
Notebooks là môi trường tương tác cho phép nhà phát triển vừa viết mã vừa thêm ghi chú và tài liệu xung quanh mã, rất hữu ích cho các dự án thử nghiệm hoặc nghiên cứu.
Notebooks là môi trường tương tác cho phép nhà phát triển vừa viết mã vừa thêm ghi chú và tài liệu xung quanh mã, rất hữu ích cho các dự án nghiên cứu hoặc thử nghiệm.
[![ML cho người mới bắt đầu - Cài đặt Jupyter Notebooks để bắt đầu xây dựng mô hình hồi quy](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML cho người mới bắt đầu - Cài đặt Jupyter Notebooks để bắt đầu xây dựng mô hình hồi quy")
[![ML cho người mới - Thiết lập Jupyter Notebooks để bắt đầu xây dựng mô hình hồi quy](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "ML cho người mới - Thiết lập Jupyter Notebooks để bắt đầu xây dựng mô hình hồi quy")
> 🎥 Nhấp vào hình ảnh trên để xem video ngắn hướng dẫn bài tập này.
@ -57,64 +57,65 @@ Trong thư mục này, bạn sẽ tìm thấy tệp _notebook.ipynb_.
1. Mở _notebook.ipynb_ trong Visual Studio Code.
Một máy chủ Jupyter sẽ khởi động với Python 3+. Bạn sẽ thấy các khu vực của notebook có thể `chạy`, các đoạn mã. Bạn có thể chạy một khối mã bằng cách chọn biểu tượng giống nút phát.
Một máy chủ Jupyter sẽ khởi động với Python 3+ được bật. Bạn sẽ thấy các phần của notebook có thể `chạy`, là các đoạn mã. Bạn có thể chạy một đoạn mã bằng cách chọn biểu tượng giống nút phát.
2. Chọn biểu tượng `md` và thêm một chút markdown, với văn bản sau **# Chào mừng bạn đến với notebook của mình**.
1. Chọn biểu tượng `md` và thêm một chút markdown, với đoạn văn bản sau **# Welcome to your notebook**.
Tiếp theo, thêm một số mã Python.
Tiếp theo, thêm một số mã Python.
3. Gõ **print('hello notebook')** trong khối mã.
4. Chọn mũi tên để chạy mã.
1. Gõ **print('hello notebook')** trong đoạn mã.
1. Chọn mũi tên để chạy mã.
Bạn sẽ thấy câu lệnh được in ra:
Bạn sẽ thấy câu in ra:
```output
hello notebook
```
![VS Code với một notebook đang mở](../../../../2-Regression/1-Tools/images/notebook.jpg)
![VS Code với notebook đang mở](../../../../translated_images/vi/notebook.4a3ee31f396b8832.webp)
Bạn có thể xen kẽ mã của mình với các nhận xét để tự tài liệu hóa notebook.
Bạn có thể xen kẽ mã của bạn với các bình luận để tự tài liệu hóa notebook.
✅ Hãy nghĩ một chút về sự khác biệt giữa môi trường làm việc của nhà phát triển web và của nhà khoa học dữ liệu.
✅ Hãy suy nghĩ một chút về môi trường làm việc của một nhà phát triển web so với một nhà khoa học dữ liệu.
## Bắt đầu với Scikit-learn
## Khởi động với Scikit-learn
Bây giờ Python đã được thiết lập trong môi trường cục bộ của bạn, và bạn đã quen thuộc với Jupyter notebooks, hãy làm quen với Scikit-learn (phát âm là `sci` như trong `science`). Scikit-learn cung cấp một [API phong phú](https://scikit-learn.org/stable/modules/classes.html#api-ref) để giúp bạn thực hiện các tác vụ ML.
Bây giờ Python đã được thiết lập trên môi trường cục bộ của bạn, và bạn đã quen với Jupyter Notebooks, hãy cùng làm quen với Scikit-learn (phát âm là `sci` như trong `science`). Scikit-learn cung cấp một [API phong phú](https://scikit-learn.org/stable/modules/classes.html#api-ref) để hỗ trợ bạn thực hiện các tác vụ ML.
Theo [trang web của họ](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn là một thư viện học máy mã nguồn mở hỗ trợ học có giám sát và không giám sát. Nó cũng cung cấp nhiều công cụ cho việc xây dựng mô hình, tiền xử lý dữ liệu, lựa chọn và đánh giá mô hình, cùng nhiều tiện ích khác."
Theo [trang web](https://scikit-learn.org/stable/getting_started.html) của họ, "Scikit-learn là một thư viện học máy mã nguồn mở hỗ trợ học có giám sát và không giám sát. Nó cũng cung cấp các công cụ để điều chỉnh mô hình, tiền xử lý dữ liệu, lựa chọn và đánh giá mô hình, cùng nhiều tiện ích khác."
Trong khóa học này, bạn sẽ sử dụng Scikit-learn và các công cụ khác để xây dựng các mô hình học máy nhằm thực hiện các tác vụ 'học máy truyền thống'. Chúng tôi đã cố tình tránh các mạng nơ-ron và học sâu, vì chúng sẽ được đề cập trong chương trình 'AI cho người mới bắt đầu' sắp tới của chúng tôi.
Trong khóa học này, bạn sẽ sử dụng Scikit-learn và các công cụ khác để xây dựng các mô hình học máy thực hiện các tác vụ mà chúng ta gọi là 'học máy truyền thống'. Chúng tôi cố ý tránh các mạng nơ-ron và học sâu, vì những chủ đề đó được trình bày tốt hơn trong chương trình 'AI dành cho người mới' sắp tới.
Scikit-learn giúp việc xây dựng mô hình và đánh giá chúng trở nên đơn giản. Nó chủ yếu tập trung vào việc sử dụng dữ liệu số và chứa một số bộ dữ liệu sẵn có để sử dụng như công cụ học tập. Nó cũng bao gồm các mô hình được xây dựng sẵn để sinh viên thử nghiệm. Hãy khám phá quy trình tải dữ liệu được đóng gói sẵn và sử dụng một bộ ước lượng để tạo mô hình ML đầu tiên với Scikit-learn bằng một số dữ liệu cơ bản.
Scikit-learn giúp việc xây dựng và đánh giá mô hình trở nên đơn giản. Nó tập trung chủ yếu vào dữ liệu số và bao gồm một số bộ dữ liệu sẵn có làm công cụ học tập. Nó cũng bao gồm các mô hình được xây dựng sẵn để học viên thử nghiệm. Hãy khám phá quá trình tải dữ liệu đóng gói sẵn và sử dụng một bộ ước lượng tích hợp mô hình ML đầu tiên với Scikit-learn cùng dữ liệu cơ bản.
## Bài tập - notebook Scikit-learn đầu tiên của bạn
> Hướng dẫn này được lấy cảm hứng từ [ví dụ hồi quy tuyến tính](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) trên trang web của Scikit-learn.
> Bài hướng dẫn này lấy cảm hứng từ [ví dụ hồi quy tuyến tính](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) trên trang web Scikit-learn.
[![ML cho người mới bắt đầu - Dự án hồi quy tuyến tính đầu tiên của bạn trong Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML cho người mới bắt đầu - Dự án hồi quy tuyến tính đầu tiên của bạn trong Python")
[![ML dành cho người mới - Dự án Hồi quy Tuyến tính Đầu tiên của Bạn bằng Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "ML dành cho người mới - Dự án Hồi quy Tuyến tính Đầu tiên của Bạn bằng Python")
> 🎥 Nhấp vào hình ảnh trên để xem video ngắn hướng dẫn bài tập này.
Trong tệp _notebook.ipynb_ liên quan đến bài học này, xóa tất cả các ô bằng cách nhấn vào biểu tượng 'thùng rác'.
Trong tệp _notebook.ipynb_ kèm bài học này, xóa hết tất cả các ô bằng cách nhấn biểu tượng 'thùng rác'.
Trong phần này, bạn sẽ làm việc với một bộ dữ liệu nhỏ về bệnh tiểu đường được tích hợp trong Scikit-learn để học tập. Hãy tưởng tượng rằng bạn muốn thử nghiệm một phương pháp điều trị cho bệnh nhân tiểu đường. Các mô hình học máy có thể giúp bạn xác định bệnh nhân nào sẽ phản ứng tốt hơn với phương pháp điều trị, dựa trên sự kết hợp của các biến. Ngay cả một mô hình hồi quy rất cơ bản, khi được trực quan hóa, cũng có thể cung cấp thông tin về các biến giúp bạn tổ chức các thử nghiệm lâm sàng lý thuyết.
Trong phần này, bạn sẽ làm việc với một bộ dữ liệu nhỏ về bệnh tiểu đường được tích hợp trong Scikit-learn cho mục đích học tập. Hãy tưởng tượng bạn muốn thử nghiệm một phương pháp điều trị cho bệnh nhân tiểu đường. Các mô hình học máy có thể giúp xác định bệnh nhân nào sẽ phản ứng tốt hơn dựa trên sự kết hợp các biến số. Ngay cả một mô hình hồi quy rất cơ bản, khi được trực quan hóa, có thể cho thấy thông tin về các biến số giúp bạn tổ chức các thử nghiệm lâm sàng giả thuyết.
✅ Có nhiều loại phương pháp hồi quy, và việc chọn loại nào phụ thuộc vào câu trả lời bạn đang tìm kiếm. Nếu bạn muốn dự đoán chiều cao có thể xảy ra của một người ở một độ tuổi nhất định, bạn sẽ sử dụng hồi quy tuyến tính, vì bạn đang tìm kiếm một **giá trị số**. Nếu bạn muốn xác định liệu một loại ẩm thực có nên được coi là thuần chay hay không, bạn đang tìm kiếm một **phân loại danh mục**, vì vậy bạn sẽ sử dụng hồi quy logistic. Bạn sẽ học thêm về hồi quy logistic sau này. Hãy nghĩ một chút về các câu hỏi bạn có thể đặt ra với dữ liệu, và phương pháp nào sẽ phù hợp hơn.
✅ Có nhiều phương pháp hồi quy khác nhau, và bạn chọn phương pháp nào phụ thuộc vào câu trả lời bạn tìm kiếm. Nếu bạn muốn dự đoán chiều cao có thể của một người ở độ tuổi xác định, bạn dùng hồi quy tuyến tính vì bạn đang tìm một **giá trị số**. Nếu bạn muốn biết liệu một loại ẩm thực có nên coi là thuần chay hay không, bạn đang tìm một **phân loại nhóm** nên dùng hồi quy logistic. Bạn sẽ học về hồi quy logistic sau. Hãy suy nghĩ về một số câu hỏi bạn có thể hỏi dữ liệu, và phương pháp nào sẽ phù hợp hơn.
Hãy bắt đầu nhiệm vụ này.
Hãy bắt đầu với nhiệm vụ này.
### Nhập thư viện
### Nhập các thư viện
Đối với nhiệm vụ này, chúng ta sẽ nhập một số thư viện:
Cho nhiệm vụ này, chúng ta sẽ nhập một số thư viện:
- **matplotlib**. Đây là một [công cụ vẽ đồ thị](https://matplotlib.org/) hữu ích và chúng ta sẽ sử dụng nó để tạo biểu đồ đường.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) là một thư viện hữu ích để xử lý dữ liệu số trong Python.
- **matplotlib**. Đây là công cụ [vẽ đồ thị](https://matplotlib.org/) hữu ích và chúng ta sẽ dùng để tạo biểu đồ đường.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) là thư viện xử lý dữ liệu số trong Python.
- **sklearn**. Đây là thư viện [Scikit-learn](https://scikit-learn.org/stable/user_guide.html).
Nhập một số thư viện để hỗ trợ nhiệm vụ của bạn.
1. Thêm các lệnh nhập bằng cách gõ mã sau:
1. Thêm các lệnh nhập bằng cách gõ đoạn mã sau:
```python
import matplotlib.pyplot as plt
@ -122,26 +123,26 @@ Nhập một số thư viện để hỗ trợ nhiệm vụ của bạn.
from sklearn import datasets, linear_model, model_selection
```
Ở trên, bạn đang nhập `matplotlib`, `numpy` bạn đang nhập `datasets`, `linear_model``model_selection` từ `sklearn`. `model_selection` được sử dụng để chia dữ liệu thành tập huấn luyện và tập kiểm tra.
Ở trên bạn đang nhập `matplotlib`, `numpy` và nhập `datasets`, `linear_model``model_selection` từ `sklearn`. `model_selection` dùng để phân tách dữ liệu thành tập huấn luyện và kiểm thử.
### Bộ dữ liệu tiểu đường
### Bộ dữ liệu diabetes
Bộ dữ liệu [tiểu đường](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) tích hợp bao gồm 442 mẫu dữ liệu về bệnh tiểu đường, với 10 biến đặc trưng, một số trong đó bao gồm:
Bộ dữ liệu tích hợp sẵn [diabetes dataset](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) chứa 442 mẫu dữ liệu về bệnh tiểu đường, với 10 biến đặc trưng, một số biến bao gồm:
- age: tuổi tính bằng năm
- bmi: chỉ số khối cơ thể
- bmi: chỉ số cơ thể (body mass index)
- bp: huyết áp trung bình
- s1 tc: T-Cells (một loại tế bào bạch cầu)
✅ Bộ dữ liệu này bao gồm khái niệm 'giới tính' như một biến đặc trưng quan trọng trong nghiên cứu về bệnh tiểu đường. Nhiều bộ dữ liệu y tế bao gồm loại phân loại nhị phân này. Hãy nghĩ một chút về cách các phân loại như vậy có thể loại trừ một số phần của dân số khỏi các phương pháp điều trị.
✅ Bộ dữ liệu này bao gồm khái niệm 'giới tính' như một biến đặc trưng quan trọng trong nghiên cứu về tiểu đường. Nhiều bộ dữ liệu y tế chứa loại phân loại nhị phân như thế này. Hãy suy nghĩ về cách các phân loại như vậy có thể loại trừ một số nhóm dân cư khỏi các phương pháp điều trị.
Bây giờ, hãy tải dữ liệu X và y.
> 🎓 Nhớ rằng, đây là học có giám sát, và chúng ta cần một mục tiêu 'y' được đặt tên.
> 🎓 Hãy nhớ, đây là học có giám sát, và cần một mục tiêu 'y' được đặt tên.
Trong một ô mã mới, tải bộ dữ liệu tiểu đường bằng cách gọi `load_diabetes()`. Đầu vào `return_X_y=True` báo hiệu rằng `X` sẽ là ma trận dữ liệu, và `y` sẽ là mục tiêu hồi quy.
Trong một ô mã mới, tải bộ dữ liệu diabetes bằng cách gọi `load_diabetes()`. Tham số `return_X_y=True` báo `X` sẽ là ma trận dữ liệu, và `y` sẽ là mục tiêu hồi quy.
1. Thêm một số lệnh in để hiển thị hình dạng của ma trận dữ liệu và phần tử đầu tiên của nó:
1. Thêm một số lệnh in để hiển thị kích thước của ma trận dữ liệu và phần tử đầu tiên:
```python
X, y = datasets.load_diabetes(return_X_y=True)
@ -149,9 +150,9 @@ Trong một ô mã mới, tải bộ dữ liệu tiểu đường bằng cách g
print(X[0])
```
Những gì bạn nhận được là một tuple. Bạn đang gán hai giá trị đầu tiên của tuple cho `X``y` tương ứng. Tìm hiểu thêm [về tuple](https://wikipedia.org/wiki/Tuple).
Bạn nhận về một tuple. Bạn đang gán hai giá trị đầu của tuple cho `X``y` tương ứng. Tìm hiểu thêm về [tuple](https://wikipedia.org/wiki/Tuple).
Bạn có thể thấy rằng dữ liệu này có 442 mục được định hình trong các mảng gồm 10 phần tử:
Bạn có thể thấy dữ liệu này có 442 mẫu, mỗi mẫu là mảng 10 phần tử:
```text
(442, 10)
@ -159,39 +160,39 @@ Trong một ô mã mới, tải bộ dữ liệu tiểu đường bằng cách g
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ Hãy nghĩ một chút về mối quan hệ giữa dữ liệu và mục tiêu hồi quy. Hồi quy tuyến tính dự đoán mối quan hệ giữa đặc trưng X và biến mục tiêu y. Bạn có thể tìm thấy [mục tiêu](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) cho bộ dữ liệu tiểu đường trong tài liệu không? Bộ dữ liệu này đang thể hiện điều gì, dựa trên mục tiêu?
✅ Nghĩ về mối quan hệ giữa dữ liệu và mục tiêu hồi quy. Hồi quy tuyến tính dự đoán mối quan hệ giữa đặc trưng X và biến mục tiêu y. Bạn có thể tìm thấy [mục tiêu](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) của bộ dữ liệu diabetes trong tài liệu không? Bộ dữ liệu này đang minh họa gì, dựa trên mục tiêu đó?
2. Tiếp theo, chọn một phần của bộ dữ liệu này để vẽ bằng cách chọn cột thứ 3 của bộ dữ liệu. Bạn có thể làm điều này bằng cách sử dụng toán tử `:` để chọn tất cả các hàng, và sau đó chọn cột thứ 3 bằng cách sử dụng chỉ số (2). Bạn cũng có thể định hình lại dữ liệu thành mảng 2D - như yêu cầu để vẽ - bằng cách sử dụng `reshape(n_rows, n_columns)`. Nếu một trong các tham số là -1, kích thước tương ứng sẽ được tính tự động.
2. Tiếp theo, chọn một phần của bộ dữ liệu để vẽ bằng cách chọn cột thứ 3 của bộ dữ liệu. Bạn có thể dùng toán tử `:` để chọn tất cả các hàng, rồi chọn cột thứ 3 bằng chỉ mục (2). Bạn cũng có thể chuyển đổi dữ liệu thành mảng 2D - cần thiết cho việc vẽ - bằng cách dùng `reshape(n_rows, n_columns)`. Nếu một tham số là -1, chiều tương ứng sẽ được tính tự động.
```python
X = X[:, 2]
X = X.reshape((-1,1))
```
✅ Bất cứ lúc nào, hãy in dữ liệu ra để kiểm tra hình dạng của nó.
✅ Bất cứ lúc nào, in dữ liệu ra để kiểm tra kích thước.
3. Bây giờ bạn đã có dữ liệu sẵn sàng để vẽ, bạn có thể xem liệu máy có thể giúp xác định một đường phân chia hợp lý giữa các số trong bộ dữ liệu này hay không. Để làm điều này, bạn cần chia cả dữ liệu (X) và mục tiêu (y) thành tập kiểm tra và tập huấn luyện. Scikit-learn có cách đơn giản để làm điều này; bạn có thể chia dữ liệu kiểm tra của mình tại một điểm nhất định.
3. Bây giờ dữ liệu đã sẵn sàng để vẽ, bạn có thể xem liệu máy có thể giúp xác định một ngưỡng hợp lý chia các số trong bộ dữ liệu không. Để làm điều này, bạn cần chia cả dữ liệu (X) và mục tiêu (y) thành tập kiểm thử và huấn luyện. Scikit-learn có cách đơn giản để làm điều này, bạn có thể chia dữ liệu kiểm thử tại một điểm xác định.
```python
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
```
4. Bây giờ bạn đã sẵn sàng để huấn luyện mô hình của mình! Tải mô hình hồi quy tuyến tính và huấn luyện với các tập huấn luyện X và y của bạn bằng cách sử dụng `model.fit()`:
4. Bây giờ bạn đã sẵn sàng huấn luyện mô hình! Tải mô hình hồi quy tuyến tính và huấn luyện với tập huấn luyện X và y bằng `model.fit()`:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` một hàm bạn sẽ thấy trong nhiều thư viện ML như TensorFlow.
`model.fit()` là hàm bạn sẽ thấy trong nhiều thư viện ML như TensorFlow
5. Sau đó, tạo một dự đoán bằng cách sử dụng dữ liệu kiểm tra, sử dụng hàm `predict()`. Điều này sẽ được sử dụng để vẽ đường giữa các nhóm dữ liệu.
5. Sau đó, tạo dự đoán dùng dữ liệu kiểm thử với hàm `predict()`. Kết quả này sẽ dùng để vẽ đường phân chia giữa các nhóm dữ liệu
```python
y_pred = model.predict(X_test)
```
6. Bây giờ là lúc hiển thị dữ liệu trong một biểu đồ. Matplotlib là một công cụ rất hữu ích cho nhiệm vụ này. Tạo biểu đồ scatterplot của tất cả dữ liệu kiểm tra X và y, và sử dụng dự đoán để vẽ một đường ở vị trí thích hợp nhất, giữa các nhóm dữ liệu của mô hình.
6. Giờ là lúc hiển thị dữ liệu trên biểu đồ. Matplotlib là công cụ rất hữu ích cho việc này. Tạo biểu đồ điểm (scatterplot) của tất cả dữ liệu thử nghiệm X và y, rồi dùng dự đoán để vẽ một đường kẻ ở vị trí phù hợp nhất, phân tách các nhóm dữ liệu của mô hình.
```python
plt.scatter(X_test, y_test, color='black')
@ -202,29 +203,32 @@ Trong một ô mã mới, tải bộ dữ liệu tiểu đường bằng cách g
plt.show()
```
![biểu đồ scatterplot hiển thị các điểm dữ liệu về bệnh tiểu đường](../../../../2-Regression/1-Tools/images/scatterplot.png)
✅ Hãy suy nghĩ một chút về điều đang diễn ra ở đây. Một đường thẳng đang chạy qua nhiều điểm dữ liệu nhỏ, nhưng nó thực sự đang làm gì? Bạn có thể thấy cách sử dụng đường thẳng này để dự đoán vị trí của một điểm dữ liệu mới, chưa được nhìn thấy, trong mối quan hệ với trục y của biểu đồ không? Hãy thử diễn đạt bằng lời về ứng dụng thực tế của mô hình này.
![biểu đồ scatterplot hiển thị điểm dữ liệu về bệnh tiểu đường](../../../../translated_images/vi/scatterplot.ad8b356bcbb33be6.webp)
Chúc mừng bạn, bạn đã xây dựng mô hình hồi quy tuyến tính đầu tiên, tạo ra một dự đoán với nó, và hiển thị nó trên biểu đồ!
✅ Hãy nghĩ một chút về những gì đang xảy ra ở đây. Một đường thẳng đang chạy qua nhiều điểm dữ liệu nhỏ, nhưng nó đang làm gì chính xác? Bạn có thể thấy làm thế nào bạn nên sử dụng đường thẳng này để dự đoán nơi một điểm dữ liệu mới, chưa thấy, nên nằm ở đâu trong mối quan hệ với trục y của biểu đồ không? Hãy thử diễn đạt bằng lời về mục đích thực tiễn của mô hình này.
Chúc mừng, bạn đã xây dựng mô hình hồi quy tuyến tính đầu tiên, tạo ra một dự đoán với nó và hiển thị nó trong biểu đồ!
---
## 🚀Thử thách
Vẽ biểu đồ cho một biến khác từ tập dữ liệu này. Gợi ý: chỉnh sửa dòng này: `X = X[:,2]`. Với mục tiêu của tập dữ liệu này, bạn có thể khám phá được điều gì về sự tiến triển của bệnh tiểu đường?
## [Câu hỏi sau bài giảng](https://ff-quizzes.netlify.app/en/ml/)
Vẽ biểu đồ một biến khác từ bộ dữ liệu này. Gợi ý: chỉnh sửa dòng này: `X = X[:,2]`. Với mục tiêu của bộ dữ liệu này, bạn có thể khám phá điều gì về tiến triển của bệnh tiểu đường như một căn bệnh?
## [Trắc nghiệm sau bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## Ôn tập & Tự học
Trong hướng dẫn này, bạn đã làm việc với hồi quy tuyến tính đơn giản, thay vì hồi quy đơn biến hoặc hồi quy đa biến. Hãy đọc thêm một chút về sự khác biệt giữa các phương pháp này, hoặc xem [video này](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef).
Trong hướng dẫn này, bạn đã làm việc với hồi quy tuyến tính đơn giản, thay vì hồi quy tuyến tính đơn biến hay đa biến. Hãy đọc một chút về sự khác biệt giữa các phương pháp này, hoặc xem [video này](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef)
Tìm hiểu thêm về khái niệm hồi quy và suy nghĩ về những loại câu hỏi có thể được trả lời bằng kỹ thuật này. Hãy tham gia [hướng dẫn này](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) để nâng cao hiểu biết của bạn.
Đọc thêm về khái niệm hồi quy và suy nghĩ về những loại câu hỏi nào có thể được trả lời bằng kỹ thuật này. Tham khảo [hướng dẫn này](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) để tăng cường hiểu biết của bạn.
## Bài tập
[Một tập dữ liệu khác](assignment.md)
[Một bộ dữ liệu khác](assignment.md)
---
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -1,62 +1,62 @@
# Xây dựng mô hình hồi quy sử dụng Scikit-learn: chuẩn bị và trực quan hóa dữ liệu
![Infographic trực quan hóa dữ liệu](../../../../2-Regression/2-Data/images/data-visualization.png)
![Đồ họa trực quan hóa dữ liệu](../../../../translated_images/vi/data-visualization.54e56dded7c1a804.webp)
Infographic bởi [Dasani Madipalli](https://twitter.com/dasani_decoded)
Đồ họa do [Dasani Madipalli](https://twitter.com/dasani_decoded) thực hiện
## [Câu hỏi trước bài học](https://ff-quizzes.netlify.app/en/ml/)
## [Bài kiểm tra trước bài học](https://ff-quizzes.netlify.app/en/ml/)
> ### [Bài học này có sẵn bằng R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
## Giới thiệu
Bây giờ bạn đã có các công cụ cần thiết để bắt đầu xây dựng mô hình học máy với Scikit-learn, bạn đã sẵn sàng để bắt đầu đặt câu hỏi về dữ liệu của mình. Khi làm việc với dữ liệu và áp dụng các giải pháp ML, điều rất quan trọng là phải hiểu cách đặt câu hỏi đúng để khai thác tiềm năng của tập dữ liệu một cách hiệu quả.
Giờ bạn đã sẵn sàng với các công cụ cần thiết để bắt đầu xây dựng mô hình học máy với Scikit-learn, bạn đã sẵn sàng để bắt đầu đặt câu hỏi cho dữ liệu của mình. Khi bạn làm việc với dữ liệu và áp dụng giải pháp ML, điều rất quan trọng là hiểu cách đặt câu hỏi đúng để khai thác tiềm năng của bộ dữ liệu.
Trong bài học này, bạn sẽ học:
- Cách chuẩn bị dữ liệu cho việc xây dựng mô hình.
- Cách chuẩn bị dữ liệu của bạn để xây dựng mô hình.
- Cách sử dụng Matplotlib để trực quan hóa dữ liệu.
- Cách sử dụng Seaborn để trực quan hóa dữ liệu sinh động hơn.
## Đặt câu hỏi đúng về dữ liệu của bạn
## Đặt câu hỏi đúng đối với dữ liệu của bạn
Câu hỏi bạn cần trả lời sẽ quyết định loại thuật toán ML bạn sẽ sử dụng. Và chất lượng của câu trả lời bạn nhận được sẽ phụ thuộc rất nhiều vào bản chất của dữ liệu.
Câu hỏi bạn cần trả lời sẽ quyết định loại thuật toán ML bạn sẽ sử dụng. Và chất lượng câu trả lời bạn nhận được sẽ phụ thuộc lớn vào tính chất dữ liệu của bạn.
Hãy xem [dữ liệu](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) được cung cấp cho bài học này. Bạn có thể mở tệp .csv này trong VS Code. Một cái nhìn nhanh sẽ cho thấy rằng có các ô trống và sự pha trộn giữa dữ liệu dạng chuỗi và số. Ngoài ra còn có một cột kỳ lạ gọi là 'Package' với dữ liệu là sự pha trộn giữa 'sacks', 'bins' và các giá trị khác. Thực tế, dữ liệu này khá lộn xộn.
Hãy xem qua [dữ liệu](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) cung cấp cho bài học này. Bạn có thể mở tệp .csv này trong VS Code. Quan sát sơ qua cho thấy có những chỗ trống và một hỗn hợp giữa chuỗi và dữ liệu số. Cũng có một cột lạ tên 'Package' nơi dữ liệu là sự pha trộn giữa 'sacks', 'bins' và các giá trị khác. Dữ liệu, thực ra, hơi lộn xộn một chút.
[![ML cho người mới bắt đầu - Cách phân tích và làm sạch tập dữ liệu](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML cho người mới bắt đầu - Cách phân tích và làm sạch tập dữ liệu")
[![ML for beginners - Cách Phân tích và Làm sạch Bộ dữ liệu](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML for beginners - Cách Phân tích và Làm sạch Bộ dữ liệu")
> 🎥 Nhấp vào hình ảnh trên để xem video ngắn về cách chuẩn bị dữ liệu cho bài học này.
> 🎥 Nhấn vào hình trên để xem video ngắn hướng dẫn chuẩn bị dữ liệu cho bài học này.
Thực tế, không thường xuyên bạn nhận được một tập dữ liệu hoàn toàn sẵn sàng để sử dụng để tạo mô hình ML ngay lập tức. Trong bài học này, bạn sẽ học cách chuẩn bị một tập dữ liệu thô bằng cách sử dụng các thư viện Python tiêu chuẩn. Bạn cũng sẽ học các kỹ thuật khác nhau để trực quan hóa dữ liệu.
Thực tế, hiếm khi nào bạn được tặng một bộ dữ liệu hoàn toàn sẵn sàng để dùng ngay cho việc tạo mô hình ML. Trong bài học này, bạn sẽ học cách chuẩn bị bộ dữ liệu thô bằng các thư viện Python tiêu chuẩn. Bạn cũng sẽ học các kỹ thuật khác nhau để trực quan hóa dữ liệu.
## Nghiên cứu trường hợp: 'thị trường bí ngô'
## Nghiên cứu tình huống: 'thị trường bí ngô'
Trong thư mục này, bạn sẽ tìm thấy một tệp .csv trong thư mục gốc `data` có tên [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) bao gồm 1757 dòng dữ liệu về thị trường bí ngô, được phân loại theo thành phố. Đây là dữ liệu thô được trích xuất từ [Báo cáo Tiêu chuẩn Thị trường Cây Trồng Đặc Biệt](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) do Bộ Nông nghiệp Hoa Kỳ phân phối.
Trong thư mục này bạn sẽ tìm thấy một tệp .csv ở thư mục gốc `data` tên là [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) chứa 1757 dòng dữ liệu về thị trường bí ngô, được phân loại theo nhóm theo thành phố. Đây là dữ liệu thô được trích xuất từ các [Báo cáo Chuẩn Thị trường Chuyên ngành](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) do Bộ Nông nghiệp Hoa Kỳ phân phối.
### Chuẩn bị dữ liệu
Dữ liệu này thuộc phạm vi công cộng. Nó có thể được tải xuống dưới dạng nhiều tệp riêng biệt, theo từng thành phố, từ trang web USDA. Để tránh quá nhiều tệp riêng biệt, chúng tôi đã gộp tất cả dữ liệu thành phố vào một bảng tính, do đó chúng tôi đã _chuẩn bị_ dữ liệu một chút. Tiếp theo, hãy xem xét kỹ hơn dữ liệu.
Dữ liệu này thuộc phạm vi công cộng. Có thể tải xuống nhiều tệp riêng biệt, theo từng thành phố, từ trang web USDA. Để tránh quá nhiều tệp riêng lẻ, chúng tôi đã gộp dữ liệu của tất cả các thành phố thành một bảng tính duy nhất, do đó chúng tôi đã có một chút chuẩn bị dữ liệu rồi. Tiếp theo, hãy cùng xem kỹ hơn dữ liệu.
### Dữ liệu bí ngô - kết luận ban đầu
Bạn nhận thấy gì về dữ liệu này? Bạn đã thấy rằng có sự pha trộn giữa chuỗi, số, ô trống và các giá trị kỳ lạ mà bạn cần hiểu.
Bạn có thể đặt câu hỏi nào về dữ liệu này, sử dụng kỹ thuật hồi quy? Ví dụ: "Dự đoán giá của một quả bí ngô được bán trong một tháng cụ thể". Nhìn lại dữ liệu, có một số thay đổi bạn cần thực hiện để tạo cấu trúc dữ liệu cần thiết cho nhiệm vụ này.
Bạn nhận thấy gì về dữ liệu này? Bạn đã thấy nó là sự pha trộn giữa chuỗi, số, giá trị trống và những giá trị lạ mà bạn cần hiểu rõ.
Bạn có thể đặt câu hỏi gì cho dữ liệu này, sử dụng kỹ thuật Hồi quy? Chẳng hạn: "Dự đoán giá của một quả bí ngô được bán trong một tháng nhất định". Nhìn lại dữ liệu, bạn cần thực hiện một số thay đổi để tạo cấu trúc dữ liệu cần thiết cho nhiệm vụ này.
## Bài tập - phân tích dữ liệu bí ngô
Hãy sử dụng [Pandas](https://pandas.pydata.org/) (tên viết tắt của `Python Data Analysis`), một công cụ rất hữu ích để định hình dữ liệu, để phân tích và chuẩn bị dữ liệu bí ngô này.
Hãy sử dụng [Pandas](https://pandas.pydata.org/), (viết tắt của `Python Data Analysis`) một công cụ rất hữu ích để định hình dữ liệu, để phân tích và chuẩn bị dữ liệu bí ngô này.
### Đầu tiên, kiểm tra các ngày bị thiếu
### Trước tiên, kiểm tra ngày tháng bị thiếu
Bạn sẽ cần thực hiện các bước để kiểm tra các ngày bị thiếu:
Trước tiên bạn cần thực hiện các bước kiểm tra các ngày tháng bị thiếu:
1. Chuyển đổi các ngày sang định dạng tháng (đây là ngày tháng kiểu Mỹ, nên định dạng là `MM/DD/YYYY`).
1. Chuyển đổi các ngày tháng về định dạng tháng (đây là dữ liệu ngày tháng của Mỹ, nên định dạng là `MM/DD/YYYY`).
2. Trích xuất tháng vào một cột mới.
Mở tệp _notebook.ipynb_ trong Visual Studio Code và nhập bảng tính vào một dataframe Pandas mới.
1. Sử dụng hàm `head()` để xem năm hàng đầu tiên.
1. Dùng hàm `head()` để xem năm dòng đầu tiên.
```python
import pandas as pd
@ -64,17 +64,17 @@ Mở tệp _notebook.ipynb_ trong Visual Studio Code và nhập bảng tính và
pumpkins.head()
```
✅ Bạn sẽ sử dụng hàm nào để xem năm hàng cuối cùng?
✅ Bạn sẽ dùng hàm nào để xem năm dòng cuối cùng?
1. Kiểm tra xem có dữ liệu bị thiếu trong dataframe hiện tại không:
1. Kiểm tra xem có dữ liệu nào bị thiếu trong dataframe hiện tại không:
```python
pumpkins.isnull().sum()
```
Có dữ liệu bị thiếu, nhưng có thể nó sẽ không ảnh hưởng đến nhiệm vụ hiện tại.
Có dữ liệu bị thiếu, nhưng có thể nó không ảnh hưởng đến nhiệm vụ hiện tại.
1. Để làm cho dataframe của bạn dễ làm việc hơn, chỉ chọn các cột bạn cần, sử dụng hàm `loc` để trích xuất từ dataframe gốc một nhóm hàng (được truyền làm tham số đầu tiên) và cột (được truyền làm tham số thứ hai). Biểu thức `:` trong trường hợp dưới đây có nghĩa là "tất cả các ng".
1. Để làm dataframe dễ làm việc hơn, hãy chọn chỉ các cột cần thiết, sử dụng hàm `loc` để trích xuất từ dataframe gốc một nhóm các dòng (tham số đầu tiên) và các cột (tham số thứ hai). Biểu thức `:` trong trường hợp dưới đây có nghĩa là "tất cả các ng".
```python
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
@ -83,11 +83,11 @@ Mở tệp _notebook.ipynb_ trong Visual Studio Code và nhập bảng tính và
### Thứ hai, xác định giá trung bình của bí ngô
Hãy nghĩ về cách xác định giá trung bình của một quả bí ngô trong một tháng cụ thể. Bạn sẽ chọn những cột nào cho nhiệm vụ này? Gợi ý: bạn sẽ cần 3 cột.
Hãy suy nghĩ xem làm thế nào để xác định giá trung bình của một quả bí ngô trong một tháng nhất định. Bạn sẽ chọn những cột nào cho nhiệm vụ này? Gợi ý: bạn sẽ cần 3 cột.
Giải pháp: lấy trung bình của các cột `Low Price``High Price` để điền vào cột Price mới, và chuyển đổi cột Date để chỉ hiển thị tháng. May mắn thay, theo kiểm tra ở trên, không có dữ liệu bị thiếu cho ngày tháng hoặc giá cả.
Giải pháp: lấy trung bình của hai cột `Low Price``High Price` để điền vào cột Giá mới, và chuyển đổi cột Ngày để chỉ hiển thị tháng. May mắn thay, theo kiểm tra ở trên, không có dữ liệu bị thiếu về ngày tháng hay giá cả.
1. Để tính trung bình, thêm đoạn mã sau:
1. Để tính giá trung bình, thêm đoạn mã sau:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
@ -96,23 +96,23 @@ Giải pháp: lấy trung bình của các cột `Low Price` và `High Price` đ
```
✅ Bạn có thể in bất kỳ dữ liệu nào bạn muốn kiểm tra bằng cách sử dụng `print(month)`.
✅ Bạn có thể in ra bất cứ dữ liệu nào bạn muốn kiểm tra bằng `print(month)`.
2. Bây giờ, sao chép dữ liệu đã chuyển đổi của bạn vào một dataframe Pandas mới:
2. Bây giờ, sao chép dữ liệu đã chuyển đổi vào một dataframe Pandas mới:
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
In dataframe của bạn sẽ hiển thị một tập dữ liệu sạch sẽ, gọn gàng mà bạn có thể sử dụng để xây dựng mô hình hồi quy mới.
In ra dataframe sẽ cho bạn thấy một bộ dữ liệu gọn gàng, sạch sẽ để bạn xây dựng mô hình hồi quy mới.
### Nhưng khoan đã! Có điều gì đó kỳ lạ ở đây
Nếu bạn nhìn vào cột `Package`, bí ngô được bán theo nhiều cấu hình khác nhau. Một số được bán theo đơn vị '1 1/9 bushel', một số theo '1/2 bushel', một số theo quả, một số theo pound, và một số trong các hộp lớn với các kích thước khác nhau.
Nếu bạn nhìn vào cột `Package`, bí ngô được bán theo nhiều cách khác nhau. Một số được bán với đơn vị đo '1 1/9 bushel', một số với '1/2 bushel', một số tính theo quả, một số tính theo pound, và một số đóng trong những hộp lớn với kích thước khác nhau.
> Bí ngô dường như rất khó để cân đo một cách nhất quán
> Bí ngô dường như rất khó để cân nhất quán
Đào sâu vào dữ liệu gốc, thật thú vị khi bất kỳ mục nào có `Unit of Sale` bằng 'EACH' hoặc 'PER BIN' cũng có kiểu `Package` theo inch, theo bin, hoặc 'each'. Bí ngô dường như rất khó để cân đo một cách nhất quán, vì vậy hãy lọc chúng bằng cách chỉ chọn bí ngô có chuỗi 'bushel' trong cột `Package`.
Xem kỹ dữ liệu gốc, điều thú vị là bất cứ sản phẩm nào có `Unit of Sale` là 'EACH' hoặc 'PER BIN' cũng có kiểu `Package` là theo inch, theo thùng, hoặc 'each'. Bí ngô có vẻ rất khó để cân nhất quán, vì vậy hãy lọc chỉ những bí ngô có chuỗi 'bushel' trong cột `Package`.
1. Thêm bộ lọc ở đầu tệp, dưới phần nhập .csv ban đầu:
@ -120,13 +120,13 @@ Nếu bạn nhìn vào cột `Package`, bí ngô được bán theo nhiều cấ
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
Nếu bạn in dữ liệu bây giờ, bạn có thể thấy rằng bạn chỉ nhận được khoảng 415 dòng dữ liệu chứa bí ngô theo bushel.
Nếu bạn in dữ liệu bây giờ, bạn có thể thấy chỉ những dòng khoảng 415 dữ liệu chứa bí ngô tính theo bushel.
### Nhưng khoan đã! Còn một việc nữa cần làm
Bạn có nhận thấy rằng lượng bushel thay đổi theo từng dòng không? Bạn cần chuẩn hóa giá để hiển thị giá theo bushel, vì vậy hãy thực hiện một số phép toán để chuẩn hóa.
Bạn có nhận thấy lượng bushel khác nhau theo từng dòng không? Bạn cần chuẩn hóa giá để thể hiện giá theo từng bushel, vì thế hãy làm một số phép toán để chuẩn hóa.
1. Thêm các dòng sau sau khối tạo dataframe new_pumpkins:
1. Thêm các dòng sau sau đoạn tạo dataframe new_pumpkins:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
@ -134,29 +134,29 @@ Bạn có nhận thấy rằng lượng bushel thay đổi theo từng dòng kh
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
```
✅ Theo [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), trọng lượng của một bushel phụ thuộc vào loại sản phẩm, vì đây là một phép đo thể tích. "Một bushel cà chua, ví dụ, được cho là nặng 56 pound... Lá và rau xanh chiếm nhiều không gian hơn với ít trọng lượng hơn, vì vậy một bushel rau bina chỉ nặng 20 pound." Điều này khá phức tạp! Hãy không chuyển đổi bushel sang pound, thay vào đó tính giá theo bushel. Tất cả nghiên cứu về bushel bí ngô này, tuy nhiên, cho thấy việc hiểu rõ bản chất của dữ liệu là rất quan trọng!
✅ Theo [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), trọng lượng một bushel phụ thuộc vào loại sản phẩm, vì đây là đơn vị đo thể tích. "Một bushel cà chua, ví dụ, nặng 56 pounds... Lá xanh chiếm nhiều không gian hơn nhưng ít trọng lượng hơn, nên một bushel rau bina chỉ nặng 20 pounds." Tất cả khá phức tạp! Chúng ta không cần làm phép chuyển đổi bushel sang pound, thay vào đó giá bán theo bushel. Tất cả nghiên cứu về bushel bí ngô này cho thấy tầm quan trọng của việc hiểu bản chất dữ liệu của bạn!
Bây giờ, bạn có thể phân tích giá theo đơn vị dựa trên đo lường bushel của chúng. Nếu bạn in dữ liệu một lần nữa, bạn có thể thấy cách nó được chuẩn hóa.
Bây giờ, bạn có thể phân tích giá theo đơn vị dựa trên đo bushel của chúng. Nếu in dữ liệu lần nữa, bạn sẽ thấy cách chúng đã được chuẩn hóa.
✅ Bạn có nhận thấy rằng bí ngô được bán theo nửa bushel rất đắt không? Bạn có thể tìm ra lý do tại sao không? Gợi ý: bí ngô nhỏ thường đắt hơn bí ngô lớn, có lẽ vì có nhiều quả hơn trong một bushel, do không gian trống bị chiếm bởi một quả bí ngô lớn rỗng.
✅ Bạn có nhận thấy bí ngô bán theo nửa bushel rất đắt không? Bạn có đoán được lý do không? Gợi ý: những quả bí nhỏ có giá cao hơn nhiều so với quả to, có lẽ vì có nhiều quả nhỏ hơn trong một bushel kể cả khoảng không gian không dùng được bởi quả bí lớn rỗng bên trong.
## Chiến lược trực quan hóa
Một phần vai trò của nhà khoa học dữ liệu là thể hiện chất lượng và bản chất của dữ liệu mà họ đang làm việc. Để làm điều này, họ thường tạo ra các hình ảnh trực quan thú vị, hoặc biểu đồ, đồ thị, và sơ đồ, hiển thị các khía cạnh khác nhau của dữ liệu. Bằng cách này, họ có thể trực quan hóa các mối quan hệ và khoảng trống mà nếu không sẽ khó phát hiện.
Một phần công việc của nhà khoa học dữ liệu là trình bày chất lượng và tính chất của dữ liệu mà họ làm việc. Để làm điều này, họ thường tạo các trực quan đồ họa thú vị, biểu đồ, đồ thị, minh họa các khía cạnh khác nhau của dữ liệu. Bằng cách này, họ có thể hiển thị trực quan các mối quan hệ và khoảng trống mà nếu không sẽ rất khó phát hiện.
[![ML cho người mới bắt đầu - Cách trực quan hóa dữ liệu với Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML cho người mới bắt đầu - Cách trực quan hóa dữ liệu với Matplotlib")
[![ML for beginners - Cách Trực quan hóa Dữ liệu với Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML for beginners - Cách Trực quan hóa Dữ liệu với Matplotlib")
> 🎥 Nhấp vào hình ảnh trên để xem video ngắn về cách trực quan hóa dữ liệu cho bài học này.
> 🎥 Nhấn vào hình trên để xem video ngắn hướng dẫn trực quan hóa dữ liệu cho bài học này.
Các hình ảnh trực quan cũng có thể giúp xác định kỹ thuật học máy phù hợp nhất với dữ liệu. Một biểu đồ phân tán có vẻ theo một đường thẳng, ví dụ, cho thấy rằng dữ liệu là ứng viên tốt cho bài tập hồi quy tuyến tính.
Trực quan hóa cũng giúp xác định kỹ thuật học máy phù hợp nhất với dữ liệu. Ví dụ, một biểu đồ phân tán (scatterplot) có vẻ theo một đường thẳng có thể chỉ ra rằng dữ liệu phù hợp cho bài tập hồi quy tuyến tính.
Một thư viện trực quan hóa dữ liệu hoạt động tốt trong Jupyter notebooks là [Matplotlib](https://matplotlib.org/) (mà bạn cũng đã thấy trong bài học trước).
Một thư viện trực quan hóa dữ liệu hoạt động tốt trong các notebook Jupyter là [Matplotlib](https://matplotlib.org/) (mà bạn cũng đã thấy trong bài học trước).
> Tìm hiểu thêm về trực quan hóa dữ liệu trong [các hướng dẫn này](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
> Tăng kinh nghiệm trực quan hóa dữ liệu của bạn trong [những bài hướng dẫn này](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
## Bài tập - thử nghiệm với Matplotlib
Hãy thử tạo một số biểu đồ cơ bản để hiển thị dataframe mới bạn vừa tạo. Một biểu đồ đường cơ bản sẽ hiển thị điều gì?
Hãy thử tạo một số biểu đồ cơ bản để hiển thị dataframe mới bạn vừa tạo. Một biểu đồ đường cơ bản sẽ thể hiện điều gì?
1. Nhập Matplotlib ở đầu tệp, dưới phần nhập Pandas:
@ -165,7 +165,7 @@ Hãy thử tạo một số biểu đồ cơ bản để hiển thị dataframe
```
1. Chạy lại toàn bộ notebook để làm mới.
1. Ở cuối notebook, thêm một ô để vẽ dữ liệu dưới dạng hộp:
1. Ở cuối notebook, thêm một ô để biểu diễn dữ liệu dưới dạng hộp (box):
```python
price = new_pumpkins.Price
@ -174,38 +174,113 @@ Hãy thử tạo một số biểu đồ cơ bản để hiển thị dataframe
plt.show()
```
![Biểu đồ phân tán hiển thị mối quan hệ giữa giá và tháng](../../../../2-Regression/2-Data/images/scatterplot.png)
![Biểu đồ phân tán thể hiện mối quan hệ giá theo tháng](../../../../translated_images/vi/scatterplot.b6868f44cbd2051c.webp)
Đây có phải là biểu đồ hữu ích không? Có điều gì về nó làm bạn ngạc nhiên không?
Biểu đồ này có hữu ích không? Có gì làm bạn ngạc nhiên không?
Nó không đặc biệt hữu ích vì tất cả những gì nó làm là hiển thị dữ liệu của bạn dưới dạng một loạt các điểm trong một tháng nhất định.
Nó không quá hữu ích vì chỉ hiển thị dữ liệu của bạn như một tập điểm phân bố theo tháng.
### Làm cho nó hữu ích
Để các biểu đồ hiển thị dữ liệu hữu ích, bạn thường cần nhóm dữ liệu theo cách nào đó. Hãy thử tạo một biểu đồ mà trục y hiển thị các tháng và dữ liệu thể hiện sự phân bố của dữ liệu.
Để các biểu đồ thể hiện dữ liệu có ích, bạn thường cần nhóm dữ liệu theo một cách nào đó. Hãy thử tạo một biểu đồ nhóm nơi trục y thể hiện các tháng và dữ liệu biểu diễn phân phối dữ liệu.
1. Thêm một ô để tạo biểu đồ cột nhóm:
1. Thêm một ô để tạo biểu đồ cột theo nhóm:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![Biểu đồ cột hiển thị mối quan hệ giữa giá và tháng](../../../../2-Regression/2-Data/images/barchart.png)
![Biểu đồ cột thể hiện mối quan hệ giá theo tháng](../../../../translated_images/vi/barchart.a833ea9194346d76.webp)
Đây là trực quan hóa dữ liệu hữu ích hơn! Nó dường như chỉ ra rằng giá cao nhất của bí ngô xảy ra vào tháng Chín và tháng Mười. Điều này có đúng với kỳ vọng của bạn không? Tại sao hoặc tại sao không?
## Bài tập - thử nghiệm với Seaborn
Matplotlib rất mạnh, nhưng có thể cần nhiều mã để tạo biểu đồ tinh tế. [Seaborn](https://seaborn.pydata.org/) là thư viện xây dựng _trên nền_ Matplotlib được thiết kế cho trực quan hóa dữ liệu thống kê. Nó làm việc trực tiếp với các dataframe Pandas, áp dụng các kiểu mặc định hấp dẫn và cho phép bạn tạo biểu đồ thông tin chỉ với rất ít mã. Vì Seaborn trả về các đối tượng Matplotlib, bạn vẫn có thể sử dụng mọi thứ bạn biết về Matplotlib để tinh chỉnh kết quả.
> Nếu bạn chưa cài Seaborn, hãy cài bằng lệnh `pip install seaborn`.
1. Nhập Seaborn ở đầu notebook, dưới các import khác. Thông thường nó được nhập dưới tên `sns`:
```python
import seaborn as sns
```
### Biểu đồ phân tán để thể hiện các mối quan hệ
Một phần lớn của việc khám phá dữ liệu trước khi xây dựng mô hình là tìm kiếm các _mối quan hệ_ giữa các biến. Một [biểu đồ phân tán](https://en.wikipedia.org/wiki/Scatter_plot) là một trong những công cụ tốt nhất cho việc này: nếu các điểm dường như theo một đường thẳng, hai biến có thể tương quan, đây là dấu hiệu tốt rằng mô hình hồi quy tuyến tính có thể hiệu quả.
1. Tạo lại biểu đồ phân tán giá theo tháng trước đây, lần này sử dụng [`relplot()`](https://seaborn.pydata.org/generated/seaborn.relplot.html) của Seaborn (biểu đồ quan hệ), làm việc trực tiếp với các cột dataframe của bạn:
```python
sns.relplot(x="Price", y="Month", data=new_pumpkins)
```
![Biểu đồ phân tán Seaborn thể hiện mối quan hệ giá theo tháng](../../../../translated_images/vi/relplot.a03837d8f0329cec.webp)
Lưu ý bạn truyền _tên cột_ và dataframe, Seaborn sẽ tự động tạo nhãn trục cho bạn.
2. Bạn có thể chuyển sang biểu đồ đường bằng cách truyền `kind="line"`. Seaborn còn vẽ băng bóng thể hiện khoảng tin cậy quanh đường:
```python
sns.relplot(x="Price", y="Month", kind="line", data=new_pumpkins)
```
![Biểu đồ đường Seaborn thể hiện quan hệ giá theo tháng](../../../../translated_images/vi/lineplot.f9034ba47b1e30ee.webp)
Dữ liệu này khá nhiễu, nên biểu đồ đường không phải là lựa chọn rõ ràng ở đây — nhưng nó cho thấy bạn có thể dễ dàng thay đổi loại biểu đồ trong Seaborn.
### Biểu đồ cột để thể hiện phân bố
Trước đó bạn đã nhóm dữ liệu thủ công để tạo biểu đồ cột với Matplotlib. Hàm [`catplot()`](https://seaborn.pydata.org/generated/seaborn.catplot.html) (biểu đồ phân loại) của Seaborn có thể thực hiện việc nhóm và tổng hợp cho bạn. Mặc định `kind="bar"` hiển thị giá trị trung bình của mỗi nhóm cùng với một đường màu đen chỉ khoảng tin cậy.
1. Tạo biểu đồ cột giá trung bình theo từng tháng:
```python
sns.catplot(x="Month", y="Price", data=new_pumpkins, kind="bar")
```
![Một biểu đồ cột Seaborn hiển thị phân bố giá theo tháng](../../../../translated_images/vi/catplot.e73fc35fdf96242b.webp)
Điều này xác nhận điều bạn đã thấy với Matplotlib — giá đạt đỉnh quanh tháng Chín và tháng Mười — nhưng Seaborn cũng trực quan hóa mức độ _biến động_ giá trong từng tháng.
### Biểu đồ nhiệt để hiển thị mối tương quan
Biểu đồ phân tán so sánh hai biến tại một thời điểm. Khi bạn có nhiều cột số, một [biểu đồ nhiệt](https://en.wikipedia.org/wiki/Heat_map) cho phép bạn nhìn thấy sức mạnh mối quan hệ giữa _mọi_ cặp cột cùng lúc. Đây là cách phổ biến để phát hiện những đặc trưng có tương quan mạnh nhất trước khi chọn dữ liệu cho mô hình (và loại biểu đồ này cũng được dùng sau đó để hiển thị ma trận nhầm lẫn trong phân loại).
1. Xây dựng ma trận tương quan với Pandas, rồi vẽ nó bằng [`heatmap()`](https://seaborn.pydata.org/generated/seaborn.heatmap.html) của Seaborn. Tùy chọn `annot=True` in ra các giá trị tương quan trên từng ô:
```python
correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()
sns.heatmap(correlations, annot=True, cmap="coolwarm")
```
![Một biểu đồ nhiệt Seaborn hiển thị các tương quan giữa các cột số](../../../../translated_images/vi/heatmap.bd98dce43b404c57.webp)
Các giá trị gần `1` (hoặc `-1`) nghĩa là các cột có tương quan _tuyến tính_ mạnh. Chú ý cách `Low Price``High Price` gần như tương quan hoàn hảo. Còn `Month` chỉ thể hiện tương quan tuyến tính yếu với giá — mặc dù biểu đồ cột phía trên đã tiết lộ một đỉnh mùa vụ rõ ràng vào tháng Chín và tháng Mười. Đây là bài học quan trọng: hệ số tương quan chỉ đo các mối quan hệ _trực tuyến_ nên có thể bỏ sót các mẫu mùa vụ hoặc phi tuyến tính khác. ✅ Tại sao việc quan sát cả biểu đồ nhiệt *và* các biểu đồ như biểu đồ cột lại hữu dụng trước khi quyết định sử dụng cột nào?
### Matplotlib hay Seaborn?
Cả hai thư viện đều đáng để biết:
- **Matplotlib** cho bạn kiểm soát chi tiết từng phần tử của biểu đồ và là nền tảng mà gần như mọi thư viện vẽ biểu đồ Python khác xây dựng dựa vào.
- **Seaborn** cung cấp các hàm cấp cao hơn với cấu hình mặc định đẹp cho biểu đồ thống kê, làm việc trực tiếp với dataframe, và thường nhanh hơn cho phân tích dữ liệu khám phá.
Đây là một hình ảnh trực quan dữ liệu hữu ích hơn! Dường như nó chỉ ra rằng giá cao nhất cho bí ngô xảy ra vào tháng 9 và tháng 10. Điều này có đúng với mong đợi của bạn không? Tại sao hoặc tại sao không?
Một quy trình phổ biến là sử dụng Seaborn để khám phá dữ liệu nhanh, rồi chuyển xuống Matplotlib khi cần tùy chỉnh chi tiết.
---
## 🚀Thử thách
Khám phá các loại hình ảnh trực quan khác nhau mà Matplotlib cung cấp. Loại nào phù hợp nhất cho các bài toán hồi quy?
Khám phá các loại trực quan hóa khác nhau mà Matplotlib và Seaborn cung cấp. Loại nào thích hợp nhất cho các bài toán hồi quy?
## [Câu hỏi sau bài học](https://ff-quizzes.netlify.app/en/ml/)
## [Bài kiểm tra sau bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## Ôn tập & Tự học
Hãy xem xét các cách khác nhau để trực quan hóa dữ liệu. Lập danh sách các thư viện khác nhau có sẵn và ghi chú loại nào tốt nhất cho các loại nhiệm vụ cụ thể, ví dụ trực quan hóa 2D so với trực quan hóa 3D. Bạn phát hiện ra điều gì?
Hãy xem qua nhiều cách khác nhau để trực quan hóa dữ liệu. Lập danh sách các thư viện khả dụng và ghi chú thư viện nào phù hợp với nhiệm vụ nào, ví dụ trực quan hóa 2D so với trực quan hóa 3D. Bạn khám phá được gì?
## Bài tập
@ -213,5 +288,7 @@ Hãy xem xét các cách khác nhau để trực quan hóa dữ liệu. Lập da
---
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->

@ -3,7 +3,9 @@
{
"cell_type": "markdown",
"metadata": {},
"source": []
"source": [
"## Hồi Quy Tuyến Tính cho Bí Ngô - Bài Học 2\n"
]
},
{
"cell_type": "code",
@ -220,6 +222,7 @@
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"pumpkins = pd.read_csv('../../data/US-pumpkins.csv')\n",
"\n",
"pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]\n",
@ -383,18 +386,78 @@
"plt.ylabel(\"Pumpkin Price\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Trực quan hóa với Seaborn\n",
"\n",
"[Seaborn](https://seaborn.pydata.org/) được xây dựng trên Matplotlib và hoạt động trực tiếp với dataframes, giúp nhanh chóng tạo các biểu đồ thống kê hấp dẫn chỉ với rất ít mã.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Biểu đồ phân tán để hiển thị mối quan hệ\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.relplot(x=\"Price\", y=\"Month\", data=new_pumpkins)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sns.relplot(x=\"Price\", y=\"Month\", kind=\"line\", data=new_pumpkins)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Biểu đồ cột để hiển thị phân phối\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
"source": [
"sns.catplot(x=\"Month\", y=\"Price\", data=new_pumpkins, kind=\"bar\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Tuyên bố miễn trừ trách nhiệm**: \nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn tham khảo chính thức. Đối với các thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp từ con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.\n"
"### Bản đồ nhiệt để hiển thị tương quan\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"correlations = new_pumpkins[['Month', 'Low Price', 'High Price', 'Price']].corr()\n",
"sns.heatmap(correlations, annot=True, cmap=\"coolwarm\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**Tuyên bố miễn trừ trách nhiệm**:\nTài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
@ -424,13 +487,7 @@
"hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d"
}
},
"orig_nbformat": 2,
"coopTranslator": {
"original_hash": "95726f0b8283628d5356a4f8eb8b4b76",
"translation_date": "2025-09-06T13:46:35+00:00",
"source_file": "2-Regression/2-Data/solution/notebook.ipynb",
"language_code": "vi"
}
"orig_nbformat": 2
},
"nbformat": 4,
"nbformat_minor": 2

@ -1,47 +1,47 @@
# Giới thiệu về Học Tăng Cường và Q-Learning
# Giới thiệu về Học tăng cường và Q-Learning
![Tóm tắt về học tăng cường trong học máy qua sketchnote](../../../../sketchnotes/ml-reinforcement.png)
![Tóm tắt về học tăng cường trong máy học dưới dạng sketchnote](../../../../translated_images/vi/ml-reinforcement.94024374d63348db.webp)
> Sketchnote bởi [Tomomi Imura](https://www.twitter.com/girlie_mac)
Học tăng cường liên quan đến ba khái niệm quan trọng: tác nhân, các trạng thái, và một tập hợp các hành động cho mỗi trạng thái. Bằng cách thực hiện một hành động trong một trạng thái cụ thể, tác nhân sẽ nhận được phần thưởng. Hãy tưởng tượng trò chơi điện tử Super Mario. Bạn là Mario, bạn đang ở một cấp độ trong trò chơi, đứng cạnh mép vực. Phía trên bạn là một đồng xu. Bạn là Mario, ở một cấp độ trò chơi, tại một vị trí cụ thể... đó là trạng thái của bạn. Di chuyển một bước sang phải (một hành động) sẽ khiến bạn rơi xuống vực, và điều đó sẽ cho bạn một điểm số thấp. Tuy nhiên, nhấn nút nhảy sẽ giúp bạn ghi điểm và bạn sẽ sống sót. Đó là một kết quả tích cực và điều đó sẽ thưởng cho bạn một điểm số cao.
Học tăng cường bao gồm ba khái niệm quan trọng: tác nhân, một số trạng thái, và một tập các hành động cho mỗi trạng thái. Bằng cách thực hiện một hành động trong trạng thái cụ thể, tác nhân sẽ nhận được phần thưởng. Hãy tưởng tượng trò chơi điện tử Super Mario. Bạn là Mario, bạn ở trong một màn chơi, đứng cạnh mép vách đá. Phía trên bạn là một đồng xu. Bạn, với vai trò Mario, trong một màn chơi, tại vị trí cụ thể ... đó là trạng thái của bạn. Di chuyển một bước sang phải (một hành động) sẽ khiến bạn rơi xuống, và điều đó sẽ cho bạn điểm số thấp. Tuy nhiên, nhấn nút nhảy sẽ giúp bạn ghi một điểm và bạn sẽ sống sót. Đó là một kết quả tích cực và bạn nên được thưởng điểm số dương.
Bằng cách sử dụng học tăng cường và một trình mô phỏng (trò chơi), bạn có thể học cách chơi trò chơi để tối đa hóa phần thưởng, đó là sống sót và ghi được càng nhiều điểm càng tốt.
Bằng cách sử dụng học tăng cường và một bộ mô phỏng (trò chơi), bạn có thể học cách chơi trò chơi để tối đa hóa phần thưởng là sống sót và kiếm thật nhiều điểm.
[![Giới thiệu về Học Tăng Cường](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
[![Giới thiệu về Học tăng cường](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
> 🎥 Nhấn vào hình ảnh trên để nghe Dmitry thảo luận về Học Tăng Cường
> 🎥 Nhấn vào hình trên để nghe Dmitry thảo luận về Học tăng cường
## [Câu hỏi trước bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## [Đề kiểm tra trước bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## Yêu cầu và Cài đặt
Trong bài học này, chúng ta sẽ thử nghiệm một số đoạn mã trong Python. Bạn cần có khả năng chạy mã Jupyter Notebook từ bài học này, trên máy tính của bạn hoặc trên đám mây.
Trong bài học này, chúng ta sẽ thử nghiệm với một số đoạn mã Python. Bạn nên có khả năng chạy mã trong Jupyter Notebook của bài học này, trên máy tính của bạn hoặc ở đâu đó trên đám mây.
Bạn có thể mở [notebook bài học](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) và đi qua bài học này để xây dựng.
Bạn có thể mở [notebook bài học](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/notebook.ipynb) và theo dõi bài học này để xây dựng.
> **Lưu ý:** Nếu bạn mở mã này từ đám mây, bạn cũng cần lấy tệp [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), được sử dụng trong mã notebook. Thêm nó vào cùng thư mục với notebook.
> **Lưu ý:** Nếu bạn mở mã này từ đám mây, bạn cũng cần tải file [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), được sử dụng trong mã notebook. Thêm nó vào cùng thư mục với notebook.
## Giới thiệu
Trong bài học này, chúng ta sẽ khám phá thế giới của **[Peter và con sói](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, lấy cảm hứng từ câu chuyện cổ tích âm nhạc của nhà soạn nhạc người Nga, [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev). Chúng ta sẽ sử dụng **Học Tăng Cường** để giúp Peter khám phá môi trường của mình, thu thập những quả táo ngon và tránh gặp con sói.
Trong bài học này, chúng ta sẽ khám phá thế giới của **[Peter và Con Sói](https://en.wikipedia.org/wiki/Peter_and_the_Wolf)**, lấy cảm hứng từ câu chuyện nhạc cổ tích do nhà soạn nhạc người Nga, [Sergei Prokofiev](https://en.wikipedia.org/wiki/Sergei_Prokofiev), sáng tác. Chúng ta sẽ sử dụng **Học tăng cường** để cho Peter khám phá môi trường, thu thập táo ngon và tránh gặp con sói.
**Học Tăng Cường** (RL) là một kỹ thuật học cho phép chúng ta học hành vi tối ưu của một **tác nhân** trong một **môi trường** bằng cách thực hiện nhiều thử nghiệm. Một tác nhân trong môi trường này cần có một **mục tiêu**, được định nghĩa bởi một **hàm phần thưởng**.
**Học tăng cường** (RL) là một kỹ thuật học tập cho phép ta học hành vi tối ưu của một **tác nhân** trong một **môi trường** nào đó bằng cách thực hiện nhiều thử nghiệm. Một tác nhân trong môi trường này sẽ có một **mục tiêu**, được xác định bởi một **hàm phần thưởng**.
## Môi trường
Để đơn giản, hãy xem thế giới của Peter là một bảng vuông có kích thước `width` x `height`, như sau:
Để đơn giản, ta coi thế giới của Peter là một bàn cờ vuông có kích thước `width` x `height`, như sau:
![Môi trường của Peter](../../../../8-Reinforcement/1-QLearning/images/environment.png)
![Môi trường của Peter](../../../../translated_images/vi/environment.40ba3cb66256c93f.webp)
Mỗi ô trong bảng này có thể là:
Mỗi ô trong bàn cờ này có thể là:
* **mặt đất**, nơi Peter và các sinh vật khác có thể đi lại.
* **nước**, nơi bạn rõ ràng không thể đi lại.
* một **cây** hoặc **cỏ**, nơi bạn có thể nghỉ ngơi.
* một **quả táo**, thứ mà Peter sẽ rất vui khi tìm thấy để ăn.
* một **con sói**, thứ nguy hiểm và cần tránh.
* **đất**, nơi mà Peter và các sinh vật khác có thể đi lại.
* **nước**, nơi mà rõ ràng bạn không thể đi lại.
* một **cây** hoặc **cỏ**, nơi để bạn nghỉ ngơi.
* một **quả táo**, đại diện cho thứ mà Peter sẽ vui mừng tìm thấy để tự nuôi mình.
* một **con sói**, rất nguy hiểm và cần tránh.
Có một module Python riêng biệt, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), chứa mã để làm việc với môi trường này. Vì mã này không quan trọng để hiểu các khái niệm của chúng ta, chúng ta sẽ nhập module và sử dụng nó để tạo bảng mẫu (code block 1):
Có một module Python riêng, [`rlboard.py`](https://github.com/microsoft/ML-For-Beginners/blob/main/8-Reinforcement/1-QLearning/rlboard.py), chứa mã xử lý môi trường này. Vì mã này không quan trọng cho việc hiểu các khái niệm của ta, ta sẽ nhập module này và dùng nó để tạo bàn cờ mẫu (khối mã 1):
```python
from rlboard import *
@ -52,15 +52,15 @@ m.randomize(seed=13)
m.plot()
```
Mã này sẽ in ra hình ảnh của môi trường tương tự như hình trên.
Mã này sẽ in ra hình ảnh của môi trường tương tự như hình trên.
## Hành động và chính sách
Trong ví dụ của chúng ta, mục tiêu của Peter là tìm được quả táo, đồng thời tránh con sói và các chướng ngại vật khác. Để làm điều này, anh ta có thể đi lại cho đến khi tìm thấy quả táo.
Trong ví dụ của ta, mục tiêu của Peter là tìm được quả táo, đồng thời tránh con sói và các chướng ngại khác. Để làm điều này, anh ta có thể đi lang thang cho đến khi tìm thấy quả táo.
Do đó, tại bất kỳ vị trí nào, anh ta có thể chọn một trong các hành động sau: lên, xuống, trái và phải.
Chúng ta sẽ định nghĩa các hành động đó dưới dạng một từ điển và ánh xạ chúng tới các cặp thay đổi tọa độ tương ứng. Ví dụ, di chuyển sang phải (`R`) sẽ tương ứng với cặp `(1,0)`. (code block 2):
Ta sẽ định nghĩa những hành động này dưới dạng một từ điển, và ánh xạ chúng thành các cặp thay đổi tọa độ tương ứng. Ví dụ, di chuyển sang phải (`R`) sẽ tương ứng với cặp `(1,0)`. (khối mã 2):
```python
actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
@ -69,46 +69,46 @@ action_idx = { a : i for i,a in enumerate(actions.keys()) }
Tóm lại, chiến lược và mục tiêu của kịch bản này như sau:
- **Chiến lược**, của tác nhân (Peter) được định nghĩa bởi một cái gọi là **chính sách**. Chính sách là một hàm trả về hành động tại bất kỳ trạng thái nào. Trong trường hợp của chúng ta, trạng thái của vấn đề được biểu diễn bởi bảng, bao gồm vị trí hiện tại của người chơi.
- **Chiến lược**, của tác nhân ta (Peter) được xác định bởi cái gọi là **chính sách**. Chính sách là một hàm trả về hành động tại bất kỳ trạng thái nào. Trong trường hợp của ta, trạng thái của bài toán được biểu diễn bằng bàn cờ, bao gồm vị trí hiện tại của người chơi.
- **Mục tiêu**, của học tăng cường là cuối cùng học được một chính sách tốt cho phép chúng ta giải quyết vấn đề một cách hiệu quả. Tuy nhiên, như một cơ sở, hãy xem xét chính sách đơn giản nhất gọi là **đi bộ ngẫu nhiên**.
- **Mục tiêu**, của học tăng cường là cuối cùng học được một chính sách tốt cho phép ta giải quyết bài toán hiệu quả. Tuy nhiên, như một điểm khởi đầu, ta sẽ xem xét chính sách đơn giản nhất gọi là **đi lang thang ngẫu nhiên**.
## Đi bộ ngẫu nhiên
## Đi lang thang ngẫu nhiên
Hãy giải quyết vấn đề của chúng ta bằng cách triển khai chiến lược đi bộ ngẫu nhiên. Với đi bộ ngẫu nhiên, chúng ta sẽ chọn ngẫu nhiên hành động tiếp theo từ các hành động được phép, cho đến khi chúng ta đạt được quả táo (code block 3).
Trước hết, hãy giải bài toán bằng cách triển khai chiến lược đi lang thang ngẫu nhiên. Với đi lang thang ngẫu nhiên, ta sẽ chọn ngẫu nhiên hành động tiếp theo từ các hành động được phép, cho đến khi ta đến được quả táo (khối mã 3).
1. Triển khai đi bộ ngẫu nhiên với mã dưới đây:
1. Triển khai đi lang thang ngẫu nhiên với đoạn mã bên dưới:
```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
n = 0 # số bước
# đặt vị trí ban đầu
if start_position:
m.human = start_position
else:
m.random_start()
while True:
if m.at() == Board.Cell.apple:
return n # success!
return n # thành công!
if m.at() in [Board.Cell.wolf, Board.Cell.water]:
return -1 # eaten by wolf or drowned
return -1 # bị sói ăn hoặc chết đuối
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
m.move(a) # thực hiện di chuyển thực tế
break
n+=1
walk(m,random_policy)
```
Lệnh gọi `walk` sẽ trả về độ dài của đường đi tương ứng, có thể thay đổi từ lần chạy này sang lần chạy khác.
Lời gọi hàm `walk` sẽ trả về chiều dài của đường đi tương ứng, có thể thay đổi trong mỗi lần chạy.
1. Thực hiện thử nghiệm đi bộ một số lần (ví dụ, 100 lần), và in ra thống kê kết quả (code block 4):
1. Chạy thí nghiệm đi lang thang nhiều lần (ví dụ 100 lần), và in ra thống kê kết quả (khối mã 4):
```python
def print_statistics(policy):
@ -125,17 +125,17 @@ Hãy giải quyết vấn đề của chúng ta bằng cách triển khai chiế
print_statistics(random_policy)
```
Lưu ý rằng độ dài trung bình của một đường đi là khoảng 30-40 bước, khá nhiều, trong khi khoảng cách trung bình đến quả táo gần nhất là khoảng 5-6 bước.
Lưu ý rằng chiều dài trung bình của một đường đi khoảng 30-40 bước, khá lớn, trong khi khoảng cách trung bình đến quả táo gần nhất là khoảng 5-6 bước.
Bạn cũng có thể xem chuyển động của Peter trong quá trình đi bộ ngẫu nhiên:
Bạn cũng có thể xem chuyển động của Peter trong quá trình đi lang thang ngẫu nhiên:
![Đi bộ ngẫu nhiên của Peter](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif)
![Đi lang thang ngẫu nhiên của Peter](../../../../8-Reinforcement/1-QLearning/images/random_walk.gif)
## Hàm phần thưởng
Để làm cho chính sách của chúng ta thông minh hơn, chúng ta cần hiểu hành động nào "tốt hơn" hành động khác. Để làm điều này, chúng ta cần định nghĩa mục tiêu của mình.
Để làm cho chính sách của ta thông minh hơn, ta cần hiểu hành động nào "tốt hơn" những hành động khác. Để làm điều này, ta cần xác định mục tiêu của mình.
Mục tiêu có thể được định nghĩa dưới dạng một **hàm phần thưởng**, hàm này sẽ trả về một giá trị điểm cho mỗi trạng thái. Số càng cao, hàm phần thưởng càng tốt. (code block 5)
Mục tiêu có thể được định nghĩa qua một **hàm phần thưởng**, hàm này sẽ trả về giá trị điểm cho mỗi trạng thái. Số càng cao, phần thưởng càng tốt. (khối mã 5)
```python
move_reward = -0.1
@ -154,39 +154,115 @@ def reward(m,pos=None):
return move_reward
```
Một điều thú vị về các hàm phần thưởng là trong hầu hết các trường hợp, *chúng ta chỉ nhận được phần thưởng đáng kể vào cuối trò chơi*. Điều này có nghĩa là thuật toán của chúng ta cần phải nhớ các bước "tốt" dẫn đến phần thưởng tích cực ở cuối, và tăng tầm quan trọng của chúng. Tương tự, tất cả các bước dẫn đến kết quả xấu cần bị giảm giá trị.
Một điều thú vị về hàm phần thưởng là trong hầu hết các trường hợp, *ta chỉ nhận được phần thưởng lớn vào cuối trò chơi*. Điều này nghĩa là thuật toán của ta phải nhớ lại những bước "tốt" dẫn đến phần thưởng tích cực ở cuối, và tăng tầm quan trọng của chúng. Tương tự, tất cả các bước đi dẫn đến kết quả xấu nên bị hạn chế.
## Q-Learning
Thuật toán mà chúng ta sẽ thảo luận ở đây được gọi là **Q-Learning**. Trong thuật toán này, chính sách được định nghĩa bởi một hàm (hoặc cấu trúc dữ liệu) gọi là **Q-Table**. Nó ghi lại "mức độ tốt" của mỗi hành động trong một trạng thái nhất định.
Một thuật toán mà ta sẽ thảo luận ở đây gọi là **Q-Learning**. Trong thuật toán này, chính sách được định nghĩa bởi một hàm (hoặc cấu trúc dữ liệu) gọi là **Bảng Q**. Nó ghi lại mức độ "tốt" của mỗi hành động trong một trạng thái nhất định.
Nó được gọi là Q-Table vì thường tiện lợi để biểu diễn nó dưới dạng một bảng, hoặc mảng đa chiều. Vì bảng của chúng ta có kích thước `width` x `height`, chúng ta có thể biểu diễn Q-Table bằng một mảng numpy với hình dạng `width` x `height` x `len(actions)`: (code block 6)
Nó được gọi là Bảng Q vì thường thuận tiện khi biểu diễn nó dưới dạng bảng hoặc mảng đa chiều. Vì bàn cờ của ta có kích thước `width` x `height`, ta có thể biểu diễn Bảng Q bằng một numpy array có hình dạng `width` x `height` x `len(actions)`: (khối mã 6)
```python
Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
```
Lưu ý rằng chúng ta khởi tạo tất cả các giá trị của Q-Table với một giá trị bằng nhau, trong trường hợp của chúng ta là 0.25. Điều này tương ứng với chính sách "đi bộ ngẫu nhiên", vì tất cả các hành động trong mỗi trạng thái đều tốt như nhau. Chúng ta có thể truyền Q-Table vào hàm `plot` để trực quan hóa bảng trên bảng: `m.plot(Q)`.
Lưu ý rằng ta khởi tạo tất cả giá trị của Bảng Q với giá trị bằng nhau, trong trường hợp này là 0.25. Điều này tương ứng với chính sách "đi lang thang ngẫu nhiên", vì tất cả các hành động trong mỗi trạng thái đều như nhau. Ta có thể truyền Bảng Q cho hàm `plot` để trực quan hóa bảng trên bàn cờ: `m.plot(Q)`.
![Môi trường của Peter](../../../../8-Reinforcement/1-QLearning/images/env_init.png)
![Môi trường của Peter](../../../../translated_images/vi/env_init.04e8f26d2d60089e.webp)
Ở trung tâm của mỗi ô có một "mũi tên" chỉ hướng di chuyển ưu tiên. Vì tất cả các hướng đều bằng nhau, một dấu chấm được hiển thị.
Ở trung tâm mỗi ô có một "mũi tên" chỉ hướng di chuyển được ưu tiên. Vì tất cả các hướng bằng nhau, một dấu chấm được hiển thị.
Bây giờ chúng ta cần chạy mô phỏng, khám phá môi trường của mình, và học một phân phối giá trị Q-Table tốt hơn, điều này sẽ cho phép chúng ta tìm đường đến quả táo nhanh hơn nhiều.
Giờ ta cần chạy mô phỏng, khám phá môi trường và học một phân bố giá trị Bảng Q tốt hơn, giúp ta tìm đường đến quả táo nhanh hơn nhiều.
## Bản chất của Q-Learning: Phương trình Bellman
Khi chúng ta bắt đầu di chuyển, mỗi hành động sẽ có một phần thưởng tương ứng, tức là chúng ta có thể lý thuyết chọn hành động tiếp theo dựa trên phần thưởng ngay lập tức cao nhất. Tuy nhiên, trong hầu hết các trạng thái, hành động sẽ không đạt được mục tiêu của chúng ta là đến quả táo, và do đó chúng ta không thể ngay lập tức quyết định hướng nào tốt hơn.
Khi ta bắt đầu di chuyển, mỗi hành động sẽ có phần thưởng tương ứng, tức là ta có thể chọn hành động tiếp theo dựa trên phần thưởng tức thì cao nhất. Tuy nhiên, trong hầu hết trạng thái, bước đi sẽ không đạt mục tiêu là tìm được quả táo, nên ta không thể ngay lập tức quyết định hướng nào tốt hơn.
> Hãy nhớ rằng điều quan trọng không phải là kết quả ngay lập tức, mà là kết quả cuối cùng, mà chúng ta sẽ đạt được vào cuối mô phỏng.
> Hãy nhớ rằng điều quan trọng không phải kết quả tức thì, mà là kết quả cuối cùng mà ta sẽ thu được khi kết thúc mô phỏng.
Để tính đến phần thưởng bị trì hoãn này, chúng ta cần sử dụng các nguyên tắc của **[lập trình động](https://en.wikipedia.org/wiki/Dynamic_programming)**, cho phép chúng ta suy nghĩ về vấn đề của mình một cách đệ quy.
Để tính đến phần thưởng trì hoãn này, ta cần sử dụng nguyên lý của **[lập trình động](https://en.wikipedia.org/wiki/Dynamic_programming)**, cho phép suy nghĩ bài toán một cách đệ quy.
Giả sử chúng ta đang ở trạng thái *s*, và chúng ta muốn di chuyển đến trạng thái tiếp theo *s'*. Bằng cách làm như vậy, chúng ta sẽ nhận được phần thưởng ngay lập tức *r(s,a)*, được định nghĩa bởi hàm phần thưởng, cộng với một phần thưởng tương lai. Nếu chúng ta giả sử rằng Q-Table của chúng ta phản ánh chính xác "sự hấp dẫn" của mỗi hành động, thì tại trạng thái *s'* chúng ta sẽ chọn một hành động *a* tương ứng với giá trị tối đa của *Q(s',a')*. Do đó, phần thưởng tương lai tốt nhất có thể mà chúng ta có thể nhận được tại trạng thái *s* sẽ được định nghĩa là `max`
Giả sử ta đang ở trạng thái *s*, và muốn di chuyển sang trạng thái tiếp theo *s'*. Khi làm vậy, ta sẽ nhận phần thưởng tức thì *r(s,a)*, do hàm phần thưởng xác định, cộng với một phần thưởng trong tương lai. Nếu giả sử Bảng Q của ta phản ánh đúng "sức hấp dẫn" của mỗi hành động, thì tại trạng thái *s'* ta sẽ chọn hành động *a* tương ứng với giá trị tối đa của *Q(s',a')*. Do đó, phần thưởng tương lai tốt nhất tại trạng thái *s* được định nghĩa là `max`<sub>a'</sub>*Q(s',a')* (giá trị tối đa ở đây được tính trên tất cả các hành động *a'* có thể tại trạng thái *s'*).
Điều này dẫn đến **công thức Bellman** để tính giá trị Bảng Q tại trạng thái *s*, với hành động *a*:
<img src="../../../../translated_images/vi/bellman-equation.7c0c4c722e5a6b7c.webp"/>
Ở đây γ là hệ số giảm giá (**discount factor**) xác định mức độ bạn ưu tiên phần thưởng hiện tại hơn phần thưởng tương lai và ngược lại.
## Thuật toán học
Với phương trình trên, ta có thể viết mã giả cho thuật toán học:
* Khởi tạo Bảng Q với các giá trị bằng nhau cho tất cả trạng thái và hành động
* Đặt tốc độ học α ← 1
* Lặp lại mô phỏng nhiều lần
1. Bắt đầu tại vị trí ngẫu nhiên
1. Lặp lại
1. Chọn hành động *a* tại trạng thái *s*
2. Thực thi hành động bằng cách di chuyển đến trạng thái mới *s'*
3. Nếu đạt điều kiện kết thúc trò chơi, hoặc phần thưởng tổng quá nhỏ - thoát mô phỏng
4. Tính phần thưởng *r* tại trạng thái mới
5. Cập nhật hàm Q theo phương trình Bellman: *Q(s,a)* ← *(1-α)Q(s,a)+α(r+γ max<sub>a'</sub>Q(s',a'))*
6. *s* ← *s'*
7. Cập nhật phần thưởng tổng và giảm α.
## Khám phá vs. lợi dụng
Trong thuật toán trên, ta chưa chỉ rõ cách chọn hành động tại bước 2.1. Nếu chọn hành động ngẫu nhiên, ta sẽ **khám phá** môi trường ngẫu nhiên, và có khả năng chết nhiều cũng như vào những khu vực thông thường ta không đi đến. Phương án khác là **lợi dụng** các giá trị trong Bảng Q đã biết, để chọn hành động tốt nhất (có giá trị Q cao hơn) tại trạng thái *s*. Tuy nhiên, điều này sẽ ngăn ta khám phá các trạng thái khác và có thể không tìm được giải pháp tối ưu.
Do đó, cách tốt nhất là cân bằng giữa khám phá và lợi dụng. Điều này có thể thực hiện bằng cách chọn hành động tại trạng thái *s* với xác suất tỉ lệ thuận với giá trị trong Bảng Q. Ban đầu, khi các giá trị trong Bảng Q đều bằng nhau, đó là chọn ngẫu nhiên, nhưng khi ta học được nhiều hơn về môi trường, ta có xu hướng theo đường đi tối ưu đồng thời cho phép tác nhân thỉnh thoảng chọn các đường chưa được khám phá.
## Triển khai trong Python
Bây giờ ta sẵn sàng triển khai thuật toán học. Trước đó ta cần một hàm chuyển các giá trị bất kỳ trong Bảng Q thành một vector xác suất cho các hành động tương ứng.
1. Tạo hàm `probs()`:
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
```
Ta thêm vài giá trị `eps` vào vector gốc để tránh chia cho 0 trong trường hợp ban đầu, khi tất cả thành phần vector giống nhau.
Chạy thuật toán học qua 5000 lần thí nghiệm, còn gọi là **epochs**: (khối mã 8)
```python
for epoch in range(5000):
# Chọn điểm khởi đầu
m.random_start()
# Bắt đầu di chuyển
n=0
cum_reward = 0
while True:
x,y = m.human
v = probs(Q[x,y])
a = random.choices(list(actions),weights=v)[0]
dpos = actions[a]
m.move(dpos,check_correctness=False) # chúng tôi cho phép người chơi di chuyển ra ngoài bàn cờ, điều này sẽ kết thúc tập phim
r = reward(m)
cum_reward += r
if r==end_reward or cum_reward < -1000:
lpath.append(n)
break
alpha = np.exp(-n / 10e5)
gamma = 0.5
ai = action_idx[a]
Q[x,y,ai] = (1 - alpha) * Q[x,y,ai] + alpha * (r + gamma * Q[x+dpos[0], y+dpos[1]].max())
n+=1
```
Sau khi thực hiện thuật toán này, Bảng Q sẽ được cập nhật với các giá trị xác định sức hấp dẫn của các hành động khác nhau ở mỗi bước. Ta có thể thử trực quan hóa Bảng Q bằng cách vẽ một vector tại mỗi ô, chỉ vào hướng di chuyển mong muốn. Để đơn giản, ta vẽ một vòng tròn nhỏ thay vì mũi tên.
<img src="../../../../translated_images/vi/learned.ed28bcd8484b5287.webp"/>
## Kiểm tra chính sách
Vì Q-Table liệt kê "mức độ hấp dẫn" của mỗi hành động tại mỗi trạng thái, nên rất dễ sử dụng nó để xác định cách điều hướng hiệu quả trong thế giới của chúng ta. Trong trường hợp đơn giản nhất, chúng ta có thể chọn hành động tương ứng với giá trị Q-Table cao nhất: (code block 9)
Bảng Q liệt kê mức độ "hấp dẫn" của mỗi hành động tại mỗi trạng thái, ta dễ dàng dùng nó để xác định cách điều hướng hiệu quả trong thế giới của ta. Trong trường hợp đơn giản nhất, ta chọn hành động tương ứng với giá trị Bảng Q cao nhất: (khối mã 9)
```python
def qpolicy_strict(m):
@ -198,17 +274,18 @@ def qpolicy_strict(m):
walk(m,qpolicy_strict)
```
> Nếu bạn thử đoạn mã trên nhiều lần, bạn có thể nhận thấy rằng đôi khi nó "bị treo", và bạn cần nhấn nút STOP trong notebook để dừng lại. Điều này xảy ra vì có thể có những tình huống khi hai trạng thái "chỉ" vào nhau về mặt giá trị Q tối ưu, dẫn đến việc agent di chuyển qua lại giữa các trạng thái đó vô thời hạn.
> Nếu bạn thử chạy mã trên nhiều lần, bạn có thể nhận thấy rằng đôi khi nó "đơ", và bạn cần nhấn nút STOP trong notebook để dừng nó lại. Điều này xảy ra vì có thể có những tình huống khi hai trạng thái "chỉ" vào nhau về giá trị Q tối ưu, trong trường hợp đó tác nhân sẽ di chuyển giữa các trạng thái đó mãi mãi.
## 🚀Thử thách
> **Nhiệm vụ 1:** Sửa đổi hàm `walk` để giới hạn độ dài tối đa của đường đi bằng một số bước nhất định (ví dụ, 100), và xem đoạn mã trên trả về giá trị này theo thời gian.
> **Nhiệm vụ 1:** Sửa đổi hàm `walk` để giới hạn độ dài tối đa của đường đi bằng một số bước nhất định (ví dụ, 100 bước), và quan sát mã trên trả về giá trị này theo thời gian.
> **Nhiệm vụ 2:** Sửa đổi hàm `walk` để không quay lại những nơi mà nó đã từng đi qua trước đó. Điều này sẽ ngăn `walk` lặp lại, tuy nhiên, agent vẫn có thể bị "mắc kẹt" ở một vị trí mà nó không thể thoát ra.
> **Nhiệm vụ 2:** Sửa đổi hàm `walk` sao cho nó không quay lại những nơi đã từng đến trước đó. Điều này sẽ ngăn không cho `walk` bị lặp vòng, tuy nhiên, tác nhân vẫn có thể bị "mắc kẹt" ở một vị trí mà nó không thể thoát ra được.
## Điều hướng
Một chính sách điều hướng tốt hơn sẽ là chính sách mà chúng ta đã sử dụng trong quá trình huấn luyện, kết hợp giữa khai thác và khám phá. Trong chính sách này, chúng ta sẽ chọn mỗi hành động với một xác suất nhất định, tỷ lệ thuận với các giá trị trong Q-Table. Chiến lược này vẫn có thể dẫn đến việc agent quay lại một vị trí mà nó đã khám phá, nhưng như bạn có thể thấy từ đoạn mã dưới đây, nó dẫn đến một đường đi trung bình rất ngắn đến vị trí mong muốn (hãy nhớ rằng `print_statistics` chạy mô phỏng 100 lần): (code block 10)
Chính sách điều hướng tốt hơn là chính sách mà chúng ta đã dùng trong quá trình đào tạo, kết hợp giữa khai thác và khám phá. Trong chính sách này, chúng ta sẽ chọn mỗi hành động với một xác suất nhất định, tỷ lệ thuận với các giá trị trong Bảng Q. Chiến lược này vẫn có thể khiến tác nhân quay lại vị trí đã khám phá, nhưng như bạn có thể thấy từ mã dưới đây, nó dẫn đến độ dài đường đi trung bình rất ngắn đến vị trí mong muốn (hãy nhớ rằng `print_statistics` chạy mô phỏng 100 lần): (khối mã 10)
```python
def qpolicy(m):
@ -220,28 +297,32 @@ def qpolicy(m):
print_statistics(qpolicy)
```
Sau khi chạy đoạn mã này, bạn sẽ nhận được độ dài đường đi trung bình nhỏ hơn nhiều so với trước, trong khoảng từ 3-6.
Sau khi chạy đoạn mã này, bạn sẽ nhận được độ dài đường đi trung bình nhỏ hơn nhiều so với trước đây, trong khoảng từ 3-6.
## Điều tra quá trình học
## Khám phá quá trình học
Như chúng ta đã đề cập, quá trình học là sự cân bằng giữa khám phá và khai thác kiến thức đã thu được về cấu trúc không gian vấn đề. Chúng ta đã thấy kết quả học tập (khả năng giúp tác nhân tìm đường ngắn đến mục tiêu) được cải thiện, nhưng cũng rất thú vị để quan sát cách độ dài đường đi trung bình thay đổi trong quá trình học:
Như chúng ta đã đề cập, quá trình học là sự cân bằng giữa việc khám phá và khai thác kiến thức đã thu được về cấu trúc không gian vấn đề. Chúng ta đã thấy rằng kết quả của việc học (khả năng giúp agent tìm đường ngắn đến mục tiêu) đã được cải thiện, nhưng cũng rất thú vị khi quan sát cách độ dài đường đi trung bình thay đổi trong quá trình học:
<img src="../../../../translated_images/vi/lpathlen1.0534784add58d4eb.webp"/>
## Tóm tắt bài học:
Các bài học có thể được tóm tắt như sau:
- **Độ dài đường đi trung bình tăng lên**. Điều chúng ta thấy ở đây là ban đầu, độ dài đường đi trung bình tăng lên. Điều này có thể là do khi chúng ta chưa biết gì về môi trường, chúng ta có khả năng bị mắc kẹt ở các trạng thái xấu, như nước hoặc sói. Khi chúng ta học được nhiều hơn và bắt đầu sử dụng kiến thức này, chúng ta có thể khám phá môi trường lâu hơn, nhưng vẫn chưa biết rõ vị trí của những quả táo.
- **Độ dài đường đi trung bình tăng lên**. Những gì ta thấy ở đây là ban đầu, độ dài đường đi trung bình tăng lên. Điều này có thể do khi ta không biết gì về môi trường, ta dễ bị mắc kẹt ở các trạng thái xấu, như nước hay sói. Khi ta học nhiều hơn và bắt đầu sử dụng kiến thức này, ta có thể khám phá môi trường lâu hơn, nhưng vẫn chưa biết rõ vị trí các quả táo.
- **Độ dài đường đi giảm khi học được nhiều hơn**. Khi chúng ta học đủ, việc đạt được mục tiêu trở nên dễ dàng hơn đối với agent, và độ dài đường đi bắt đầu giảm. Tuy nhiên, chúng ta vẫn mở rộng khám phá, vì vậy chúng ta thường đi lệch khỏi đường đi tốt nhất và khám phá các lựa chọn mới, làm cho đường đi dài hơn mức tối ưu.
- **Độ dài đường đi giảm dần khi ta học nhiều hơn**. Khi ta học đủ nhiều, việc đạt mục tiêu trở nên dễ dàng hơn cho tác nhân, và độ dài đường đi bắt đầu giảm. Tuy nhiên, ta vẫn mở rộng khám phá, nên thường xuyên đi lệch khỏi đường đi tốt nhất, và thử các lựa chọn mới, làm đường đi dài hơn mức tối ưu.
- **Độ dài tăng đột ngột**. Điều chúng ta cũng quan sát được trên biểu đồ này là tại một số thời điểm, độ dài tăng đột ngột. Điều này cho thấy tính ngẫu nhiên của quá trình, và rằng chúng ta có thể "làm hỏng" các hệ số Q-Table bằng cách ghi đè chúng với các giá trị mới. Điều này lý tưởng nên được giảm thiểu bằng cách giảm tốc độ học (ví dụ, về cuối quá trình huấn luyện, chúng ta chỉ điều chỉnh các giá trị Q-Table bằng một giá trị nhỏ).
- **Độ dài tăng đột ngột**. Ta cũng quan sát thấy trong biểu đồ này là vào một số thời điểm, độ dài tăng đột ngột. Điều này cho thấy tính ngẫu nhiên của quá trình, và ta có thể "làm hỏng" các hệ số trong Bảng Q bằng cách ghi đè chúng với các giá trị mới. Việc này lý tưởng nên được giảm thiểu bằng cách giảm tốc độ học (ví dụ, về cuối khóa đào tạo, ta chỉ điều chỉnh các giá trị trong Bảng Q một lượng nhỏ).
Nhìn chung, điều quan trọng cần nhớ là sự thành công và chất lượng của quá trình học phụ thuộc đáng kể vào các tham số, như tốc độ học, sự giảm tốc độ học, và hệ số chiết khấu. Những tham số này thường được gọi là **siêu tham số**, để phân biệt với **tham số**, mà chúng ta tối ưu trong quá trình huấn luyện (ví dụ, các hệ số Q-Table). Quá trình tìm giá trị siêu tham số tốt nhất được gọi là **tối ưu hóa siêu tham số**, và nó xứng đáng là một chủ đề riêng.
Tổng thể, quan trọng để nhớ rằng thành công và chất lượng của quá trình học phụ thuộc rất nhiều vào các tham số, như tốc độ học, sự suy giảm tốc độ học, và hệ số chiết khấu. Những tham số này thường gọi là **siêu tham số**, để phân biệt với **tham số**, là các giá trị chúng ta tối ưu trong quá trình đào tạo (ví dụ, các hệ số trong Bảng Q). Quá trình tìm giá trị siêu tham số tốt nhất được gọi là **tối ưu hóa siêu tham số**, và đây là một chủ đề riêng biệt.
## [Câu hỏi sau bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## [Bài kiểm tra sau bài giảng](https://ff-quizzes.netlify.app/en/ml/)
## Bài tập
[Một thế giới thực tế hơn](assignment.md)
---
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**Tuyên bố miễn trừ trách nhiệm**:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI [Co-op Translator](https://github.com/Azure/co-op-translator). Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng bản dịch tự động có thể chứa lỗi hoặc sai sót. Tài liệu gốc bằng ngôn ngữ gốc nên được coi là nguồn tin chính thức. Đối với thông tin quan trọng, nên sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm về bất kỳ hiểu lầm hoặc giải thích sai nào phát sinh từ việc sử dụng bản dịch này.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->
Loading…
Cancel
Save