🌐 Update translations via Co-op Translator

pull/854/head
leestott 3 months ago committed by GitHub
parent 2283bb5445
commit e4050807fb

@ -1,150 +1,150 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "73e9a7245aa57f00cd413ffd22c0ccb6",
"translation_date": "2025-08-29T13:42:16+00:00",
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
"translation_date": "2025-09-04T20:47:38+00:00",
"source_file": "1-Introduction/1-intro-to-ML/README.md",
"language_code": "ar"
}
-->
# مقدمة في تعلم الآلة
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/1/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
---
[![تعلم الآلة للمبتدئين - مقدمة في تعلم الآلة للمبتدئين](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "تعلم الآلة للمبتدئين - مقدمة في تعلم الآلة للمبتدئين")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير يشرح هذه الدرس.
> 🎥 اضغط على الصورة أعلاه لمشاهدة فيديو قصير يشرح هذه الدرس.
مرحبًا بكم في هذه الدورة حول تعلم الآلة الكلاسيكي للمبتدئين! سواء كنت جديدًا تمامًا على هذا الموضوع، أو ممارسًا متمرسًا في تعلم الآلة وترغب في تحسين معرفتك في مجال معين، نحن سعداء بانضمامك إلينا! نهدف إلى إنشاء نقطة انطلاق ودية لدراستك في تعلم الآلة، وسنكون سعداء بتقييم ملاحظاتك [هنا](https://github.com/microsoft/ML-For-Beginners/discussions) والاستجابة لها ودمجها.
مرحبًا بكم في هذه الدورة حول تعلم الآلة الكلاسيكي للمبتدئين! سواء كنت جديدًا تمامًا على هذا الموضوع، أو ممارسًا لتعلم الآلة يبحث عن تحسين معرفته في مجال معين، نحن سعداء بانضمامك إلينا! نهدف إلى إنشاء نقطة انطلاق ودية لدراستك في تعلم الآلة، ويسعدنا تقييم ملاحظاتك [وتلقيها](https://github.com/microsoft/ML-For-Beginners/discussions) ودمجها.
[![مقدمة في تعلم الآلة](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "مقدمة في تعلم الآلة")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو: جون غوتاغ من MIT يقدم مقدمة في تعلم الآلة.
> 🎥 اضغط على الصورة أعلاه لمشاهدة فيديو: جون غوتاغ من MIT يقدم تعلم الآلة
---
## البدء مع تعلم الآلة
قبل البدء في هذه المنهجية، تحتاج إلى إعداد جهاز الكمبيوتر الخاص بك ليكون جاهزًا لتشغيل الدفاتر محليًا.
- **قم بإعداد جهازك باستخدام هذه الفيديوهات**. استخدم الروابط التالية لتتعلم [كيفية تثبيت Python](https://youtu.be/CXZYvNRIAKM) على نظامك و[إعداد محرر نصوص](https://youtu.be/EU8eayHWoZg) للتطوير.
- **تعلم Python**. يُوصى أيضًا بأن يكون لديك فهم أساسي لـ [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott)، وهي لغة برمجة مفيدة لعلماء البيانات ونستخدمها في هذه الدورة.
- **تعلم Node.js وJavaScript**. نستخدم JavaScript أيضًا في بعض الأحيان في هذه الدورة عند بناء تطبيقات ويب، لذا ستحتاج إلى تثبيت [node](https://nodejs.org) و[npm](https://www.npmjs.com/) بالإضافة إلى [Visual Studio Code](https://code.visualstudio.com/) لتطوير Python وJavaScript.
- **إنشاء حساب GitHub**. بما أنك وجدتنا هنا على [GitHub](https://github.com)، قد يكون لديك حساب بالفعل، ولكن إذا لم يكن لديك، قم بإنشاء حساب ثم قم بعمل fork لهذه المنهجية لاستخدامها بنفسك. (لا تنسَ أن تعطينا نجمة 😊)
- **قم بإعداد جهازك باستخدام هذه الفيديوهات**. استخدم الروابط التالية لتتعلم [كيفية تثبيت بايثون](https://youtu.be/CXZYvNRIAKM) على نظامك و[إعداد محرر نصوص](https://youtu.be/EU8eayHWoZg) للتطوير.
- **تعلم بايثون**. يُوصى أيضًا بأن يكون لديك فهم أساسي لـ [بايثون](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott)، وهي لغة برمجة مفيدة لعلماء البيانات التي نستخدمها في هذه الدورة.
- **تعلم Node.js وجافا سكريبت**. نستخدم أيضًا جافا سكريبت عدة مرات في هذه الدورة عند بناء تطبيقات ويب، لذا ستحتاج إلى تثبيت [node](https://nodejs.org) و[npm](https://www.npmjs.com/) بالإضافة إلى [Visual Studio Code](https://code.visualstudio.com/) لتطوير بايثون وجافا سكريبت.
- **إنشاء حساب GitHub**. بما أنك وجدتنا هنا على [GitHub](https://github.com)، قد يكون لديك حساب بالفعل، ولكن إذا لم يكن لديك، قم بإنشاء حساب ثم قم بعمل fork لهذه المنهجية لاستخدامها بنفسك. (لا تنسَ أن تعطينا نجمة أيضًا 😊)
- **استكشاف Scikit-learn**. تعرف على [Scikit-learn](https://scikit-learn.org/stable/user_guide.html)، وهي مجموعة من مكتبات تعلم الآلة التي نستخدمها في هذه الدروس.
---
## ما هو تعلم الآلة؟
مصطلح "تعلم الآلة" هو واحد من أكثر المصطلحات شيوعًا واستخدامًا في الوقت الحالي. هناك احتمال كبير أنك سمعت هذا المصطلح مرة واحدة على الأقل إذا كنت على دراية بالتكنولوجيا، بغض النظر عن المجال الذي تعمل فيه. ومع ذلك، فإن آليات تعلم الآلة تظل غامضة بالنسبة لمعظم الناس. بالنسبة للمبتدئين في تعلم الآلة، قد يبدو الموضوع أحيانًا مربكًا. لذلك، من المهم فهم ما هو تعلم الآلة فعليًا، وتعلمه خطوة بخطوة من خلال أمثلة عملية.
مصطلح "تعلم الآلة" هو واحد من أكثر المصطلحات شيوعًا واستخدامًا في الوقت الحالي. هناك احتمال كبير أنك سمعت هذا المصطلح على الأقل مرة واحدة إذا كنت على دراية بالتكنولوجيا، بغض النظر عن المجال الذي تعمل فيه. ومع ذلك، فإن آليات تعلم الآلة تظل غامضة بالنسبة لمعظم الناس. بالنسبة للمبتدئين في تعلم الآلة، قد يبدو الموضوع أحيانًا مربكًا. لذلك، من المهم فهم ما هو تعلم الآلة فعليًا، والتعرف عليه خطوة بخطوة من خلال أمثلة عملية.
---
## منحنى الضجة
![منحنى الضجة لتعلم الآلة](../../../../translated_images/hype.07183d711a17aafe70915909a0e45aa286ede136ee9424d418026ab00fec344c.ar.png)
![منحنى الضجة لتعلم الآلة](../../../../1-Introduction/1-intro-to-ML/images/hype.png)
> يظهر Google Trends منحنى الضجة الأخير لمصطلح "تعلم الآلة".
> يظهر Google Trends منحنى الضجة الأخير لمصطلح "تعلم الآلة"
---
## كون غامض
نعيش في كون مليء بالألغاز المثيرة. علماء عظماء مثل ستيفن هوكينغ وألبرت أينشتاين وغيرهم كرسوا حياتهم للبحث عن معلومات ذات معنى تكشف عن ألغاز العالم من حولنا. هذه هي طبيعة الإنسان في التعلم: يتعلم الطفل البشري أشياء جديدة ويكتشف هيكل العالم من حوله عامًا بعد عام أثناء نموه.
نعيش في كون مليء بالألغاز المثيرة. علماء عظماء مثل ستيفن هوكينغ، ألبرت أينشتاين، وغيرهم كرسوا حياتهم للبحث عن معلومات ذات معنى تكشف عن أسرار العالم من حولنا. هذه هي طبيعة الإنسان في التعلم: يتعلم الطفل البشري أشياء جديدة ويكتشف هيكل عالمه عامًا بعد عام أثناء نموه ليصبح بالغًا.
---
## دماغ الطفل
يدرك دماغ الطفل وحواسه حقائق محيطه ويتعلم تدريجيًا الأنماط المخفية للحياة التي تساعده على صياغة قواعد منطقية للتعرف على الأنماط المكتسبة. عملية التعلم في الدماغ البشري تجعل البشر أكثر الكائنات الحية تطورًا في هذا العالم. التعلم المستمر من خلال اكتشاف الأنماط المخفية ثم الابتكار بناءً عليها يمكننا من تحسين أنفسنا باستمرار طوال حياتنا. هذه القدرة على التعلم والتطور ترتبط بمفهوم يسمى [مرونة الدماغ](https://www.simplypsychology.org/brain-plasticity.html). بشكل سطحي، يمكننا رسم بعض التشابهات التحفيزية بين عملية التعلم في الدماغ البشري ومفاهيم تعلم الآلة.
يدرك دماغ الطفل وحواسه حقائق محيطه ويتعلم تدريجيًا الأنماط المخفية للحياة التي تساعد الطفل على صياغة قواعد منطقية لتحديد الأنماط المكتسبة. عملية التعلم في الدماغ البشري تجعل البشر أكثر الكائنات الحية تطورًا في هذا العالم. التعلم المستمر من خلال اكتشاف الأنماط المخفية ثم الابتكار بناءً عليها يمكننا من تحسين أنفسنا باستمرار طوال حياتنا. هذه القدرة على التعلم والتطور ترتبط بمفهوم يسمى [لدونة الدماغ](https://www.simplypsychology.org/brain-plasticity.html). بشكل سطحي، يمكننا رسم بعض التشابهات التحفيزية بين عملية التعلم في الدماغ البشري ومفاهيم تعلم الآلة.
---
## الدماغ البشري
[الدماغ البشري](https://www.livescience.com/29365-human-brain.html) يدرك الأشياء من العالم الحقيقي، ويعالج المعلومات المدركة، ويتخذ قرارات عقلانية، وينفذ إجراءات معينة بناءً على الظروف. هذا ما نسميه التصرف بذكاء. عندما نبرمج عملية مشابهة للسلوك الذكي في آلة، يُطلق عليها الذكاء الاصطناعي (AI).
[الدماغ البشري](https://www.livescience.com/29365-human-brain.html) يدرك الأشياء من العالم الحقيقي، يعالج المعلومات المدركة، يتخذ قرارات عقلانية، ويقوم بأفعال معينة بناءً على الظروف. هذا ما نسميه التصرف بذكاء. عندما نبرمج عملية سلوك ذكي مشابهة في آلة، يُطلق عليها الذكاء الاصطناعي (AI).
---
## بعض المصطلحات
على الرغم من أن المصطلحات قد تكون مربكة، فإن تعلم الآلة (ML) هو جزء مهم من الذكاء الاصطناعي. **تعلم الآلة يهتم باستخدام خوارزميات متخصصة لاكتشاف معلومات ذات معنى والعثور على أنماط مخفية من البيانات المدركة لدعم عملية اتخاذ القرارات العقلانية**.
على الرغم من أن المصطلحات قد تكون مربكة، فإن تعلم الآلة (ML) هو جزء مهم من الذكاء الاصطناعي. **تعلم الآلة يهتم باستخدام خوارزميات متخصصة لاستخراج معلومات ذات معنى واكتشاف الأنماط المخفية من البيانات المدركة لدعم عملية اتخاذ القرارات العقلانية**.
---
## الذكاء الاصطناعي، تعلم الآلة، التعلم العميق
![الذكاء الاصطناعي، تعلم الآلة، التعلم العميق، علم البيانات](../../../../translated_images/ai-ml-ds.537ea441b124ebf69c144a52c0eb13a7af63c4355c2f92f440979380a2fb08b8.ar.png)
![الذكاء الاصطناعي، تعلم الآلة، التعلم العميق، علم البيانات](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png)
> رسم بياني يوضح العلاقات بين الذكاء الاصطناعي، تعلم الآلة، التعلم العميق، وعلم البيانات. إنفوجرافيك من [جين لوبر](https://twitter.com/jenlooper) مستوحى من [هذا الرسم](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining).
> رسم بياني يوضح العلاقات بين الذكاء الاصطناعي، تعلم الآلة، التعلم العميق، وعلم البيانات. إنفوجرافيك بواسطة [جين لوبر](https://twitter.com/jenlooper) مستوحى من [هذا الرسم](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining)
---
## المفاهيم التي سنغطيها
في هذه المنهجية، سنغطي فقط المفاهيم الأساسية لتعلم الآلة التي يجب أن يعرفها المبتدئ. سنركز على ما نسميه "تعلم الآلة الكلاسيكي" باستخدام مكتبة Scikit-learn الممتازة التي يستخدمها العديد من الطلاب لتعلم الأساسيات. لفهم المفاهيم الأوسع للذكاء الاصطناعي أو التعلم العميق، فإن المعرفة الأساسية القوية بتعلم الآلة لا غنى عنها، ونرغب في تقديمها هنا.
في هذه المنهجية، سنغطي فقط المفاهيم الأساسية لتعلم الآلة التي يجب أن يعرفها المبتدئ. نغطي ما نسميه "تعلم الآلة الكلاسيكي" باستخدام Scikit-learn بشكل أساسي، وهي مكتبة ممتازة يستخدمها العديد من الطلاب لتعلم الأساسيات. لفهم المفاهيم الأوسع للذكاء الاصطناعي أو التعلم العميق، فإن المعرفة الأساسية القوية لتعلم الآلة لا غنى عنها، ونود تقديمها هنا.
---
## في هذه الدورة ستتعلم:
- المفاهيم الأساسية لتعلم الآلة
- تاريخ تعلم الآلة
- تعلم الآلة والإنصاف
- تقنيات الانحدار في تعلم الآلة
- تقنيات التصنيف في تعلم الآلة
- تقنيات التجميع في تعلم الآلة
- تقنيات معالجة اللغة الطبيعية في تعلم الآلة
- تقنيات التنبؤ بالسلاسل الزمنية في تعلم الآلة
- التعلم المعزز
- تطبيقات واقعية لتعلم الآلة
- المفاهيم الأساسية لتعلم الآلة
- تاريخ تعلم الآلة
- تعلم الآلة والإنصاف
- تقنيات الانحدار في تعلم الآلة
- تقنيات التصنيف في تعلم الآلة
- تقنيات التجميع في تعلم الآلة
- تقنيات معالجة اللغة الطبيعية في تعلم الآلة
- تقنيات التنبؤ بالسلاسل الزمنية في تعلم الآلة
- التعلم المعزز
- تطبيقات تعلم الآلة في العالم الحقيقي
---
## ما لن نغطيه
- التعلم العميق
- الشبكات العصبية
- الذكاء الاصطناعي
- التعلم العميق
- الشبكات العصبية
- الذكاء الاصطناعي
لتحسين تجربة التعلم، سنتجنب تعقيدات الشبكات العصبية و"التعلم العميق" - بناء النماذج متعددة الطبقات باستخدام الشبكات العصبية - والذكاء الاصطناعي، الذي سنناقشه في منهجية مختلفة. سنقدم أيضًا منهجية قادمة لعلم البيانات للتركيز على هذا الجانب من هذا المجال الأوسع.
لتحقيق تجربة تعلم أفضل، سنتجنب تعقيدات الشبكات العصبية، "التعلم العميق" - بناء نماذج متعددة الطبقات باستخدام الشبكات العصبية - والذكاء الاصطناعي، الذي سنناقشه في منهجية مختلفة. سنقدم أيضًا منهجية قادمة لعلم البيانات للتركيز على هذا الجانب من هذا المجال الأوسع.
---
## لماذا ندرس تعلم الآلة؟
## لماذا دراسة تعلم الآلة؟
من منظور الأنظمة، يُعرف تعلم الآلة بأنه إنشاء أنظمة مؤتمتة يمكنها تعلم الأنماط المخفية من البيانات للمساعدة في اتخاذ قرارات ذكية.
هذا الدافع مستوحى بشكل فضفاض من كيفية تعلم الدماغ البشري أشياء معينة بناءً على البيانات التي يدركها من العالم الخارجي.
✅ فكر للحظة لماذا قد ترغب شركة ما في استخدام استراتيجيات تعلم الآلة بدلاً من إنشاء محرك يعتمد على قواعد مشفرة يدويًا.
✅ فكر لدقيقة لماذا قد ترغب شركة في استخدام استراتيجيات تعلم الآلة بدلاً من إنشاء محرك يعتمد على قواعد مبرمجة.
---
## تطبيقات تعلم الآلة
تطبيقات تعلم الآلة موجودة الآن في كل مكان، وهي منتشرة بقدر البيانات التي تتدفق في مجتمعاتنا، والتي يتم توليدها من هواتفنا الذكية، والأجهزة المتصلة، والأنظمة الأخرى. بالنظر إلى الإمكانات الهائلة لخوارزميات تعلم الآلة المتقدمة، استكشف الباحثون قدرتها على حل المشكلات الواقعية متعددة الأبعاد والتخصصات بنتائج إيجابية كبيرة.
تطبيقات تعلم الآلة موجودة الآن في كل مكان، وهي منتشرة مثل البيانات التي تتدفق حول مجتمعاتنا، والتي يتم إنشاؤها بواسطة هواتفنا الذكية، الأجهزة المتصلة، وأنظمة أخرى. بالنظر إلى الإمكانات الهائلة لخوارزميات تعلم الآلة الحديثة، استكشف الباحثون قدرتها على حل مشاكل متعددة الأبعاد ومتعددة التخصصات في الحياة الواقعية بنتائج إيجابية كبيرة.
---
## أمثلة على تعلم الآلة المطبق
**يمكنك استخدام تعلم الآلة بطرق عديدة**:
- للتنبؤ باحتمالية الإصابة بمرض بناءً على التاريخ الطبي أو التقارير.
- لاستخدام بيانات الطقس للتنبؤ بالأحداث الجوية.
- لفهم مشاعر النصوص.
- لاكتشاف الأخبار المزيفة لوقف انتشار الدعاية.
- للتنبؤ باحتمالية الإصابة بمرض بناءً على التاريخ الطبي أو التقارير.
- للاستفادة من بيانات الطقس للتنبؤ بالأحداث الجوية.
- لفهم مشاعر النصوص.
- لاكتشاف الأخبار المزيفة لوقف انتشار الدعاية.
مجالات مثل التمويل، الاقتصاد، علوم الأرض، استكشاف الفضاء، الهندسة الطبية الحيوية، العلوم الإدراكية، وحتى المجالات الإنسانية، تبنت تعلم الآلة لحل المشكلات الصعبة التي تعتمد على معالجة البيانات بكثافة.
التمويل، الاقتصاد، علوم الأرض، استكشاف الفضاء، الهندسة الطبية الحيوية، العلوم الإدراكية، وحتى المجالات الإنسانية قد تبنت تعلم الآلة لحل المشاكل الصعبة التي تعتمد على معالجة البيانات في مجالاتها.
---
## الخلاصة
## الخاتمة
يعمل تعلم الآلة على أتمتة عملية اكتشاف الأنماط من خلال العثور على رؤى ذات معنى من البيانات الواقعية أو المولدة. وقد أثبتت قيمته العالية في التطبيقات التجارية، الصحية، والمالية، وغيرها.
يعمل تعلم الآلة على أتمتة عملية اكتشاف الأنماط من خلال استخراج رؤى ذات معنى من البيانات الحقيقية أو المولدة. وقد أثبت نفسه كأداة قيمة للغاية في الأعمال التجارية، الصحة، والتطبيقات المالية، وغيرها.
في المستقبل القريب، سيكون فهم أساسيات تعلم الآلة ضرورة للأشخاص من أي مجال نظرًا لاعتماده الواسع.
في المستقبل القريب، سيكون فهم أساسيات تعلم الآلة ضرورة للأشخاص من أي مجال بسبب اعتماده الواسع.
---
# 🚀 التحدي
قم برسم، على الورق أو باستخدام تطبيق عبر الإنترنت مثل [Excalidraw](https://excalidraw.com/)، فهمك للاختلافات بين الذكاء الاصطناعي، تعلم الآلة، التعلم العميق، وعلم البيانات. أضف بعض الأفكار حول المشكلات التي يمكن لكل من هذه التقنيات حلها.
قم برسم، على الورق أو باستخدام تطبيق عبر الإنترنت مثل [Excalidraw](https://excalidraw.com/)، فهمك للاختلافات بين الذكاء الاصطناعي، تعلم الآلة، التعلم العميق، وعلم البيانات. أضف بعض الأفكار حول المشاكل التي يمكن لكل من هذه التقنيات حلها.
# [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/2/)
# [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
---
# المراجعة والدراسة الذاتية
لتعلم المزيد حول كيفية العمل مع خوارزميات تعلم الآلة في السحابة، تابع [مسار التعلم](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott).
لتعلم المزيد حول كيفية العمل مع خوارزميات تعلم الآلة في السحابة، اتبع [مسار التعلم](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott).
خذ [مسار التعلم](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) حول أساسيات تعلم الآلة.

@ -1,18 +1,18 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b2d11df10030cacc41427a1fbc8bc8f1",
"translation_date": "2025-08-29T13:44:29+00:00",
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
"translation_date": "2025-09-04T20:48:03+00:00",
"source_file": "1-Introduction/2-history-of-ML/README.md",
"language_code": "ar"
}
-->
# تاريخ تعلم الآلة
![ملخص تاريخ تعلم الآلة في رسم تخطيطي](../../../../translated_images/ml-history.a1bdfd4ce1f464d9a0502f38d355ffda384c95cd5278297a46c9a391b5053bc4.ar.png)
> رسم تخطيطي بواسطة [تومومي إيمورا](https://www.twitter.com/girlie_mac)
![ملخص تاريخ تعلم الآلة في رسم تخطيطي](../../../../sketchnotes/ml-history.png)
> رسم تخطيطي من إعداد [تومومي إيمورا](https://www.twitter.com/girlie_mac)
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/3/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
---
@ -20,65 +20,65 @@ CO_OP_TRANSLATOR_METADATA:
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير يشرح هذه الدرس.
في هذا الدرس، سنستعرض أهم المحطات في تاريخ تعلم الآلة والذكاء الاصطناعي.
في هذا الدرس، سنستعرض المحطات الرئيسية في تاريخ تعلم الآلة والذكاء الاصطناعي.
تاريخ الذكاء الاصطناعي (AI) كحقل علمي مرتبط ارتباطًا وثيقًا بتاريخ تعلم الآلة، حيث أن الخوارزميات والتطورات الحاسوبية التي تدعم تعلم الآلة ساهمت في تطوير الذكاء الاصطناعي. من المفيد أن نتذكر أنه، على الرغم من أن هذه المجالات بدأت تتبلور كمجالات بحثية متميزة في الخمسينيات، فإن الاكتشافات [الخوارزمية، الإحصائية، الرياضية، الحاسوبية والتقنية](https://wikipedia.org/wiki/Timeline_of_machine_learning) سبقت وتداخلت مع هذه الحقبة. في الواقع، كان الناس يفكرون في هذه الأسئلة منذ [مئات السنين](https://wikipedia.org/wiki/History_of_artificial_intelligence): يناقش هذا المقال الأسس الفكرية التاريخية لفكرة "الآلة المفكرة".
تاريخ الذكاء الاصطناعي (AI) كمجال مرتبط بشكل وثيق بتاريخ تعلم الآلة، حيث أن الخوارزميات والتطورات الحاسوبية التي تدعم تعلم الآلة ساهمت في تطوير الذكاء الاصطناعي. من المفيد أن نتذكر أنه على الرغم من أن هذه المجالات بدأت تتبلور كمجالات بحثية متميزة في الخمسينيات، إلا أن هناك [اكتشافات خوارزمية وإحصائية ورياضية وحاسوبية وتقنية مهمة](https://wikipedia.org/wiki/Timeline_of_machine_learning) سبقت وتداخلت مع هذه الحقبة. في الواقع، كان الناس يفكرون في هذه الأسئلة منذ [مئات السنين](https://wikipedia.org/wiki/History_of_artificial_intelligence): يناقش هذا المقال الأسس الفكرية التاريخية لفكرة "الآلة المفكرة".
---
## اكتشافات بارزة
- 1763، 1812 [نظرية بايز](https://wikipedia.org/wiki/Bayes%27_theorem) وأسلافها. هذه النظرية وتطبيقاتها تشكل أساس الاستدلال، حيث تصف احتمال حدوث حدث بناءً على المعرفة السابقة.
- 1805 [نظرية المربعات الصغرى](https://wikipedia.org/wiki/Least_squares) بواسطة عالم الرياضيات الفرنسي أدريان-ماري ليجيندر. هذه النظرية، التي ستتعلم عنها في وحدة الانحدار، تساعد في ملاءمة البيانات.
- 1913 [سلاسل ماركوف](https://wikipedia.org/wiki/Markov_chain)، التي سميت باسم عالم الرياضيات الروسي أندريه ماركوف، تُستخدم لوصف سلسلة من الأحداث المحتملة بناءً على الحالة السابقة.
- 1957 [بيرسيبترون](https://wikipedia.org/wiki/Perceptron) هو نوع من المصنفات الخطية اخترعه عالم النفس الأمريكي فرانك روزنبلات ويشكل أساس التقدم في التعلم العميق.
- 1763، 1812 [نظرية بايز](https://wikipedia.org/wiki/Bayes%27_theorem) وأسلافها. هذه النظرية وتطبيقاتها تشكل أساس الاستدلال، حيث تصف احتمالية وقوع حدث بناءً على المعرفة السابقة.
- 1805 [نظرية المربعات الصغرى](https://wikipedia.org/wiki/Least_squares) التي قدمها عالم الرياضيات الفرنسي أدريان-ماري ليجيندر. هذه النظرية، التي ستتعلم عنها في وحدة الانحدار، تساعد في ملاءمة البيانات.
- 1913 [سلاسل ماركوف](https://wikipedia.org/wiki/Markov_chain)، التي سميت على اسم عالم الرياضيات الروسي أندريه ماركوف، تُستخدم لوصف تسلسل الأحداث المحتملة بناءً على الحالة السابقة.
- 1957 [Perceptron](https://wikipedia.org/wiki/Perceptron)، وهو نوع من المصنفات الخطية اخترعه عالم النفس الأمريكي فرانك روزنبلات، ويشكل أساس التقدم في التعلم العميق.
---
- 1967 [أقرب جار](https://wikipedia.org/wiki/Nearest_neighbor) هو خوارزمية صُممت في الأصل لتخطيط الطرق. في سياق تعلم الآلة، تُستخدم لاكتشاف الأنماط.
- 1970 [الانتشار العكسي](https://wikipedia.org/wiki/Backpropagation) يُستخدم لتدريب [الشبكات العصبية الأمامية](https://wikipedia.org/wiki/Feedforward_neural_network).
- 1982 [الشبكات العصبية المتكررة](https://wikipedia.org/wiki/Recurrent_neural_network) هي شبكات عصبية اصطناعية مشتقة من الشبكات العصبية الأمامية وتُنشئ رسومًا بيانية زمنية.
- 1967 [أقرب جار](https://wikipedia.org/wiki/Nearest_neighbor)، وهو خوارزمية صُممت في الأصل لتخطيط المسارات. في سياق تعلم الآلة، تُستخدم لاكتشاف الأنماط.
- 1970 [الانتشار العكسي](https://wikipedia.org/wiki/Backpropagation)، يُستخدم لتدريب [الشبكات العصبية التقدمية](https://wikipedia.org/wiki/Feedforward_neural_network).
- 1982 [الشبكات العصبية المتكررة](https://wikipedia.org/wiki/Recurrent_neural_network)، وهي شبكات عصبية اصطناعية مشتقة من الشبكات العصبية التقدمية تُنشئ رسومًا بيانية زمنية.
✅ قم ببعض البحث. ما هي التواريخ الأخرى التي تبرز كمحورية في تاريخ تعلم الآلة والذكاء الاصطناعي؟
✅ قم ببعض البحث. ما هي التواريخ الأخرى التي تبرز كمحطات محورية في تاريخ تعلم الآلة والذكاء الاصطناعي؟
---
## 1950: آلات تفكر
## 1950: الآلات التي تفكر
آلان تورينغ، شخصية استثنائية تم التصويت عليها [من قبل الجمهور في عام 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) كأعظم عالم في القرن العشرين، يُنسب إليه المساهمة في وضع الأساس لفكرة "آلة يمكنها التفكير". تعامل مع المشككين وحاجته الشخصية إلى أدلة تجريبية لهذه الفكرة جزئيًا من خلال إنشاء [اختبار تورينغ](https://www.bbc.com/news/technology-18475646)، الذي ستستكشفه في دروس معالجة اللغة الطبيعية.
يُعتبر آلان تورينغ، وهو شخصية استثنائية تم التصويت له [من قبل الجمهور في عام 2019](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) كأعظم عالم في القرن العشرين، أحد المؤسسين لفكرة "الآلة التي يمكن أن تفكر". لقد واجه المشككين وحاجته الشخصية إلى أدلة تجريبية لهذه الفكرة من خلال إنشاء [اختبار تورينغ](https://www.bbc.com/news/technology-18475646)، الذي ستستكشفه في دروس معالجة اللغة الطبيعية.
---
## 1956: مشروع بحث صيف دارتموث
## 1956: مشروع دارتموث الصيفي للبحث
"كان مشروع البحث الصيفي في دارتموث حول الذكاء الاصطناعي حدثًا بارزًا في مجال الذكاء الاصطناعي"، وفيه تم صياغة مصطلح "الذكاء الاصطناعي" ([المصدر](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)).
"كان مشروع دارتموث الصيفي للبحث في الذكاء الاصطناعي حدثًا محوريًا في مجال الذكاء الاصطناعي"، حيث تم صياغة مصطلح "الذكاء الاصطناعي" لأول مرة ([المصدر](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)).
> يمكن وصف كل جانب من جوانب التعلم أو أي ميزة أخرى للذكاء بدقة بحيث يمكن إنشاء آلة لمحاكاته.
> يمكن وصف كل جانب من جوانب التعلم أو أي ميزة أخرى للذكاء بدقة كافية بحيث يمكن إنشاء آلة لمحاكاتها.
---
كان الباحث الرئيسي، أستاذ الرياضيات جون مكارثي، يأمل "في المضي قدمًا بناءً على فرضية أن كل جانب من جوانب التعلم أو أي ميزة أخرى للذكاء يمكن وصفها بدقة بحيث يمكن إنشاء آلة لمحاكاته." وكان من بين المشاركين شخصية بارزة أخرى في المجال، مارفن مينسكي.
كان الباحث الرئيسي، أستاذ الرياضيات جون مكارثي، يأمل "في المضي قدمًا بناءً على فرضية أن كل جانب من جوانب التعلم أو أي ميزة أخرى للذكاء يمكن وصفها بدقة كافية بحيث يمكن إنشاء آلة لمحاكاتها." وشملت المشاركين شخصية بارزة أخرى في المجال، مارفن مينسكي.
يُنسب إلى الورشة الفضل في بدء وتشجيع العديد من المناقشات بما في ذلك "ظهور الأساليب الرمزية، الأنظمة التي تركز على مجالات محدودة (أنظمة الخبراء المبكرة)، والأنظمة الاستنتاجية مقابل الأنظمة الاستقرائية." ([المصدر](https://wikipedia.org/wiki/Dartmouth_workshop)).
يُنسب إلى الورشة الفضل في بدء وتشجيع العديد من المناقشات، بما في ذلك "ظهور الأساليب الرمزية، الأنظمة التي تركز على مجالات محدودة (أنظمة الخبراء المبكرة)، والأنظمة الاستنتاجية مقابل الأنظمة الاستقرائية." ([المصدر](https://wikipedia.org/wiki/Dartmouth_workshop)).
---
## 1956 - 1974: "السنوات الذهبية"
من الخمسينيات وحتى منتصف السبعينيات، كان هناك تفاؤل كبير بأن الذكاء الاصطناعي يمكن أن يحل العديد من المشاكل. في عام 1967، صرح مارفن مينسكي بثقة أن "في غضون جيل ... سيتم حل مشكلة إنشاء 'الذكاء الاصطناعي' بشكل كبير." (مينسكي، مارفن (1967)، الحساب: الآلات المحدودة واللامحدودة، إنجلوود كليفس، نيوجيرسي: برنتيس-هول)
من الخمسينيات وحتى منتصف السبعينيات، ساد التفاؤل الكبير بأن الذكاء الاصطناعي يمكن أن يحل العديد من المشكلات. في عام 1967، صرح مارفن مينسكي بثقة: "في غضون جيل ... سيتم حل مشكلة إنشاء 'ذكاء اصطناعي' بشكل كبير." (مينسكي، مارفن (1967)، الحساب: الآلات المحدودة واللانهائية، إنغلوود كليفس، نيوجيرسي: برنتيس-هول)
ازدهرت أبحاث معالجة اللغة الطبيعية، وتم تحسين البحث وجعله أكثر قوة، وتم إنشاء مفهوم "العوالم المصغرة"، حيث تم تنفيذ المهام البسيطة باستخدام تعليمات بلغة واضحة.
ازدهرت أبحاث معالجة اللغة الطبيعية، وتم تحسين البحث وجعله أكثر قوة، وتم إنشاء مفهوم "العوالم المصغرة"، حيث تم تنفيذ مهام بسيطة باستخدام تعليمات بلغة بسيطة.
---
تم تمويل الأبحاث بشكل جيد من قبل الوكالات الحكومية، وتم تحقيق تقدم في الحساب والخوارزميات، وتم بناء نماذج أولية للآلات الذكية. بعض هذه الآلات تشمل:
حظيت الأبحاث بتمويل جيد من الوكالات الحكومية، وتم إحراز تقدم في الحوسبة والخوارزميات، وتم بناء نماذج أولية للآلات الذكية. بعض هذه الآلات تشمل:
* [الروبوت شاكي](https://wikipedia.org/wiki/Shakey_the_robot)، الذي كان يمكنه المناورة واتخاذ قرارات لتنفيذ المهام "بذكاء".
* [الروبوت شاكي](https://wikipedia.org/wiki/Shakey_the_robot)، الذي كان بإمكانه المناورة واتخاذ قرارات "ذكية" لتنفيذ المهام.
![شاكي، روبوت ذكي](../../../../translated_images/shakey.4dc17819c447c05bf4b52f76da0bdd28817d056fdb906252ec20124dd4cfa55e.ar.jpg)
![شاكي، روبوت ذكي](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg)
> شاكي في عام 1972
---
* إليزا، "روبوت محادثة" مبكر، كان يمكنه التحدث مع الناس والتصرف كـ "معالج" بدائي. ستتعرف أكثر على إليزا في دروس معالجة اللغة الطبيعية.
* إليزا، وهي "روبوت محادثة" مبكر، كان بإمكانها التحدث مع الناس والعمل كـ "معالج" بدائي. ستتعرف على إليزا أكثر في دروس معالجة اللغة الطبيعية.
![إليزا، روبوت محادثة](../../../../translated_images/eliza.84397454cda9559bb5ec296b5b8fff067571c0cccc5405f9c1ab1c3f105c075c.ar.png)
![إليزا، روبوت محادثة](../../../../1-Introduction/2-history-of-ML/images/eliza.png)
> نسخة من إليزا، روبوت محادثة
---
@ -92,46 +92,46 @@ CO_OP_TRANSLATOR_METADATA:
---
## 1974 - 1980: "شتاء الذكاء الاصطناعي"
بحلول منتصف السبعينيات، أصبح واضحًا أن تعقيد إنشاء "آلات ذكية" قد تم التقليل من شأنه وأن وعوده، بالنظر إلى قوة الحوسبة المتاحة، قد تم تضخيمها. جف التمويل وتباطأت الثقة في المجال. بعض القضايا التي أثرت على الثقة تشمل:
بحلول منتصف السبعينيات، أصبح من الواضح أن تعقيد إنشاء "آلات ذكية" قد تم التقليل من شأنه وأن الوعود التي قُدمت، بالنظر إلى قوة الحوسبة المتاحة، كانت مبالغًا فيها. جف التمويل وتباطأت الثقة في المجال. بعض القضايا التي أثرت على الثقة تشمل:
---
- **القيود**. كانت قوة الحوسبة محدودة للغاية.
- **الانفجار التوافقي**. زاد عدد المعلمات التي يجب تدريبها بشكل كبير مع زيادة الطلبات على الحواسيب، دون تطور موازٍ في قوة الحوسبة والقدرات.
- **ندرة البيانات**. كانت هناك ندرة في البيانات التي أعاقت عملية اختبار وتطوير وتحسين الخوارزميات.
- **هل نطرح الأسئلة الصحيحة؟**. بدأت الأسئلة التي كانت تُطرح في المجال تخضع للتشكيك. بدأ الباحثون في مواجهة النقد حول مناهجهم:
- تم التشكيك في اختبارات تورينغ من خلال نظريات مثل "نظرية الغرفة الصينية" التي افترضت أن "برمجة الكمبيوتر الرقمي قد تجعل الأمر يبدو وكأنه يفهم اللغة ولكنها لا يمكن أن تنتج فهمًا حقيقيًا." ([المصدر](https://plato.stanford.edu/entries/chinese-room/))
- **الانفجار التوافقي**. نما عدد المعلمات التي يجب تدريبها بشكل أسي مع زيادة الطلبات على الحواسيب، دون تطور موازٍ في قوة وقدرة الحوسبة.
- **ندرة البيانات**. كانت هناك ندرة في البيانات التي أعاقت عملية الاختبار والتطوير وتحسين الخوارزميات.
- **هل نطرح الأسئلة الصحيحة؟**. بدأت الأسئلة نفسها التي كانت تُطرح تخضع للتشكيك. بدأ الباحثون يواجهون انتقادات حول مناهجهم:
- اختبارات تورينغ خضعت للتشكيك من خلال، من بين أفكار أخرى، "نظرية الغرفة الصينية" التي افترضت أن "برمجة حاسوب رقمي قد تجعل الأمر يبدو وكأنه يفهم اللغة ولكنه لا يمكن أن ينتج فهمًا حقيقيًا." ([المصدر](https://plato.stanford.edu/entries/chinese-room/))
- تم تحدي أخلاقيات إدخال ذكاء اصطناعي مثل "المعالج" إليزا إلى المجتمع.
---
في الوقت نفسه، بدأت تتشكل مدارس مختلفة للذكاء الاصطناعي. تم إنشاء تفرقة بين ممارسات ["الذكاء الاصطناعي الفوضوي" مقابل "الذكاء الاصطناعي المنظم"](https://wikipedia.org/wiki/Neats_and_scruffies). كانت المختبرات "الفوضوية" تعدل البرامج لساعات حتى تحصل على النتائج المطلوبة. أما المختبرات "المنظمة" فكانت "تركز على المنطق وحل المشكلات بشكل رسمي". كانت إليزا وSHRDLU من الأنظمة "الفوضوية" المعروفة. في الثمانينيات، مع ظهور الطلب على جعل أنظمة تعلم الآلة قابلة للتكرار، بدأ النهج "المنظم" يأخذ الصدارة لأن نتائجه أكثر قابلية للتفسير.
في الوقت نفسه، بدأت تتشكل مدارس فكرية مختلفة للذكاء الاصطناعي. تم إنشاء تفرقة بين ممارسات ["الذكاء الاصطناعي الفوضوي" و"الذكاء الاصطناعي المنظم"](https://wikipedia.org/wiki/Neats_and_scruffies). كانت المختبرات "الفوضوية" تعدل البرامج لساعات حتى تحصل على النتائج المطلوبة. أما المختبرات "المنظمة" فكانت تركز على المنطق وحل المشكلات الرسمي. كانت إليزا وSHRDLU من الأنظمة "الفوضوية" المعروفة. في الثمانينيات، مع ظهور الحاجة لجعل أنظمة تعلم الآلة قابلة للتكرار، أصبح النهج "المنظم" في المقدمة لأن نتائجه أكثر قابلية للتفسير.
---
## أنظمة الخبراء في الثمانينيات
مع نمو المجال، أصبح واضحًا فائدته للأعمال التجارية، وفي الثمانينيات انتشرت "أنظمة الخبراء". "كانت أنظمة الخبراء من بين أول أشكال البرمجيات الناجحة حقًا للذكاء الاصطناعي (AI)." ([المصدر](https://wikipedia.org/wiki/Expert_system)).
مع نمو المجال، أصبح واضحًا فائدته للأعمال التجارية، وفي الثمانينيات انتشرت "أنظمة الخبراء". "كانت أنظمة الخبراء من بين أول أشكال البرمجيات الناجحة حقًا للذكاء الاصطناعي." ([المصدر](https://wikipedia.org/wiki/Expert_system)).
هذا النوع من الأنظمة هو في الواقع _هجين_، يتكون جزئيًا من محرك قواعد يحدد متطلبات الأعمال، ومحرك استنتاج يستفيد من نظام القواعد لاستنتاج حقائق جديدة.
هذا النوع من الأنظمة هو في الواقع _هجين_، يتكون جزئيًا من محرك قواعد يحدد متطلبات العمل، ومحرك استنتاج يستفيد من نظام القواعد لاستنتاج حقائق جديدة.
شهدت هذه الحقبة أيضًا اهتمامًا متزايدًا بالشبكات العصبية.
شهدت هذه الحقبة أيضًا زيادة الاهتمام بالشبكات العصبية.
---
## 1987 - 1993: "برودة الذكاء الاصطناعي"
كان لتوسع أجهزة أنظمة الخبراء المتخصصة تأثير سلبي حيث أصبحت متخصصة للغاية. كما تنافست أجهزة الكمبيوتر الشخصية مع هذه الأنظمة الكبيرة والمركزية. بدأت ديمقراطية الحوسبة، مما مهد الطريق لانفجار البيانات الضخمة الحديث.
كان لانتشار أجهزة أنظمة الخبراء المتخصصة تأثير سلبي حيث أصبحت متخصصة للغاية. كما تنافست أجهزة الكمبيوتر الشخصية مع هذه الأنظمة الكبيرة والمركزية. بدأت ديمقراطية الحوسبة، مما مهد الطريق في النهاية لانفجار البيانات الضخمة الحديث.
---
## 1993 - 2011
شهدت هذه الحقبة عصرًا جديدًا لتعلم الآلة والذكاء الاصطناعي لحل بعض المشاكل التي كانت قد ظهرت سابقًا بسبب نقص البيانات وقوة الحوسبة. بدأت كمية البيانات في الزيادة بسرعة وأصبحت أكثر توفرًا، للأفضل وللأسوأ، خاصة مع ظهور الهواتف الذكية حوالي عام 2007. توسعت قوة الحوسبة بشكل كبير، وتطورت الخوارزميات جنبًا إلى جنب. بدأ المجال في اكتساب النضج حيث بدأت الأيام الحرة السابقة تتبلور إلى تخصص حقيقي.
شهدت هذه الحقبة عصرًا جديدًا لتعلم الآلة والذكاء الاصطناعي لحل بعض المشكلات التي كانت ناجمة عن نقص البيانات وقوة الحوسبة في السابق. بدأت كمية البيانات في الزيادة بسرعة وأصبحت متاحة على نطاق واسع، سواء للأفضل أو للأسوأ، خاصة مع ظهور الهواتف الذكية حوالي عام 2007. توسعت قوة الحوسبة بشكل كبير، وتطورت الخوارزميات جنبًا إلى جنب. بدأ المجال في النضوج حيث بدأت الأيام العشوائية الماضية تتبلور إلى تخصص حقيقي.
---
## الآن
اليوم، تعلم الآلة والذكاء الاصطناعي يؤثران على كل جزء تقريبًا من حياتنا. هذه الحقبة تتطلب فهمًا دقيقًا للمخاطر والتأثيرات المحتملة لهذه الخوارزميات على حياة البشر. كما قال براد سميث من مايكروسوفت: "تثير تكنولوجيا المعلومات قضايا تتعلق بجوهر حماية حقوق الإنسان الأساسية مثل الخصوصية وحرية التعبير. هذه القضايا تزيد من مسؤولية شركات التكنولوجيا التي تبتكر هذه المنتجات. في رأينا، تدعو أيضًا إلى تنظيم حكومي مدروس وتطوير معايير حول الاستخدامات المقبولة" ([المصدر](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)).
اليوم، يمس تعلم الآلة والذكاء الاصطناعي تقريبًا كل جزء من حياتنا. هذا العصر يتطلب فهمًا دقيقًا للمخاطر والتأثيرات المحتملة لهذه الخوارزميات على حياة البشر. كما صرح براد سميث من مايكروسوفت: "تثير تكنولوجيا المعلومات قضايا تمس جوهر حماية حقوق الإنسان الأساسية مثل الخصوصية وحرية التعبير. هذه القضايا تزيد من مسؤولية شركات التكنولوجيا التي تصنع هذه المنتجات. من وجهة نظرنا، تدعو أيضًا إلى تنظيم حكومي مدروس وتطوير معايير حول الاستخدامات المقبولة" ([المصدر](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)).
---
يبقى أن نرى ما يحمله المستقبل، ولكن من المهم فهم هذه الأنظمة الحاسوبية والبرمجيات والخوارزميات التي تعمل عليها. نأمل أن يساعدك هذا المنهج الدراسي في اكتساب فهم أفضل بحيث يمكنك اتخاذ قراراتك بنفسك.
لا يزال من غير المعروف ما يخبئه المستقبل، ولكن من المهم فهم هذه الأنظمة الحاسوبية والبرمجيات والخوارزميات التي تعمل بها. نأمل أن يساعدك هذا المنهج في اكتساب فهم أفضل حتى تتمكن من اتخاذ قراراتك بنفسك.
[![تاريخ التعلم العميق](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "تاريخ التعلم العميق")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو: يان ليكون يناقش تاريخ التعلم العميق في هذه المحاضرة
@ -139,14 +139,14 @@ CO_OP_TRANSLATOR_METADATA:
---
## 🚀تحدي
استكشف واحدة من هذه اللحظات التاريخية وتعرف أكثر على الأشخاص الذين كانوا وراءها. هناك شخصيات مثيرة للاهتمام، ولم يتم إنشاء أي اكتشاف علمي في فراغ ثقافي. ماذا تكتشف؟
تعمق في واحدة من هذه اللحظات التاريخية وتعرف أكثر على الأشخاص الذين كانوا وراءها. هناك شخصيات مثيرة للاهتمام، ولم يتم إنشاء أي اكتشاف علمي في فراغ ثقافي. ماذا تكتشف؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/4/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
---
## المراجعة والدراسة الذاتية
إليك بعض العناصر للمشاهدة والاستماع:
إليك بعض المواد للمشاهدة والاستماع:
[هذا البودكاست حيث تناقش آمي بويد تطور الذكاء الاصطناعي](http://runasradio.com/Shows/Show/739)
@ -156,9 +156,9 @@ CO_OP_TRANSLATOR_METADATA:
## الواجب
[قم بإنشاء خط زمني](assignment.md)
[إنشاء خط زمني](assignment.md)
---
**إخلاء المسؤولية**:
تمت ترجمة هذه الوثيقة باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار الوثيقة الأصلية بلغتها الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تمت ترجمة هذه الوثيقة باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار الوثيقة الأصلية بلغتها الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,37 +1,37 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "8f819813b2ca08ec7b9f60a2c9336045",
"translation_date": "2025-08-29T13:35:57+00:00",
"original_hash": "9a6b702d1437c0467e3c5c28d763dac2",
"translation_date": "2025-09-04T20:46:15+00:00",
"source_file": "1-Introduction/3-fairness/README.md",
"language_code": "ar"
}
-->
# بناء حلول تعلم الآلة باستخدام الذكاء الاصطناعي المسؤول
# بناء حلول التعلم الآلي باستخدام الذكاء الاصطناعي المسؤول
![ملخص الذكاء الاصطناعي المسؤول في تعلم الآلة في رسم تخطيطي](../../../../translated_images/ml-fairness.ef296ebec6afc98a44566d7b6c1ed18dc2bf1115c13ec679bb626028e852fa1d.ar.png)
![ملخص الذكاء الاصطناعي المسؤول في التعلم الآلي في رسم تخطيطي](../../../../sketchnotes/ml-fairness.png)
> رسم تخطيطي بواسطة [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المقدمة
في هذا المنهج، ستبدأ في اكتشاف كيف يؤثر تعلم الآلة على حياتنا اليومية. حتى الآن، يتم استخدام الأنظمة والنماذج في اتخاذ القرارات اليومية مثل تشخيصات الرعاية الصحية، الموافقة على القروض، أو اكتشاف الاحتيال. لذلك، من المهم أن تعمل هذه النماذج بشكل جيد لتقديم نتائج موثوقة. كما هو الحال مع أي تطبيق برمجي، قد تخفق أنظمة الذكاء الاصطناعي في تلبية التوقعات أو تؤدي إلى نتائج غير مرغوبة. لهذا السبب، من الضروري فهم وتفسير سلوك نموذج الذكاء الاصطناعي.
في هذا المنهج، ستبدأ في اكتشاف كيف يؤثر التعلم الآلي على حياتنا اليومية. حتى الآن، تُستخدم الأنظمة والنماذج في اتخاذ قرارات يومية مثل تشخيصات الرعاية الصحية، الموافقة على القروض، أو اكتشاف الاحتيال. لذلك، من المهم أن تعمل هذه النماذج بشكل جيد لتقديم نتائج موثوقة. مثل أي تطبيق برمجي، قد تخفق أنظمة الذكاء الاصطناعي في تلبية التوقعات أو تؤدي إلى نتائج غير مرغوبة. لهذا السبب، من الضروري فهم وتفسير سلوك نموذج الذكاء الاصطناعي.
تخيل ما يمكن أن يحدث عندما تفتقر البيانات التي تستخدمها لبناء هذه النماذج إلى تمثيل بعض الفئات الديموغرافية مثل العرق، الجنس، الرأي السياسي، الدين، أو تمثلها بشكل غير متناسب. ماذا عن عندما يتم تفسير نتائج النموذج لتفضيل فئة ديموغرافية معينة؟ ما هي العواقب على التطبيق؟ بالإضافة إلى ذلك، ماذا يحدث عندما يؤدي النموذج إلى نتائج ضارة؟ من يتحمل المسؤولية عن سلوك أنظمة الذكاء الاصطناعي؟ هذه بعض الأسئلة التي سنستكشفها في هذا المنهج.
تخيل ما يمكن أن يحدث عندما تفتقر البيانات التي تستخدمها لبناء هذه النماذج إلى تمثيل ديموغرافي معين مثل العرق، الجنس، الرؤية السياسية، الدين، أو تمثيل غير متوازن لهذه الفئات. ماذا عن عندما يتم تفسير نتائج النموذج لتفضيل فئة معينة؟ ما هي العواقب على التطبيق؟ بالإضافة إلى ذلك، ماذا يحدث عندما يؤدي النموذج إلى نتائج ضارة تؤثر سلبًا على الناس؟ من المسؤول عن سلوك أنظمة الذكاء الاصطناعي؟ هذه بعض الأسئلة التي سنستكشفها في هذا المنهج.
في هذه الدرس، ستتعلم:
- رفع مستوى الوعي بأهمية الإنصاف في تعلم الآلة والأضرار المتعلقة بالإنصاف.
- أهمية الإنصاف في التعلم الآلي والأضرار المرتبطة به.
- التعرف على ممارسة استكشاف الحالات الشاذة والسيناريوهات غير المعتادة لضمان الموثوقية والسلامة.
- فهم الحاجة إلى تمكين الجميع من خلال تصميم أنظمة شاملة.
- استكشاف أهمية حماية خصوصية وأمان البيانات والأفراد.
- استكشاف أهمية حماية الخصوصية وأمن البيانات والأفراد.
- إدراك أهمية النهج الشفاف لتفسير سلوك نماذج الذكاء الاصطناعي.
- التفكير في كيف أن المساءلة ضرورية لبناء الثقة في أنظمة الذكاء الاصطناعي.
- التفكير في كيفية أن تكون المساءلة ضرورية لبناء الثقة في أنظمة الذكاء الاصطناعي.
## المتطلبات الأساسية
كشرط أساسي، يرجى أخذ مسار التعلم "مبادئ الذكاء الاصطناعي المسؤول" ومشاهدة الفيديو أدناه حول الموضوع:
كشرط مسبق، يرجى أخذ مسار التعلم "مبادئ الذكاء الاصطناعي المسؤول" ومشاهدة الفيديو أدناه حول الموضوع:
تعرف على المزيد حول الذكاء الاصطناعي المسؤول من خلال متابعة هذا [مسار التعلم](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
@ -41,27 +41,27 @@ CO_OP_TRANSLATOR_METADATA:
## الإنصاف
يجب أن تعامل أنظمة الذكاء الاصطناعي الجميع بإنصاف وتتجنب التأثير على مجموعات متشابهة من الناس بطرق مختلفة. على سبيل المثال، عندما تقدم أنظمة الذكاء الاصطناعي إرشادات حول العلاج الطبي، طلبات القروض، أو التوظيف، يجب أن تقدم نفس التوصيات للجميع الذين لديهم أعراض مشابهة، ظروف مالية متشابهة، أو مؤهلات مهنية متشابهة. كل واحد منا كبشر يحمل تحيزات موروثة تؤثر على قراراتنا وأفعالنا. يمكن أن تكون هذه التحيزات واضحة في البيانات التي نستخدمها لتدريب أنظمة الذكاء الاصطناعي. قد يحدث هذا التلاعب أحيانًا دون قصد. غالبًا ما يكون من الصعب إدراك متى يتم إدخال التحيز في البيانات.
يجب أن تعامل أنظمة الذكاء الاصطناعي الجميع بإنصاف وتتجنب التأثير على مجموعات متشابهة من الناس بطرق مختلفة. على سبيل المثال، عندما تقدم أنظمة الذكاء الاصطناعي إرشادات حول العلاج الطبي، طلبات القروض، أو التوظيف، يجب أن تقدم نفس التوصيات للجميع بناءً على أعراض مشابهة، ظروف مالية، أو مؤهلات مهنية. كل واحد منا كبشر يحمل تحيزات موروثة تؤثر على قراراتنا وأفعالنا. يمكن أن تكون هذه التحيزات واضحة في البيانات التي نستخدمها لتدريب أنظمة الذكاء الاصطناعي. قد يحدث هذا التلاعب أحيانًا دون قصد. غالبًا ما يكون من الصعب إدراك متى يتم إدخال التحيز في البيانات.
**"عدم الإنصاف"** يشمل التأثيرات السلبية أو "الأضرار" لمجموعة من الناس، مثل تلك المعرفة من حيث العرق، الجنس، العمر، أو حالة الإعاقة. يمكن تصنيف الأضرار الرئيسية المتعلقة بالإنصاف على النحو التالي:
**"عدم الإنصاف"** يشمل التأثيرات السلبية أو "الأضرار" لمجموعة من الناس، مثل تلك المحددة بناءً على العرق، الجنس، العمر، أو حالة الإعاقة. يمكن تصنيف الأضرار الرئيسية المتعلقة بالإنصاف على النحو التالي:
- **التخصيص**، إذا تم تفضيل جنس أو عرق معين على آخر.
- **جودة الخدمة**. إذا قمت بتدريب البيانات على سيناريو محدد ولكن الواقع أكثر تعقيدًا، يؤدي ذلك إلى خدمة ضعيفة الأداء. على سبيل المثال، موزع صابون لم يتمكن من التعرف على الأشخاص ذوي البشرة الداكنة. [مرجع](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **التقليل**. النقد غير العادل أو تصنيف شيء أو شخص بشكل غير منصف. على سبيل المثال، تقنية تصنيف الصور التي وصفت بشكل خاطئ صور الأشخاص ذوي البشرة الداكنة كغوريلات.
- **جودة الخدمة**. إذا تم تدريب البيانات على سيناريو محدد ولكن الواقع أكثر تعقيدًا، يؤدي ذلك إلى خدمة ضعيفة الأداء. على سبيل المثال، موزع صابون يدوي لم يتمكن من التعرف على الأشخاص ذوي البشرة الداكنة. [مرجع](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **التشهير**. انتقاد أو تصنيف شيء أو شخص بشكل غير عادل. على سبيل المثال، تقنية تصنيف الصور التي وصفت بشكل خاطئ صور الأشخاص ذوي البشرة الداكنة كغوريلات.
- **التمثيل الزائد أو الناقص**. الفكرة هي أن مجموعة معينة لا تُرى في مهنة معينة، وأي خدمة أو وظيفة تستمر في تعزيز ذلك تساهم في الضرر.
- **التنميط**. ربط مجموعة معينة بصفات محددة مسبقًا. على سبيل المثال، قد يكون هناك أخطاء في نظام ترجمة اللغة بين الإنجليزية والتركية بسبب الكلمات المرتبطة بتنميط الجنس.
- **التنميط**. ربط مجموعة معينة بصفات محددة مسبقًا. على سبيل المثال، قد يكون هناك أخطاء في نظام ترجمة اللغة بين الإنجليزية والتركية بسبب الكلمات المرتبطة بالتحيزات الجندرية.
![الترجمة إلى التركية](../../../../translated_images/gender-bias-translate-en-tr.f185fd8822c2d4372912f2b690f6aaddd306ffbb49d795ad8d12a4bf141e7af0.ar.png)
![الترجمة إلى التركية](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png)
> الترجمة إلى التركية
![الترجمة إلى الإنجليزية](../../../../translated_images/gender-bias-translate-tr-en.4eee7e3cecb8c70e13a8abbc379209bc8032714169e585bdeac75af09b1752aa.ar.png)
![الترجمة إلى الإنجليزية](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png)
> الترجمة إلى الإنجليزية
عند تصميم واختبار أنظمة الذكاء الاصطناعي، يجب أن نضمن أن الذكاء الاصطناعي عادل وغير مبرمج لاتخاذ قرارات متحيزة أو تمييزية، وهو ما يُحظر على البشر أيضًا القيام به. ضمان الإنصاف في الذكاء الاصطناعي وتعلم الآلة يظل تحديًا اجتماعيًا تقنيًا معقدًا.
عند تصميم واختبار أنظمة الذكاء الاصطناعي، يجب أن نضمن أن الذكاء الاصطناعي عادل وغير مبرمج لاتخاذ قرارات متحيزة أو تمييزية، وهي قرارات يُحظر على البشر اتخاذها أيضًا. ضمان الإنصاف في الذكاء الاصطناعي والتعلم الآلي يظل تحديًا اجتماعيًا تقنيًا معقدًا.
### الموثوقية والسلامة
لبناء الثقة، يجب أن تكون أنظمة الذكاء الاصطناعي موثوقة وآمنة ومتسقة في الظروف العادية وغير المتوقعة. من المهم معرفة كيف ستتصرف أنظمة الذكاء الاصطناعي في مجموعة متنوعة من المواقف، خاصة عندما تكون هناك حالات شاذة. عند بناء حلول الذكاء الاصطناعي، يجب التركيز بشكل كبير على كيفية التعامل مع مجموعة واسعة من الظروف التي قد تواجهها حلول الذكاء الاصطناعي. على سبيل المثال، يجب أن تضع السيارة ذاتية القيادة سلامة الناس كأولوية قصوى. نتيجة لذلك، يجب أن يأخذ الذكاء الاصطناعي الذي يشغل السيارة في الاعتبار جميع السيناريوهات الممكنة التي قد تواجهها السيارة مثل الليل، العواصف الرعدية أو الثلوج، الأطفال الذين يركضون عبر الشارع، الحيوانات الأليفة، أعمال الطرق، إلخ. مدى قدرة نظام الذكاء الاصطناعي على التعامل مع مجموعة واسعة من الظروف بشكل موثوق وآمن يعكس مستوى التوقعات التي أخذها عالم البيانات أو مطور الذكاء الاصطناعي في الاعتبار أثناء تصميم أو اختبار النظام.
لبناء الثقة، يجب أن تكون أنظمة الذكاء الاصطناعي موثوقة وآمنة ومتسقة في الظروف العادية وغير المتوقعة. من المهم معرفة كيف ستتصرف أنظمة الذكاء الاصطناعي في مجموعة متنوعة من المواقف، خاصة عندما تكون هناك حالات شاذة. عند بناء حلول الذكاء الاصطناعي، يجب التركيز بشكل كبير على كيفية التعامل مع مجموعة واسعة من الظروف التي قد تواجهها هذه الحلول. على سبيل المثال، يجب أن تكون السيارة ذاتية القيادة تضع سلامة الناس كأولوية قصوى. نتيجة لذلك، يجب أن يأخذ الذكاء الاصطناعي الذي يشغل السيارة في الاعتبار جميع السيناريوهات الممكنة التي قد تواجهها السيارة مثل الليل، العواصف الرعدية أو الثلوج، الأطفال الذين يركضون عبر الشارع، الحيوانات الأليفة، أعمال الطرق، إلخ. مدى قدرة نظام الذكاء الاصطناعي على التعامل مع مجموعة واسعة من الظروف بشكل موثوق وآمن يعكس مستوى التوقعات التي أخذها عالم البيانات أو مطور الذكاء الاصطناعي في الاعتبار أثناء تصميم أو اختبار النظام.
> [🎥 انقر هنا لمشاهدة الفيديو: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
@ -73,31 +73,31 @@ CO_OP_TRANSLATOR_METADATA:
### الأمن والخصوصية
يجب أن تكون أنظمة الذكاء الاصطناعي آمنة وتحترم خصوصية الناس. الناس لديهم ثقة أقل في الأنظمة التي تعرض خصوصيتهم، معلوماتهم، أو حياتهم للخطر. عند تدريب نماذج تعلم الآلة، نعتمد على البيانات للحصول على أفضل النتائج. أثناء القيام بذلك، يجب مراعاة مصدر البيانات وسلامتها. على سبيل المثال، هل كانت البيانات مقدمة من المستخدم أو متاحة للجمهور؟ بعد ذلك، أثناء العمل مع البيانات، من الضروري تطوير أنظمة الذكاء الاصطناعي التي يمكنها حماية المعلومات السرية ومقاومة الهجمات. مع انتشار الذكاء الاصطناعي، أصبح حماية الخصوصية وتأمين المعلومات الشخصية والتجارية الهامة أكثر أهمية وتعقيدًا. تتطلب قضايا الخصوصية وأمن البيانات اهتمامًا خاصًا للذكاء الاصطناعي لأن الوصول إلى البيانات ضروري لأنظمة الذكاء الاصطناعي لتقديم توقعات وقرارات دقيقة ومستنيرة حول الناس.
يجب أن تكون أنظمة الذكاء الاصطناعي آمنة وتحترم خصوصية الناس. يقل ثقة الناس في الأنظمة التي تعرض خصوصيتهم أو معلوماتهم أو حياتهم للخطر. عند تدريب نماذج التعلم الآلي، نعتمد على البيانات للحصول على أفضل النتائج. أثناء ذلك، يجب مراعاة مصدر البيانات وسلامتها. على سبيل المثال، هل البيانات مقدمة من المستخدم أو متاحة للجمهور؟ بعد ذلك، أثناء العمل مع البيانات، من الضروري تطوير أنظمة الذكاء الاصطناعي التي يمكنها حماية المعلومات السرية ومقاومة الهجمات. مع انتشار الذكاء الاصطناعي، أصبحت حماية الخصوصية وتأمين المعلومات الشخصية والتجارية الهامة أكثر أهمية وتعقيدًا. تتطلب قضايا الخصوصية وأمن البيانات اهتمامًا خاصًا للذكاء الاصطناعي لأن الوصول إلى البيانات ضروري لأنظمة الذكاء الاصطناعي لتقديم توقعات وقرارات دقيقة ومستنيرة حول الناس.
> [🎥 انقر هنا لمشاهدة الفيديو: الأمن في الذكاء الاصطناعي](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- كصناعة، حققنا تقدمًا كبيرًا في الخصوصية والأمن، مدفوعًا بشكل كبير باللوائح مثل اللائحة العامة لحماية البيانات (GDPR).
- كصناعة، حققنا تقدمًا كبيرًا في الخصوصية والأمن، مدفوعًا بشكل كبير بتنظيمات مثل اللائحة العامة لحماية البيانات (GDPR).
- ومع ذلك، مع أنظمة الذكاء الاصطناعي، يجب أن نعترف بالتوتر بين الحاجة إلى المزيد من البيانات الشخصية لجعل الأنظمة أكثر شخصية وفعالية - والخصوصية.
- كما هو الحال مع ولادة أجهزة الكمبيوتر المتصلة بالإنترنت، نشهد أيضًا زيادة كبيرة في عدد القضايا الأمنية المتعلقة بالذكاء الاصطناعي.
- في الوقت نفسه، رأينا استخدام الذكاء الاصطناعي لتحسين الأمن. على سبيل المثال، معظم ماسحات الفيروسات الحديثة تعتمد على استدلالات الذكاء الاصطناعي اليوم.
- تمامًا كما حدث مع ولادة أجهزة الكمبيوتر المتصلة بالإنترنت، نشهد أيضًا زيادة كبيرة في عدد مشكلات الأمن المتعلقة بالذكاء الاصطناعي.
- في الوقت نفسه، رأينا استخدام الذكاء الاصطناعي لتحسين الأمن. على سبيل المثال، معظم ماسحات الفيروسات الحديثة تعتمد اليوم على استدلالات الذكاء الاصطناعي.
- يجب أن نضمن أن عمليات علم البيانات لدينا تتناغم بشكل متناغم مع أحدث ممارسات الخصوصية والأمن.
### الشفافية
يجب أن تكون أنظمة الذكاء الاصطناعي مفهومة. جزء أساسي من الشفافية هو تفسير سلوك أنظمة الذكاء الاصطناعي ومكوناتها. تحسين فهم أنظمة الذكاء الاصطناعي يتطلب أن يفهم أصحاب المصلحة كيف ولماذا تعمل حتى يتمكنوا من تحديد مشكلات الأداء المحتملة، مخاوف السلامة والخصوصية، التحيزات، الممارسات الإقصائية، أو النتائج غير المقصودة. نعتقد أيضًا أن أولئك الذين يستخدمون أنظمة الذكاء الاصطناعي يجب أن يكونوا صادقين وصريحين بشأن متى ولماذا وكيف يختارون نشرها. وكذلك حدود الأنظمة التي يستخدمونها. على سبيل المثال، إذا استخدم بنك نظام ذكاء اصطناعي لدعم قرارات الإقراض للمستهلكين، فمن المهم فحص النتائج وفهم البيانات التي تؤثر على توصيات النظام. بدأت الحكومات في تنظيم الذكاء الاصطناعي عبر الصناعات، لذا يجب على علماء البيانات والمنظمات تفسير ما إذا كان نظام الذكاء الاصطناعي يفي بالمتطلبات التنظيمية، خاصة عندما تكون هناك نتيجة غير مرغوبة.
يجب أن تكون أنظمة الذكاء الاصطناعي مفهومة. جزء أساسي من الشفافية هو تفسير سلوك أنظمة الذكاء الاصطناعي ومكوناتها. تحسين فهم أنظمة الذكاء الاصطناعي يتطلب أن يفهم أصحاب المصلحة كيف ولماذا تعمل هذه الأنظمة بحيث يمكنهم تحديد مشكلات الأداء المحتملة، مخاوف السلامة والخصوصية، التحيزات، الممارسات الإقصائية، أو النتائج غير المقصودة. نعتقد أيضًا أن أولئك الذين يستخدمون أنظمة الذكاء الاصطناعي يجب أن يكونوا صادقين وصريحين بشأن متى ولماذا وكيف يختارون نشرها، بالإضافة إلى قيود الأنظمة التي يستخدمونها. على سبيل المثال، إذا استخدم بنك نظام ذكاء اصطناعي لدعم قرارات الإقراض للمستهلكين، فمن المهم فحص النتائج وفهم البيانات التي تؤثر على توصيات النظام. بدأت الحكومات في تنظيم الذكاء الاصطناعي عبر الصناعات، لذا يجب على علماء البيانات والمنظمات تفسير ما إذا كان نظام الذكاء الاصطناعي يفي بالمتطلبات التنظيمية، خاصة عندما تكون هناك نتيجة غير مرغوبة.
> [🎥 انقر هنا لمشاهدة الفيديو: الشفافية في الذكاء الاصطناعي](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- نظرًا لأن أنظمة الذكاء الاصطناعي معقدة للغاية، من الصعب فهم كيفية عملها وتفسير النتائج.
- يؤثر هذا الفهم المحدود على طريقة إدارة هذه الأنظمة، تشغيلها، وتوثيقها.
- يؤثر هذا الفهم المحدود بشكل أكبر على القرارات التي يتم اتخاذها باستخدام النتائج التي تنتجها هذه الأنظمة.
- يؤثر هذا النقص في الفهم على طريقة إدارة هذه الأنظمة، تشغيلها، وتوثيقها.
- يؤثر هذا النقص في الفهم بشكل أكثر أهمية على القرارات التي تُتخذ باستخدام النتائج التي تنتجها هذه الأنظمة.
### المساءلة
يجب أن يكون الأشخاص الذين يصممون وينشرون أنظمة الذكاء الاصطناعي مسؤولين عن كيفية عمل أنظمتهم. الحاجة إلى المساءلة مهمة بشكل خاص مع التقنيات الحساسة مثل التعرف على الوجه. مؤخرًا، كان هناك طلب متزايد على تقنية التعرف على الوجه، خاصة من المنظمات القانونية التي ترى إمكانات التكنولوجيا في استخدامات مثل العثور على الأطفال المفقودين. ومع ذلك، يمكن أن تُستخدم هذه التقنيات من قبل الحكومات لتعريض الحريات الأساسية للمواطنين للخطر من خلال، على سبيل المثال، تمكين المراقبة المستمرة لأفراد معينين. لذلك، يجب أن يكون علماء البيانات والمنظمات مسؤولين عن كيفية تأثير نظام الذكاء الاصطناعي على الأفراد أو المجتمع.
يجب أن يكون الأشخاص الذين يصممون وينشرون أنظمة الذكاء الاصطناعي مسؤولين عن كيفية عمل أنظمتهم. الحاجة إلى المساءلة مهمة بشكل خاص مع التقنيات الحساسة مثل التعرف على الوجه. مؤخرًا، كان هناك طلب متزايد على تقنية التعرف على الوجه، خاصة من المنظمات القانونية التي ترى إمكانات التكنولوجيا في استخدامات مثل العثور على الأطفال المفقودين. ومع ذلك، يمكن أن تُستخدم هذه التقنيات من قبل الحكومات لتعريض الحريات الأساسية لمواطنيها للخطر، على سبيل المثال، من خلال تمكين المراقبة المستمرة لأفراد معينين. لذلك، يجب أن يكون علماء البيانات والمنظمات مسؤولين عن كيفية تأثير نظام الذكاء الاصطناعي على الأفراد أو المجتمع.
[![باحث بارز في الذكاء الاصطناعي يحذر من المراقبة الجماعية عبر التعرف على الوجه](../../../../translated_images/accountability.41d8c0f4b85b6231301d97f17a450a805b7a07aaeb56b34015d71c757cad142e.ar.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "نهج مايكروسوفت تجاه الذكاء الاصطناعي المسؤول")
[![باحث رائد في الذكاء الاصطناعي يحذر من المراقبة الجماعية عبر التعرف على الوجه](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "نهج مايكروسوفت تجاه الذكاء الاصطناعي المسؤول")
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: تحذيرات من المراقبة الجماعية عبر التعرف على الوجه
@ -105,18 +105,18 @@ CO_OP_TRANSLATOR_METADATA:
## تقييم التأثير
قبل تدريب نموذج تعلم الآلة، من المهم إجراء تقييم للتأثير لفهم الغرض من نظام الذكاء الاصطناعي؛ ما هو الاستخدام المقصود؛ أين سيتم نشره؛ ومن سيتفاعل مع النظام. هذه التقييمات مفيدة للمراجعين أو المختبرين لتقييم النظام ومعرفة العوامل التي يجب أخذها في الاعتبار عند تحديد المخاطر المحتملة والعواقب المتوقعة.
قبل تدريب نموذج التعلم الآلي، من المهم إجراء تقييم تأثير لفهم الغرض من نظام الذكاء الاصطناعي؛ ما هو الاستخدام المقصود؛ أين سيتم نشره؛ ومن سيتفاعل مع النظام. هذه التقييمات مفيدة للمراجعين أو المختبرين لتقييم النظام ومعرفة العوامل التي يجب أخذها في الاعتبار عند تحديد المخاطر المحتملة والعواقب المتوقعة.
تشمل المجالات التي يجب التركيز عليها عند إجراء تقييم التأثير:
* **التأثير السلبي على الأفراد**. إدراك أي قيود أو متطلبات، استخدام غير مدعوم أو أي قيود معروفة تعيق أداء النظام أمر ضروري لضمان عدم استخدام النظام بطريقة قد تسبب ضررًا للأفراد.
* **متطلبات البيانات**. فهم كيفية وأين سيستخدم النظام البيانات يمكّن المراجعين من استكشاف أي متطلبات بيانات يجب أن تكون على دراية بها (مثل لوائح GDPR أو HIPPA). بالإضافة إلى ذلك، فحص ما إذا كان مصدر أو كمية البيانات كافية للتدريب.
* **ملخص التأثير**. جمع قائمة بالأضرار المحتملة التي قد تنشأ عن استخدام النظام. خلال دورة حياة تعلم الآلة، مراجعة ما إذا كانت المشكلات المحددة قد تم تخفيفها أو معالجتها.
* **متطلبات البيانات**. فهم كيفية وأين سيستخدم النظام البيانات يمكّن المراجعين من استكشاف أي متطلبات بيانات يجب أن تكون على دراية بها (مثل لوائح GDPR أو HIPPA). بالإضافة إلى ذلك، فحص ما إذا كان مصدر أو كمية البيانات كافٍ للتدريب.
* **ملخص التأثير**. جمع قائمة بالأضرار المحتملة التي قد تنشأ عن استخدام النظام. خلال دورة حياة التعلم الآلي، مراجعة ما إذا كانت المشكلات المحددة قد تم تخفيفها أو معالجتها.
* **الأهداف القابلة للتطبيق** لكل من المبادئ الستة الأساسية. تقييم ما إذا كانت الأهداف من كل مبدأ قد تم تحقيقها وما إذا كانت هناك أي فجوات.
## تصحيح الأخطاء باستخدام الذكاء الاصطناعي المسؤول
مثل تصحيح الأخطاء في تطبيق برمجي، فإن تصحيح الأخطاء في نظام الذكاء الاصطناعي هو عملية ضرورية لتحديد وحل المشكلات في النظام. هناك العديد من العوامل التي قد تؤثر على أداء النموذج بشكل غير متوقع أو غير مسؤول. معظم مقاييس أداء النموذج التقليدية هي تجميعات كمية لأداء النموذج، والتي لا تكفي لتحليل كيفية انتهاك النموذج لمبادئ الذكاء الاصطناعي المسؤول. علاوة على ذلك، يعد نموذج تعلم الآلة صندوقًا أسودًا يجعل من الصعب فهم ما يدفع نتائجه أو تقديم تفسير عندما يرتكب خطأ. لاحقًا في هذه الدورة، سنتعلم كيفية استخدام لوحة معلومات الذكاء الاصطناعي المسؤول للمساعدة في تصحيح أخطاء أنظمة الذكاء الاصطناعي. توفر لوحة المعلومات أداة شاملة لعلماء البيانات ومطوري الذكاء الاصطناعي لأداء:
مثل تصحيح الأخطاء في تطبيق برمجي، فإن تصحيح الأخطاء في نظام الذكاء الاصطناعي هو عملية ضرورية لتحديد وحل المشكلات في النظام. هناك العديد من العوامل التي قد تؤثر على أداء النموذج بشكل غير متوقع أو غير مسؤول. معظم مقاييس أداء النموذج التقليدية هي تجميعات كمية لأداء النموذج، والتي لا تكفي لتحليل كيفية انتهاك النموذج لمبادئ الذكاء الاصطناعي المسؤول. علاوة على ذلك، يعد نموذج التعلم الآلي صندوقًا أسودًا يجعل من الصعب فهم ما يدفع نتائجه أو تقديم تفسير عندما يرتكب خطأ. لاحقًا في هذه الدورة، سنتعلم كيفية استخدام لوحة معلومات الذكاء الاصطناعي المسؤول للمساعدة في تصحيح أخطاء أنظمة الذكاء الاصطناعي. توفر لوحة المعلومات أداة شاملة لعلماء البيانات ومطوري الذكاء الاصطناعي للقيام بما يلي:
* **تحليل الأخطاء**. لتحديد توزيع الأخطاء في النموذج الذي يمكن أن يؤثر على إنصاف النظام أو موثوقيته.
* **نظرة عامة على النموذج**. لاكتشاف أين توجد تفاوتات في أداء النموذج عبر مجموعات البيانات.
@ -125,31 +125,32 @@ CO_OP_TRANSLATOR_METADATA:
## 🚀 التحدي
لمنع الأضرار من أن يتم إدخالها في المقام الأول، يجب علينا:
لمنع الأضرار من أن تُدخل في المقام الأول، يجب علينا:
- وجود تنوع في الخلفيات ووجهات النظر بين الأشخاص الذين يعملون على الأنظمة
- الاستثمار في مجموعات بيانات تعكس تنوع مجتمعنا
- تطوير طرق أفضل خلال دورة حياة تعلم الآلة للكشف عن الذكاء الاصطناعي المسؤول وتصحيحه عند حدوثه
- ضمان تنوع الخلفيات ووجهات النظر بين الأشخاص الذين يعملون على الأنظمة.
- الاستثمار في مجموعات بيانات تعكس تنوع مجتمعنا.
- تطوير طرق أفضل خلال دورة حياة التعلم الآلي للكشف عن الذكاء الاصطناعي المسؤول وتصحيحه عند حدوثه.
فكر في سيناريوهات الحياة الواقعية حيث يكون عدم موثوقية النموذج واضحًا في بناء النموذج واستخدامه. ما الذي يجب أن نأخذه في الاعتبار أيضًا؟
فكر في سيناريوهات واقعية حيث يكون عدم موثوقية النموذج واضحًا في بناء النموذج واستخدامه. ما الذي يجب أن نأخذه في الاعتبار أيضًا؟
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/6/)
## المراجعة والدراسة الذاتية
في هذه الدرس، تعلمت بعض الأساسيات حول مفاهيم العدالة وعدم العدالة في تعلم الآلة.
شاهد هذا الورشة لتتعرف أكثر على المواضيع:
في هذا الدرس، تعلمت بعض أساسيات مفاهيم الإنصاف وعدم الإنصاف في التعلم الآلي.
شاهد هذه الورشة للتعمق أكثر في المواضيع:
- السعي نحو الذكاء الاصطناعي المسؤول: تحويل المبادئ إلى ممارسة بواسطة بسميرة نوشي، مهرنوش سامكي وأميت شارما
- السعي نحو الذكاء الاصطناعي المسؤول: تحويل المبادئ إلى ممارسة بواسطة بسميرة نوشي، مهرنوش ساميكي وأميت شارما
[![Responsible AI Toolbox: إطار عمل مفتوح المصدر لبناء الذكاء الاصطناعي المسؤول](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: إطار عمل مفتوح المصدر لبناء الذكاء الاصطناعي المسؤول")
[![Responsible AI Toolbox: إطار عمل مفتوح المصدر لبناء ذكاء اصطناعي مسؤول](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: إطار عمل مفتوح المصدر لبناء ذكاء اصطناعي مسؤول")
> 🎥 اضغط على الصورة أعلاه لمشاهدة الفيديو: RAI Toolbox: إطار عمل مفتوح المصدر لبناء الذكاء الاصطناعي المسؤول بواسطة بسميرة نوشي، مهرنوش سامكي وأميت شارما
> 🎥 اضغط على الصورة أعلاه لمشاهدة الفيديو: RAI Toolbox: إطار عمل مفتوح المصدر لبناء ذكاء اصطناعي مسؤول بواسطة بسميرة نوشي، مهرنوش ساميكي، وأميت شارما
اقرأ أيضًا:
- مركز موارد الذكاء الاصطناعي المسؤول من مايكروسوفت: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- مركز موارد الذكاء الاصطناعي المسؤول من مايكروسوفت: [موارد الذكاء الاصطناعي المسؤول مايكروسوفت AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- مجموعة أبحاث FATE من مايكروسوفت: [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:
@ -166,4 +167,4 @@ RAI Toolbox:
---
**إخلاء المسؤولية**:
تمت ترجمة هذه الوثيقة باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار الوثيقة الأصلية بلغتها الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تمت ترجمة هذه الوثيقة باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار الوثيقة الأصلية بلغتها الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.

@ -1,20 +1,20 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "dc4575225da159f2b06706e103ddba2a",
"translation_date": "2025-08-29T13:39:04+00:00",
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
"translation_date": "2025-09-04T20:47:01+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
"language_code": "ar"
}
-->
# تقنيات تعلم الآلة
عملية بناء واستخدام وصيانة نماذج تعلم الآلة والبيانات التي تستخدمها تختلف بشكل كبير عن العديد من عمليات تطوير البرمجيات الأخرى. في هذه الدرس، سنقوم بتبسيط العملية، ونوضح التقنيات الرئيسية التي تحتاج إلى معرفتها. ستتعلم:
عملية بناء واستخدام وصيانة نماذج تعلم الآلة والبيانات التي تستخدمها تختلف بشكل كبير عن العديد من سير العمل التطويرية الأخرى. في هذا الدرس، سنزيل الغموض عن هذه العملية، ونوضح التقنيات الرئيسية التي تحتاج إلى معرفتها. ستتعلم:
- فهم العمليات التي تقوم عليها تعلم الآلة على مستوى عالٍ.
- استكشاف المفاهيم الأساسية مثل "النماذج"، "التنبؤات"، و"بيانات التدريب".
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/7/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
[![تعلم الآلة للمبتدئين - تقنيات تعلم الآلة](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "تعلم الآلة للمبتدئين - تقنيات تعلم الآلة")
@ -22,25 +22,25 @@ CO_OP_TRANSLATOR_METADATA:
## المقدمة
على مستوى عالٍ، تتكون عملية إنشاء تعلم الآلة (ML) من عدة خطوات:
على مستوى عالٍ، تتكون عملية إنشاء عمليات تعلم الآلة (ML) من عدة خطوات:
1. **تحديد السؤال**. تبدأ معظم عمليات تعلم الآلة بطرح سؤال لا يمكن الإجابة عليه باستخدام برنامج شرطي بسيط أو محرك يعتمد على القواعد. غالبًا ما تدور هذه الأسئلة حول التنبؤات بناءً على مجموعة من البيانات.
2. **جمع وتحضير البيانات**. للإجابة على سؤالك، تحتاج إلى بيانات. جودة البيانات وأحيانًا كميتها ستحدد مدى قدرتك على الإجابة على سؤالك الأولي. يعد تصور البيانات جانبًا مهمًا في هذه المرحلة. تشمل هذه المرحلة أيضًا تقسيم البيانات إلى مجموعة تدريب واختبار لبناء النموذج.
3. **اختيار طريقة التدريب**. بناءً على سؤالك وطبيعة بياناتك، تحتاج إلى اختيار الطريقة التي تريد بها تدريب النموذج لتعكس بياناتك بشكل أفضل وتقديم تنبؤات دقيقة. هذه هي الجزء من عملية تعلم الآلة الذي يتطلب خبرة محددة وغالبًا قدرًا كبيرًا من التجربة.
4. **تدريب النموذج**. باستخدام بيانات التدريب الخاصة بك، ستستخدم خوارزميات مختلفة لتدريب نموذج للتعرف على الأنماط في البيانات. قد يعتمد النموذج على أوزان داخلية يمكن تعديلها لتفضيل أجزاء معينة من البيانات على أخرى لبناء نموذج أفضل.
5. **تقييم النموذج**. تستخدم بيانات لم يتم رؤيتها من قبل (بيانات الاختبار) من المجموعة التي جمعتها لمعرفة كيفية أداء النموذج.
1. **تحديد السؤال**. تبدأ معظم عمليات تعلم الآلة بطرح سؤال لا يمكن الإجابة عليه ببرنامج شرطي بسيط أو محرك قائم على القواعد. غالبًا ما تدور هذه الأسئلة حول التنبؤات بناءً على مجموعة من البيانات.
2. **جمع وتحضير البيانات**. للإجابة على سؤالك، تحتاج إلى بيانات. جودة البيانات وأحيانًا كميتها ستحدد مدى قدرتك على الإجابة على سؤالك الأولي. يعد تصور البيانات جانبًا مهمًا في هذه المرحلة. تتضمن هذه المرحلة أيضًا تقسيم البيانات إلى مجموعة تدريب واختبار لبناء نموذج.
3. **اختيار طريقة التدريب**. بناءً على سؤالك وطبيعة بياناتك، تحتاج إلى اختيار الطريقة التي تريد بها تدريب نموذج يعكس بياناتك بدقة ويقدم تنبؤات دقيقة. هذه هي المرحلة التي تتطلب خبرة محددة وغالبًا قدرًا كبيرًا من التجريب.
4. **تدريب النموذج**. باستخدام بيانات التدريب الخاصة بك، ستستخدم خوارزميات مختلفة لتدريب نموذج للتعرف على الأنماط في البيانات. قد يعتمد النموذج على أوزان داخلية يمكن تعديلها لتفضيل أجزاء معينة من البيانات على الأخرى لبناء نموذج أفضل.
5. **تقييم النموذج**. تستخدم بيانات لم يسبق للنموذج رؤيتها (بيانات الاختبار) من المجموعة التي جمعتها لمعرفة أداء النموذج.
6. **ضبط المعلمات**. بناءً على أداء النموذج، يمكنك إعادة العملية باستخدام معلمات أو متغيرات مختلفة تتحكم في سلوك الخوارزميات المستخدمة لتدريب النموذج.
7. **التنبؤ**. استخدم مدخلات جديدة لاختبار دقة النموذج.
## ما السؤال الذي يجب طرحه؟
## ما السؤال الذي يجب طرحه
تتميز أجهزة الكمبيوتر بمهارتها في اكتشاف الأنماط المخفية في البيانات. هذه الفائدة مفيدة جدًا للباحثين الذين لديهم أسئلة حول مجال معين لا يمكن الإجابة عليها بسهولة عن طريق إنشاء محرك يعتمد على القواعد الشرطية. على سبيل المثال، في مهمة اكتوارية، قد يتمكن عالم البيانات من إنشاء قواعد يدوية حول معدل الوفيات للمدخنين مقابل غير المدخنين.
تتميز أجهزة الكمبيوتر بمهارتها في اكتشاف الأنماط المخفية في البيانات. هذه الفائدة مفيدة جدًا للباحثين الذين لديهم أسئلة حول مجال معين لا يمكن الإجابة عليها بسهولة من خلال إنشاء محرك قواعد شرطي. على سبيل المثال، قد يتمكن عالم بيانات من إنشاء قواعد يدوية حول معدل الوفيات بين المدخنين وغير المدخنين.
عندما يتم إدخال العديد من المتغيرات الأخرى في المعادلة، قد يكون نموذج تعلم الآلة أكثر كفاءة في التنبؤ بمعدلات الوفيات المستقبلية بناءً على التاريخ الصحي السابق. مثال أكثر تفاؤلاً قد يكون التنبؤ بالطقس لشهر أبريل في موقع معين بناءً على بيانات تشمل خط العرض، خط الطول، تغير المناخ، القرب من المحيط، أنماط التيار النفاث، والمزيد.
ولكن عندما يتم إدخال العديد من المتغيرات الأخرى في المعادلة، قد يكون نموذج تعلم الآلة أكثر كفاءة في التنبؤ بمعدلات الوفيات المستقبلية بناءً على التاريخ الصحي السابق. مثال أكثر تفاؤلاً قد يكون التنبؤ بالطقس لشهر أبريل في موقع معين بناءً على بيانات تشمل خطوط العرض والطول، تغير المناخ، القرب من المحيط، أنماط التيار النفاث، والمزيد.
✅ يقدم هذا [عرض الشرائح](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) منظورًا تاريخيًا لاستخدام تعلم الآلة في تحليل الطقس.
✅ يقدم هذا [العرض التقديمي](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) نظرة تاريخية على استخدام تعلم الآلة في تحليل الطقس.
## مهام ما قبل البناء
## المهام قبل البناء
قبل البدء في بناء النموذج الخاص بك، هناك عدة مهام تحتاج إلى إكمالها. لاختبار سؤالك وتشكيل فرضية بناءً على تنبؤات النموذج، تحتاج إلى تحديد وتكوين عدة عناصر.
@ -48,20 +48,20 @@ CO_OP_TRANSLATOR_METADATA:
للإجابة على سؤالك بأي درجة من اليقين، تحتاج إلى كمية جيدة من البيانات من النوع الصحيح. هناك شيئان تحتاج إلى القيام بهما في هذه المرحلة:
- **جمع البيانات**. مع الأخذ في الاعتبار الدرس السابق حول الإنصاف في تحليل البيانات، اجمع بياناتك بعناية. كن على دراية بمصادر هذه البيانات، أي تحيزات متأصلة قد تكون لديها، ووثق أصلها.
- **تحضير البيانات**. هناك عدة خطوات في عملية تحضير البيانات. قد تحتاج إلى تجميع البيانات وتطبيعها إذا كانت تأتي من مصادر متنوعة. يمكنك تحسين جودة وكمية البيانات من خلال طرق مختلفة مثل تحويل النصوص إلى أرقام (كما نفعل في [التجميع](../../5-Clustering/1-Visualize/README.md)). قد تقوم أيضًا بإنشاء بيانات جديدة بناءً على الأصل (كما نفعل في [التصنيف](../../4-Classification/1-Introduction/README.md)). يمكنك تنظيف وتحرير البيانات (كما سنفعل قبل درس [تطبيق الويب](../../3-Web-App/README.md)). أخيرًا، قد تحتاج أيضًا إلى عشوائية البيانات وتوزيعها، بناءً على تقنيات التدريب الخاصة بك.
- **جمع البيانات**. مع الأخذ في الاعتبار الدرس السابق حول الإنصاف في تحليل البيانات، اجمع بياناتك بعناية. كن على دراية بمصادر هذه البيانات، وأي تحيزات متأصلة قد تكون لديها، ووثق أصلها.
- **تحضير البيانات**. هناك عدة خطوات في عملية تحضير البيانات. قد تحتاج إلى تجميع البيانات وتطبيعها إذا كانت تأتي من مصادر متنوعة. يمكنك تحسين جودة وكمية البيانات من خلال طرق مختلفة مثل تحويل النصوص إلى أرقام (كما نفعل في [التجميع](../../5-Clustering/1-Visualize/README.md)). قد تقوم أيضًا بإنشاء بيانات جديدة بناءً على الأصل (كما نفعل في [التصنيف](../../4-Classification/1-Introduction/README.md)). يمكنك تنظيف وتحرير البيانات (كما سنفعل قبل درس [تطبيق الويب](../../3-Web-App/README.md)). وأخيرًا، قد تحتاج أيضًا إلى عشوائية البيانات وخلطها، بناءً على تقنيات التدريب الخاصة بك.
✅ بعد جمع ومعالجة بياناتك، خذ لحظة لترى ما إذا كان شكلها سيسمح لك بمعالجة سؤالك المقصود. قد تكون البيانات غير مناسبة لأداء مهمتك، كما نكتشف في دروس [التجميع](../../5-Clustering/1-Visualize/README.md)!
✅ بعد جمع ومعالجة بياناتك، خذ لحظة لترى ما إذا كان شكلها سيسمح لك بمعالجة سؤالك المقصود. قد تكون البيانات غير مناسبة لمهمتك المحددة، كما نكتشف في دروس [التجميع](../../5-Clustering/1-Visualize/README.md)!
### الميزات والهدف
[الميزة](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) هي خاصية قابلة للقياس في بياناتك. في العديد من مجموعات البيانات يتم التعبير عنها كعنوان عمود مثل "التاريخ"، "الحجم"، أو "اللون". تمثل متغيرات الميزات، التي يتم تمثيلها عادةً بـ `X` في الكود، المدخلات التي سيتم استخدامها لتدريب النموذج.
الميزة هي خاصية قابلة للقياس في بياناتك. في العديد من مجموعات البيانات، يتم التعبير عنها كعنوان عمود مثل "التاريخ"، "الحجم"، أو "اللون". تمثل متغيرات الميزات، التي يتم تمثيلها عادةً بـ `X` في الكود، المتغيرات المدخلة التي سيتم استخدامها لتدريب النموذج.
الهدف هو الشيء الذي تحاول التنبؤ به. يتم تمثيل الهدف عادةً بـ `y` في الكود، ويمثل الإجابة على السؤال الذي تحاول طرحه على بياناتك: في ديسمبر، ما **لون** القرع الذي سيكون الأرخص؟ في سان فرانسيسكو، ما الأحياء التي ستتمتع بأفضل **أسعار** العقارات؟ أحيانًا يتم الإشارة إلى الهدف أيضًا كخاصية التسمية.
الهدف هو الشيء الذي تحاول التنبؤ به. يتم تمثيل الهدف عادةً بـ `y` في الكود، ويمثل الإجابة على السؤال الذي تحاول طرحه على بياناتك: في ديسمبر، ما هو **لون** القرع الذي سيكون الأرخص؟ في سان فرانسيسكو، ما هي الأحياء التي ستحتوي على أفضل **أسعار** العقارات؟ أحيانًا يُشار إلى الهدف أيضًا كخاصية التسمية.
### اختيار متغير الميزات الخاص بك
### اختيار متغير الميزة الخاص بك
🎓 **اختيار الميزات واستخراج الميزات** كيف تعرف أي متغير تختار عند بناء نموذج؟ ربما ستخوض عملية اختيار الميزات أو استخراج الميزات لاختيار المتغيرات المناسبة للنموذج الأكثر أداءً. ومع ذلك، هما ليسا نفس الشيء: "استخراج الميزات ينشئ ميزات جديدة من وظائف الميزات الأصلية، بينما اختيار الميزات يعيد مجموعة فرعية من الميزات." ([المصدر](https://wikipedia.org/wiki/Feature_selection))
🎓 **اختيار الميزات واستخراج الميزات** كيف تعرف أي متغير تختار عند بناء نموذج؟ ربما ستخوض عملية اختيار الميزات أو استخراج الميزات لاختيار المتغيرات المناسبة للنموذج الأكثر كفاءة. ومع ذلك، فهما ليسا نفس الشيء: "استخراج الميزات ينشئ ميزات جديدة من وظائف الميزات الأصلية، بينما اختيار الميزات يعيد مجموعة فرعية من الميزات." ([المصدر](https://wikipedia.org/wiki/Feature_selection))
### تصور بياناتك
@ -71,62 +71,62 @@ CO_OP_TRANSLATOR_METADATA:
قبل التدريب، تحتاج إلى تقسيم مجموعة البيانات الخاصة بك إلى جزأين أو أكثر بأحجام غير متساوية تمثل البيانات بشكل جيد.
- **التدريب**. هذا الجزء من مجموعة البيانات يتم استخدامه لتدريب النموذج. يشكل هذا الجزء غالبية مجموعة البيانات الأصلية.
- **الاختبار**. مجموعة بيانات الاختبار هي مجموعة مستقلة من البيانات، غالبًا ما يتم جمعها من البيانات الأصلية، التي تستخدمها لتأكيد أداء النموذج المبني.
- **التدريب**. هذا الجزء من مجموعة البيانات يتم استخدامه لتدريب النموذج. يشكل هذا الجزء الغالبية من مجموعة البيانات الأصلية.
- **الاختبار**. مجموعة بيانات الاختبار هي مجموعة مستقلة من البيانات، غالبًا ما يتم جمعها من البيانات الأصلية، والتي تستخدمها لتأكيد أداء النموذج المبني.
- **التحقق**. مجموعة التحقق هي مجموعة أصغر مستقلة من الأمثلة التي تستخدمها لضبط معلمات النموذج أو هيكله لتحسين النموذج. بناءً على حجم بياناتك والسؤال الذي تطرحه، قد لا تحتاج إلى بناء هذه المجموعة الثالثة (كما نلاحظ في [التنبؤ بالسلاسل الزمنية](../../7-TimeSeries/1-Introduction/README.md)).
## بناء النموذج
## بناء نموذج
باستخدام بيانات التدريب الخاصة بك، هدفك هو بناء نموذج، أو تمثيل إحصائي لبياناتك، باستخدام خوارزميات مختلفة لتدريبه. تدريب النموذج يعرضه للبيانات ويسمح له بعمل افتراضات حول الأنماط التي يكتشفها، يتحقق منها، ويقبلها أو يرفضها.
باستخدام بيانات التدريب الخاصة بك، هدفك هو بناء نموذج، أو تمثيل إحصائي لبياناتك، باستخدام خوارزميات مختلفة لتدريبه. تدريب النموذج يعرضه للبيانات ويسمح له بافتراض الأنماط التي يكتشفها، يتحقق منها، ويقبلها أو يرفضها.
### تحديد طريقة التدريب
بناءً على سؤالك وطبيعة بياناتك، ستختار طريقة لتدريبها. من خلال استعراض [وثائق Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - التي نستخدمها في هذه الدورة - يمكنك استكشاف العديد من الطرق لتدريب النموذج. بناءً على تجربتك، قد تضطر إلى تجربة عدة طرق مختلفة لبناء النموذج الأفضل. من المحتمل أن تخوض عملية يقوم فيها علماء البيانات بتقييم أداء النموذج عن طريق تغذيته ببيانات غير مرئية، والتحقق من الدقة، والتحيز، وغيرها من المشكلات التي تؤثر على الجودة، واختيار طريقة التدريب الأنسب للمهمة المطروحة.
بناءً على سؤالك وطبيعة بياناتك، ستختار طريقة لتدريبها. من خلال استعراض [وثائق Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - التي نستخدمها في هذا الدورة - يمكنك استكشاف العديد من الطرق لتدريب نموذج. بناءً على تجربتك، قد تضطر إلى تجربة عدة طرق مختلفة لبناء النموذج الأفضل. من المحتمل أن تمر بعملية يقوم فيها علماء البيانات بتقييم أداء النموذج من خلال تزويده ببيانات غير مرئية، والتحقق من الدقة، والتحيز، والقضايا الأخرى التي تقلل من الجودة، واختيار طريقة التدريب الأنسب للمهمة المطروحة.
### تدريب النموذج
مسلحًا ببيانات التدريب الخاصة بك، أنت جاهز لتطبيقها لإنشاء نموذج. ستلاحظ أنه في العديد من مكتبات تعلم الآلة ستجد الكود 'model.fit' - في هذا الوقت ترسل متغير الميزات الخاص بك كمصفوفة من القيم (عادةً 'X') ومتغير الهدف (عادةً 'y').
مسلحًا ببيانات التدريب الخاصة بك، أنت جاهز لـ "تطبيقها" لإنشاء نموذج. ستلاحظ أنه في العديد من مكتبات تعلم الآلة ستجد الكود 'model.fit' - في هذا الوقت تقوم بإرسال متغير الميزة الخاص بك كمصفوفة من القيم (عادةً 'X') ومتغير الهدف (عادةً 'y').
### تقييم النموذج
بمجرد اكتمال عملية التدريب (قد تستغرق العديد من التكرارات، أو "epochs"، لتدريب نموذج كبير)، ستتمكن من تقييم جودة النموذج باستخدام بيانات الاختبار لقياس أدائه. هذه البيانات هي مجموعة فرعية من البيانات الأصلية التي لم يقم النموذج بتحليلها مسبقًا. يمكنك طباعة جدول من المقاييس حول جودة النموذج.
بمجرد اكتمال عملية التدريب (قد تستغرق العديد من التكرارات، أو "epochs"، لتدريب نموذج كبير)، ستتمكن من تقييم جودة النموذج باستخدام بيانات الاختبار لقياس أدائه. هذه البيانات هي جزء فرعي من البيانات الأصلية التي لم يقم النموذج بتحليلها مسبقًا. يمكنك طباعة جدول من المقاييس حول جودة النموذج.
🎓 **تطبيق النموذج**
في سياق تعلم الآلة، يشير تطبيق النموذج إلى دقة الوظيفة الأساسية للنموذج أثناء محاولته تحليل البيانات التي ليست مألوفة له.
🎓 **التطبيق غير الجيد** و**التطبيق المفرط** هما مشكلتان شائعتان تؤثران على جودة النموذج، حيث يتناسب النموذج إما بشكل غير كافٍ أو بشكل مفرط. يؤدي ذلك إلى جعل النموذج يقدم تنبؤات إما متوافقة جدًا أو غير متوافقة جدًا مع بيانات التدريب الخاصة به. النموذج المفرط التناسب يتنبأ ببيانات التدريب بشكل جيد جدًا لأنه تعلم تفاصيل البيانات وضوضائها بشكل مفرط. النموذج غير الجيد التناسب ليس دقيقًا لأنه لا يمكنه تحليل بيانات التدريب الخاصة به أو البيانات التي لم يسبق له رؤيتها بدقة.
🎓 **التطبيق الناقص** و **التطبيق الزائد** هما مشكلتان شائعتان تقللان من جودة النموذج، حيث يتناسب النموذج إما بشكل غير كافٍ أو بشكل زائد. يؤدي ذلك إلى جعل النموذج يقدم تنبؤات إما متطابقة جدًا أو غير متطابقة مع بيانات التدريب الخاصة به. النموذج الزائد يتنبأ ببيانات التدريب بشكل جيد جدًا لأنه تعلم تفاصيل البيانات وضوضائها بشكل زائد. النموذج الناقص ليس دقيقًا لأنه لا يمكنه تحليل بيانات التدريب الخاصة به أو البيانات التي لم "يرها" بعد بدقة.
![نموذج مفرط التناسب](../../../../translated_images/overfitting.1c132d92bfd93cb63240baf63ebdf82c30e30a0a44e1ad49861b82ff600c2b5c.ar.png)
![نموذج زائد التطبيق](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png)
> رسم توضيحي بواسطة [Jen Looper](https://twitter.com/jenlooper)
## ضبط المعلمات
بمجرد اكتمال التدريب الأولي، قم بمراقبة جودة النموذج وفكر في تحسينه عن طريق تعديل "المعلمات الفائقة". اقرأ المزيد عن العملية [في الوثائق](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott).
بمجرد اكتمال التدريب الأولي، راقب جودة النموذج وفكر في تحسينه عن طريق تعديل "المعلمات الفائقة". اقرأ المزيد عن العملية [في الوثائق](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott).
## التنبؤ
هذه هي اللحظة التي يمكنك فيها استخدام بيانات جديدة تمامًا لاختبار دقة النموذج الخاص بك. في إعداد تعلم الآلة "التطبيقي"، حيث تقوم ببناء أصول ويب لاستخدام النموذج في الإنتاج، قد تتضمن هذه العملية جمع مدخلات المستخدم (مثل الضغط على زر) لتعيين متغير وإرساله إلى النموذج للاستنتاج أو التقييم.
هذه هي اللحظة التي يمكنك فيها استخدام بيانات جديدة تمامًا لاختبار دقة النموذج الخاص بك. في إعداد تعلم الآلة "التطبيقي"، حيث تقوم ببناء أصول ويب لاستخدام النموذج في الإنتاج، قد تتضمن هذه العملية جمع مدخلات المستخدم (مثل الضغط على زر) لتعيين متغير وإرساله إلى النموذج للاستدلال أو التقييم.
في هذه الدروس، ستكتشف كيفية استخدام هذه الخطوات للتحضير، البناء، الاختبار، التقييم، والتنبؤ - جميع إيماءات عالم البيانات وأكثر، أثناء تقدمك في رحلتك لتصبح مهندس تعلم الآلة "متكامل المهارات".
في هذه الدروس، ستكتشف كيفية استخدام هذه الخطوات للتحضير، البناء، الاختبار، التقييم، والتنبؤ - جميع إيماءات عالم البيانات والمزيد، أثناء تقدمك في رحلتك لتصبح مهندس تعلم الآلة "متكامل المهارات".
---
## 🚀التحدي
## 🚀تحدي
ارسم مخططًا يعكس خطوات ممارس تعلم الآلة. أين ترى نفسك الآن في العملية؟ أين تتوقع أن تجد صعوبة؟ ما الذي يبدو سهلاً بالنسبة لك؟
ارسم مخططًا انسيابيًا يعكس خطوات ممارس تعلم الآلة. أين ترى نفسك الآن في العملية؟ أين تتوقع أن تجد صعوبة؟ ما الذي يبدو سهلاً بالنسبة لك؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/8/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
ابحث عبر الإنترنت عن مقابلات مع علماء بيانات يناقشون عملهم اليومي. إليك [واحدة](https://www.youtube.com/watch?v=Z3IjgbbCEfs).
ابحث عبر الإنترنت عن مقابلات مع علماء بيانات يناقشون عملهم اليومي. هنا [واحدة](https://www.youtube.com/watch?v=Z3IjgbbCEfs).
## الواجب
[قم بمقابلة عالم بيانات](assignment.md)
[قم بمقابلة مع عالم بيانات](assignment.md)
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,31 +1,31 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6b1cb0e46d4c5b747eff6e3607642760",
"translation_date": "2025-08-29T13:01:46+00:00",
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
"translation_date": "2025-09-04T20:40:45+00:00",
"source_file": "2-Regression/1-Tools/README.md",
"language_code": "ar"
}
-->
# ابدأ مع Python و Scikit-learn لنماذج الانحدار
# البدء مع Python و Scikit-learn لنماذج الانحدار
![ملخص الانحدارات في رسم توضيحي](../../../../translated_images/ml-regression.4e4f70e3b3ed446e3ace348dec973e133fa5d3680fbc8412b61879507369b98d.ar.png)
![ملخص الانحدارات في رسم توضيحي](../../../../sketchnotes/ml-regression.png)
> رسم توضيحي بواسطة [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/9/)
## [اختبار ما قبل المحاضرة](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.
- استخدام مكتبة Scikit-learn، بما في ذلك التثبيت.
- استخدام Scikit-learn، بما في ذلك التثبيت.
- استكشاف الانحدار الخطي من خلال تمرين عملي.
## التثبيت والإعدادات
@ -34,29 +34,29 @@ CO_OP_TRANSLATOR_METADATA:
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير حول إعداد جهاز الكمبيوتر الخاص بك لتعلم الآلة.
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**. تأكد من أن [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 تتطلب إصدارًا معينًا من البرنامج، بينما تتطلب أخرى إصدارًا مختلفًا. لهذا السبب، من المفيد العمل داخل [بيئة افتراضية](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 داخل 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، يُوصى باستخدام بيئة افتراضية. لاحظ أنه إذا كنت تقوم بتثبيت هذه المكتبة على جهاز Mac M1، فهناك تعليمات خاصة على الصفحة المرتبطة أعلاه.
4. **تثبيت Jupyter Notebook**. ستحتاج إلى [تثبيت حزمة Jupyter](https://pypi.org/project/jupyter/).
## بيئة تأليف تعلم الآلة الخاصة بك
ستستخدم **دفاتر الملاحظات (notebooks)** لتطوير كود Python الخاص بك وإنشاء نماذج تعلم الآلة. هذا النوع من الملفات هو أداة شائعة لعلماء البيانات، ويمكن التعرف عليه من خلال الامتداد `.ipynb`.
ستستخدم **دفاتر الملاحظات** لتطوير كود Python الخاص بك وإنشاء نماذج تعلم الآلة. هذا النوع من الملفات هو أداة شائعة لعلماء البيانات، ويمكن التعرف عليها من خلال لاحقتها أو امتدادها `.ipynb`.
دفاتر الملاحظات هي بيئة تفاعلية تتيح للمطور كتابة الكود وإضافة الملاحظات وكتابة التوثيق حول الكود، مما يكون مفيدًا جدًا للمشاريع التجريبية أو البحثية.
دفاتر الملاحظات هي بيئة تفاعلية تسمح للمطور بكتابة الكود وإضافة ملاحظات وكتابة توثيق حول الكود، وهو أمر مفيد جدًا للمشاريع التجريبية أو البحثية.
[![تعلم الآلة للمبتدئين - إعداد دفاتر Jupyter لبدء بناء نماذج الانحدار](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "تعلم الآلة للمبتدئين - إعداد دفاتر Jupyter لبدء بناء نماذج الانحدار")
[![تعلم الآلة للمبتدئين - إعداد دفاتر Jupyter للبدء في بناء نماذج الانحدار](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "تعلم الآلة للمبتدئين - إعداد دفاتر Jupyter للبدء في بناء نماذج الانحدار")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير حول هذا التمرين.
@ -66,9 +66,9 @@ CO_OP_TRANSLATOR_METADATA:
1. افتح _notebook.ipynb_ في Visual Studio Code.
سيتم تشغيل خادم Jupyter مع Python 3+. ستجد مناطق في دفتر الملاحظات يمكن تشغيلها، وهي أجزاء من الكود. يمكنك تشغيل كتلة كود عن طريق تحديد الأيقونة التي تشبه زر التشغيل.
سيتم تشغيل خادم Jupyter مع Python 3+. ستجد مناطق في دفتر الملاحظات يمكن تشغيلها، وهي أجزاء من الكود. يمكنك تشغيل كتلة الكود عن طريق تحديد الرمز الذي يشبه زر التشغيل.
2. حدد أيقونة `md` وأضف بعض النصوص باستخدام Markdown، مثل النص التالي: **# مرحبًا بك في دفتر الملاحظات الخاص بك**.
2. حدد رمز `md` وأضف بعض النصوص باستخدام Markdown، والنص التالي **# مرحبًا بك في دفتر ملاحظاتك**.
بعد ذلك، أضف بعض كود Python.
@ -81,23 +81,23 @@ CO_OP_TRANSLATOR_METADATA:
hello notebook
```
![VS Code مع دفتر ملاحظات مفتوح](../../../../translated_images/notebook.4a3ee31f396b88325607afda33cadcc6368de98040ff33942424260aa84d75f2.ar.jpg)
![VS Code مع دفتر ملاحظات مفتوح](../../../../2-Regression/1-Tools/images/notebook.jpg)
يمكنك دمج الكود مع التعليقات لتوثيق دفتر الملاحظات بنفسك.
يمكنك دمج الكود مع التعليقات لتوثيق دفتر الملاحظات ذاتيًا.
✅ فكر للحظة في مدى اختلاف بيئة عمل مطور الويب عن بيئة عمل عالم البيانات.
## البدء مع Scikit-learn
الآن بعد أن تم إعداد Python في بيئتك المحلية وأصبحت مرتاحًا مع دفاتر Jupyter، دعنا نتعرف على Scikit-learn (تُنطق `ساي` كما في `ساينس`). توفر Scikit-learn [واجهة برمجية شاملة](https://scikit-learn.org/stable/modules/classes.html#api-ref) لمساعدتك في تنفيذ مهام تعلم الآلة.
الآن بعد أن تم إعداد Python في بيئتك المحلية وأصبحت مرتاحًا مع دفاتر Jupyter، دعنا نتعرف على Scikit-learn (تُنطق `sci` كما في `science`). توفر Scikit-learn [واجهة برمجية شاملة](https://scikit-learn.org/stable/modules/classes.html#api-ref) لمساعدتك في تنفيذ مهام تعلم الآلة.
وفقًا لموقعهم [الرسمي](https://scikit-learn.org/stable/getting_started.html)، "Scikit-learn هي مكتبة مفتوحة المصدر لتعلم الآلة تدعم التعلم الموجه وغير الموجه. كما توفر أدوات متنوعة لتلائم النماذج، ومعالجة البيانات، واختيار النماذج وتقييمها، والعديد من الأدوات الأخرى."
في هذه الدورة، ستستخدم Scikit-learn وأدوات أخرى لبناء نماذج تعلم الآلة لتنفيذ ما نسميه مهام "تعلم الآلة التقليدي". لقد تجنبنا عمدًا الشبكات العصبية والتعلم العميق، حيث يتم تغطيتها بشكل أفضل في منهجنا القادم "الذكاء الاصطناعي للمبتدئين".
تجعل Scikit-learn من السهل بناء النماذج وتقييمها للاستخدام. تركز بشكل أساسي على استخدام البيانات الرقمية وتحتوي على العديد من مجموعات البيانات الجاهزة للاستخدام كأدوات تعليمية. كما تتضمن نماذج جاهزة يمكن للطلاب تجربتها. دعنا نستكشف عملية تحميل البيانات المعبأة مسبقًا واستخدام نموذج تقدير مدمج لإنشاء أول نموذج تعلم آلي باستخدام Scikit-learn مع بعض البيانات الأساسية.
تجعل Scikit-learn بناء النماذج وتقييمها للاستخدام أمرًا بسيطًا. وهي تركز بشكل أساسي على استخدام البيانات الرقمية وتحتوي على العديد من مجموعات البيانات الجاهزة للاستخدام كأدوات تعليمية. كما تتضمن نماذج مسبقة الصنع يمكن للطلاب تجربتها. دعنا نستكشف عملية تحميل البيانات المعبأة مسبقًا واستخدام نموذج تقدير أولي مع 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.
@ -105,23 +105,23 @@ CO_OP_TRANSLATOR_METADATA:
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير حول هذا التمرين.
في الملف _notebook.ipynb_ المرتبط بهذا الدرس، قم بمسح جميع الخلايا عن طريق الضغط على أيقونة "سلة المهملات".
في ملف _notebook.ipynb_ المرتبط بهذا الدرس، قم بمسح جميع الخلايا بالضغط على رمز "سلة المهملات".
في هذا القسم، ستعمل مع مجموعة بيانات صغيرة حول مرض السكري مدمجة في Scikit-learn لأغراض التعلم. تخيل أنك تريد اختبار علاج لمرضى السكري. قد تساعدك نماذج تعلم الآلة في تحديد المرضى الذين قد يستجيبون بشكل أفضل للعلاج، بناءً على مجموعات من المتغيرات. حتى نموذج الانحدار الأساسي جدًا، عند تصوره، قد يظهر معلومات حول المتغيرات التي يمكن أن تساعدك في تنظيم التجارب السريرية النظرية.
في هذا القسم، ستعمل مع مجموعة بيانات صغيرة حول مرض السكري مضمنة في Scikit-learn لأغراض التعلم. تخيل أنك تريد اختبار علاج لمرضى السكري. قد تساعدك نماذج تعلم الآلة في تحديد المرضى الذين قد يستجيبون بشكل أفضل للعلاج بناءً على مجموعات من المتغيرات. حتى نموذج الانحدار الأساسي جدًا، عند تصوره، قد يظهر معلومات حول المتغيرات التي قد تساعدك في تنظيم تجاربك السريرية النظرية.
✅ هناك العديد من أنواع طرق الانحدار، واختيارك يعتمد على الإجابة التي تبحث عنها. إذا كنت تريد التنبؤ بالطول المحتمل لشخص بناءً على عمره، ستستخدم الانحدار الخطي، حيث أنك تبحث عن **قيمة رقمية**. إذا كنت مهتمًا بمعرفة ما إذا كان نوع معين من الطعام يجب اعتباره نباتيًا أم لا، فأنت تبحث عن **تصنيف فئوي** وبالتالي ستستخدم الانحدار اللوجستي. فكر قليلاً في بعض الأسئلة التي يمكنك طرحها على البيانات، وأي من هذه الطرق ستكون أكثر ملاءمة.
✅ هناك العديد من أنواع طرق الانحدار، واختيارك يعتمد على الإجابة التي تبحث عنها. إذا كنت تريد التنبؤ بالطول المحتمل لشخص بناءً على عمره، ستستخدم الانحدار الخطي، حيث تبحث عن **قيمة رقمية**. إذا كنت مهتمًا بمعرفة ما إذا كان نوع معين من الطعام يجب اعتباره نباتيًا أم لا، فأنت تبحث عن **تعيين فئة** وبالتالي ستستخدم الانحدار اللوجستي. ستتعلم المزيد عن الانحدار اللوجستي لاحقًا. فكر قليلاً في بعض الأسئلة التي يمكنك طرحها على البيانات، وأي من هذه الطرق سيكون أكثر ملاءمة.
دعنا نبدأ هذه المهمة.
لنبدأ هذه المهمة.
### استيراد المكتبات
لهذه المهمة، سنقوم باستيراد بعض المكتبات:
- **matplotlib**. إنها أداة [رسم بياني](https://matplotlib.org/) مفيدة وسنستخدمها لإنشاء رسم خطي.
- **matplotlib**. إنها أداة [رسم بياني](https://matplotlib.org/) مفيدة وسنستخدمها لإنشاء مخطط خطي.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) هي مكتبة مفيدة للتعامل مع البيانات الرقمية في Python.
- **sklearn**. هذه هي مكتبة [Scikit-learn](https://scikit-learn.org/stable/user_guide.html).
قم باستيراد بعض المكتبات للمساعدة في مهامك.
قم باستيراد بعض المكتبات لمساعدتك في المهام.
1. أضف الاستيرادات بكتابة الكود التالي:
@ -131,24 +131,24 @@ CO_OP_TRANSLATOR_METADATA:
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` لتقسيم البيانات إلى مجموعات تدريب واختبار.
### مجموعة بيانات السكري
مجموعة البيانات المدمجة [السكري](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) تحتوي على 442 عينة بيانات حول مرض السكري، مع 10 متغيرات مميزة، بعضها يشمل:
مجموعة بيانات [السكري المدمجة](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) تحتوي على 442 عينة من البيانات حول مرض السكري، مع 10 متغيرات مميزة، بعضها يشمل:
- العمر: العمر بالسنوات
- مؤشر كتلة الجسم (bmi): مؤشر كتلة الجسم
- ضغط الدم (bp): متوسط ضغط الدم
- s1 tc: خلايا T (نوع من خلايا الدم البيضاء)
- خلايا T (s1 tc): نوع من خلايا الدم البيضاء
✅ تتضمن مجموعة البيانات هذه مفهوم "الجنس" كمتغير مميز مهم للبحث حول مرض السكري. تحتوي العديد من مجموعات البيانات الطبية على هذا النوع من التصنيفات الثنائية. فكر قليلاً في كيفية استبعاد مثل هذه التصنيفات لأجزاء معينة من السكان من العلاجات.
✅ تتضمن هذه المجموعة مفهوم "الجنس" كمتغير مميز مهم للبحث حول مرض السكري. العديد من مجموعات البيانات الطبية تتضمن هذا النوع من التصنيف الثنائي. فكر قليلاً في كيفية تأثير مثل هذه التصنيفات على استبعاد أجزاء معينة من السكان من العلاجات.
الآن، قم بتحميل بيانات X و y.
> 🎓 تذكر، هذا تعلم موجه، ونحن بحاجة إلى هدف مسمى 'y'.
> 🎓 تذكر، هذا تعلم موجه، ونحتاج إلى هدف مسمى "y".
في خلية كود جديدة، قم بتحميل مجموعة بيانات السكري عن طريق استدعاء `load_diabetes()`. الإعداد `return_X_y=True` يشير إلى أن `X` ستكون مصفوفة بيانات، و`y` ستكون الهدف الانحداري.
في خلية كود جديدة، قم بتحميل مجموعة بيانات السكري عن طريق استدعاء `load_diabetes()`. الإعداد `return_X_y=True` يشير إلى أن `X` ستكون مصفوفة بيانات، و `y` ستكون الهدف الانحداري.
1. أضف بعض أوامر الطباعة لعرض شكل مصفوفة البيانات وأول عنصر فيها:
@ -158,7 +158,7 @@ CO_OP_TRANSLATOR_METADATA:
print(X[0])
```
ما تحصل عليه كاستجابة هو مجموعة. ما تقوم به هو تعيين القيمتين الأوليين من المجموعة إلى `X` و`y` على التوالي. تعرف على المزيد [حول المجموعات](https://wikipedia.org/wiki/Tuple).
ما تحصل عليه كاستجابة هو مجموعة. ما تقوم به هو تعيين القيمتين الأوليين للمجموعة إلى `X` و `y` على التوالي. تعرف على المزيد [حول المجموعات](https://wikipedia.org/wiki/Tuple).
يمكنك رؤية أن هذه البيانات تحتوي على 442 عنصرًا مرتبة في مصفوفات تحتوي على 10 عناصر:
@ -168,9 +168,9 @@ CO_OP_TRANSLATOR_METADATA:
-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]
@ -179,7 +179,7 @@ CO_OP_TRANSLATOR_METADATA:
✅ في أي وقت، قم بطباعة البيانات للتحقق من شكلها.
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)
@ -200,7 +200,7 @@ CO_OP_TRANSLATOR_METADATA:
y_pred = model.predict(X_test)
```
6. الآن حان الوقت لعرض البيانات في رسم بياني. Matplotlib هي أداة مفيدة جدًا لهذه المهمة. قم بإنشاء مخطط نقطي لجميع بيانات الاختبار X و y، واستخدم التوقع لرسم خط في المكان الأنسب، بين مجموعات البيانات الخاصة بالنموذج.
6. الآن حان الوقت لعرض البيانات في مخطط. Matplotlib هي أداة مفيدة جدًا لهذه المهمة. قم بإنشاء مخطط نقاط لجميع بيانات الاختبار X و y، واستخدم التوقع لرسم خط في المكان الأنسب بين مجموعات البيانات الخاصة بالنموذج.
```python
plt.scatter(X_test, y_test, color='black')
@ -211,23 +211,23 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![مخطط نقطي يظهر نقاط البيانات حول مرض السكري](../../../../translated_images/scatterplot.ad8b356bcbb33be68d54050e09b9b7bfc03e94fde7371f2609ae43f4c563b2d7.ar.png)
✅ فكر قليلاً فيما يحدث هنا. هناك خط مستقيم يمر عبر العديد من النقاط الصغيرة للبيانات، ولكن ماذا يفعل بالضبط؟ هل يمكنك أن ترى كيف يمكن استخدام هذا الخط للتنبؤ بمكان نقطة بيانات جديدة وغير مرئية بالنسبة لمحور y في الرسم البياني؟ حاول أن تصف الاستخدام العملي لهذا النموذج بالكلمات.
![مخطط نقاط يظهر نقاط البيانات حول مرض السكري](../../../../2-Regression/1-Tools/images/scatterplot.png)
✅ فكر قليلاً فيما يحدث هنا. هناك خط مستقيم يمر عبر العديد من النقاط الصغيرة من البيانات، ولكن ماذا يفعل بالضبط؟ هل يمكنك أن ترى كيف يمكن استخدام هذا الخط للتنبؤ بمكان نقطة بيانات جديدة وغير مرئية بالنسبة لمحور y في الرسم البياني؟ حاول أن تصف الاستخدام العملي لهذا النموذج بالكلمات.
تهانينا، لقد قمت ببناء أول نموذج انحدار خطي، وأنشأت توقعًا باستخدامه، وعرضته في رسم بياني!
تهانينا، لقد قمت ببناء أول نموذج انحدار خطي، وأنشأت تنبؤًا باستخدامه، وعرضته في رسم بياني!
---
## 🚀التحدي
قم برسم متغير مختلف من هذه المجموعة البيانية. تلميح: قم بتعديل هذا السطر: `X = X[:,2]`. بالنظر إلى الهدف من هذه المجموعة البيانية، ماذا يمكنك اكتشافه عن تطور مرض السكري كمرض؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/10/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
في هذا الدرس، عملت مع الانحدار الخطي البسيط، بدلاً من الانحدار الأحادي أو الانحدار المتعدد. اقرأ قليلاً عن الفروقات بين هذه الطرق، أو شاهد [هذا الفيديو](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef).
اقرأ المزيد عن مفهوم الانحدار وفكر في نوع الأسئلة التي يمكن الإجابة عليها باستخدام هذه التقنية. خذ [هذا الدرس](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) لتعميق فهمك.
اقرأ المزيد عن مفهوم الانحدار وفكر في نوعية الأسئلة التي يمكن الإجابة عليها باستخدام هذه التقنية. خذ [هذا الدرس](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott) لتعميق فهمك.
## الواجب
@ -236,4 +236,4 @@ CO_OP_TRANSLATOR_METADATA:
---
**إخلاء المسؤولية**:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,19 +1,19 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a683e1fe430bb0d4a10b68f6ca15e0a6",
"translation_date": "2025-08-29T13:05:36+00:00",
"original_hash": "7c077988328ebfe33b24d07945f16eca",
"translation_date": "2025-09-04T20:41:20+00:00",
"source_file": "2-Regression/2-Data/README.md",
"language_code": "ar"
}
-->
# بناء نموذج انحدار باستخدام Scikit-learn: إعداد البيانات وتصويرها
![مخطط معلومات لتصور البيانات](../../../../translated_images/data-visualization.54e56dded7c1a804d00d027543f2881cb32da73aeadda2d4a4f10f3497526114.ar.png)
![مخطط تصوير البيانات](../../../../2-Regression/2-Data/images/data-visualization.png)
مخطط المعلومات من [Dasani Madipalli](https://twitter.com/dasani_decoded)
مخطط تصوير البيانات بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/11/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
> ### [هذه الدرس متوفر بلغة R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
@ -24,11 +24,11 @@ CO_OP_TRANSLATOR_METADATA:
في هذا الدرس، ستتعلم:
- كيفية إعداد البيانات لبناء النماذج.
- كيفية استخدام مكتبة Matplotlib لتصور البيانات.
- كيفية استخدام مكتبة Matplotlib لتصوير البيانات.
## طرح السؤال الصحيح على بياناتك
السؤال الذي تحتاج إلى الإجابة عليه سيحدد نوع خوارزميات تعلم الآلة التي ستستخدمها. كما أن جودة الإجابة التي تحصل عليها تعتمد بشكل كبير على طبيعة البيانات.
السؤال الذي تحتاج إلى الإجابة عليه سيحدد نوع خوارزميات تعلم الآلة التي ستستخدمها. كما أن جودة الإجابة التي تحصل عليها تعتمد بشكل كبير على طبيعة بياناتك.
ألقِ نظرة على [البيانات](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv) المقدمة لهذا الدرس. يمكنك فتح ملف .csv هذا في VS Code. نظرة سريعة تظهر على الفور وجود فراغات ومزيج من النصوص والبيانات الرقمية. هناك أيضًا عمود غريب يسمى "Package" حيث تكون البيانات مزيجًا بين "sacks"، "bins" وقيم أخرى. البيانات، في الواقع، تبدو فوضوية بعض الشيء.
@ -36,11 +36,11 @@ CO_OP_TRANSLATOR_METADATA:
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير حول إعداد البيانات لهذا الدرس.
في الواقع، من غير الشائع أن تحصل على مجموعة بيانات جاهزة تمامًا للاستخدام لإنشاء نموذج تعلم الآلة مباشرة. في هذا الدرس، ستتعلم كيفية إعداد مجموعة بيانات خام باستخدام مكتبات Python القياسية. ستتعلم أيضًا تقنيات مختلفة لتصور البيانات.
في الواقع، من غير الشائع أن تحصل على مجموعة بيانات جاهزة تمامًا للاستخدام لإنشاء نموذج تعلم آلي مباشرة. في هذا الدرس، ستتعلم كيفية إعداد مجموعة بيانات خام باستخدام مكتبات 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 سطرًا من البيانات حول سوق القرع، مرتبة في مجموعات حسب المدينة. هذه بيانات خام مستخرجة من [تقارير السوق القياسية للمحاصيل الخاصة](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice) التي توزعها وزارة الزراعة الأمريكية.
### إعداد البيانات
@ -54,7 +54,7 @@ CO_OP_TRANSLATOR_METADATA:
## تمرين - تحليل بيانات القرع
دعونا نستخدم [Pandas](https://pandas.pydata.org/) (الاسم اختصار لـ `Python Data Analysis`) وهي أداة مفيدة جدًا لتشكيل البيانات، لتحليل وإعداد بيانات القرع.
لنستخدم [Pandas](https://pandas.pydata.org/) (الاسم اختصار لـ `Python Data Analysis`) وهي أداة مفيدة جدًا لتشكيل البيانات، لتحليل وإعداد بيانات القرع.
### أولاً، تحقق من التواريخ المفقودة
@ -81,7 +81,7 @@ CO_OP_TRANSLATOR_METADATA:
pumpkins.isnull().sum()
```
هناك بيانات مفقودة، ولكن ربما لن تكون مهمة للمهمة المطروحة.
هناك بيانات مفقودة، ولكن ربما لن تكون مهمة للمهمة الحالية.
1. لجعل إطار البيانات الخاص بك أسهل للعمل معه، اختر فقط الأعمدة التي تحتاجها، باستخدام وظيفة `loc` التي تستخرج من إطار البيانات الأصلي مجموعة من الصفوف (الممررة كمعامل أول) والأعمدة (الممررة كمعامل ثاني). التعبير `:` في الحالة أدناه يعني "جميع الصفوف".
@ -117,11 +117,11 @@ CO_OP_TRANSLATOR_METADATA:
### لكن انتظر! هناك شيء غريب هنا
إذا نظرت إلى عمود `Package`، يتم بيع القرع بتكوينات مختلفة. بعضها يُباع بمقاييس "1 1/9 bushel"، وبعضها بمقاييس "1/2 bushel"، وبعضها لكل قرع، وبعضها لكل رطل، وبعضها في صناديق كبيرة بأحجام مختلفة.
إذا نظرت إلى عمود `Package`، يتم بيع القرع في تكوينات مختلفة. بعضها يُباع بمقاييس "1 1/9 bushel"، وبعضها بمقاييس "1/2 bushel"، وبعضها لكل قرع، وبعضها لكل رطل، وبعضها في صناديق كبيرة بأحجام مختلفة.
> يبدو أن القرع صعب الوزن بشكل متسق
بالتعمق في البيانات الأصلية، من المثير للاهتمام أن أي شيء يحتوي على `Unit of Sale` يساوي "EACH" أو "PER BIN" يحتوي أيضًا على نوع `Package` لكل بوصة، لكل صندوق، أو "each". يبدو أن القرع صعب الوزن بشكل متسق، لذا دعونا نقوم بتصفيته عن طريق اختيار فقط القرع الذي يحتوي على السلسلة "bushel" في عمود `Package`.
بالتعمق في البيانات الأصلية، من المثير للاهتمام أن أي شيء يحتوي على `Unit of Sale` يساوي "EACH" أو "PER BIN" يحتوي أيضًا على نوع `Package` لكل بوصة، لكل صندوق، أو "each". يبدو أن القرع صعب الوزن بشكل متسق، لذا دعونا نقوم بتصفيته عن طريق اختيار فقط القرع الذي يحتوي على النص "bushel" في عمود `Package`.
1. أضف فلتر في أعلى الملف، تحت استيراد ملف .csv الأولي:
@ -135,7 +135,7 @@ CO_OP_TRANSLATOR_METADATA:
هل لاحظت أن كمية البوشل تختلف حسب الصف؟ تحتاج إلى تطبيع التسعير بحيث تظهر التسعير لكل بوشل، لذا قم ببعض العمليات الحسابية لتوحيدها.
1. أضف هذه الأسطر بعد الكتلة التي تنشئ إطار بيانات القرع الجديد:
1. أضف هذه الأسطر بعد الكتلة التي تنشئ إطار بيانات new_pumpkins:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
@ -143,27 +143,27 @@ CO_OP_TRANSLATOR_METADATA:
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)، يعتمد وزن البوشل على نوع المنتج، حيث إنه قياس حجم. "البوشل من الطماطم، على سبيل المثال، من المفترض أن يزن 56 رطلاً... الأوراق والخضروات تشغل مساحة أكبر بوزن أقل، لذا فإن البوشل من السبانخ يزن فقط 20 رطلاً." الأمر معقد جدًا! دعونا لا نزعج أنفسنا بتحويل البوشل إلى رطل، وبدلاً من ذلك نقوم بالتسعير حسب البوشل. كل هذه الدراسة للبوشل من القرع، مع ذلك، تظهر مدى أهمية فهم طبيعة بياناتك!
✅ وفقًا لـ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308)، يعتمد وزن البوشل على نوع المنتج، حيث إنه قياس حجم. "يُفترض أن يزن بوشل الطماطم، على سبيل المثال، 56 رطلاً... الأوراق والخضروات تشغل مساحة أكبر بوزن أقل، لذا فإن بوشل السبانخ يزن فقط 20 رطلاً." الأمر معقد جدًا! دعونا لا نزعج أنفسنا بتحويل البوشل إلى رطل، وبدلاً من ذلك نحدد السعر حسب البوشل. كل هذا الدراسة للبوشل من القرع، مع ذلك، تظهر مدى أهمية فهم طبيعة بياناتك!
الآن، يمكنك تحليل التسعير لكل وحدة بناءً على قياس البوشل الخاص بها. إذا قمت بطباعة البيانات مرة أخرى، يمكنك رؤية كيف تم توحيدها.
✅ هل لاحظت أن القرع الذي يُباع بنصف بوشل غالي جدًا؟ هل يمكنك معرفة السبب؟ تلميح: القرع الصغير أغلى بكثير من الكبير، ربما لأن هناك الكثير منه لكل بوشل، بالنظر إلى المساحة غير المستخدمة التي يشغلها قرع كبير مجوف.
## استراتيجيات التصور
## استراتيجيات التصوير
جزء من دور عالم البيانات هو توضيح جودة وطبيعة البيانات التي يعملون معها. للقيام بذلك، غالبًا ما يقومون بإنشاء تصورات مثيرة للاهتمام، مثل المخططات، الرسوم البيانية، والخرائط، التي تظهر جوانب مختلفة من البيانات. بهذه الطريقة، يمكنهم عرض العلاقات والفجوات بصريًا التي يصعب اكتشافها بطريقة أخرى.
جزء من دور عالم البيانات هو توضيح جودة وطبيعة البيانات التي يعمل معها. للقيام بذلك، غالبًا ما يقومون بإنشاء تصورات مثيرة للاهتمام، مثل المخططات، الرسوم البيانية، والخرائط، التي تظهر جوانب مختلفة من البيانات. بهذه الطريقة، يمكنهم عرض العلاقات والفجوات بصريًا التي يصعب اكتشافها بطريقة أخرى.
[![تعلم الآلة للمبتدئين - كيفية تصور البيانات باستخدام Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "تعلم الآلة للمبتدئين - كيفية تصور البيانات باستخدام 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
حاول إنشاء بعض المخططات الأساسية لعرض إطار البيانات الجديد الذي أنشأته للتو. ماذا سيظهر مخطط خطي أساسي؟
@ -183,13 +183,13 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![مخطط انتشار يظهر العلاقة بين السعر والشهر](../../../../translated_images/scatterplot.b6868f44cbd2051c6680ccdbb1510697d06a3ff6cd4abda656f5009c0ed4e3fc.ar.png)
![مخطط انتشار يظهر العلاقة بين السعر والشهر](../../../../2-Regression/2-Data/images/scatterplot.png)
هل هذا مخطط مفيد؟ هل هناك شيء يفاجئك بشأنه؟
هل هذا مخطط مفيد؟ هل هناك شيء يفاجئك؟
إنه ليس مفيدًا بشكل خاص حيث إنه يعرض فقط بياناتك كانتشار نقاط في شهر معين.
إنه ليس مفيدًا بشكل خاص حيث إنه يعرض فقط بياناتك كنقاط منتشرة في شهر معين.
### اجعله مفيدًا
### اجعلها مفيدة
لجعل المخططات تعرض بيانات مفيدة، عادةً ما تحتاج إلى تجميع البيانات بطريقة ما. دعونا نحاول إنشاء مخطط حيث يظهر المحور y الأشهر وتظهر البيانات توزيع البيانات.
@ -200,9 +200,9 @@ CO_OP_TRANSLATOR_METADATA:
plt.ylabel("Pumpkin Price")
```
![مخطط شريطي يظهر العلاقة بين السعر والشهر](../../../../translated_images/barchart.a833ea9194346d769c77a3a870f7d8aee51574cd1138ca902e5500830a41cbce.ar.png)
![مخطط شريطي يظهر العلاقة بين السعر والشهر](../../../../2-Regression/2-Data/images/barchart.png)
هذا هو تصور بيانات أكثر فائدة! يبدو أنه يشير إلى أن أعلى سعر للقرع يحدث في سبتمبر وأكتوبر. هل يتوافق ذلك مع توقعاتك؟ لماذا أو لماذا لا؟
هذا تصوير بيانات أكثر فائدة! يبدو أنه يشير إلى أن أعلى سعر للقرع يحدث في سبتمبر وأكتوبر. هل يتوافق ذلك مع توقعاتك؟ لماذا أو لماذا لا؟
---
@ -210,17 +210,17 @@ CO_OP_TRANSLATOR_METADATA:
استكشف الأنواع المختلفة من التصورات التي تقدمها Matplotlib. ما الأنواع الأكثر ملاءمة لمشاكل الانحدار؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/12/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
ألقِ نظرة على الطرق العديدة لتصور البيانات. قم بعمل قائمة بالمكتبات المختلفة المتاحة ودوّن أيها الأفضل لأنواع معينة من المهام، على سبيل المثال التصورات ثنائية الأبعاد مقابل التصورات ثلاثية الأبعاد. ماذا تكتشف؟
ألقِ نظرة على الطرق العديدة لتصوير البيانات. قم بعمل قائمة بالمكتبات المختلفة المتاحة ولاحظ أيها الأفضل لأنواع معينة من المهام، على سبيل المثال التصورات ثنائية الأبعاد مقابل التصورات ثلاثية الأبعاد. ماذا تكتشف؟
## الواجب
[استكشاف التصور](assignment.md)
[استكشاف التصوير](assignment.md)
---
**إخلاء المسؤولية**:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.
تمت ترجمة هذه الوثيقة باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). على الرغم من أننا نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار الوثيقة الأصلية بلغتها الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.

@ -1,92 +1,92 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2f88fbc741d792890ff2f1430fe0dae0",
"translation_date": "2025-08-29T12:52:13+00:00",
"original_hash": "40e64f004f3cb50aa1d8661672d3cd92",
"translation_date": "2025-09-04T20:37:53+00:00",
"source_file": "2-Regression/3-Linear/README.md",
"language_code": "ar"
}
-->
# بناء نموذج انحدار باستخدام Scikit-learn: أربعة أنواع من الانحدار
# بناء نموذج انحدار باستخدام Scikit-learn: الانحدار بأربع طرق
![مخطط معلوماتي عن الانحدار الخطي مقابل الانحدار متعدد الحدود](../../../../translated_images/linear-polynomial.5523c7cb6576ccab0fecbd0e3505986eb2d191d9378e785f82befcf3a578a6e7.ar.png)
> مخطط معلوماتي من إعداد [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/13/)
![مخطط معلوماتي عن الانحدار الخطي مقابل الانحدار متعدد الحدود](../../../../2-Regression/3-Linear/images/linear-polynomial.png)
> مخطط معلوماتي بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
> ### [هذا الدرس متوفر بلغة R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### المقدمة
> ### [هذه الدرس متوفر بلغة R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### المقدمة
حتى الآن، قمت باستكشاف مفهوم الانحدار باستخدام بيانات عينة مأخوذة من مجموعة بيانات تسعير القرع التي سنستخدمها طوال هذا الدرس. كما قمت بتصورها باستخدام مكتبة Matplotlib.
الآن أنت مستعد للتعمق أكثر في الانحدار لتعلم الآلة. بينما يسمح التصور بفهم البيانات، فإن القوة الحقيقية لتعلم الآلة تأتي من _تدريب النماذج_. يتم تدريب النماذج على بيانات تاريخية لالتقاط العلاقات بين البيانات تلقائيًا، مما يسمح لك بالتنبؤ بالنتائج لبيانات جديدة لم يرها النموذج من قبل.
الآن أنت جاهز للتعمق أكثر في الانحدار في تعلم الآلة. بينما يسمح التصور بفهم البيانات، فإن القوة الحقيقية لتعلم الآلة تأتي من _تدريب النماذج_. يتم تدريب النماذج على البيانات التاريخية لالتقاط العلاقات بين البيانات تلقائيًا، وتتيح لك التنبؤ بالنتائج للبيانات الجديدة التي لم يرها النموذج من قبل.
في هذا الدرس، ستتعلم المزيد عن نوعين من الانحدار: _الانحدار الخطي الأساسي_ و_الانحدار متعدد الحدود_، بالإضافة إلى بعض الرياضيات التي تدعم هذه التقنيات. ستتيح لنا هذه النماذج التنبؤ بأسعار القرع بناءً على بيانات إدخال مختلفة.
في هذا الدرس، ستتعلم المزيد عن نوعين من الانحدار: _الانحدار الخطي الأساسي_ و _الانحدار متعدد الحدود_، إلى جانب بعض الرياضيات الأساسية لهذه التقنيات. ستتيح لنا هذه النماذج التنبؤ بأسعار القرع بناءً على بيانات الإدخال المختلفة.
[![تعلم الآلة للمبتدئين - فهم الانحدار الخطي](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "تعلم الآلة للمبتدئين - فهم الانحدار الخطي")
[![تعلّم الآلة للمبتدئين - فهم الانحدار الخطي](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "تعلّم الآلة للمبتدئين - فهم الانحدار الخطي")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير عن الانحدار الخطي.
> خلال هذا المنهج، نفترض معرفة رياضية بسيطة، ونسعى لجعلها متاحة للطلاب القادمين من مجالات أخرى، لذا انتبه للملاحظات، 🧮 التنبيهات، الرسوم البيانية، وأدوات التعلم الأخرى التي تساعد على الفهم.
> خلال هذه المنهجية، نفترض معرفة بسيطة بالرياضيات، ونسعى لجعلها سهلة الوصول للطلاب القادمين من مجالات أخرى، لذا ابحث عن الملاحظات، 🧮 التنبيهات، الرسوم البيانية، وأدوات التعلم الأخرى لتسهيل الفهم.
### المتطلبات الأساسية
يجب أن تكون الآن على دراية ببنية بيانات القرع التي نقوم بفحصها. يمكنك العثور عليها محملة مسبقًا ومنظفة مسبقًا في ملف _notebook.ipynb_ الخاص بهذا الدرس. في الملف، يتم عرض سعر القرع لكل سلة في إطار بيانات جديد. تأكد من أنك تستطيع تشغيل هذه الدفاتر في النواة الخاصة بـ Visual Studio Code.
يجب أن تكون الآن على دراية ببنية بيانات القرع التي نقوم بفحصها. يمكنك العثور عليها محملة مسبقًا ومُنظفة مسبقًا في ملف _notebook.ipynb_ الخاص بهذا الدرس. في الملف، يتم عرض سعر القرع لكل بوشل في إطار بيانات جديد. تأكد من أنك تستطيع تشغيل هذه الدفاتر في النواة الخاصة بـ Visual Studio Code.
### التحضير
كتذكير، تقوم بتحميل هذه البيانات لطرح أسئلة عليها.
كتذكير، أنت تقوم بتحميل هذه البيانات لطرح أسئلة عليها.
- متى يكون أفضل وقت لشراء القرع؟
- ما السعر المتوقع لصندوق من القرع الصغير؟
- هل يجب أن أشتريه في سلال نصف البوشل أم في صناديق 1 1/9 بوشل؟
دعنا نستمر في استكشاف هذه البيانات.
- هل يجب أن أشتريه في سلال نصف بوشل أو في صناديق بوشل 1 1/9؟
دعونا نستمر في استكشاف هذه البيانات.
في الدرس السابق، قمت بإنشاء إطار بيانات باستخدام Pandas وملأته بجزء من مجموعة البيانات الأصلية، موحدًا التسعير حسب البوشل. ومع ذلك، من خلال القيام بذلك، تمكنت فقط من جمع حوالي 400 نقطة بيانات وللأشهر الخريفية فقط.
في الدرس السابق، قمت بإنشاء إطار بيانات باستخدام Pandas وملأته بجزء من مجموعة البيانات الأصلية، موحدًا التسعير حسب البوشل. ومع ذلك، من خلال القيام بذلك، تمكنت فقط من جمع حوالي 400 نقطة بيانات وفقط للأشهر الخريفية.
ألقِ نظرة على البيانات المحملة مسبقًا في دفتر الملاحظات المرافق لهذا الدرس. البيانات محملة مسبقًا وتم رسم مخطط مبعثر أولي لإظهار بيانات الأشهر. ربما يمكننا الحصول على مزيد من التفاصيل حول طبيعة البيانات من خلال تنظيفها أكثر.
ألقِ نظرة على البيانات التي قمنا بتحميلها مسبقًا في دفتر الملاحظات المرافق لهذا الدرس. البيانات محملة مسبقًا وتم رسم مخطط مبعثر أولي لإظهار بيانات الأشهر. ربما يمكننا الحصول على مزيد من التفاصيل حول طبيعة البيانات من خلال تنظيفها أكثر.
## خط الانحدار الخطي
كما تعلمت في الدرس الأول، الهدف من تمرين الانحدار الخطي هو رسم خط لـ:
كما تعلمت في الدرس الأول، الهدف من تمرين الانحدار الخطي هو القدرة على رسم خط لـ:
- **إظهار العلاقات بين المتغيرات**. إظهار العلاقة بين المتغيرات.
- **إظهار العلاقات بين المتغيرات**. إظهار العلاقة بين المتغيرات
- **إجراء التنبؤات**. إجراء تنبؤات دقيقة حول مكان وقوع نقطة بيانات جديدة بالنسبة لذلك الخط.
من الشائع استخدام **انحدار المربعات الصغرى** لرسم هذا النوع من الخطوط. يشير مصطلح "المربعات الصغرى" إلى أن جميع نقاط البيانات المحيطة بخط الانحدار يتم تربيعها ثم جمعها. من الناحية المثالية، يكون المجموع النهائي صغيرًا قدر الإمكان، لأننا نريد عددًا منخفضًا من الأخطاء، أو `المربعات الصغرى`.
من المعتاد استخدام **انحدار المربعات الصغرى** لرسم هذا النوع من الخطوط. مصطلح "المربعات الصغرى" يعني أن جميع نقاط البيانات المحيطة بخط الانحدار يتم تربيعها ثم جمعها. من الناحية المثالية، يكون المجموع النهائي صغيرًا قدر الإمكان، لأننا نريد عددًا منخفضًا من الأخطاء، أو `المربعات الصغرى`.
نقوم بذلك لأننا نريد نمذجة خط يحتوي على أقل مسافة تراكمية من جميع نقاط البيانات لدينا. كما نقوم بتربيع المصطلحات قبل جمعها لأننا نهتم بحجمها بدلاً من اتجاهها.
> **🧮 أرني الرياضيات**
>
> يمكن التعبير عن هذا الخط، المسمى _خط أفضل تطابق_، بواسطة [معادلة](https://en.wikipedia.org/wiki/Simple_linear_regression):
>
>
> يمكن التعبير عن هذا الخط، المسمى _خط أفضل تطابق_، بواسطة [معادلة](https://en.wikipedia.org/wiki/Simple_linear_regression):
>
> ```
> Y = a + bX
> ```
>
> `X` هو "المتغير التوضيحي". `Y` هو "المتغير التابع". ميل الخط هو `b` و`a` هو نقطة تقاطع المحور Y، والتي تشير إلى قيمة `Y` عندما يكون `X = 0`.
> `X` هو "المتغير التوضيحي". `Y` هو "المتغير التابع". ميل الخط هو `b` و `a` هو نقطة تقاطع المحور Y، والتي تشير إلى قيمة `Y` عندما يكون `X = 0`.
>
>![حساب الميل](../../../../translated_images/slope.f3c9d5910ddbfcf9096eb5564254ba22c9a32d7acd7694cab905d29ad8261db3.ar.png)
>![حساب الميل](../../../../2-Regression/3-Linear/images/slope.png)
>
> أولاً، احسب الميل `b`. مخطط معلوماتي من إعداد [Jen Looper](https://twitter.com/jenlooper)
> أولاً، احسب الميل `b`. مخطط معلوماتي بواسطة [Jen Looper](https://twitter.com/jenlooper)
>
> بعبارة أخرى، وبالإشارة إلى السؤال الأصلي لبيانات القرع: "توقع سعر القرع لكل بوشل حسب الشهر"، سيكون `X` يشير إلى السعر و`Y` يشير إلى شهر البيع.
> بعبارة أخرى، وبالإشارة إلى السؤال الأصلي لبيانات القرع: "توقع سعر القرع لكل بوشل حسب الشهر"، سيكون `X` يشير إلى السعر و `Y` يشير إلى شهر البيع.
>
>![إكمال المعادلة](../../../../translated_images/calculation.a209813050a1ddb141cdc4bc56f3af31e67157ed499e16a2ecf9837542704c94.ar.png)
>![إكمال المعادلة](../../../../2-Regression/3-Linear/images/calculation.png)
>
> احسب قيمة Y. إذا كنت تدفع حوالي 4 دولارات، فلا بد أن يكون أبريل! مخطط معلوماتي من إعداد [Jen Looper](https://twitter.com/jenlooper)
> احسب قيمة Y. إذا كنت تدفع حوالي 4 دولارات، فلا بد أن يكون أبريل! مخطط معلوماتي بواسطة [Jen Looper](https://twitter.com/jenlooper)
>
> يجب أن توضح الرياضيات التي تحسب الخط ميل الخط، والذي يعتمد أيضًا على نقطة التقاطع، أو مكان وجود `Y` عندما يكون `X = 0`.
> يجب أن تُظهر الرياضيات التي تحسب الخط ميل الخط، والذي يعتمد أيضًا على نقطة التقاطع، أو مكان وجود `Y` عندما يكون `X = 0`.
>
> يمكنك مشاهدة طريقة الحساب لهذه القيم على موقع [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). قم أيضًا بزيارة [آلة حاسبة المربعات الصغرى](https://www.mathsisfun.com/data/least-squares-calculator.html) لمشاهدة كيفية تأثير قيم الأرقام على الخط.
> يمكنك مشاهدة طريقة الحساب لهذه القيم على موقع [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). كما يمكنك زيارة [آلة حاسبة المربعات الصغرى](https://www.mathsisfun.com/data/least-squares-calculator.html) لمشاهدة كيف تؤثر قيم الأرقام على الخط.
## الارتباط
مصطلح آخر يجب فهمه هو **معامل الارتباط** بين المتغيرين X وY المعطى. باستخدام مخطط مبعثر، يمكنك بسرعة تصور هذا المعامل. إذا كانت النقاط المبعثرة على المخطط تشكل خطًا مرتبًا، فإن الارتباط يكون عاليًا، ولكن إذا كانت النقاط مبعثرة في كل مكان بين X وY، فإن الارتباط يكون منخفضًا.
مصطلح آخر يجب فهمه هو **معامل الارتباط** بين المتغيرين X و Y المعطىين. باستخدام مخطط مبعثر، يمكنك بسرعة تصور هذا المعامل. مخطط يحتوي على نقاط بيانات متناثرة في خط مرتب لديه ارتباط عالي، ولكن مخطط يحتوي على نقاط بيانات متناثرة في كل مكان بين X و Y لديه ارتباط منخفض.
نموذج الانحدار الخطي الجيد سيكون نموذجًا يحتوي على معامل ارتباط عالٍ (أقرب إلى 1 من 0) باستخدام طريقة انحدار المربعات الصغرى مع خط الانحدار.
نموذج الانحدار الخطي الجيد سيكون النموذج الذي يحتوي على معامل ارتباط عالي (أقرب إلى 1 من 0) باستخدام طريقة انحدار المربعات الصغرى مع خط الانحدار.
✅ قم بتشغيل دفتر الملاحظات المرافق لهذا الدرس وانظر إلى المخطط المبعثر بين الشهر والسعر. هل تبدو البيانات التي تربط الشهر بالسعر لمبيعات القرع ذات ارتباط عالٍ أم منخفض، وفقًا لتفسيرك البصري للمخطط المبعثر؟ هل يتغير ذلك إذا استخدمت مقياسًا أكثر دقة بدلاً من `الشهر`، مثل *يوم السنة* (أي عدد الأيام منذ بداية السنة)؟
✅ قم بتشغيل دفتر الملاحظات المرافق لهذا الدرس وانظر إلى مخطط الشهر مقابل السعر. هل تبدو البيانات التي تربط الشهر بالسعر لمبيعات القرع ذات ارتباط عالي أو منخفض، وفقًا لتفسيرك البصري للمخطط المبعثر؟ هل يتغير ذلك إذا استخدمت مقياسًا أكثر دقة بدلاً من `الشهر`، مثل *اليوم من السنة* (أي عدد الأيام منذ بداية السنة)؟
في الكود أدناه، سنفترض أننا قمنا بتنظيف البيانات، وحصلنا على إطار بيانات يسمى `new_pumpkins`، مشابه لما يلي:
@ -98,36 +98,36 @@ ID | Month | DayOfYear | Variety | City | Package | Low Price | High Price | Pri
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 bushel cartons | 15.0 | 15.0 | 13.636364
> الكود لتنظيف البيانات متوفر في [`notebook.ipynb`](notebook.ipynb). قمنا بتنفيذ نفس خطوات التنظيف كما في الدرس السابق، وحسبنا عمود `DayOfYear` باستخدام التعبير التالي:
> الكود لتنظيف البيانات متوفر في [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). قمنا بتنفيذ نفس خطوات التنظيف كما في الدرس السابق، وقمنا بحساب عمود `DayOfYear` باستخدام التعبير التالي:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
الآن بعد أن أصبحت لديك فكرة عن الرياضيات وراء الانحدار الخطي، دعنا ننشئ نموذج انحدار لنرى ما إذا كان بإمكاننا التنبؤ بأي حزمة من القرع ستحتوي على أفضل أسعار القرع. قد يرغب شخص يشتري القرع لمزرعة قرع في العطلات في الحصول على هذه المعلومات لتحسين مشترياته من حزم القرع للمزرعة.
الآن بعد أن أصبحت لديك فهم للرياضيات وراء الانحدار الخطي، دعنا ننشئ نموذج انحدار لنرى ما إذا كان بإمكاننا التنبؤ بأي حزمة من القرع ستحتوي على أفضل أسعار القرع. قد يرغب شخص يشتري القرع لحديقة قرع العطلات في هذه المعلومات ليتمكن من تحسين مشترياته من حزم القرع للحديقة.
## البحث عن الارتباط
[![تعلم الآلة للمبتدئين - البحث عن الارتباط: المفتاح للانحدار الخطي](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "تعلم الآلة للمبتدئين - البحث عن الارتباط: المفتاح للانحدار الخطي")
[![تعلّم الآلة للمبتدئين - البحث عن الارتباط: المفتاح للانحدار الخطي](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "تعلّم الآلة للمبتدئين - البحث عن الارتباط: المفتاح للانحدار الخطي")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير عن الارتباط.
من الدرس السابق، ربما لاحظت أن متوسط السعر للأشهر المختلفة يبدو كالتالي:
من الدرس السابق ربما لاحظت أن متوسط السعر للأشهر المختلفة يبدو كالتالي:
<img alt="متوسط السعر حسب الشهر" src="../2-Data/images/barchart.png" width="50%"/>
يشير هذا إلى أنه قد يكون هناك ارتباط، ويمكننا محاولة تدريب نموذج انحدار خطي للتنبؤ بالعلاقة بين `الشهر` و`السعر`، أو بين `يوم السنة` و`السعر`. هنا المخطط المبعثر الذي يظهر العلاقة الأخيرة:
هذا يشير إلى أنه يجب أن يكون هناك بعض الارتباط، ويمكننا محاولة تدريب نموذج انحدار خطي للتنبؤ بالعلاقة بين `الشهر` و `السعر`، أو بين `اليوم من السنة` و `السعر`. إليك المخطط المبعثر الذي يظهر العلاقة الأخيرة:
<img alt="مخطط مبعثر للسعر مقابل يوم السنة" src="images/scatter-dayofyear.png" width="50%" />
<img alt="مخطط مبعثر للسعر مقابل اليوم من السنة" src="images/scatter-dayofyear.png" width="50%" />
دعنا نرى ما إذا كان هناك ارتباط باستخدام دالة `corr`:
دعونا نرى ما إذا كان هناك ارتباط باستخدام وظيفة `corr`:
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
يبدو أن الارتباط صغير جدًا، -0.15 بالنسبة لـ `الشهر` و-0.17 بالنسبة لـ `يوم الشهر`، ولكن قد تكون هناك علاقة مهمة أخرى. يبدو أن هناك مجموعات مختلفة من الأسعار تتوافق مع أنواع مختلفة من القرع. لتأكيد هذه الفرضية، دعنا نرسم كل فئة من القرع بلون مختلف. عن طريق تمرير معامل `ax` إلى دالة الرسم المبعثر، يمكننا رسم جميع النقاط على نفس الرسم البياني:
يبدو أن الارتباط صغير جدًا، -0.15 حسب `الشهر` و -0.17 حسب `اليوم من الشهر`، ولكن قد تكون هناك علاقة مهمة أخرى. يبدو أن هناك مجموعات مختلفة من الأسعار تتوافق مع أنواع مختلفة من القرع. لتأكيد هذه الفرضية، دعونا نرسم كل فئة من القرع باستخدام لون مختلف. من خلال تمرير معلمة `ax` إلى وظيفة الرسم المبعثر، يمكننا رسم جميع النقاط على نفس الرسم البياني:
```python
ax=None
@ -137,27 +137,27 @@ for i,var in enumerate(new_pumpkins['Variety'].unique()):
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="مخطط مبعثر للسعر مقابل يوم السنة" src="images/scatter-dayofyear-color.png" width="50%" />
<img alt="مخطط مبعثر للسعر مقابل اليوم من السنة" src="images/scatter-dayofyear-color.png" width="50%" />
تشير تحقيقاتنا إلى أن النوع له تأثير أكبر على السعر الإجمالي من تاريخ البيع الفعلي. يمكننا رؤية ذلك باستخدام رسم بياني شريطي:
تشير تحقيقاتنا إلى أن النوع له تأثير أكبر على السعر الإجمالي من تاريخ البيع الفعلي. يمكننا رؤية ذلك باستخدام مخطط شريطي:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="رسم بياني شريطي للسعر مقابل النوع" src="images/price-by-variety.png" width="50%" />
<img alt="مخطط شريطي للسعر مقابل النوع" src="images/price-by-variety.png" width="50%" />
دعنا نركز في الوقت الحالي فقط على نوع واحد من القرع، وهو "نوع الفطيرة"، ونرى ما هو تأثير التاريخ على السعر:
دعونا نركز في الوقت الحالي فقط على نوع واحد من القرع، وهو "نوع الفطيرة"، ونرى ما هو تأثير التاريخ على السعر:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="مخطط مبعثر للسعر مقابل يوم السنة" src="images/pie-pumpkins-scatter.png" width="50%" />
<img alt="مخطط مبعثر للسعر مقابل اليوم من السنة" src="images/pie-pumpkins-scatter.png" width="50%" />
إذا قمنا الآن بحساب الارتباط بين `السعر` و`يوم السنة` باستخدام دالة `corr`، سنحصل على شيء مثل `-0.27` - مما يعني أن تدريب نموذج تنبؤي يبدو منطقيًا.
إذا قمنا الآن بحساب الارتباط بين `السعر` و `اليوم من السنة` باستخدام وظيفة `corr`، سنحصل على شيء مثل `-0.27` - مما يعني أن تدريب نموذج تنبؤي يبدو منطقيًا.
> قبل تدريب نموذج الانحدار الخطي، من المهم التأكد من أن بياناتنا نظيفة. لا يعمل الانحدار الخطي بشكل جيد مع القيم المفقودة، لذا من المنطقي التخلص من جميع الخلايا الفارغة:
> قبل تدريب نموذج الانحدار الخطي، من المهم التأكد من أن بياناتنا نظيفة. لا يعمل الانحدار الخطي جيدًا مع القيم المفقودة، لذا من المنطقي التخلص من جميع الخلايا الفارغة:
```python
pie_pumpkins.dropna(inplace=True)
@ -168,7 +168,7 @@ pie_pumpkins.info()
## الانحدار الخطي البسيط
[![تعلم الآلة للمبتدئين - الانحدار الخطي ومتعدد الحدود باستخدام Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "تعلم الآلة للمبتدئين - الانحدار الخطي ومتعدد الحدود باستخدام Scikit-learn")
[![تعلّم الآلة للمبتدئين - الانحدار الخطي ومتعدد الحدود باستخدام Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "تعلّم الآلة للمبتدئين - الانحدار الخطي ومتعدد الحدود باستخدام Scikit-learn")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير عن الانحدار الخطي ومتعدد الحدود.
@ -187,7 +187,7 @@ X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> لاحظ أننا اضطررنا إلى تنفيذ `reshape` على بيانات الإدخال لكي يفهمها حزمة الانحدار الخطي بشكل صحيح. يتوقع الانحدار الخطي مصفوفة ثنائية الأبعاد كمدخل، حيث يمثل كل صف من المصفوفة متجهًا لميزات الإدخال. في حالتنا، بما أن لدينا مدخلًا واحدًا فقط - نحتاج إلى مصفوفة ذات شكل N×1، حيث N هو حجم مجموعة البيانات.
> لاحظ أننا اضطررنا إلى تنفيذ `reshape` على بيانات الإدخال لكي يفهمها حزمة الانحدار الخطي بشكل صحيح. يتوقع الانحدار الخطي مصفوفة ثنائية الأبعاد كمدخل، حيث يمثل كل صف من المصفوفة متجهًا لميزات الإدخال. في حالتنا، نظرًا لأن لدينا مدخلًا واحدًا فقط - نحتاج إلى مصفوفة ذات شكل N×1، حيث N هو حجم مجموعة البيانات.
ثم، نحتاج إلى تقسيم البيانات إلى مجموعات تدريب واختبار، حتى نتمكن من التحقق من صحة النموذج بعد التدريب:
@ -195,16 +195,16 @@ y = pie_pumpkins['Price']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
أخيرًا، تدريب نموذج الانحدار الخطي الفعلي يستغرق سطرين فقط من الكود. نقوم بتعريف كائن `LinearRegression`، ونقوم بتدريبه على بياناتنا باستخدام دالة `fit`:
أخيرًا، تدريب نموذج الانحدار الخطي الفعلي يستغرق فقط سطرين من الكود. نقوم بتعريف كائن `LinearRegression`، ونقوم بتدريبه على بياناتنا باستخدام طريقة `fit`:
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
يحتوي كائن `LinearRegression` بعد عملية `fit` على جميع معاملات الانحدار، والتي يمكن الوصول إليها باستخدام خاصية `.coef_`. في حالتنا، هناك معامل واحد فقط، والذي يجب أن يكون حوالي `-0.017`. هذا يعني أن الأسعار تبدو وكأنها تنخفض قليلاً مع مرور الوقت، ولكن ليس كثيرًا، حوالي 2 سنت في اليوم. يمكننا أيضًا الوصول إلى نقطة التقاطع مع المحور Y باستخدام `lin_reg.intercept_` - ستكون حوالي `21` في حالتنا، مما يشير إلى السعر في بداية السنة.
يحتوي كائن `LinearRegression` بعد عملية `fit` على جميع معاملات الانحدار، والتي يمكن الوصول إليها باستخدام خاصية `.coef_`. في حالتنا، هناك معامل واحد فقط، والذي يجب أن يكون حوالي `-0.017`. هذا يعني أن الأسعار تبدو وكأنها تنخفض قليلاً مع مرور الوقت، ولكن ليس كثيرًا، حوالي 2 سنت في اليوم. يمكننا أيضًا الوصول إلى نقطة تقاطع الانحدار مع المحور Y باستخدام `lin_reg.intercept_` - ستكون حوالي `21` في حالتنا، مما يشير إلى السعر في بداية السنة.
لرؤية مدى دقة النموذج الخاص بنا، يمكننا التنبؤ بالأسعار على مجموعة بيانات الاختبار، ثم قياس مدى قرب توقعاتنا من القيم المتوقعة. يمكن القيام بذلك باستخدام مقياس متوسط مربع الخطأ (MSE)، وهو متوسط جميع الفروقات المربعة بين القيمة المتوقعة والقيمة المتنبأ بها.
لرؤية مدى دقة نموذجنا، يمكننا توقع الأسعار على مجموعة بيانات الاختبار، ثم قياس مدى قرب توقعاتنا من القيم المتوقعة. يمكن القيام بذلك باستخدام مقياس متوسط الخطأ التربيعي (MSE)، وهو متوسط جميع الفروقات المربعة بين القيمة المتوقعة والقيمة المتنبأ بها.
```python
pred = lin_reg.predict(X_test)
@ -231,7 +231,7 @@ plt.plot(X_test,pred)
## الانحدار متعدد الحدود
نوع آخر من الانحدار الخطي هو الانحدار متعدد الحدود. في بعض الأحيان تكون هناك علاقة خطية بين المتغيرات - مثل كلما زاد حجم اليقطين، زاد السعر - ولكن في أحيان أخرى لا يمكن رسم هذه العلاقات كطائرة أو خط مستقيم.
نوع آخر من الانحدار الخطي هو الانحدار متعدد الحدود. في بعض الأحيان تكون هناك علاقة خطية بين المتغيرات - كلما زاد حجم اليقطين، زاد السعر - ولكن في أحيان أخرى لا يمكن رسم هذه العلاقات كطائرة أو خط مستقيم.
✅ إليك [بعض الأمثلة](https://online.stat.psu.edu/stat501/lesson/9/9.8) على البيانات التي يمكن استخدام الانحدار متعدد الحدود معها.
@ -241,7 +241,7 @@ plt.plot(X_test,pred)
الانحدار متعدد الحدود ينشئ خطًا منحنيًا ليتناسب بشكل أفضل مع البيانات غير الخطية. في حالتنا، إذا قمنا بإضافة متغير `DayOfYear` المربع إلى بيانات الإدخال، يجب أن نتمكن من ملاءمة بياناتنا بمنحنى شبه مكافئ، والذي سيكون له حد أدنى في نقطة معينة خلال السنة.
تتضمن مكتبة Scikit-learn واجهة [API للأنابيب](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) لتجميع خطوات معالجة البيانات المختلفة معًا. **الأنابيب** هي سلسلة من **المقدّرين**. في حالتنا، سننشئ أنبوبًا يضيف أولاً ميزات متعددة الحدود إلى النموذج، ثم يدرب الانحدار:
تتضمن مكتبة Scikit-learn واجهة [API للأنابيب](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline) لتجميع خطوات معالجة البيانات المختلفة معًا. **الأنبوب** هو سلسلة من **المقدّرين**. في حالتنا، سننشئ أنبوبًا يضيف أولاً ميزات متعددة الحدود إلى النموذج، ثم يدرب الانحدار:
```python
from sklearn.preprocessing import PolynomialFeatures
@ -262,11 +262,11 @@ pipeline.fit(X_train,y_train)
> يمكنك أن ترى أن أدنى أسعار اليقطين تُلاحظ في مكان ما حول عيد الهالوين. كيف يمكنك تفسير ذلك؟
🎃 تهانينا، لقد أنشأت نموذجًا يمكنه المساعدة في التنبؤ بسعر اليقطين الخاص بالفطائر. ربما يمكنك تكرار نفس الإجراء لجميع أنواع اليقطين، ولكن سيكون ذلك مرهقًا. دعنا نتعلم الآن كيفية أخذ نوع اليقطين في الاعتبار في نموذجنا!
🎃 تهانينا، لقد أنشأت نموذجًا يمكنه المساعدة في التنبؤ بسعر فطائر اليقطين. ربما يمكنك تكرار نفس الإجراء لجميع أنواع اليقطين، ولكن سيكون ذلك مرهقًا. دعنا نتعلم الآن كيفية أخذ نوع اليقطين في الاعتبار في نموذجنا!
## الميزات الفئوية
في العالم المثالي، نريد أن نكون قادرين على التنبؤ بالأسعار لأنواع مختلفة من اليقطين باستخدام نفس النموذج. ومع ذلك، فإن العمود `Variety` يختلف قليلاً عن الأعمدة مثل `Month`، لأنه يحتوي على قيم غير رقمية. تُعرف هذه الأعمدة باسم **الفئوية**.
في العالم المثالي، نريد أن نكون قادرين على التنبؤ بالأسعار لأنواع مختلفة من اليقطين باستخدام نفس النموذج. ومع ذلك، فإن العمود `Variety` يختلف قليلاً عن الأعمدة مثل `Month`، لأنه يحتوي على قيم غير رقمية. تُعرف هذه الأعمدة بـ **الفئوية**.
[![تعلم الآلة للمبتدئين - التنبؤ بالميزات الفئوية باستخدام الانحدار الخطي](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "تعلم الآلة للمبتدئين - التنبؤ بالميزات الفئوية باستخدام الانحدار الخطي")
@ -278,8 +278,8 @@ pipeline.fit(X_train,y_train)
لأخذ النوع في الاعتبار، نحتاج أولاً إلى تحويله إلى شكل رقمي، أو **ترميزه**. هناك عدة طرق يمكننا القيام بها:
* **الترميز الرقمي البسيط** سيقوم بإنشاء جدول لأنواع مختلفة، ثم استبدال اسم النوع بمؤشر في ذلك الجدول. هذه ليست أفضل فكرة للانحدار الخطي، لأن الانحدار الخطي يأخذ القيمة الرقمية الفعلية للمؤشر، ويضيفها إلى النتيجة، مضاعفًا بمعامل معين. في حالتنا، العلاقة بين رقم المؤشر والسعر غير خطية بوضوح، حتى لو تأكدنا من أن المؤشرات مرتبة بطريقة معينة.
* **الترميز الواحد الساخن** سيستبدل العمود `Variety` بأربعة أعمدة مختلفة، واحد لكل نوع. يحتوي كل عمود على `1` إذا كانت الصف المقابل من نوع معين، و `0` خلاف ذلك. هذا يعني أنه سيكون هناك أربعة معاملات في الانحدار الخطي، واحد لكل نوع من اليقطين، مسؤول عن "السعر الأساسي" (أو بالأحرى "السعر الإضافي") لذلك النوع المحدد.
* **الترميز الرقمي البسيط** سيقوم ببناء جدول لأنواع مختلفة، ثم استبدال اسم النوع برقم في هذا الجدول. هذه ليست أفضل فكرة للانحدار الخطي، لأن الانحدار الخطي يأخذ القيمة الرقمية الفعلية للرقم، ويضيفها إلى النتيجة، مضروبًا بمعامل معين. في حالتنا، العلاقة بين رقم الفهرس والسعر غير خطية بوضوح، حتى لو تأكدنا من أن الأرقام مرتبة بطريقة معينة.
* **الترميز الواحد الساخن** سيقوم باستبدال العمود `Variety` بأربعة أعمدة مختلفة، واحد لكل نوع. يحتوي كل عمود على `1` إذا كانت الصف المقابل من نوع معين، و`0` خلاف ذلك. هذا يعني أنه سيكون هناك أربعة معاملات في الانحدار الخطي، واحد لكل نوع من أنواع اليقطين، مسؤول عن "السعر الأساسي" (أو بالأحرى "السعر الإضافي") لذلك النوع المحدد.
الكود أدناه يظهر كيف يمكننا ترميز النوع الواحد الساخن:
@ -357,7 +357,7 @@ print('Model determination: ', score)
| جميع الميزات خطي | 2.84 (10.5%) | 0.94 |
| جميع الميزات متعدد الحدود | 2.23 (8.25%) | 0.97 |
🏆 أحسنت! لقد أنشأت أربعة نماذج انحدار في درس واحد، وحسنت جودة النموذج إلى 97%. في القسم الأخير حول الانحدار، ستتعلم عن الانحدار اللوجستي لتحديد الفئات.
🏆 أحسنت! لقد أنشأت أربعة نماذج انحدار في درس واحد، وحسّنت جودة النموذج إلى 97%. في القسم الأخير حول الانحدار، ستتعلم عن الانحدار اللوجستي لتحديد الفئات.
---
@ -365,11 +365,11 @@ print('Model determination: ', score)
اختبر عدة متغيرات مختلفة في هذا الدفتر لترى كيف تتوافق العلاقة مع دقة النموذج.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/14/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
في هذا الدرس تعلمنا عن الانحدار الخطي. هناك أنواع أخرى مهمة من الانحدار. اقرأ عن تقنيات Stepwise، Ridge، Lasso و Elasticnet. دورة جيدة للدراسة لتعلم المزيد هي [دورة التعلم الإحصائي من ستانفورد](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning)
في هذا الدرس تعلمنا عن الانحدار الخطي. هناك أنواع أخرى مهمة من الانحدار. اقرأ عن تقنيات Stepwise، Ridge، Lasso و Elasticnet. دورة جيدة للدراسة لتعلم المزيد هي [دورة التعلم الإحصائي من جامعة ستانفورد](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).
## الواجب
@ -378,4 +378,4 @@ print('Model determination: ', score)
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,72 +1,72 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "72b5bae0879baddf6aafc82bb07b8776",
"translation_date": "2025-08-29T12:57:22+00:00",
"original_hash": "abf86d845c84330bce205a46b382ec88",
"translation_date": "2025-09-04T20:39:43+00:00",
"source_file": "2-Regression/4-Logistic/README.md",
"language_code": "ar"
}
-->
# الانحدار اللوجستي لتوقع الفئات
# الانحدار اللوجستي للتنبؤ بالفئات
![مخطط معلوماتي عن الانحدار اللوجستي مقابل الانحدار الخطي](../../../../translated_images/linear-vs-logistic.ba180bf95e7ee66721ba10ebf2dac2666acbd64a88b003c83928712433a13c7d.ar.png)
![رسم توضيحي للفرق بين الانحدار الخطي والانحدار اللوجستي](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png)
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/15/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
> ### [هذه الدرس متاح بلغة R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
> ### [هذا الدرس متوفر بلغة R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
## المقدمة
في هذا الدرس الأخير حول الانحدار، وهو أحد تقنيات التعلم الآلي الكلاسيكية الأساسية، سنلقي نظرة على الانحدار اللوجستي. يمكنك استخدام هذه التقنية لاكتشاف الأنماط لتوقع الفئات الثنائية. هل هذه الحلوى شوكولاتة أم لا؟ هل هذا المرض معدٍ أم لا؟ هل سيختار هذا العميل هذا المنتج أم لا؟
في هذا الدرس الأخير حول الانحدار، وهو أحد تقنيات تعلم الآلة _الكلاسيكية_ الأساسية، سنلقي نظرة على الانحدار اللوجستي. يمكنك استخدام هذه التقنية لاكتشاف الأنماط للتنبؤ بالفئات الثنائية. هل هذه الحلوى تحتوي على شوكولاتة أم لا؟ هل هذا المرض معدٍ أم لا؟ هل سيختار هذا العميل هذا المنتج أم لا؟
في هذا الدرس، ستتعلم:
- مكتبة جديدة لتصور البيانات
- تقنيات الانحدار اللوجستي
✅ عمّق فهمك للعمل مع هذا النوع من الانحدار في هذا [الوحدة التعليمية](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott)
✅ عمّق فهمك للعمل مع هذا النوع من الانحدار في [وحدة التعلم هذه](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott)
## المتطلبات الأساسية
بعد العمل مع بيانات القرع، أصبحنا على دراية كافية بها لندرك أن هناك فئة ثنائية يمكننا العمل معها: `اللون`.
بعد العمل مع بيانات القرع، أصبحنا الآن على دراية كافية بها لندرك أن هناك فئة ثنائية يمكننا العمل معها: `اللون`.
لنقم ببناء نموذج انحدار لوجستي لتوقع ذلك، بناءً على بعض المتغيرات، ا اللون الذي من المرجح أن يكون عليه القرع_ (برتقالي 🎃 أو أبيض 👻).
دعونا نبني نموذج انحدار لوجستي للتنبؤ بذلك، بناءً على بعض المتغيرات، ا هو اللون المحتمل للقرع المعطى_ (برتقالي 🎃 أو أبيض 👻).
> لماذا نتحدث عن التصنيف الثنائي في درس متعلق بالانحدار؟ فقط للراحة اللغوية، حيث أن الانحدار اللوجستي هو [في الواقع طريقة تصنيف](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression)، وإن كانت تعتمد على الخطية. تعرف على طرق أخرى لتصنيف البيانات في مجموعة الدروس التالية.
> لماذا نتحدث عن التصنيف الثنائي في درس حول الانحدار؟ فقط لتسهيل اللغة، حيث أن الانحدار اللوجستي هو [في الواقع طريقة تصنيف](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression)، وإن كانت تعتمد على الخطية. تعرّف على طرق أخرى لتصنيف البيانات في مجموعة الدروس التالية.
## تحديد السؤال
لأغراضنا، سنعبر عن هذا كفئة ثنائية: "أبيض" أو "ليس أبيض". هناك أيضًا فئة "مخطط" في مجموعة البيانات الخاصة بنا ولكن هناك عدد قليل من الحالات لها، لذا لن نستخدمها. تختفي بمجرد إزالة القيم الفارغة من مجموعة البيانات على أي حال.
لأغراضنا، سنعبر عن هذا كفئة ثنائية: "أبيض" أو "ليس أبيض". هناك أيضًا فئة "مخطط" في مجموعة البيانات الخاصة بنا، ولكن هناك عدد قليل من الحالات منها، لذلك لن نستخدمها. على أي حال، تختفي بمجرد إزالة القيم الفارغة من مجموعة البيانات.
> 🎃 معلومة ممتعة، أحيانًا نسمي القرع الأبيض "قرع الأشباح". ليس من السهل نحته، لذا فهو ليس شائعًا مثل البرتقالي ولكنه يبدو رائعًا! لذلك يمكننا أيضًا إعادة صياغة سؤالنا كالتالي: "شبح" أو "ليس شبحًا". 👻
> 🎃 معلومة ممتعة، أحيانًا نطلق على القرع الأبيض "قرع الأشباح". إنها ليست سهلة النحت، لذا فهي ليست شائعة مثل البرتقالية، لكنها تبدو رائعة! لذلك يمكننا أيضًا إعادة صياغة سؤالنا كالتالي: "شبح" أو "ليس شبح". 👻
## عن الانحدار اللوجستي
## حول الانحدار اللوجستي
يختلف الانحدار اللوجستي عن الانحدار الخطي، الذي تعلمت عنه سابقًا، في بعض الطرق المهمة.
يختلف الانحدار اللوجستي عن الانحدار الخطي، الذي تعلمته سابقًا، في بعض الجوانب المهمة.
[![تعلم الآلة للمبتدئين - فهم الانحدار اللوجستي لتصنيف البيانات](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "تعلم الآلة للمبتدئين - فهم الانحدار اللوجستي لتصنيف البيانات")
> 🎥 انقر على الصورة أعلاه للحصول على نظرة عامة قصيرة عن الانحدار اللوجستي.
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير عن الانحدار اللوجستي.
### التصنيف الثنائي
لا يقدم الانحدار اللوجستي نفس الميزات التي يقدمها الانحدار الخطي. الأول يقدم توقعًا حول فئة ثنائية ("أبيض أو ليس أبيض") بينما الثاني قادر على توقع قيم مستمرة، على سبيل المثال بناءً على أصل القرع ووقت الحصاد، _كم سيرتفع سعره_.
لا يقدم الانحدار اللوجستي نفس ميزات الانحدار الخطي. الأول يقدم تنبؤًا بفئة ثنائية ("أبيض أو ليس أبيض") بينما الثاني قادر على التنبؤ بالقيم المستمرة، على سبيل المثال بناءً على أصل القرع ووقت الحصاد، _كم سيرتفع سعره_.
![نموذج تصنيف القرع](../../../../translated_images/pumpkin-classifier.562771f104ad5436b87d1c67bca02a42a17841133556559325c0a0e348e5b774.ar.png)
> مخطط معلوماتي بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
![نموذج تصنيف القرع](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png)
> رسم توضيحي بواسطة [داساني ماديبالي](https://twitter.com/dasani_decoded)
### تصنيفات أخرى
هناك أنواع أخرى من الانحدار اللوجستي، بما في ذلك متعدد الفئات والترتيبي:
هناك أنواع أخرى من الانحدار اللوجستي، بما في ذلك متعدد الفئات والمرتب:
- **متعدد الفئات**، والذي يتضمن وجود أكثر من فئة واحدة - "برتقالي، أبيض، ومخطط".
- **ترتيبي**، والذي يتضمن فئات مرتبة، مفيد إذا أردنا ترتيب النتائج منطقيًا، مثل القرع الذي يتم ترتيبه حسب عدد محدود من الأحجام (صغير جدًا، صغير، متوسط، كبير، كبير جدًا، ضخم).
- **متعدد الفئات**، الذي يتضمن وجود أكثر من فئة - "برتقالي، أبيض، ومخطط".
- **المرتب**، الذي يتضمن فئات مرتبة، وهو مفيد إذا أردنا ترتيب النتائج منطقيًا، مثل القرع الذي يتم ترتيبه حسب عدد محدود من الأحجام (صغير جدًا، صغير، متوسط، كبير، كبير جدًا، ضخم).
![الانحدار متعدد الفئات مقابل الترتيبي](../../../../translated_images/multinomial-vs-ordinal.36701b4850e37d86c9dd49f7bef93a2f94dbdb8fe03443eb68f0542f97f28f29.ar.png)
![الانحدار متعدد الفئات مقابل المرتب](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png)
### المتغيرات لا تحتاج إلى أن تكون مترابطة
### المتغيرات لا تحتاج إلى الارتباط
تذكر كيف كان الانحدار الخطي يعمل بشكل أفضل مع المتغيرات الأكثر ترابطًا؟ الانحدار اللوجستي هو العكس - المتغيرات لا تحتاج إلى أن تكون متوافقة. هذا يعمل مع هذه البيانات التي لديها ترابطات ضعيفة إلى حد ما.
تذكر كيف كان الانحدار الخطي يعمل بشكل أفضل مع المتغيرات الأكثر ارتباطًا؟ الانحدار اللوجستي هو العكس - المتغيرات لا تحتاج إلى التوافق. وهذا يناسب هذه البيانات التي تحتوي على ارتباطات ضعيفة إلى حد ما.
### تحتاج إلى الكثير من البيانات النظيفة
@ -74,9 +74,7 @@ CO_OP_TRANSLATOR_METADATA:
[![تعلم الآلة للمبتدئين - تحليل البيانات وتحضيرها للانحدار اللوجستي](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "تعلم الآلة للمبتدئين - تحليل البيانات وتحضيرها للانحدار اللوجستي")
> 🎥 انقر على الصورة أعلاه للحصول على نظرة عامة قصيرة عن تحضير البيانات للانحدار الخطي.
✅ فكر في أنواع البيانات التي تناسب الانحدار اللوجستي بشكل جيد.
✅ فكر في أنواع البيانات التي يمكن أن تكون مناسبة للانحدار اللوجستي
## التمرين - تنظيف البيانات
@ -100,11 +98,11 @@ CO_OP_TRANSLATOR_METADATA:
### التصور - مخطط الفئات
بحلول الآن، قمت بتحميل [دفتر الملاحظات المبدئي](./notebook.ipynb) مع بيانات القرع مرة أخرى وقمت بتنظيفه للحفاظ على مجموعة بيانات تحتوي على بعض المتغيرات، بما في ذلك `اللون`. لنقم بتصور إطار البيانات في دفتر الملاحظات باستخدام مكتبة مختلفة: [Seaborn](https://seaborn.pydata.org/index.html)، التي تعتمد على Matplotlib التي استخدمناها سابقًا.
بحلول الآن، قمت بتحميل [دفتر الملاحظات المبدئي](../../../../2-Regression/4-Logistic/notebook.ipynb) مع بيانات القرع مرة أخرى وقمت بتنظيفه للحفاظ على مجموعة بيانات تحتوي على بعض المتغيرات، بما في ذلك `اللون`. دعنا نتصور إطار البيانات في دفتر الملاحظات باستخدام مكتبة مختلفة: [Seaborn](https://seaborn.pydata.org/index.html)، التي تعتمد على Matplotlib التي استخدمناها سابقًا.
Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبيل المثال، يمكنك مقارنة توزيعات البيانات لكل `Variety` و `Color` في مخطط الفئات.
يوفر Seaborn طرقًا رائعة لتصور بياناتك. على سبيل المثال، يمكنك مقارنة توزيعات البيانات لكل `Variety` و`Color` في مخطط فئات.
1. قم بإنشاء مثل هذا المخطط باستخدام وظيفة `catplot`، باستخدام بيانات القرع `pumpkins`، وتحديد تعيين اللون لكل فئة قرع (برتقالي أو أبيض):
1. أنشئ مثل هذا المخطط باستخدام وظيفة `catplot`، باستخدام بيانات القرع `pumpkins`، وتحديد تعيين الألوان لكل فئة من فئات القرع (برتقالي أو أبيض):
```python
import seaborn as sns
@ -120,19 +118,19 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
)
```
![شبكة من البيانات المصورة](../../../../translated_images/pumpkins_catplot_1.c55c409b71fea2ecc01921e64b91970542101f90bcccfa4aa3a205db8936f48b.ar.png)
![شبكة من البيانات المصورة](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png)
من خلال ملاحظة البيانات، يمكنك رؤية كيف ترتبط بيانات اللون بالتنوع.
من خلال ملاحظة البيانات، يمكنك رؤية كيف ترتبط بيانات اللون بالفئة.
✅ بالنظر إلى هذا المخطط الفئوي، ما هي بعض الاستكشافات المثيرة التي يمكنك تصورها؟
✅ بالنظر إلى هذا المخطط الفئوي، ما هي بعض الاستكشافات المثيرة للاهتمام التي يمكنك تخيلها؟
### معالجة البيانات: ترميز الميزات والتسميات
تحتوي مجموعة بيانات القرع الخاصة بنا على قيم نصية لجميع أعمدتها. العمل مع البيانات الفئوية يكون بديهيًا للبشر ولكنه ليس كذلك للآلات. تعمل خوارزميات التعلم الآلي بشكل جيد مع الأرقام. لهذا السبب، يعد الترميز خطوة مهمة جدًا في مرحلة معالجة البيانات، حيث يتيح لنا تحويل البيانات الفئوية إلى بيانات رقمية، دون فقدان أي معلومات. الترميز الجيد يؤدي إلى بناء نموذج جيد.
تحتوي مجموعة بيانات القرع الخاصة بنا على قيم نصية لجميع أعمدتها. العمل مع البيانات الفئوية يكون بديهيًا للبشر ولكنه ليس كذلك للآلات. تعمل خوارزميات تعلم الآلة بشكل جيد مع الأرقام. لهذا السبب، يعد الترميز خطوة مهمة جدًا في مرحلة معالجة البيانات، حيث يتيح لنا تحويل البيانات الفئوية إلى بيانات رقمية دون فقدان أي معلومات. يؤدي الترميز الجيد إلى بناء نموذج جيد.
بالنسبة لترميز الميزات، هناك نوعان رئيسيان من المرمزين:
لترميز الميزات، هناك نوعان رئيسيان من المشفرات:
1. المرمز الترتيبي: يناسب المتغيرات الترتيبية، وهي المتغيرات الفئوية التي تتبع بياناتها ترتيبًا منطقيًا، مثل عمود `Item Size` في مجموعة البيانات الخاصة بنا. يقوم بإنشاء تعيين بحيث يتم تمثيل كل فئة برقم، وهو ترتيب الفئة في العمود.
1. المشفر الترتيبي: يناسب المتغيرات الترتيبية، وهي المتغيرات الفئوية التي تتبع بياناتها ترتيبًا منطقيًا، مثل عمود `Item Size` في مجموعة البيانات الخاصة بنا. يقوم بإنشاء تعيين بحيث يتم تمثيل كل فئة برقم، وهو ترتيب الفئة في العمود.
```python
from sklearn.preprocessing import OrdinalEncoder
@ -142,7 +140,7 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
```
2. المرمز الفئوي: يناسب المتغيرات الاسمية، وهي المتغيرات الفئوية التي لا تتبع بياناتها ترتيبًا منطقيًا، مثل جميع الميزات المختلفة عن `Item Size` في مجموعة البيانات الخاصة بنا. إنه ترميز ثنائي، مما يعني أن كل فئة يتم تمثيلها بعمود ثنائي: تكون القيمة المشفرة مساوية لـ 1 إذا كان القرع ينتمي إلى هذا التنوع و 0 خلاف ذلك.
2. المشفر الفئوي: يناسب المتغيرات الاسمية، وهي المتغيرات الفئوية التي لا تتبع بياناتها ترتيبًا منطقيًا، مثل جميع الميزات المختلفة عن `Item Size` في مجموعة البيانات الخاصة بنا. إنه ترميز ثنائي، مما يعني أن كل فئة يتم تمثيلها بعمود ثنائي: تكون المتغيرات المشفرة مساوية لـ 1 إذا كان القرع ينتمي إلى تلك الفئة و0 خلاف ذلك.
```python
from sklearn.preprocessing import OneHotEncoder
@ -151,7 +149,7 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
categorical_encoder = OneHotEncoder(sparse_output=False)
```
ثم يتم استخدام `ColumnTransformer` لدمج عدة مرمزين في خطوة واحدة وتطبيقهم على الأعمدة المناسبة.
ثم يتم استخدام `ColumnTransformer` لدمج عدة مشفرات في خطوة واحدة وتطبيقها على الأعمدة المناسبة.
```python
from sklearn.compose import ColumnTransformer
@ -165,7 +163,7 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
encoded_features = ct.fit_transform(pumpkins)
```
من ناحية أخرى، لترميز التسمية، نستخدم فئة `LabelEncoder` من scikit-learn، وهي فئة مساعدة لتطبيع التسميات بحيث تحتوي فقط على قيم بين 0 و n_classes-1 (هنا، 0 و 1).
من ناحية أخرى، لترميز التسمية، نستخدم فئة `LabelEncoder` من scikit-learn، وهي فئة مساعدة لتطبيع التسميات بحيث تحتوي فقط على قيم بين 0 وn_classes-1 (هنا، 0 و1).
```python
from sklearn.preprocessing import LabelEncoder
@ -180,13 +178,11 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
```
✅ ما هي مزايا استخدام المرمز الترتيبي لعمود `Item Size`؟
✅ ما هي مزايا استخدام المشفر الترتيبي لعمود `Item Size`؟
### تحليل العلاقات بين المتغيرات
الآن بعد أن قمنا بمعالجة البيانات، يمكننا تحليل العلاقات بين الميزات والتسمية لفهم مدى قدرة النموذج على توقع التسمية بناءً على الميزات.
أفضل طريقة لإجراء هذا النوع من التحليل هي رسم البيانات. سنستخدم مرة أخرى وظيفة `catplot` من Seaborn، لتصور العلاقات بين `Item Size` و `Variety` و `Color` في مخطط الفئات. لتحسين رسم البيانات، سنستخدم العمود المشفر `Item Size` والعمود غير المشفر `Variety`.
الآن بعد أن قمنا بمعالجة بياناتنا، يمكننا تحليل العلاقات بين الميزات والتسمية لفهم مدى قدرة النموذج على التنبؤ بالتسمية بناءً على الميزات. أفضل طريقة لإجراء هذا النوع من التحليل هي رسم البيانات. سنستخدم مرة أخرى وظيفة `catplot` من Seaborn لتصور العلاقات بين `Item Size`، `Variety` و`Color` في مخطط فئات. لتوضيح البيانات بشكل أفضل، سنستخدم عمود `Item Size` المشفر وعمود `Variety` غير المشفر.
```python
palette = {
@ -206,7 +202,7 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
g.set_titles(row_template="{row_name}")
```
![مخطط الفئات للبيانات المصورة](../../../../translated_images/pumpkins_catplot_2.87a354447880b3889278155957f8f60dd63db4598de5a6d0fda91c334d31f9f1.ar.png)
![مخطط فئات للبيانات المصورة](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png)
### استخدام مخطط السرب
@ -224,25 +220,25 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
```
![سرب من البيانات المصورة](../../../../translated_images/swarm_2.efeacfca536c2b577dc7b5f8891f28926663fbf62d893ab5e1278ae734ca104e.ar.png)
![سرب من البيانات المصورة](../../../../2-Regression/4-Logistic/images/swarm_2.png)
**انتبه**: قد يولد الكود أعلاه تحذيرًا، حيث يفشل Seaborn في تمثيل هذا العدد الكبير من نقاط البيانات في مخطط السرب. الحل الممكن هو تقليل حجم العلامة باستخدام معلمة "size". ومع ذلك، كن على علم بأن هذا يؤثر على قابلية قراءة المخطط.
**تنبيه**: قد ينتج الكود أعلاه تحذيرًا، حيث يفشل Seaborn في تمثيل هذا العدد الكبير من النقاط في مخطط السرب. الحل الممكن هو تقليل حجم العلامة باستخدام معامل 'size'. ومع ذلك، كن على علم بأن هذا يؤثر على قابلية قراءة المخطط.
> **🧮 أرني الرياضيات**
>
> يعتمد الانحدار اللوجستي على مفهوم "الاحتمالية القصوى" باستخدام [دوال السجمويد](https://wikipedia.org/wiki/Sigmoid_function). تبدو "دالة السجمويد" على الرسم البياني كمنحنى على شكل "S". تأخذ قيمة وتقوم بتعيينها إلى مكان ما بين 0 و 1. يُطلق على منحناها أيضًا "المنحنى اللوجستي". تبدو صيغتها كالتالي:
> يعتمد الانحدار اللوجستي على مفهوم "الاحتمالية القصوى" باستخدام [دوال سيجمويد](https://wikipedia.org/wiki/Sigmoid_function). تبدو دالة "سيجمويد" على الرسم البياني كمنحنى على شكل "S". تأخذ قيمة وتعينها إلى مكان ما بين 0 و1. يُطلق على منحناها أيضًا "منحنى لوجستي". تبدو صيغتها كالتالي:
>
> ![دالة السجمويد](../../../../translated_images/sigmoid.8b7ba9d095c789cf72780675d0d1d44980c3736617329abfc392dfc859799704.ar.png)
> ![دالة لوجستية](../../../../2-Regression/4-Logistic/images/sigmoid.png)
>
> حيث يكون منتصف السجمويد عند النقطة 0 لـ x، وL هو القيمة القصوى للمنحنى، وk هو انحدار المنحنى. إذا كانت نتيجة الدالة أكثر من 0.5، سيتم إعطاء التسمية المعنية الفئة "1" من الخيار الثنائي. إذا لم يكن كذلك، سيتم تصنيفها كـ "0".
> حيث يكون منتصف السيجمويد عند النقطة 0 للمحور x، وL هو القيمة القصوى للمنحنى، وk هو انحدار المنحنى. إذا كانت نتيجة الدالة أكثر من 0.5، سيتم إعطاء التسمية المعنية الفئة "1" من الخيار الثنائي. إذا لم تكن كذلك، سيتم تصنيفها كـ "0".
## بناء النموذج الخاص بك
بناء نموذج لتحديد هذه الفئات الثنائية أمر بسيط بشكل مدهش في Scikit-learn.
بناء نموذج للعثور على هذا التصنيف الثنائي بسيط بشكل مدهش في Scikit-learn.
[![تعلم الآلة للمبتدئين - الانحدار اللوجستي لتصنيف البيانات](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "تعلم الآلة للمبتدئين - الانحدار اللوجستي لتصنيف البيانات")
> 🎥 انقر على الصورة أعلاه للحصول على نظرة عامة قصيرة عن بناء نموذج الانحدار الخطي.
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو قصير عن بناء نموذج انحدار لوجستي
1. اختر المتغيرات التي تريد استخدامها في نموذج التصنيف الخاص بك وقسم مجموعات التدريب والاختبار باستخدام `train_test_split()`:
@ -271,7 +267,7 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
print('F1-score: ', f1_score(y_test, predictions))
```
ألقِ نظرة على لوحة نتائج النموذج الخاص بك. ليس سيئًا، بالنظر إلى أن لديك حوالي 1000 صف فقط من البيانات:
ألقِ نظرة على لوحة النتائج الخاصة بنموذجك. إنها ليست سيئة، بالنظر إلى أن لديك حوالي 1000 صف فقط من البيانات:
```output
precision recall f1-score support
@ -296,7 +292,7 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
بينما يمكنك الحصول على تقرير لوحة النتائج [المصطلحات](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report) عن طريق طباعة العناصر أعلاه، قد تتمكن من فهم النموذج الخاص بك بسهولة أكبر باستخدام [مصفوفة الالتباس](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix) لمساعدتنا على فهم كيفية أداء النموذج.
> 🎓 "[مصفوفة الالتباس](https://wikipedia.org/wiki/Confusion_matrix)" (أو "مصفوفة الخطأ") هي جدول يعبر عن الإيجابيات والسلبيات الحقيقية والخاطئة لنموذجك، وبالتالي يقيس دقة التوقعات.
> 🎓 "[مصفوفة الالتباس](https://wikipedia.org/wiki/Confusion_matrix)" (أو "مصفوفة الأخطاء") هي جدول يعبر عن الإيجابيات الحقيقية مقابل الإيجابيات الكاذبة والسلبيات الحقيقية مقابل السلبيات الكاذبة لنموذجك، وبالتالي قياس دقة التنبؤات.
1. لاستخدام مصفوفة الالتباس، استدعِ `confusion_matrix()`:
@ -305,7 +301,7 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
confusion_matrix(y_test, predictions)
```
ألقِ نظرة على مصفوفة الالتباس الخاصة بالنموذج الخاص بك:
ألقِ نظرة على مصفوفة الالتباس الخاصة بنموذجك:
```output
array([[162, 4],
@ -321,12 +317,12 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
ما الذي يحدث هنا؟ لنفترض أن النموذج الخاص بنا طُلب منه تصنيف القرع بين فئتين ثنائيتين، الفئة "أبيض" والفئة "ليس أبيض".
- إذا توقع النموذج أن القرع ليس أبيض وكان ينتمي بالفعل إلى الفئة "ليس أبيض"، نسميه سلبية حقيقية، يظهر في الرقم العلوي الأيسر.
- إذا توقع النموذج أن القرع أبيض وكان ينتمي بالفعل إلى الفئة "ليس أبيض"، نسميه سلبية خاطئة، يظهر في الرقم السفلي الأيسر.
- إذا توقع النموذج أن القرع ليس أبيض وكان ينتمي بالفعل إلى الفئة "أبيض"، نسميه إيجابية خاطئة، يظهر في الرقم العلوي الأيمن.
- إذا توقع النموذج أن القرع أبيض وكان ينتمي بالفعل إلى الفئة "أبيض"، نسميه إيجابية حقيقية، يظهر في الرقم السفلي الأيمن.
- إذا توقع النموذج أن القرع ليس أبيضًا وكان ينتمي بالفعل إلى الفئة "ليس أبيض"، نسمي ذلك سلبية حقيقية (True Negative)، وهو الرقم في الزاوية العلوية اليسرى.
- إذا توقع النموذج أن القرع أبيض وكان ينتمي بالفعل إلى الفئة "ليس أبيض"، نسمي ذلك سلبية كاذبة (False Negative)، وهو الرقم في الزاوية السفلية اليسرى.
- إذا توقع النموذج أن القرع ليس أبيضًا وكان ينتمي بالفعل إلى الفئة "أبيض"، نسمي ذلك إيجابية كاذبة (False Positive)، وهو الرقم في الزاوية العلوية اليمنى.
- إذا توقع النموذج أن القرع أبيض وكان ينتمي بالفعل إلى الفئة "أبيض"، نسمي ذلك إيجابية حقيقية (True Positive)، وهو الرقم في الزاوية السفلية اليمنى.
كما قد تكون خمنت، من الأفضل أن يكون لديك عدد أكبر من الإيجابيات الحقيقية والسلبيات الحقيقية وعدد أقل من الإيجابيات الخاطئة والسلبيات الخاطئة، مما يعني أن النموذج يعمل بشكل أفضل.
كما قد تكون خمنت، من الأفضل أن يكون لديك عدد أكبر من الإيجابيات الحقيقية والسلبيات الحقيقية وعدد أقل من الإيجابيات الكاذبة والسلبيات الكاذبة، مما يعني أن النموذج يعمل بشكل أفضل.
كيف ترتبط مصفوفة الالتباس بالدقة والاسترجاع؟ تذكر أن تقرير التصنيف الذي طُبع أعلاه أظهر دقة (0.85) واسترجاع (0.67).
الدقة = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
@ -345,11 +341,11 @@ Seaborn يقدم طرقًا رائعة لتصور بياناتك. على سبي
🎓 الدعم: عدد مرات ظهور كل تصنيف مسترجع.
🎓 الدقة الإجمالية: (TP + TN)/(TP + TN + FP + FN) النسبة المئوية للتصنيفات التي تم التنبؤ بها بدقة لعينة.
🎓 الدقة الإجمالية: (TP + TN)/(TP + TN + FP + FN) النسبة المئوية للتصنيفات التي تم التنبؤ بها بدقة لعينة معينة.
🎓 المتوسط الكلي: حساب المتوسط غير الموزون للمقاييس لكل تصنيف، دون أخذ عدم التوازن في التصنيفات بعين الاعتبار.
🎓 المتوسط الموزون: حساب المتوسط للمقاييس لكل تصنيف، مع أخذ عدم التوازن في التصنيفات بعين الاعتبار من خلال وزنها بدعمها (عدد الحالات الحقيقية لكل تصنيف).
🎓 المتوسط الموزون: حساب المتوسط الموزون للمقاييس لكل تصنيف، مع أخذ عدم التوازن في التصنيفات بعين الاعتبار من خلال وزنها بدعمها (عدد الحالات الحقيقية لكل تصنيف).
✅ هل يمكنك التفكير في أي مقياس يجب مراقبته إذا كنت تريد تقليل عدد القيم السلبية الخاطئة في النموذج؟
@ -379,30 +375,30 @@ plt.title('ROC Curve')
plt.show()
```
باستخدام مكتبة Matplotlib، قم برسم [منحنى تشغيل المستقبل](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) أو ROC للنموذج. تُستخدم منحنيات ROC غالبًا للحصول على رؤية لمخرجات المصنف من حيث القيم الإيجابية الحقيقية مقابل القيم الإيجابية الخاطئة. "تتميز منحنيات ROC عادةً بمعدل القيم الإيجابية الحقيقية على المحور Y، ومعدل القيم الإيجابية الخاطئة على المحور X." وبالتالي، فإن انحدار المنحنى والمساحة بين خط المنتصف والمنحنى مهمان: تريد منحنى يتجه بسرعة إلى الأعلى ويتجاوز الخط. في حالتنا، هناك قيم إيجابية خاطئة في البداية، ثم يتجه الخط إلى الأعلى ويتجاوز بشكل صحيح:
باستخدام مكتبة Matplotlib، قم برسم [منحنى تشغيل المستقبل](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) أو ROC للنموذج. تُستخدم منحنيات ROC غالبًا للحصول على رؤية لمخرجات المصنف من حيث القيم الإيجابية الحقيقية مقابل القيم الإيجابية الخاطئة. "عادةً ما تحتوي منحنيات ROC على معدل القيم الإيجابية الحقيقية على المحور Y، ومعدل القيم الإيجابية الخاطئة على المحور X." وبالتالي، فإن انحدار المنحنى والمساحة بين خط المنتصف والمنحنى مهمان: تريد منحنى يتجه بسرعة إلى الأعلى ويتجاوز الخط. في حالتنا، هناك قيم إيجابية خاطئة في البداية، ثم يتجه الخط إلى الأعلى ويتجاوز بشكل صحيح:
![ROC](../../../../translated_images/ROC_2.777f20cdfc4988ca683ade6850ac832cb70c96c12f1b910d294f270ef36e1a1c.ar.png)
![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png)
أخيرًا، استخدم واجهة برمجة التطبيقات [`roc_auc_score`](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) الخاصة بـ Scikit-learn لحساب "المساحة تحت المنحنى" (AUC):
```python
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
```
النتيجة هي `0.9749908725812341`. نظرًا لأن AUC يتراوح بين 0 و1، فإنك تريد درجة كبيرة، حيث أن النموذج الذي يكون دقيقًا بنسبة 100% في توقعاته سيحصل على AUC بقيمة 1؛ في هذه الحالة، النموذج _جيد جدًا_.
```
النتيجة هي `0.9749908725812341`. نظرًا لأن AUC يتراوح بين 0 و1، فإنك تريد الحصول على درجة كبيرة، حيث أن النموذج الذي يكون دقيقًا بنسبة 100% في توقعاته سيحصل على AUC بقيمة 1؛ في هذه الحالة، النموذج _جيد جدًا_.
في دروس التصنيفات المستقبلية، ستتعلم كيفية التكرار لتحسين درجات النموذج. ولكن الآن، تهانينا! لقد أكملت دروس الانحدار هذه!
في دروس التصنيف المستقبلية، ستتعلم كيفية تحسين درجات النموذج. ولكن في الوقت الحالي، تهانينا! لقد أكملت دروس الانحدار هذه!
---
## 🚀تحدي
هناك الكثير لاستكشافه بخصوص الانحدار اللوجستي! ولكن أفضل طريقة للتعلم هي التجربة. ابحث عن مجموعة بيانات تناسب هذا النوع من التحليل وقم ببناء نموذج باستخدامها. ماذا تتعلم؟ نصيحة: جرب [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) للحصول على مجموعات بيانات مثيرة للاهتمام.
هناك الكثير لاستكشافه فيما يتعلق بالانحدار اللوجستي! ولكن أفضل طريقة للتعلم هي التجربة. ابحث عن مجموعة بيانات تناسب هذا النوع من التحليل وقم ببناء نموذج باستخدامها. ماذا تتعلم؟ نصيحة: جرب [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) للحصول على مجموعات بيانات مثيرة للاهتمام.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/16/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
اقرأ الصفحات الأولى من [هذا البحث من جامعة ستانفورد](https://web.stanford.edu/~jurafsky/slp3/5.pdf) حول بعض الاستخدامات العملية للانحدار اللوجستي. فكر في المهام التي تناسب نوعًا واحدًا أو آخر من مهام الانحدار التي درسناها حتى الآن. ما الذي سيكون الأفضل؟
اقرأ الصفحات الأولى من [هذا البحث من جامعة ستانفورد](https://web.stanford.edu/~jurafsky/slp3/5.pdf) حول بعض الاستخدامات العملية للانحدار اللوجستي. فكر في المهام التي تناسب نوعًا معينًا من مهام الانحدار التي درسناها حتى الآن. ما الذي سيكون الأنسب؟
## الواجب
@ -411,4 +407,4 @@ print(auc)
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,26 +1,26 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2680c691fbdb6367f350761a275e2508",
"translation_date": "2025-08-29T13:48:01+00:00",
"original_hash": "e0b75f73e4a90d45181dc5581fe2ef5c",
"translation_date": "2025-09-04T20:48:36+00:00",
"source_file": "3-Web-App/1-Web-App/README.md",
"language_code": "ar"
}
-->
# بناء تطبيق ويب لاستخدام نموذج تعلم الآلة
في هذا الدرس، ستقوم بتدريب نموذج تعلم آلي على مجموعة بيانات غير تقليدية: _مشاهدات الأجسام الطائرة المجهولة (UFO) خلال القرن الماضي_، والمأخوذة من قاعدة بيانات NUFORC.
في هذه الدرس، ستقوم بتدريب نموذج تعلم الآلة على مجموعة بيانات غير مألوفة: _مشاهدات الأجسام الطائرة المجهولة خلال القرن الماضي_، مأخوذة من قاعدة بيانات NUFORC.
ستتعلم:
- كيفية "تخزين" نموذج مدرب باستخدام Pickle
- كيفية استخدام هذا النموذج في تطبيق Flask
سنواصل استخدام دفاتر Jupyter لتنظيف البيانات وتدريب النموذج، ولكن يمكنك أن تأخذ العملية خطوة إضافية من خلال استكشاف استخدام النموذج "في العالم الحقيقي"، أي في تطبيق ويب.
سنواصل استخدام دفاتر الملاحظات لتنظيف البيانات وتدريب النموذج، ولكن يمكنك أخذ العملية خطوة إضافية من خلال استكشاف استخدام النموذج "في العالم الحقيقي"، أي في تطبيق ويب.
للقيام بذلك، تحتاج إلى بناء تطبيق ويب باستخدام Flask.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/17/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## بناء التطبيق
@ -30,38 +30,38 @@ CO_OP_TRANSLATOR_METADATA:
هناك العديد من الأسئلة التي تحتاج إلى طرحها:
- **هل هو تطبيق ويب أم تطبيق جوال؟** إذا كنت تبني تطبيقًا جوالًا أو تحتاج إلى استخدام النموذج في سياق إنترنت الأشياء (IoT)، يمكنك استخدام [TensorFlow Lite](https://www.tensorflow.org/lite/) واستخدام النموذج في تطبيق Android أو iOS.
- **هل هو تطبيق ويب أم تطبيق جوال؟** إذا كنت تبني تطبيقًا جوالًا أو تحتاج إلى استخدام النموذج في سياق إنترنت الأشياء، يمكنك استخدام [TensorFlow Lite](https://www.tensorflow.org/lite/) واستخدام النموذج في تطبيق Android أو iOS.
- **أين سيقيم النموذج؟** في السحابة أم محليًا؟
- **الدعم دون اتصال.** هل يجب أن يعمل التطبيق دون اتصال؟
- **ما هي التقنية المستخدمة لتدريب النموذج؟** قد تؤثر التقنية المختارة على الأدوات التي تحتاج إلى استخدامها.
- **استخدام TensorFlow.** إذا كنت تدرب نموذجًا باستخدام TensorFlow، على سبيل المثال، فإن هذا النظام يوفر إمكانية تحويل نموذج TensorFlow لاستخدامه في تطبيق ويب باستخدام [TensorFlow.js](https://www.tensorflow.org/js/).
- **استخدام PyTorch.** إذا كنت تبني نموذجًا باستخدام مكتبة مثل [PyTorch](https://pytorch.org/)، لديك خيار تصديره بتنسيق [ONNX](https://onnx.ai/) (Open Neural Network Exchange) لاستخدامه في تطبيقات ويب JavaScript التي يمكنها استخدام [Onnx Runtime](https://www.onnxruntime.ai/). سيتم استكشاف هذا الخيار في درس مستقبلي لنموذج مدرب باستخدام Scikit-learn.
- **استخدام Lobe.ai أو Azure Custom Vision.** إذا كنت تستخدم نظام تعلم آلي كخدمة (ML SaaS) مثل [Lobe.ai](https://lobe.ai/) أو [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) لتدريب نموذج، فإن هذا النوع من البرمجيات يوفر طرقًا لتصدير النموذج للعديد من المنصات، بما في ذلك بناء واجهة برمجية مخصصة يمكن استدعاؤها في السحابة بواسطة تطبيقك عبر الإنترنت.
- **استخدام TensorFlow.** إذا كنت تدرب نموذجًا باستخدام TensorFlow، على سبيل المثال، يوفر هذا النظام البيئي القدرة على تحويل نموذج TensorFlow للاستخدام في تطبيق ويب باستخدام [TensorFlow.js](https://www.tensorflow.org/js/).
- **استخدام PyTorch.** إذا كنت تبني نموذجًا باستخدام مكتبة مثل [PyTorch](https://pytorch.org/)، لديك خيار تصديره بتنسيق [ONNX](https://onnx.ai/) (تبادل الشبكة العصبية المفتوحة) للاستخدام في تطبيقات ويب JavaScript التي يمكنها استخدام [Onnx Runtime](https://www.onnxruntime.ai/). سيتم استكشاف هذا الخيار في درس مستقبلي لنموذج مدرب باستخدام Scikit-learn.
- **استخدام Lobe.ai أو Azure Custom Vision.** إذا كنت تستخدم نظام SaaS (البرمجيات كخدمة) مثل [Lobe.ai](https://lobe.ai/) أو [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) لتدريب نموذج، يوفر هذا النوع من البرمجيات طرقًا لتصدير النموذج للعديد من المنصات، بما في ذلك بناء API مخصص للاستعلام عنه في السحابة بواسطة تطبيقك عبر الإنترنت.
لديك أيضًا فرصة لبناء تطبيق ويب كامل باستخدام Flask يمكنه تدريب النموذج نفسه في متصفح الويب. يمكن القيام بذلك أيضًا باستخدام TensorFlow.js في سياق JavaScript.
بالنسبة لأغراضنا، بما أننا عملنا مع دفاتر Jupyter المستندة إلى Python، دعنا نستكشف الخطوات التي تحتاج إلى اتخاذها لتصدير نموذج مدرب من دفتر ملاحظات إلى تنسيق يمكن قراءته بواسطة تطبيق ويب مبني باستخدام Python.
بالنسبة لأغراضنا، نظرًا لأننا عملنا مع دفاتر ملاحظات تعتمد على Python، دعنا نستكشف الخطوات التي تحتاج إلى اتخاذها لتصدير نموذج مدرب من دفتر ملاحظات إلى تنسيق يمكن قراءته بواسطة تطبيق ويب مبني باستخدام Python.
## الأدوات
لهذه المهمة، تحتاج إلى أداتين: Flask وPickle، وكلاهما يعملان على Python.
لهذه المهمة، تحتاج إلى أداتين: Flask وPickle، وكلاهما يعمل على Python.
✅ ما هو [Flask](https://palletsprojects.com/p/flask/)؟ يُعرف بأنه "إطار عمل صغير" من قبل مطوريه، يوفر Flask الميزات الأساسية لإطارات عمل الويب باستخدام Python ومحرك قوالب لبناء صفحات الويب. ألقِ نظرة على [هذا الدرس](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) لتتعلم كيفية بناء تطبيقات باستخدام Flask.
✅ ما هو [Flask](https://palletsprojects.com/p/flask/)؟ يُعرف بأنه "إطار عمل صغير" من قبل منشئيه، يوفر Flask الميزات الأساسية لإطارات عمل الويب باستخدام Python ومحرك قوالب لبناء صفحات الويب. ألقِ نظرة على [وحدة التعلم هذه](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott) لممارسة البناء باستخدام Flask.
✅ ما هو [Pickle](https://docs.python.org/3/library/pickle.html)؟ Pickle 🥒 هو وحدة Python تقوم بتسلسل وفك تسلسل هيكل كائن Python. عندما تقوم "بتخزين" نموذج، فإنك تقوم بتسلسل أو تسطيح هيكله لاستخدامه على الويب. كن حذرًا: Pickle ليس آمنًا بطبيعته، لذا كن حذرًا إذا طُلب منك "فك تخزين" ملف. الملف المخزن يحتوي على الامتداد `.pkl`.
✅ ما هو [Pickle](https://docs.python.org/3/library/pickle.html)؟ Pickle 🥒 هو وحدة Python تقوم بتسلسل وإلغاء تسلسل هيكل كائن Python. عندما تقوم "بتخزين" نموذج، فإنك تقوم بتسلسل أو تسطيح هيكله للاستخدام على الويب. كن حذرًا: Pickle ليس آمنًا بطبيعته، لذا كن حذرًا إذا طُلب منك "إلغاء تخزين" ملف. يحتوي الملف المخزن على اللاحقة `.pkl`.
## تمرين - تنظيف البيانات
في هذا الدرس، ستستخدم بيانات من 80,000 مشاهدة للأجسام الطائرة المجهولة، التي جمعها [NUFORC](https://nuforc.org) (المركز الوطني لتقارير الأجسام الطائرة المجهولة). تحتوي هذه البيانات على أوصاف مثيرة للاهتمام لمشاهدات الأجسام الطائرة المجهولة، على سبيل المثال:
في هذا الدرس ستستخدم بيانات من 80,000 مشاهدة للأجسام الطائرة المجهولة، تم جمعها بواسطة [NUFORC](https://nuforc.org) (المركز الوطني للإبلاغ عن الأجسام الطائرة المجهولة). تحتوي هذه البيانات على أوصاف مثيرة للاهتمام لمشاهدات الأجسام الطائرة المجهولة، على سبيل المثال:
- **وصف طويل كمثال.** "رجل يظهر من شعاع ضوء يضيء على حقل عشبي في الليل ويركض نحو موقف سيارات Texas Instruments".
- **وصف طويل كمثال.** "رجل يخرج من شعاع ضوء يضيء على حقل عشبي في الليل ويركض نحو موقف سيارات Texas Instruments".
- **وصف قصير كمثال.** "الأضواء طاردتنا".
تتضمن ورقة البيانات [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) أعمدة حول `المدينة`، `الولاية` و`الدولة` التي حدثت فيها المشاهدة، شكل الجسم الطائر (`shape`) وخطوط الطول والعرض (`latitude` و`longitude`).
تشمل جدول البيانات [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) أعمدة حول `المدينة`، `الولاية` و`الدولة` حيث حدثت المشاهدة، شكل الجسم، و`خط العرض` و`خط الطول`.
في [دفتر الملاحظات](notebook.ipynb) الفارغ المرفق في هذا الدرس:
في [دفتر الملاحظات](../../../../3-Web-App/1-Web-App/notebook.ipynb) الفارغ المرفق في هذا الدرس:
1. قم باستيراد `pandas`، `matplotlib`، و`numpy` كما فعلت في الدروس السابقة واستورد ورقة بيانات الأجسام الطائرة المجهولة. يمكنك إلقاء نظرة على عينة من مجموعة البيانات:
1. قم باستيراد `pandas`، `matplotlib`، و`numpy` كما فعلت في الدروس السابقة واستيراد جدول بيانات الأجسام الطائرة المجهولة. يمكنك إلقاء نظرة على مجموعة بيانات نموذجية:
```python
import pandas as pd
@ -71,7 +71,7 @@ CO_OP_TRANSLATOR_METADATA:
ufos.head()
```
1. قم بتحويل بيانات الأجسام الطائرة إلى إطار بيانات صغير مع عناوين جديدة. تحقق من القيم الفريدة في حقل `Country`.
1. قم بتحويل بيانات الأجسام الطائرة المجهولة إلى إطار بيانات صغير مع عناوين جديدة. تحقق من القيم الفريدة في حقل `Country`.
```python
ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
@ -79,7 +79,7 @@ CO_OP_TRANSLATOR_METADATA:
ufos.Country.unique()
```
1. الآن، يمكنك تقليل كمية البيانات التي نحتاج إلى التعامل معها عن طريق حذف أي قيم فارغة واستيراد المشاهدات التي تتراوح مدتها بين 1-60 ثانية فقط:
1. الآن، يمكنك تقليل كمية البيانات التي نحتاج إلى التعامل معها عن طريق حذف أي قيم فارغة واستيراد المشاهدات فقط بين 1-60 ثانية:
```python
ufos.dropna(inplace=True)
@ -89,7 +89,7 @@ CO_OP_TRANSLATOR_METADATA:
ufos.info()
```
1. استورد مكتبة `LabelEncoder` من Scikit-learn لتحويل القيم النصية للدول إلى أرقام:
1. قم باستيراد مكتبة `LabelEncoder` الخاصة بـ Scikit-learn لتحويل القيم النصية للدول إلى أرقام:
✅ يقوم LabelEncoder بترميز البيانات أبجديًا
@ -114,9 +114,9 @@ CO_OP_TRANSLATOR_METADATA:
## تمرين - بناء النموذج
الآن يمكنك الاستعداد لتدريب نموذج عن طريق تقسيم البيانات إلى مجموعة تدريب واختبار.
الآن يمكنك الاستعداد لتدريب نموذج عن طريق تقسيم البيانات إلى مجموعة التدريب والاختبار.
1. اختر ثلاث ميزات تريد التدريب عليها كمتجه X، وسيكون المتجه y هو `Country`. تريد أن تكون قادرًا على إدخال `Seconds`، `Latitude` و`Longitude` والحصول على معرف الدولة كإخراج.
1. اختر ثلاث ميزات تريد التدريب عليها كمتجه X، وسيكون المتجه y هو `Country`. تريد أن تكون قادرًا على إدخال `Seconds`، `Latitude` و`Longitude` والحصول على معرف الدولة كإجابة.
```python
from sklearn.model_selection import train_test_split
@ -143,13 +143,13 @@ CO_OP_TRANSLATOR_METADATA:
print('Accuracy: ', accuracy_score(y_test, predictions))
```
الدقة ليست سيئة **(حوالي 95%)**، وهذا ليس مفاجئًا، حيث أن `Country` و`Latitude/Longitude` مترابطان.
الدقة ليست سيئة **(حوالي 95%)**، وليس من المستغرب، حيث أن `Country` و`Latitude/Longitude` مترابطان.
النموذج الذي أنشأته ليس ثوريًا جدًا حيث يجب أن تكون قادرًا على استنتاج `Country` من `Latitude` و`Longitude`، ولكنه تمرين جيد لمحاولة التدريب على بيانات خام قمت بتنظيفها وتصديرها، ثم استخدام هذا النموذج في تطبيق ويب.
النموذج الذي أنشأته ليس ثوريًا جدًا حيث يجب أن تكون قادرًا على استنتاج `Country` من `Latitude` و`Longitude`، ولكنه تمرين جيد لمحاولة التدريب من بيانات خام قمت بتنظيفها وتصديرها، ثم استخدام هذا النموذج في تطبيق ويب.
## تمرين - "تخزين" النموذج
## تمرين - تخزين النموذج
الآن، حان الوقت لتخزين النموذج! يمكنك القيام بذلك في بضع أسطر من التعليمات البرمجية. بمجرد تخزينه، قم بتحميل النموذج المخزن واختبره مقابل مصفوفة بيانات عينة تحتوي على قيم للثواني، خط العرض وخط الطول:
الآن، حان الوقت لتخزين النموذج! يمكنك القيام بذلك في بضعة أسطر من التعليمات البرمجية. بمجرد تخزينه، قم بتحميل النموذج المخزن واختبره مقابل مجموعة بيانات نموذجية تحتوي على قيم للثواني، خط العرض وخط الطول.
```python
import pickle
@ -160,7 +160,7 @@ model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]]))
```
يُرجع النموذج **'3'**، وهو رمز الدولة للمملكة المتحدة. مذهل! 👽
النموذج يعيد **'3'**، وهو رمز الدولة للمملكة المتحدة. مذهل! 👽
## تمرين - بناء تطبيق Flask
@ -179,9 +179,9 @@ print(model.predict([[50,44,-12]]))
ufo-model.pkl
```
ارجع إلى مجلد الحل لرؤية التطبيق النهائي
راجع مجلد الحل للحصول على عرض للتطبيق النهائي
1. أول ملف تقوم بإنشائه في مجلد _web-app_ هو ملف **requirements.txt**. مثل _package.json_ في تطبيق JavaScript، يسرد هذا الملف التبعيات المطلوبة للتطبيق. في **requirements.txt** أضف الأسطر:
1. أول ملف يتم إنشاؤه في مجلد _web-app_ هو ملف **requirements.txt**. مثل _package.json_ في تطبيق JavaScript، يسرد هذا الملف التبعيات المطلوبة للتطبيق. في **requirements.txt** أضف الأسطر:
```text
scikit-learn
@ -190,13 +190,13 @@ print(model.predict([[50,44,-12]]))
flask
```
1. الآن، قم بتشغيل هذا الملف عن طريق الانتقال إلى _web-app_:
1. الآن، قم بتشغيل هذا الملف عن طريق التنقل إلى _web-app_:
```bash
cd web-app
```
1. في الطرفية الخاصة بك، اكتب `pip install` لتثبيت المكتبات المدرجة في _requirements.txt_:
1. في الطرفية الخاصة بك، اكتب `pip install`، لتثبيت المكتبات المدرجة في _requirements.txt_:
```bash
pip install -r requirements.txt
@ -204,9 +204,9 @@ print(model.predict([[50,44,-12]]))
1. الآن، أنت جاهز لإنشاء ثلاثة ملفات أخرى لإنهاء التطبيق:
1. أنشئ ملف **app.py** في الجذر.
2. أنشئ ملف **index.html** في مجلد _templates_.
3. أنشئ ملف **styles.css** في مجلد _static/css_.
1. قم بإنشاء **app.py** في الجذر.
2. قم بإنشاء **index.html** في مجلد _templates_.
3. قم بإنشاء **styles.css** في مجلد _static/css_.
1. قم ببناء ملف _styles.css_ ببعض الأنماط:
@ -277,7 +277,7 @@ print(model.predict([[50,44,-12]]))
</html>
```
ألقِ نظرة على القوالب في هذا الملف. لاحظ صياغة "mustache" حول المتغيرات التي سيتم توفيرها بواسطة التطبيق، مثل نص التنبؤ: `{{}}`. هناك أيضًا نموذج يقوم بإرسال تنبؤ إلى مسار `/predict`.
ألقِ نظرة على القوالب في هذا الملف. لاحظ صياغة "mustache" حول المتغيرات التي سيتم توفيرها بواسطة التطبيق، مثل نص التنبؤ: `{{}}`. هناك أيضًا نموذج ينشر تنبؤًا إلى مسار `/predict`.
أخيرًا، أنت جاهز لبناء ملف Python الذي يدير استهلاك النموذج وعرض التنبؤات:
@ -318,36 +318,36 @@ print(model.predict([[50,44,-12]]))
app.run(debug=True)
```
> 💡 نصيحة: عند إضافة [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) أثناء تشغيل تطبيق الويب باستخدام Flask، سيتم عكس أي تغييرات تجريها على التطبيق فورًا دون الحاجة إلى إعادة تشغيل الخادم. احذر! لا تقم بتمكين هذا الوضع في تطبيق الإنتاج.
> 💡 نصيحة: عند إضافة [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode) أثناء تشغيل تطبيق الويب باستخدام Flask، ستنعكس أي تغييرات تجريها على التطبيق فورًا دون الحاجة إلى إعادة تشغيل الخادم. احذر! لا تقم بتمكين هذا الوضع في تطبيق الإنتاج.
إذا قمت بتشغيل `python app.py` أو `python3 app.py` - يبدأ خادم الويب الخاص بك محليًا، ويمكنك ملء نموذج قصير للحصول على إجابة لسؤالك الملح حول أماكن مشاهدة الأجسام الطائرة المجهولة!
إذا قمت بتشغيل `python app.py` أو `python3 app.py` - يبدأ خادم الويب الخاص بك محليًا، ويمكنك ملء نموذج قصير للحصول على إجابة لسؤالك الملح حول مكان مشاهدة الأجسام الطائرة المجهولة!
قبل القيام بذلك، ألقِ نظرة على أجزاء `app.py`:
1. أولاً، يتم تحميل التبعيات وبدء التطبيق.
1. أولاً، يتم تحميل التبعيات ويبدأ التطبيق.
1. ثم يتم استيراد النموذج.
1. ثم يتم عرض index.html على المسار الرئيسي.
على مسار `/predict`، تحدث عدة أشياء عند إرسال النموذج:
على مسار `/predict`، تحدث عدة أمور عند نشر النموذج:
1. يتم جمع متغيرات النموذج وتحويلها إلى مصفوفة numpy. ثم يتم إرسالها إلى النموذج ويتم إرجاع تنبؤ.
2. يتم إعادة عرض الدول التي نريد عرضها كنصوص قابلة للقراءة من رمز الدولة المتوقع، ويتم إرسال تلك القيمة مرة أخرى إلى index.html ليتم عرضها في القالب.
2. يتم إعادة عرض الدول التي نريد عرضها كنص قابل للقراءة من رمز الدولة المتوقع، ويتم إرسال تلك القيمة مرة أخرى إلى index.html ليتم عرضها في القالب.
استخدام النموذج بهذه الطريقة، مع Flask ونموذج مخزن، هو أمر بسيط نسبيًا. أصعب شيء هو فهم شكل البيانات التي يجب إرسالها إلى النموذج للحصول على تنبؤ. يعتمد ذلك كله على كيفية تدريب النموذج. يحتوي هذا النموذج على ثلاث نقاط بيانات يجب إدخالها للحصول على تنبؤ.
في بيئة احترافية، يمكنك أن ترى كيف أن التواصل الجيد ضروري بين الأشخاص الذين يدربون النموذج وأولئك الذين يستهلكونه في تطبيق ويب أو جوال. في حالتنا، الشخص الوحيد هو أنت!
في بيئة احترافية، يمكنك أن ترى كيف أن التواصل الجيد ضروري بين الأشخاص الذين يدربون النموذج وأولئك الذين يستهلكونه في تطبيق ويب أو جوال. في حالتنا، هو شخص واحد فقط، أنت!
---
## 🚀 تحدي
بدلاً من العمل في دفتر ملاحظات واستيراد النموذج إلى تطبيق Flask، يمكنك تدريب النموذج مباشرة داخل تطبيق Flask! حاول تحويل كود Python الخاص بك في دفتر الملاحظات، ربما بعد تنظيف البيانات، لتدريب النموذج من داخل التطبيق على مسار يسمى `train`. ما هي إيجابيات وسلبيات متابعة هذه الطريقة؟
بدلاً من العمل في دفتر ملاحظات واستيراد النموذج إلى تطبيق Flask، يمكنك تدريب النموذج مباشرة داخل تطبيق Flask! حاول تحويل كود Python في دفتر الملاحظات، ربما بعد تنظيف البيانات، لتدريب النموذج من داخل التطبيق على مسار يسمى `train`. ما هي الإيجابيات والسلبيات لمتابعة هذه الطريقة؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/18/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
هناك العديد من الطرق لبناء تطبيق ويب لاستهلاك نماذج تعلم الآلة. قم بعمل قائمة بالطرق التي يمكنك بها استخدام JavaScript أو Python لبناء تطبيق ويب للاستفادة من تعلم الآلة. فكر في البنية: هل يجب أن يبقى النموذج في التطبيق أم يعيش في السحابة؟ إذا كان الخيار الأخير، كيف ستصل إليه؟ ارسم نموذجًا معماريًا لحل تعلم الآلة المطبق على الويب.
هناك العديد من الطرق لبناء تطبيق ويب لاستهلاك نماذج تعلم الآلة. قم بعمل قائمة بالطرق التي يمكنك من خلالها استخدام JavaScript أو Python لبناء تطبيق ويب للاستفادة من تعلم الآلة. فكر في البنية: هل يجب أن يبقى النموذج في التطبيق أم يعيش في السحابة؟ إذا كان الخيار الأخير، كيف ستصل إليه؟ ارسم نموذجًا معماريًا لحل تعلم الآلة في تطبيق ويب.
## الواجب
@ -356,4 +356,4 @@ print(model.predict([[50,44,-12]]))
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,68 +1,68 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "76438ce4e5d48982d48f1b55c981caac",
"translation_date": "2025-08-29T13:59:47+00:00",
"original_hash": "aaf391d922bd6de5efba871d514c6d47",
"translation_date": "2025-09-04T20:50:26+00:00",
"source_file": "4-Classification/1-Introduction/README.md",
"language_code": "ar"
}
-->
# مقدمة إلى التصنيف
في هذه الدروس الأربعة، ستستكشف أحد المحاور الأساسية لتعلم الآلة الكلاسيكي - _التصنيف_. سنقوم باستعراض استخدام خوارزميات تصنيف مختلفة مع مجموعة بيانات عن جميع المأكولات الرائعة في آسيا والهند. نأمل أن تكون جائعًا!
في هذه الدروس الأربعة، ستستكشف أحد الجوانب الأساسية لتعلم الآلة الكلاسيكي - _التصنيف_. سنقوم باستخدام مجموعة متنوعة من خوارزميات التصنيف مع مجموعة بيانات عن جميع المأكولات الرائعة في آسيا والهند. نأمل أن تكون جائعًا!
![مجرد رشة!](../../../../translated_images/pinch.1b035ec9ba7e0d408313b551b60c721c9c290b2dd2094115bc87e6ddacd114c9.ar.png)
![مجرد رشة!](../../../../4-Classification/1-Introduction/images/pinch.png)
> احتفل بالمأكولات الآسيوية في هذه الدروس! الصورة من [Jen Looper](https://twitter.com/jenlooper)
> احتفل بالمأكولات الآسيوية في هذه الدروس! الصورة بواسطة [Jen Looper](https://twitter.com/jenlooper)
التصنيف هو شكل من أشكال [التعلم الموجه](https://wikipedia.org/wiki/Supervised_learning) الذي يشترك كثيرًا مع تقنيات الانحدار. إذا كان تعلم الآلة يدور حول التنبؤ بالقيم أو الأسماء باستخدام مجموعات البيانات، فإن التصنيف ينقسم عمومًا إلى مجموعتين: _التصنيف الثنائي_ و_التصنيف متعدد الفئات_.
التصنيف هو شكل من أشكال [التعلم الموجّه](https://wikipedia.org/wiki/Supervised_learning) الذي يشترك كثيرًا مع تقنيات الانحدار. إذا كان تعلم الآلة يدور حول التنبؤ بالقيم أو الأسماء باستخدام مجموعات البيانات، فإن التصنيف ينقسم عمومًا إلى مجموعتين: _التصنيف الثنائي_ و _التصنيف متعدد الفئات_.
[![مقدمة إلى التصنيف](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "مقدمة إلى التصنيف")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو: يقدم جون غوتاغ من MIT مقدمة عن التصنيف
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: يقدم جون غوتاج من MIT التصنيف
تذكر:
- **الانحدار الخطي** ساعدك في التنبؤ بالعلاقات بين المتغيرات وإجراء تنبؤات دقيقة حول مكان وقوع نقطة بيانات جديدة بالنسبة لذلك الخط. على سبيل المثال، يمكنك التنبؤ _بسعر اليقطين في سبتمبر مقابل ديسمبر_.
- **الانحدار اللوجستي** ساعدك في اكتشاف "الفئات الثنائية": عند هذا السعر، _هل هذا اليقطين برتقالي أم غير برتقالي_؟
- **الانحدار الخطي** ساعدك في التنبؤ بالعلاقات بين المتغيرات وإجراء توقعات دقيقة حول مكان وقوع نقطة بيانات جديدة بالنسبة لذلك الخط. على سبيل المثال، يمكنك التنبؤ _بسعر اليقطين في سبتمبر مقابل ديسمبر_.
- **الانحدار اللوجستي** ساعدك في اكتشاف "الفئات الثنائية": عند نقطة السعر هذه، _هل هذا اليقطين برتقالي أم غير برتقالي_؟
يستخدم التصنيف خوارزميات مختلفة لتحديد طرق أخرى لتحديد تسمية أو فئة نقطة البيانات. دعنا نعمل مع بيانات المأكولات هذه لنرى ما إذا كان بإمكاننا، من خلال ملاحظة مجموعة من المكونات، تحديد أصل المأكولات.
يستخدم التصنيف خوارزميات مختلفة لتحديد طرق أخرى لتحديد تسمية أو فئة نقطة البيانات. دعونا نعمل مع بيانات المأكولات لنرى ما إذا كان بإمكاننا، من خلال مراقبة مجموعة من المكونات، تحديد أصل المأكولات.
## [اختبار قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/19/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
> ### [هذا الدرس متوفر بلغة R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
> ### [هذا الدرس متاح بلغة R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
### مقدمة
التصنيف هو أحد الأنشطة الأساسية للباحث في تعلم الآلة وعالم البيانات. من التصنيف الأساسي لقيمة ثنائية ("هل هذا البريد الإلكتروني مزعج أم لا؟")، إلى التصنيف المعقد للصور وتقسيمها باستخدام رؤية الحاسوب، من المفيد دائمًا أن تكون قادرًا على تصنيف البيانات إلى فئات وطرح الأسئلة عليها.
التصنيف هو أحد الأنشطة الأساسية للباحثين في تعلم الآلة وعلماء البيانات. من التصنيف الأساسي لقيمة ثنائية ("هل هذا البريد الإلكتروني مزعج أم لا؟") إلى التصنيف المعقد للصور وتقسيمها باستخدام رؤية الكمبيوتر، من المفيد دائمًا أن تكون قادرًا على تصنيف البيانات إلى فئات وطرح الأسئلة عليها.
لصياغة العملية بطريقة أكثر علمية، فإن طريقة التصنيف الخاصة بك تنشئ نموذجًا تنبؤيًا يمكّنك من رسم العلاقة بين المتغيرات المدخلة والمتغيرات الناتجة.
![التصنيف الثنائي مقابل التصنيف متعدد الفئات](../../../../translated_images/binary-multiclass.b56d0c86c81105a697dddd82242c1d11e4d78b7afefea07a44627a0f1111c1a9.ar.png)
![التصنيف الثنائي مقابل التصنيف متعدد الفئات](../../../../4-Classification/1-Introduction/images/binary-multiclass.png)
> مشاكل التصنيف الثنائي مقابل متعدد الفئات التي تتعامل معها الخوارزميات. الرسم التوضيحي من [Jen Looper](https://twitter.com/jenlooper)
> مشاكل التصنيف الثنائي مقابل متعدد الفئات التي تتعامل معها خوارزميات التصنيف. الرسم البياني بواسطة [Jen Looper](https://twitter.com/jenlooper)
قبل البدء في عملية تنظيف بياناتنا، تصورها، وتجهيزها لمهام تعلم الآلة، دعونا نتعلم قليلاً عن الطرق المختلفة التي يمكن من خلالها استخدام تعلم الآلة لتصنيف البيانات.
مستمدة من [الإحصائيات](https://wikipedia.org/wiki/Statistical_classification)، يستخدم التصنيف في تعلم الآلة الكلاسيكي ميزات مثل `smoker`، `weight`، و`age` لتحديد _احتمالية الإصابة بمرض معين_. كطريقة تعلم موجهة مشابهة لتمارين الانحدار التي قمت بها سابقًا، يتم تصنيف بياناتك وتستخدم الخوارزميات هذه التصنيفات لتصنيف وتوقع الفئات (أو "الميزات") لمجموعة البيانات وتعيينها إلى مجموعة أو نتيجة.
مستمدة من [الإحصائيات](https://wikipedia.org/wiki/Statistical_classification)، يستخدم التصنيف باستخدام تعلم الآلة الكلاسيكي ميزات مثل `smoker`، `weight`، و `age` لتحديد _احتمالية الإصابة بمرض معين_. كطريقة تعلم موجّهة مشابهة لتمارين الانحدار التي أجريتها سابقًا، يتم تصنيف بياناتك وتستخدم خوارزميات تعلم الآلة هذه التصنيفات لتصنيف وتوقع الفئات (أو "الميزات") لمجموعة البيانات وتعيينها إلى مجموعة أو نتيجة.
✅ خذ لحظة لتخيل مجموعة بيانات عن المأكولات. ما الذي يمكن لنموذج متعدد الفئات الإجابة عليه؟ وما الذي يمكن لنموذج ثنائي الإجابة عليه؟ ماذا لو أردت تحديد ما إذا كانت مأكولات معينة تستخدم الحلبة؟ ماذا لو أردت معرفة ما إذا كان بإمكانك، بالنظر إلى كيس بقالة مليء باليانسون النجمي، والخرشوف، والقرنبيط، والفجل، إعداد طبق هندي نموذجي؟
✅ خذ لحظة لتخيل مجموعة بيانات عن المأكولات. ما الذي يمكن لنموذج متعدد الفئات الإجابة عليه؟ وما الذي يمكن لنموذج ثنائي الإجابة عليه؟ ماذا لو أردت تحديد ما إذا كانت مأكولات معينة من المحتمل أن تستخدم الحلبة؟ ماذا لو أردت معرفة ما إذا كان بإمكانك، بالنظر إلى حقيبة بقالة مليئة باليانسون النجمي، الخرشوف، القرنبيط، والفجل، إعداد طبق هندي نموذجي؟
[![سلال غامضة مجنونة](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "سلال غامضة مجنونة")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو. الفكرة الأساسية لبرنامج 'Chopped' هي "السلة الغامضة" حيث يتعين على الطهاة إعداد طبق من اختيار عشوائي من المكونات. بالتأكيد كان نموذج تعلم الآلة سيساعد!
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو. الفكرة الأساسية لبرنامج 'Chopped' هي "السلة الغامضة" حيث يتعين على الطهاة إعداد طبق من اختيار عشوائي من المكونات. بالتأكيد كان نموذج تعلم الآلة سيساعد!
## مرحبًا بـ 'المصنف'
السؤال الذي نريد طرحه على مجموعة بيانات المأكولات هو في الواقع سؤال **متعدد الفئات**، حيث لدينا العديد من المأكولات الوطنية المحتملة للعمل معها. بالنظر إلى مجموعة من المكونات، إلى أي من هذه الفئات العديدة ستنتمي البيانات؟
السؤال الذي نريد طرحه على مجموعة بيانات المأكولات هو في الواقع سؤال **متعدد الفئات**، حيث لدينا العديد من المأكولات الوطنية المحتملة للعمل معها. بالنظر إلى مجموعة من المكونات، أي من هذه الفئات العديدة ستتناسب معها البيانات؟
يوفر Scikit-learn العديد من الخوارزميات المختلفة لاستخدامها في تصنيف البيانات، اعتمادًا على نوع المشكلة التي تريد حلها. في الدرسين التاليين، ستتعلم عن العديد من هذه الخوارزميات.
يوفر Scikit-learn العديد من الخوارزميات المختلفة لاستخدامها لتصنيف البيانات، اعتمادًا على نوع المشكلة التي تريد حلها. في الدروس التالية، ستتعلم عن العديد من هذه الخوارزميات.
## تمرين - تنظيف وتوازن البيانات
المهمة الأولى التي يجب القيام بها، قبل بدء هذا المشروع، هي تنظيف وتوازن البيانات للحصول على نتائج أفضل. ابدأ بملف _notebook.ipynb_ الفارغ في جذر هذا المجلد.
المهمة الأولى التي يجب القيام بها، قبل بدء هذا المشروع، هي تنظيف وتوازن البيانات للحصول على نتائج أفضل. ابدأ بملف _notebook.ipynb_ الفارغ الموجود في جذر هذا المجلد.
أول شيء يجب تثبيته هو [imblearn](https://imbalanced-learn.org/stable/). هذه حزمة Scikit-learn ستسمح لك بتحقيق توازن أفضل للبيانات (ستتعلم المزيد عن هذه المهمة قريبًا).
أول شيء يجب تثبيته هو [imblearn](https://imbalanced-learn.org/stable/). هذه حزمة Scikit-learn ستتيح لك تحقيق توازن أفضل للبيانات (ستتعلم المزيد عن هذه المهمة قريبًا).
1. لتثبيت `imblearn`، قم بتشغيل `pip install`، كما يلي:
@ -70,7 +70,7 @@ CO_OP_TRANSLATOR_METADATA:
pip install imblearn
```
1. استورد الحزم التي تحتاجها لاستيراد بياناتك وتصورها، واستورد أيضًا `SMOTE` من `imblearn`.
1. قم باستيراد الحزم التي تحتاجها لاستيراد بياناتك وتصورها، واستيراد `SMOTE` من `imblearn`.
```python
import pandas as pd
@ -82,13 +82,13 @@ CO_OP_TRANSLATOR_METADATA:
الآن أصبحت جاهزًا لاستيراد البيانات.
1. المهمة التالية هي استيراد البيانات:
1. المهمة التالية ستكون استيراد البيانات:
```python
df = pd.read_csv('../data/cuisines.csv')
```
باستخدام `read_csv()` سيتم قراءة محتوى ملف csv _cusines.csv_ ووضعه في المتغير `df`.
استخدام `read_csv()` سيقرأ محتوى ملف csv _cusines.csv_ ويضعه في المتغير `df`.
1. تحقق من شكل البيانات:
@ -114,7 +114,7 @@ CO_OP_TRANSLATOR_METADATA:
df.info()
```
الناتج يشبه:
يشبه الناتج:
```output
<class 'pandas.core.frame.DataFrame'>
@ -126,15 +126,15 @@ CO_OP_TRANSLATOR_METADATA:
## تمرين - التعرف على المأكولات
الآن يبدأ العمل في أن يصبح أكثر إثارة. دعنا نكتشف توزيع البيانات لكل نوع من المأكولات.
الآن يبدأ العمل ليصبح أكثر إثارة. دعونا نكتشف توزيع البيانات لكل نوع من المأكولات.
1. ارسم البيانات كأشرطة باستخدام `barh()`:
1. قم برسم البيانات كأشرطة باستخدام `barh()`:
```python
df.cuisine.value_counts().plot.barh()
```
![توزيع بيانات المأكولات](../../../../translated_images/cuisine-dist.d0cc2d551abe5c25f83d73a5f560927e4a061e9a4560bac1e97d35682ef3ca6d.ar.png)
![توزيع بيانات المأكولات](../../../../4-Classification/1-Introduction/images/cuisine-dist.png)
هناك عدد محدود من المأكولات، لكن توزيع البيانات غير متساوٍ. يمكنك إصلاح ذلك! قبل القيام بذلك، استكشف قليلاً.
@ -154,7 +154,7 @@ CO_OP_TRANSLATOR_METADATA:
print(f'korean df: {korean_df.shape}')
```
الناتج يبدو كالتالي:
يبدو الناتج كما يلي:
```output
thai df: (289, 385)
@ -166,9 +166,9 @@ CO_OP_TRANSLATOR_METADATA:
## اكتشاف المكونات
الآن يمكنك التعمق أكثر في البيانات ومعرفة ما هي المكونات النموذجية لكل نوع من المأكولات. يجب تنظيف البيانات المتكررة التي تسبب الالتباس بين المأكولات، لذا دعنا نتعلم عن هذه المشكلة.
الآن يمكنك التعمق أكثر في البيانات ومعرفة ما هي المكونات النموذجية لكل نوع من المأكولات. يجب تنظيف البيانات المتكررة التي تسبب ارتباكًا بين المأكولات، لذا دعونا نتعلم عن هذه المشكلة.
1. أنشئ دالة `create_ingredient()` في Python لإنشاء إطار بيانات للمكونات. ستبدأ هذه الدالة بإزالة عمود غير مفيد وفرز المكونات حسب عددها:
1. قم بإنشاء وظيفة `create_ingredient()` في Python لإنشاء إطار بيانات للمكونات. ستبدأ هذه الوظيفة بإسقاط عمود غير مفيد وفرز المكونات حسب عددها:
```python
def create_ingredient_df(df):
@ -179,54 +179,52 @@ CO_OP_TRANSLATOR_METADATA:
return ingredient_df
```
الآن يمكنك استخدام هذه الدالة للحصول على فكرة عن أكثر عشرة مكونات شيوعًا لكل نوع من المأكولات.
الآن يمكنك استخدام هذه الوظيفة للحصول على فكرة عن أكثر عشرة مكونات شيوعًا لكل نوع من المأكولات.
1. استدعِ `create_ingredient()` وارسمها باستخدام `barh()`:
1. قم باستدعاء `create_ingredient()` وقم برسمها باستخدام `barh()`:
```python
thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()
```
![التايلاندية](../../../../translated_images/thai.0269dbab2e78bd38a132067759fe980008bdb80b6d778e5313448dbe12bed846.ar.png)
![التايلاندية](../../../../4-Classification/1-Introduction/images/thai.png)
1. افعل الشيء نفسه لبيانات المأكولات اليابانية:
1. قم بنفس الشيء لبيانات المأكولات اليابانية:
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![اليابانية](../../../../translated_images/japanese.30260486f2a05c463c8faa62ebe7b38f0961ed293bd9a6db8eef5d3f0cf17155.ar.png)
![اليابانية](../../../../4-Classification/1-Introduction/images/japanese.png)
1. الآن بالنسبة للمكونات الصينية:
1. الآن بالنسبة لمكونات المأكولات الصينية:
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![الصينية](../../../../translated_images/chinese.e62cafa5309f111afd1b54490336daf4e927ce32bed837069a0b7ce481dfae8d.ar.png)
![الصينية](../../../../4-Classification/1-Introduction/images/chinese.png)
1. ارسم مكونات المأكولات الهندية:
1. قم برسم مكونات المأكولات الهندية:
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![الهندية](../../../../translated_images/indian.2c4292002af1a1f97a4a24fec6b1459ee8ff616c3822ae56bb62b9903e192af6.ar.png)
![الهندية](../../../../4-Classification/1-Introduction/images/indian.png)
1. أخيرًا، ارسم مكونات المأكولات الكورية:
1. أخيرًا، قم برسم مكونات المأكولات الكورية:
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![الكورية](../../../../translated_images/korean.4a4f0274f3d9805a65e61f05597eeaad8620b03be23a2c0a705c023f65fad2c0.ar.png)
1. الآن، قم بإزالة المكونات الأكثر شيوعًا التي تسبب الالتباس بين المأكولات المختلفة، عن طريق استدعاء `drop()`:
1. الآن، قم بإسقاط المكونات الأكثر شيوعًا التي تسبب ارتباكًا بين المأكولات المختلفة، باستخدام `drop()`:
الجميع يحب الأرز، الثوم، والزنجبيل!
@ -238,25 +236,25 @@ CO_OP_TRANSLATOR_METADATA:
## توازن مجموعة البيانات
الآن بعد أن قمت بتنظيف البيانات، استخدم [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "تقنية الإفراط في أخذ العينات للأقليات الاصطناعية" - لتحقيق التوازن.
الآن بعد أن قمت بتنظيف البيانات، استخدم [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "تقنية الإفراط في أخذ العينات للأقلية الاصطناعية" - لتحقيق التوازن.
1. استدعِ `fit_resample()`، حيث تولد هذه الاستراتيجية عينات جديدة عن طريق الاستيفاء.
1. قم باستدعاء `fit_resample()`، هذه الاستراتيجية تولد عينات جديدة عن طريق الاستيفاء.
```python
oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
```
من خلال تحقيق التوازن في بياناتك، ستحصل على نتائج أفضل عند تصنيفها. فكر في التصنيف الثنائي. إذا كانت معظم بياناتك تنتمي إلى فئة واحدة، فإن نموذج تعلم الآلة سيتنبأ بتلك الفئة بشكل متكرر، فقط لأن هناك المزيد من البيانات لها. تحقيق التوازن في البيانات يزيل هذا التحيز.
من خلال تحقيق التوازن في بياناتك، ستحصل على نتائج أفضل عند تصنيفها. فكر في التصنيف الثنائي. إذا كانت معظم بياناتك تنتمي إلى فئة واحدة، فإن نموذج تعلم الآلة سيتنبأ بتلك الفئة بشكل أكثر تكرارًا، فقط لأن هناك المزيد من البيانات لها. تحقيق التوازن في البيانات يزيل أي انحراف ويساعد في حل هذه المشكلة.
1. الآن يمكنك التحقق من عدد التصنيفات لكل مكون:
1. الآن يمكنك التحقق من أعداد التصنيفات لكل مكون:
```python
print(f'new label count: {transformed_label_df.value_counts()}')
print(f'old label count: {df.cuisine.value_counts()}')
```
الناتج يبدو كالتالي:
يبدو الناتج كما يلي:
```output
new label count: korean 799
@ -281,7 +279,7 @@ CO_OP_TRANSLATOR_METADATA:
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
```
1. يمكنك إلقاء نظرة أخيرة على البيانات باستخدام `transformed_df.head()` و`transformed_df.info()`. احفظ نسخة من هذه البيانات لاستخدامها في الدروس المستقبلية:
1. يمكنك إلقاء نظرة أخيرة على البيانات باستخدام `transformed_df.head()` و `transformed_df.info()`. احفظ نسخة من هذه البيانات لاستخدامها في الدروس المستقبلية:
```python
transformed_df.head()
@ -289,21 +287,21 @@ CO_OP_TRANSLATOR_METADATA:
transformed_df.to_csv("../data/cleaned_cuisines.csv")
```
يمكن الآن العثور على ملف CSV الجديد في مجلد البيانات الرئيسي.
يمكن الآن العثور على ملف CSV الجديد في مجلد البيانات الجذر.
---
## 🚀تحدي
تحتوي هذه المناهج على العديد من مجموعات البيانات المثيرة للاهتمام. استعرض مجلدات `data` لترى ما إذا كان أي منها يحتوي على مجموعات بيانات مناسبة للتصنيف الثنائي أو متعدد الفئات؟ ما الأسئلة التي ستطرحها على هذه المجموعة من البيانات؟
تحتوي هذه المناهج على العديد من مجموعات البيانات المثيرة للاهتمام. ابحث في مجلدات `data` لترى ما إذا كانت تحتوي على مجموعات بيانات مناسبة للتصنيف الثنائي أو متعدد الفئات؟ ما الأسئلة التي ستطرحها على هذه المجموعة؟
## [اختبار بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/20/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
استكشف واجهة برمجة تطبيقات SMOTE. ما هي حالات الاستخدام التي تناسبها؟ ما المشاكل التي تحلها؟
## الواجب
## الواجب
[استكشاف طرق التصنيف](assignment.md)

@ -1,24 +1,24 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9579f42e3ff5114c58379cc9e186a828",
"translation_date": "2025-08-29T13:52:06+00:00",
"original_hash": "1a6e9e46b34a2e559fbbfc1f95397c7b",
"translation_date": "2025-09-04T20:49:03+00:00",
"source_file": "4-Classification/2-Classifiers-1/README.md",
"language_code": "ar"
}
-->
# مصنفات المأكولات 1
في هذا الدرس، ستستخدم مجموعة البيانات التي قمت بحفظها من الدرس السابق، والتي تحتوي على بيانات متوازنة ونظيفة حول المأكولات.
في هذا الدرس، ستستخدم مجموعة البيانات التي حفظتها من الدرس السابق، وهي مليئة بالبيانات المتوازنة والنظيفة حول المأكولات.
ستستخدم هذه المجموعة من البيانات مع مجموعة متنوعة من المصنفات للتنبؤ بـ _نوع المطبخ الوطني بناءً على مجموعة من المكونات_. أثناء القيام بذلك، ستتعلم المزيد عن بعض الطرق التي يمكن من خلالها استخدام الخوارزميات في مهام التصنيف.
ستستخدم هذه المجموعة مع مجموعة متنوعة من المصنفات للتنبؤ بنوع المأكولات الوطنية بناءً على مجموعة من المكونات. أثناء القيام بذلك، ستتعلم المزيد عن الطرق التي يمكن بها استخدام الخوارزميات في مهام التصنيف.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/21/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
# التحضير
بافتراض أنك أكملت [الدرس الأول](../1-Introduction/README.md)، تأكد من وجود ملف _cleaned_cuisines.csv_ في المجلد الجذر `/data` لهذه الدروس الأربعة.
## تمرين - التنبؤ بنوع المطبخ الوطني
## تمرين - التنبؤ بنوع المأكولات الوطنية
1. أثناء العمل في مجلد _notebook.ipynb_ الخاص بهذا الدرس، قم باستيراد هذا الملف مع مكتبة Pandas:
@ -37,7 +37,6 @@ CO_OP_TRANSLATOR_METADATA:
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
1. الآن، قم باستيراد المزيد من المكتبات:
@ -49,7 +48,7 @@ CO_OP_TRANSLATOR_METADATA:
import numpy as np
```
1. قسّم إحداثيات X و y إلى إطارين بيانات للتدريب. يمكن أن تكون `cuisine` إطار البيانات الخاص بالتسميات:
1. قسّم إحداثيات X و y إلى إطارين بيانات للتدريب. يمكن أن تكون `cuisine` إطار البيانات الخاص بالتصنيفات:
```python
cuisines_label_df = cuisines_df['cuisine']
@ -67,7 +66,7 @@ CO_OP_TRANSLATOR_METADATA:
Name: cuisine, dtype: object
```
1. قم بحذف العمود `Unnamed: 0` وعمود `cuisine` باستخدام `drop()`. احفظ باقي البيانات كميزات قابلة للتدريب:
1. قم بإزالة عمود `Unnamed: 0` وعمود `cuisine` باستخدام `drop()`. احفظ باقي البيانات كميزات قابلة للتدريب:
```python
cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
@ -90,69 +89,69 @@ CO_OP_TRANSLATOR_METADATA:
الآن بعد أن أصبحت بياناتك نظيفة وجاهزة للتدريب، عليك أن تقرر أي خوارزمية ستستخدم لهذه المهمة.
تجمع مكتبة Scikit-learn التصنيف تحت التعلم الموجه، وفي هذه الفئة ستجد العديد من الطرق للتصنيف. [التنوع](https://scikit-learn.org/stable/supervised_learning.html) قد يبدو محيرًا في البداية. تشمل الطرق التالية تقنيات التصنيف:
تجمع مكتبة Scikit-learn التصنيف تحت التعلم الموجه، وفي هذه الفئة ستجد العديد من الطرق للتصنيف. [التنوع](https://scikit-learn.org/stable/supervised_learning.html) قد يبدو مربكًا في البداية. تشمل الطرق التالية تقنيات التصنيف:
- النماذج الخطية
- آلات الدعم المتجهة
- الانحدار العشوائي
- أقرب الجيران
- الجيران الأقرب
- العمليات الغاوسية
- أشجار القرار
- طرق التجميع (التصويت)
- الخوارزميات متعددة الفئات ومتعددة المخرجات
- طرق التجميع (المصنف التصويتي)
- خوارزميات متعددة الفئات ومتعددة المخرجات (تصنيف متعدد الفئات ومتعدد العلامات، تصنيف متعدد الفئات ومتعدد المخرجات)
> يمكنك أيضًا استخدام [الشبكات العصبية لتصنيف البيانات](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification)، ولكن هذا خارج نطاق هذا الدرس.
### أي مصنف تختار؟
إذن، أي مصنف يجب أن تختار؟ غالبًا ما يكون تشغيل عدة مصنفات والبحث عن نتيجة جيدة طريقة لاختبار ذلك. تقدم مكتبة Scikit-learn [مقارنة جنبًا إلى جنب](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) على مجموعة بيانات تم إنشاؤها، تقارن بين KNeighbors، و SVC بطريقتين، و GaussianProcessClassifier، و DecisionTreeClassifier، و RandomForestClassifier، و MLPClassifier، و AdaBoostClassifier، و GaussianNB، و QuadraticDiscrinationAnalysis، مع عرض النتائج بشكل مرئي:
إذن، أي مصنف يجب أن تختار؟ غالبًا ما يكون تشغيل عدة مصنفات والبحث عن نتيجة جيدة طريقة لاختبار. تقدم Scikit-learn [مقارنة جنبًا إلى جنب](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) على مجموعة بيانات تم إنشاؤها، تقارن بين KNeighbors، SVC بطريقتين، GaussianProcessClassifier، DecisionTreeClassifier، RandomForestClassifier، MLPClassifier، AdaBoostClassifier، GaussianNB و QuadraticDiscrinationAnalysis، وتعرض النتائج بشكل مرئي:
![مقارنة المصنفات](../../../../translated_images/comparison.edfab56193a85e7fdecbeaa1b1f8c99e94adbf7178bed0de902090cf93d6734f.ar.png)
> الرسوم البيانية مأخوذة من توثيق Scikit-learn
![مقارنة المصنفات](../../../../4-Classification/2-Classifiers-1/images/comparison.png)
> الرسوم البيانية مأخوذة من وثائق Scikit-learn
> AutoML يحل هذه المشكلة بشكل أنيق عن طريق تشغيل هذه المقارنات في السحابة، مما يسمح لك باختيار أفضل خوارزمية لبياناتك. جربه [هنا](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)
> AutoML يحل هذه المشكلة بشكل أنيق عن طريق تشغيل هذه المقارنات في السحابة، مما يتيح لك اختيار أفضل خوارزمية لبياناتك. جربه [هنا](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)
### نهج أفضل
نهج أفضل من التخمين العشوائي هو اتباع الأفكار الموجودة في [ورقة الغش الخاصة بـ ML](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott) القابلة للتنزيل. هنا، نكتشف أنه بالنسبة لمشكلتنا متعددة الفئات، لدينا بعض الخيارات:
نهج أفضل من التخمين العشوائي هو اتباع الأفكار الموجودة في [ورقة الغش الخاصة بالتعلم الآلي](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott) القابلة للتنزيل. هنا، نكتشف أنه بالنسبة لمشكلتنا متعددة الفئات، لدينا بعض الخيارات:
![ورقة الغش للمشاكل متعددة الفئات](../../../../translated_images/cheatsheet.07a475ea444d22234cb8907a3826df5bdd1953efec94bd18e4496f36ff60624a.ar.png)
![ورقة الغش لمشاكل متعددة الفئات](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png)
> قسم من ورقة الغش الخاصة بخوارزميات Microsoft، يوضح خيارات التصنيف متعددة الفئات
✅ قم بتنزيل ورقة الغش هذه، واطبعها، وعلقها على حائطك!
### التفكير المنطقي
### التفكير
دعونا نحاول التفكير في الطرق المختلفة بناءً على القيود التي لدينا:
- **الشبكات العصبية ثقيلة جدًا**. بالنظر إلى مجموعة البيانات النظيفة ولكن الصغيرة، وحقيقة أننا نقوم بتدريب النموذج محليًا عبر دفاتر الملاحظات، فإن الشبكات العصبية ثقيلة جدًا لهذه المهمة.
- **لا يوجد مصنف ثنائي الفئات**. نحن لا نستخدم مصنفًا ثنائي الفئات، لذا فإن ذلك يستبعد one-vs-all.
- **الشبكات العصبية ثقيلة جدًا**. بالنظر إلى مجموعة البيانات النظيفة ولكن الصغيرة، وحقيقة أننا نقوم بالتدريب محليًا عبر دفاتر الملاحظات، فإن الشبكات العصبية ثقيلة جدًا لهذه المهمة.
- **لا يوجد مصنف ثنائي الفئات**. نحن لا نستخدم مصنف ثنائي الفئات، لذا يتم استبعاد طريقة واحد ضد الكل.
- **شجرة القرار أو الانحدار اللوجستي قد يعملان**. قد تعمل شجرة القرار، أو الانحدار اللوجستي للبيانات متعددة الفئات.
- **أشجار القرار المعززة متعددة الفئات تحل مشكلة مختلفة**. شجرة القرار المعززة متعددة الفئات أكثر ملاءمة للمهام غير المعلمية، مثل المهام المصممة لإنشاء تصنيفات، لذا فهي ليست مفيدة لنا.
- **أشجار القرار المعززة متعددة الفئات تحل مشكلة مختلفة**. شجرة القرار المعززة متعددة الفئات مناسبة بشكل أكبر للمهام غير المعلمية، مثل المهام المصممة لإنشاء تصنيفات، لذا فهي ليست مفيدة لنا.
### استخدام Scikit-learn
سنستخدم مكتبة Scikit-learn لتحليل بياناتنا. ومع ذلك، هناك العديد من الطرق لاستخدام الانحدار اللوجستي في Scikit-learn. ألقِ نظرة على [المعلمات التي يمكن تمريرها](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
سنستخدم Scikit-learn لتحليل بياناتنا. ومع ذلك، هناك العديد من الطرق لاستخدام الانحدار اللوجستي في Scikit-learn. ألقِ نظرة على [المعلمات التي يمكن تمريرها](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
بشكل أساسي، هناك معلمتان مهمتان - `multi_class` و `solver` - يجب تحديدهما عند طلب Scikit-learn لتنفيذ الانحدار اللوجستي. قيمة `multi_class` تطبق سلوكًا معينًا. وقيمة `solver` تحدد الخوارزمية المستخدمة. ليس كل الحلول يمكن إقرانها مع جميع قيم `multi_class`.
بشكل أساسي، هناك معلمتان مهمتان - `multi_class` و `solver` - يجب تحديدهما عند طلب Scikit-learn تنفيذ الانحدار اللوجستي. قيمة `multi_class` تطبق سلوكًا معينًا. وقيمة `solver` تحدد الخوارزمية المستخدمة. ليس كل الحلول يمكن أن تقترن بكل قيم `multi_class`.
وفقًا للتوثيق، في حالة التصنيف متعدد الفئات، فإن خوارزمية التدريب:
وفقًا للوثائق، في حالة التصنيف متعدد الفئات، فإن خوارزمية التدريب:
- **تستخدم مخطط one-vs-rest (OvR)**، إذا تم تعيين خيار `multi_class` إلى `ovr`
- **تستخدم خسارة الانتروبي المتقاطع**، إذا تم تعيين خيار `multi_class` إلى `multinomial`. (حاليًا، خيار `multinomial` مدعوم فقط من قبل الحلول lbfgs، sag، saga و newton-cg).
- **تستخدم مخطط واحد ضد الباقي (OvR)**، إذا تم تعيين خيار `multi_class` إلى `ovr`
- **تستخدم خسارة الانتروبيا المتقاطعة**، إذا تم تعيين خيار `multi_class` إلى `multinomial`. (حاليًا، خيار `multinomial` مدعوم فقط بواسطة الحلول lbfgs، sag، saga و newton-cg.)
> 🎓 "المخطط" هنا يمكن أن يكون إما 'ovr' (one-vs-rest) أو 'multinomial'. نظرًا لأن الانحدار اللوجستي مصمم لدعم التصنيف الثنائي، فإن هذه المخططات تسمح له بالتعامل بشكل أفضل مع مهام التصنيف متعددة الفئات. [المصدر](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 "المخطط" هنا يمكن أن يكون إما 'ovr' (واحد ضد الباقي) أو 'multinomial'. نظرًا لأن الانحدار اللوجستي مصمم لدعم التصنيف الثنائي، فإن هذه المخططات تسمح له بالتعامل بشكل أفضل مع مهام التصنيف متعددة الفئات. [المصدر](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 "الحل" يُعرف بأنه "الخوارزمية المستخدمة في مشكلة التحسين". [المصدر](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
تقدم مكتبة Scikit-learn هذا الجدول لشرح كيفية تعامل الحلول مع التحديات المختلفة التي تقدمها أنواع البيانات المختلفة:
تقدم Scikit-learn هذا الجدول لشرح كيفية تعامل الحلول مع التحديات المختلفة التي تقدمها هياكل البيانات المختلفة:
![الحلول](../../../../translated_images/solvers.5fc648618529e627dfac29b917b3ccabda4b45ee8ed41b0acb1ce1441e8d1ef1.ar.png)
![الحلول](../../../../4-Classification/2-Classifiers-1/images/solvers.png)
## تمرين - تقسيم البيانات
يمكننا التركيز على الانحدار اللوجستي كأول تجربة تدريبية نظرًا لأنك تعلمت عنه مؤخرًا في درس سابق.
قم بتقسيم بياناتك إلى مجموعات تدريب واختبار عن طريق استدعاء `train_test_split()`:
يمكننا التركيز على الانحدار اللوجستي لتجربة التدريب الأولى لدينا نظرًا لأنك تعلمت عنه مؤخرًا في درس سابق.
قسّم بياناتك إلى مجموعات تدريب واختبار باستخدام `train_test_split()`:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
@ -160,9 +159,9 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
## تمرين - تطبيق الانحدار اللوجستي
نظرًا لأنك تستخدم حالة التصنيف متعددة الفئات، تحتاج إلى اختيار _مخطط_ للاستخدام وتحديد _الحل_ الذي ستستخدمه. استخدم LogisticRegression مع إعداد متعدد الفئات والحل **liblinear** للتدريب.
نظرًا لأنك تستخدم حالة التصنيف متعدد الفئات، تحتاج إلى اختيار ما _المخطط_ الذي ستستخدمه وما _الحل_ الذي ستحدده. استخدم LogisticRegression مع إعداد متعدد الفئات والمحلل **liblinear** للتدريب.
1. قم بإنشاء انحدار لوجستي مع تعيين multi_class إلى `ovr` والحل إلى `liblinear`:
1. قم بإنشاء انحدار لوجستي مع تعيين multi_class إلى `ovr` والمحلل إلى `liblinear`:
```python
lr = LogisticRegression(multi_class='ovr',solver='liblinear')
@ -172,7 +171,7 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
print ("Accuracy is {}".format(accuracy))
```
✅ جرب حلاً مختلفًا مثل `lbfgs`، الذي يتم تعيينه غالبًا كإعداد افتراضي
✅ جرب محللًا مختلفًا مثل `lbfgs`، الذي يتم تعيينه غالبًا كإعداد افتراضي
> ملاحظة، استخدم وظيفة Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) لتسطيح بياناتك عند الحاجة.
الدقة جيدة بنسبة تزيد عن **80%**!
@ -190,7 +189,7 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
cuisine: indian
```
✅ جرّب رقم صف مختلف وتحقق من النتائج.
✅ جرب رقم صف مختلف وتحقق من النتائج.
1. بالتعمق أكثر، يمكنك التحقق من دقة هذا التنبؤ:
@ -204,7 +203,7 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
topPrediction.head()
```
يتم طباعة النتيجة - المطبخ الهندي هو أفضل تخمين للنموذج، مع احتمال جيد:
يتم طباعة النتيجة - المطبخ الهندي هو أفضل تخمين، مع احتمال جيد:
| | 0 |
| -------: | -------: |
@ -223,26 +222,26 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
print(classification_report(y_test,y_pred))
```
| | الدقة | الاسترجاع | f1-score | الدعم |
| ------------ | ------ | --------- | -------- | ----- |
| chinese | 0.73 | 0.71 | 0.72 | 229 |
| indian | 0.91 | 0.93 | 0.92 | 254 |
| japanese | 0.70 | 0.75 | 0.72 | 220 |
| korean | 0.86 | 0.76 | 0.81 | 242 |
| thai | 0.79 | 0.85 | 0.82 | 254 |
| الدقة | 0.80 | 1199 | | |
| المتوسط الكلي | 0.80 | 0.80 | 0.80 | 1199 |
| المتوسط الموزون | 0.80 | 0.80 | 0.80 | 1199 |
| | الدقة | الاسترجاع | درجة F1 | الدعم |
| ------------ | ------ | --------- | ------- | ------ |
| chinese | 0.73 | 0.71 | 0.72 | 229 |
| indian | 0.91 | 0.93 | 0.92 | 254 |
| japanese | 0.70 | 0.75 | 0.72 | 220 |
| korean | 0.86 | 0.76 | 0.81 | 242 |
| thai | 0.79 | 0.85 | 0.82 | 254 |
| الدقة | 0.80 | 1199 | | |
| المتوسط الكلي | 0.80 | 0.80 | 0.80 | 1199 |
| المتوسط الموزون | 0.80 | 0.80 | 0.80 | 1199 |
## 🚀التحدي
في هذا الدرس، استخدمت بياناتك المنظفة لبناء نموذج تعلم آلي يمكنه التنبؤ بالمطبخ الوطني بناءً على سلسلة من المكونات. خذ بعض الوقت لقراءة الخيارات العديدة التي يوفرها Scikit-learn لتصنيف البيانات. تعمق أكثر في مفهوم 'solver' لفهم ما يحدث خلف الكواليس.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/22/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
تعمق أكثر في الرياضيات وراء الانحدار اللوجستي في [هذا الدرس](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
تعمق قليلاً في الرياضيات وراء الانحدار اللوجستي في [هذا الدرس](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
## الواجب
[ادرس الحلول](assignment.md)
@ -250,4 +249,4 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,17 +1,17 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "808a71076f76ae8f5458862a8edd9215",
"translation_date": "2025-08-29T13:57:56+00:00",
"original_hash": "49047911108adc49d605cddfb455749c",
"translation_date": "2025-09-04T20:50:07+00:00",
"source_file": "4-Classification/3-Classifiers-2/README.md",
"language_code": "ar"
}
-->
# مصنفات المأكولات 2
في درس التصنيف الثاني هذا، ستستكشف المزيد من الطرق لتصنيف البيانات الرقمية. ستتعلم أيضًا العواقب المترتبة على اختيار مصنف معين بدلاً من الآخر.
في درس التصنيف الثاني هذا، ستستكشف طرقًا إضافية لتصنيف البيانات الرقمية. كما ستتعرف على العواقب المترتبة على اختيار مصنف معين بدلاً من آخر.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/23/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
### المتطلبات الأساسية
@ -19,25 +19,25 @@ CO_OP_TRANSLATOR_METADATA:
### التحضير
قمنا بتحميل ملف _notebook.ipynb_ الخاص بك مع مجموعة البيانات النظيفة وقمنا بتقسيمها إلى إطاري بيانات X و y، جاهزة لعملية بناء النموذج.
قمنا بتحميل ملف _notebook.ipynb_ الخاص بك مع مجموعة البيانات النظيفة وقمنا بتقسيمها إلى إطاري بيانات X و y، وهي جاهزة لعملية بناء النموذج.
## خريطة التصنيف
في السابق، تعلمت عن الخيارات المختلفة المتاحة لتصنيف البيانات باستخدام ورقة الغش الخاصة بـ Microsoft. تقدم مكتبة Scikit-learn ورقة غش مشابهة ولكن أكثر تفصيلًا يمكن أن تساعدك بشكل أكبر في تضييق نطاق المصنفات (مصطلح آخر للمصنفات):
في الدرس السابق، تعلمت عن الخيارات المختلفة المتاحة لتصنيف البيانات باستخدام ورقة الغش الخاصة بمايكروسوفت. تقدم مكتبة Scikit-learn ورقة غش مشابهة ولكن أكثر تفصيلًا يمكن أن تساعدك بشكل أكبر في تضييق نطاق المصنفات (وهو مصطلح آخر للمصنفات):
![خريطة تعلم الآلة من Scikit-learn](../../../../translated_images/map.e963a6a51349425ab107b38f6c7307eb4c0d0c7ccdd2e81a5e1919292bab9ac7.ar.png)
> نصيحة: [قم بزيارة هذه الخريطة عبر الإنترنت](https://scikit-learn.org/stable/tutorial/machine_learning_map/) وانقر على المسار لقراءة الوثائق.
![خريطة تعلم الآلة من Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png)
> نصيحة: [قم بزيارة هذه الخريطة عبر الإنترنت](https://scikit-learn.org/stable/tutorial/machine_learning_map/) وانقر على المسارات لقراءة الوثائق.
### الخطة
هذه الخريطة مفيدة جدًا بمجرد أن تكون لديك فهم واضح لبياناتك، حيث يمكنك "السير" على طول مساراتها لاتخاذ قرار:
تعد هذه الخريطة مفيدة جدًا بمجرد أن تكون لديك فكرة واضحة عن بياناتك، حيث يمكنك "السير" على طول مساراتها لاتخاذ قرار:
- لدينا >50 عينة
- نريد التنبؤ بفئة
- لدينا بيانات معنونة
- لدينا أقل من 100 ألف عينة
- ✨ يمكننا اختيار Linear SVC
- إذا لم ينجح ذلك، نظرًا لأن لدينا بيانات رقمية
- إذا لم ينجح ذلك، بما أن لدينا بيانات رقمية
- يمكننا تجربة ✨ KNeighbors Classifier
- إذا لم ينجح ذلك، جرب ✨ SVC و ✨ Ensemble Classifiers
@ -45,9 +45,9 @@ CO_OP_TRANSLATOR_METADATA:
## تمرين - تقسيم البيانات
وفقًا لهذا المسار، يجب أن نبدأ باستيراد بعض المكتبات اللازمة.
باتباع هذا المسار، يجب أن نبدأ باستيراد بعض المكتبات اللازمة.
1. قم باستيراد المكتبات المطلوبة:
1. استيراد المكتبات المطلوبة:
```python
from sklearn.neighbors import KNeighborsClassifier
@ -59,7 +59,7 @@ CO_OP_TRANSLATOR_METADATA:
import numpy as np
```
1. قم بتقسيم بيانات التدريب والاختبار:
1. قسّم بيانات التدريب والاختبار:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
@ -67,13 +67,13 @@ CO_OP_TRANSLATOR_METADATA:
## مصنف Linear SVC
التجميع باستخدام Support-Vector (SVC) هو جزء من عائلة تقنيات تعلم الآلة Support-Vector Machines (تعرف على المزيد عنها أدناه). في هذه الطريقة، يمكنك اختيار "kernel" لتحديد كيفية تجميع العلامات. يشير المعامل 'C' إلى "التنظيم" الذي ينظم تأثير المعاملات. يمكن أن يكون kernel واحدًا من [عدة خيارات](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC)؛ هنا نضبطه على 'linear' لضمان استخدام Linear SVC. يتم ضبط الاحتمالية افتراضيًا على 'false'؛ هنا نضبطها على 'true' للحصول على تقديرات الاحتمالية. نضبط الحالة العشوائية على '0' لخلط البيانات للحصول على الاحتمالات.
يعد Support-Vector Clustering (SVC) أحد أفراد عائلة تقنيات تعلم الآلة Support-Vector Machines (تعرف على المزيد عنها أدناه). في هذه الطريقة، يمكنك اختيار "نواة" لتحديد كيفية تجميع العلامات. يشير المعامل 'C' إلى "التنظيم" الذي ينظم تأثير المعاملات. يمكن أن تكون النواة واحدة من [عدة خيارات](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC)؛ هنا نضبطها على 'linear' لضمان استخدام Linear SVC. يتم ضبط الاحتمالية افتراضيًا على 'false'؛ هنا نضبطها على 'true' للحصول على تقديرات الاحتمالية. نضبط الحالة العشوائية على '0' لخلط البيانات للحصول على الاحتمالات.
### تمرين - تطبيق Linear SVC
ابدأ بإنشاء مصفوفة من المصنفات. ستضيف تدريجيًا إلى هذه المصفوفة أثناء الاختبار.
1. ابدأ بـ Linear SVC:
1. ابدأ باستخدام Linear SVC:
```python
C = 10
@ -83,7 +83,7 @@ CO_OP_TRANSLATOR_METADATA:
}
```
2. قم بتدريب النموذج باستخدام Linear SVC واطبع التقرير:
2. قم بتدريب النموذج باستخدام Linear SVC واطبع تقريرًا:
```python
n_classifiers = len(classifiers)
@ -116,11 +116,11 @@ CO_OP_TRANSLATOR_METADATA:
## مصنف K-Neighbors
K-Neighbors هو جزء من عائلة طرق تعلم الآلة "الجيران"، والتي يمكن استخدامها للتعلم الموجه وغير الموجه. في هذه الطريقة، يتم إنشاء عدد محدد مسبقًا من النقاط ويتم جمع البيانات حول هذه النقاط بحيث يمكن التنبؤ بالعلامات العامة للبيانات.
K-Neighbors هو جزء من عائلة "الجيران" لطرق تعلم الآلة، والتي يمكن استخدامها للتعلم الموجه وغير الموجه. في هذه الطريقة، يتم إنشاء عدد محدد مسبقًا من النقاط ويتم جمع البيانات حول هذه النقاط بحيث يمكن التنبؤ بالعلامات العامة للبيانات.
### تمرين - تطبيق مصنف K-Neighbors
كان المصنف السابق جيدًا وعمل بشكل جيد مع البيانات، ولكن ربما يمكننا الحصول على دقة أفضل. جرب مصنف K-Neighbors.
كان المصنف السابق جيدًا وعمل بشكل جيد مع البيانات، ولكن ربما يمكننا تحقيق دقة أفضل. جرب مصنف K-Neighbors.
1. أضف سطرًا إلى مصفوفة المصنفات (أضف فاصلة بعد عنصر Linear SVC):
@ -145,15 +145,15 @@ K-Neighbors هو جزء من عائلة طرق تعلم الآلة "الجيرا
weighted avg 0.76 0.74 0.74 1199
```
✅ تعرف على [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors)
✅ تعرف على المزيد حول [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors)
## مصنف Support Vector
مصنفات Support-Vector هي جزء من عائلة [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) من طرق تعلم الآلة التي تُستخدم لمهام التصنيف والانحدار. تقوم SVMs "برسم أمثلة التدريب كنقاط في الفضاء" لزيادة المسافة بين فئتين. يتم رسم البيانات اللاحقة في هذا الفضاء بحيث يمكن التنبؤ بفئتها.
مصنفات Support-Vector هي جزء من عائلة [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) لطرق تعلم الآلة التي تُستخدم لمهام التصنيف والانحدار. تقوم SVMs "برسم أمثلة التدريب كنقاط في الفضاء" لزيادة المسافة بين فئتين. يتم بعد ذلك رسم البيانات اللاحقة في هذا الفضاء بحيث يمكن التنبؤ بفئتها.
### تمرين - تطبيق مصنف Support Vector
دعنا نحاول الحصول على دقة أفضل قليلاً باستخدام مصنف Support Vector.
دعنا نحاول تحقيق دقة أفضل قليلاً باستخدام مصنف Support Vector.
1. أضف فاصلة بعد عنصر K-Neighbors، ثم أضف هذا السطر:
@ -178,18 +178,18 @@ K-Neighbors هو جزء من عائلة طرق تعلم الآلة "الجيرا
weighted avg 0.84 0.83 0.83 1199
```
✅ تعرف على [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm)
✅ تعرف على المزيد حول [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm)
## المصنفات التجميعية
## المصنفات المجمعة (Ensemble Classifiers)
دعنا نتبع المسار حتى النهاية، على الرغم من أن الاختبار السابق كان جيدًا جدًا. دعنا نجرب بعض المصنفات التجميعية، تحديدًا Random Forest و AdaBoost:
دعنا نتبع المسار حتى النهاية، على الرغم من أن الاختبار السابق كان جيدًا جدًا. دعنا نجرب بعض "المصنفات المجمعة"، وتحديدًا Random Forest و AdaBoost:
```python
'RFST': RandomForestClassifier(n_estimators=100),
'ADA': AdaBoostClassifier(n_estimators=100)
```
النتيجة جيدة جدًا، خاصة لـ Random Forest:
النتيجة جيدة جدًا، خاصة بالنسبة لـ Random Forest:
```output
Accuracy (train) for RFST: 84.5%
@ -219,31 +219,31 @@ Accuracy (train) for ADA: 72.4%
weighted avg 0.73 0.72 0.72 1199
```
✅ تعرف على [المصنفات التجميعية](https://scikit-learn.org/stable/modules/ensemble.html)
✅ تعرف على المزيد حول [المصنفات المجمعة](https://scikit-learn.org/stable/modules/ensemble.html)
هذه الطريقة في تعلم الآلة "تجمع توقعات عدة مصنفات أساسية" لتحسين جودة النموذج. في مثالنا، استخدمنا Random Trees و AdaBoost.
تجمع هذه الطريقة في تعلم الآلة "تنبؤات عدة مصنفات أساسية" لتحسين جودة النموذج. في مثالنا، استخدمنا Random Trees و AdaBoost.
- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest)، وهي طريقة تعتمد على المتوسط، تبني "غابة" من "أشجار القرار" مع إضافة عشوائية لتجنب الإفراط في التخصيص. يتم ضبط معامل n_estimators على عدد الأشجار.
- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest)، وهي طريقة تعتمد على المتوسط، تبني "غابة" من "أشجار القرار" مع إضافة العشوائية لتجنب الإفراط في التخصيص. يتم ضبط معامل n_estimators على عدد الأشجار.
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) يقوم بتطبيق مصنف على مجموعة البيانات ثم تطبيق نسخ من هذا المصنف على نفس مجموعة البيانات. يركز على أوزان العناصر التي تم تصنيفها بشكل غير صحيح ويعدل التخصيص للمصنف التالي لتصحيحها.
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) يقوم بتدريب مصنف على مجموعة بيانات ثم يقوم بتدريب نسخ من هذا المصنف على نفس مجموعة البيانات. يركز على أوزان العناصر التي تم تصنيفها بشكل خاطئ ويعدل التخصيص للمصنف التالي لتصحيحها.
---
## 🚀التحدي
## 🚀تحدي
كل واحدة من هذه التقنيات لديها عدد كبير من المعاملات التي يمكنك تعديلها. قم بالبحث عن المعاملات الافتراضية لكل تقنية وفكر في ما يعنيه تعديل هذه المعاملات لجودة النموذج.
كل من هذه التقنيات لديها عدد كبير من المعاملات التي يمكنك تعديلها. قم بالبحث عن المعاملات الافتراضية لكل تقنية وفكر في ما يعنيه تعديل هذه المعاملات لجودة النموذج.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/24/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
هناك الكثير من المصطلحات في هذه الدروس، لذا خذ دقيقة لمراجعة [هذه القائمة](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) من المصطلحات المفيدة!
## الواجب
## الواجب
[لعب المعاملات](assignment.md)
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,37 +1,37 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "ad2cf19d7490247558d20a6a59650d13",
"translation_date": "2025-08-29T13:55:55+00:00",
"original_hash": "61bdec27ed2da8b098cd9065405d9bb0",
"translation_date": "2025-09-04T20:49:44+00:00",
"source_file": "4-Classification/4-Applied/README.md",
"language_code": "ar"
}
-->
# بناء تطبيق ويب لتوصية المأكولات
في هذا الدرس، ستقوم ببناء نموذج تصنيف باستخدام بعض التقنيات التي تعلمتها في الدروس السابقة ومع مجموعة بيانات المأكولات الشهية التي تم استخدامها طوال هذه السلسلة. بالإضافة إلى ذلك، ستقوم ببناء تطبيق ويب صغير لاستخدام النموذج المحفوظ، مستفيدًا من بيئة تشغيل Onnx للويب.
في هذه الدرس، ستقوم ببناء نموذج تصنيف باستخدام بعض التقنيات التي تعلمتها في الدروس السابقة ومع مجموعة بيانات المأكولات الشهية التي تم استخدامها طوال هذه السلسلة. بالإضافة إلى ذلك، ستقوم ببناء تطبيق ويب صغير لاستخدام النموذج المحفوظ، مستفيدًا من تشغيل الويب الخاص بـ Onnx.
إحدى أكثر الاستخدامات العملية فائدة لتعلم الآلة هي بناء أنظمة التوصية، ويمكنك اتخاذ الخطوة الأولى في هذا الاتجاه اليوم!
واحدة من أكثر الاستخدامات العملية المفيدة لتعلم الآلة هي بناء أنظمة التوصية، ويمكنك اتخاذ الخطوة الأولى في هذا الاتجاه اليوم!
[![عرض هذا التطبيق](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "تطبيق تعلم الآلة")
[![عرض هذا التطبيق](https://img.youtube.com/vi/17wdM9AHMfg/0.jpg)](https://youtu.be/17wdM9AHMfg "Applied ML")
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: جين لوبر تبني تطبيق ويب باستخدام بيانات تصنيف المأكولات
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: جين لوبر تبني تطبيق ويب باستخدام بيانات المأكولات المصنفة
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/25/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
في هذا الدرس ستتعلم:
- كيفية بناء نموذج وحفظه كملف Onnx
- كيفية بناء نموذج وحفظه كـ Onnx model
- كيفية استخدام Netron لفحص النموذج
- كيفية استخدام النموذج الخاص بك في تطبيق ويب للاستدلال
- كيفية استخدام النموذج الخاص بك في تطبيق ويب للاستنتاج
## بناء النموذج الخاص بك
بناء أنظمة تعلم الآلة التطبيقية هو جزء مهم من الاستفادة من هذه التقنيات في أنظمة عملك. يمكنك استخدام النماذج داخل تطبيقات الويب الخاصة بك (وبالتالي استخدامها في وضع عدم الاتصال إذا لزم الأمر) باستخدام Onnx.
بناء أنظمة تعلم الآلة التطبيقية هو جزء مهم من الاستفادة من هذه التقنيات في أنظمة الأعمال الخاصة بك. يمكنك استخدام النماذج داخل تطبيقات الويب الخاصة بك (وبالتالي استخدامها في سياق غير متصل إذا لزم الأمر) باستخدام Onnx.
في [درس سابق](../../3-Web-App/1-Web-App/README.md)، قمت ببناء نموذج انحدار حول مشاهدات الأجسام الطائرة المجهولة، وقمت بحفظه باستخدام "pickle"، واستخدمته في تطبيق Flask. على الرغم من أن هذه البنية مفيدة جدًا، إلا أنها تطبيق Python كامل، وقد تتطلب متطلباتك استخدام تطبيق JavaScript.
في [درس سابق](../../3-Web-App/1-Web-App/README.md)، قمت ببناء نموذج انحدار حول مشاهدات UFO، وقمت بـ "تخزينه"، واستخدمته في تطبيق Flask. بينما هذه البنية مفيدة جدًا للمعرفة، فهي تطبيق Python كامل، وقد تتطلب احتياجاتك استخدام تطبيق JavaScript.
في هذا الدرس، يمكنك بناء نظام أساسي يعتمد على JavaScript للاستدلال. ولكن أولاً، تحتاج إلى تدريب نموذج وتحويله للاستخدام مع Onnx.
في هذا الدرس، يمكنك بناء نظام أساسي يعتمد على JavaScript للاستنتاج. ولكن أولاً، تحتاج إلى تدريب نموذج وتحويله للاستخدام مع Onnx.
## تمرين - تدريب نموذج التصنيف
@ -46,14 +46,14 @@ CO_OP_TRANSLATOR_METADATA:
تحتاج إلى '[skl2onnx](https://onnx.ai/sklearn-onnx/)' للمساعدة في تحويل نموذج Scikit-learn الخاص بك إلى تنسيق Onnx.
1. ثم، اعمل مع بياناتك بنفس الطريقة التي قمت بها في الدروس السابقة، عن طريق قراءة ملف CSV باستخدام `read_csv()`:
1. ثم، قم بمعالجة بياناتك بنفس الطريقة التي قمت بها في الدروس السابقة، عن طريق قراءة ملف CSV باستخدام `read_csv()`:
```python
data = pd.read_csv('../data/cleaned_cuisines.csv')
data.head()
```
1. قم بإزالة العمودين الأولين غير الضروريين واحفظ البيانات المتبقية كـ 'X':
1. قم بإزالة أول عمودين غير ضروريين واحفظ البيانات المتبقية كـ 'X':
```python
X = data.iloc[:,2:]
@ -72,7 +72,7 @@ CO_OP_TRANSLATOR_METADATA:
سنستخدم مكتبة 'SVC' التي تتمتع بدقة جيدة.
1. استيراد المكتبات المناسبة من Scikit-learn:
1. قم باستيراد المكتبات المناسبة من Scikit-learn:
```python
from sklearn.model_selection import train_test_split
@ -81,13 +81,13 @@ CO_OP_TRANSLATOR_METADATA:
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report
```
1. فصل مجموعات التدريب والاختبار:
1. قم بفصل مجموعات التدريب والاختبار:
```python
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3)
```
1. بناء نموذج تصنيف SVC كما فعلت في الدرس السابق:
1. قم ببناء نموذج تصنيف SVC كما فعلت في الدرس السابق:
```python
model = SVC(kernel='linear', C=10, probability=True,random_state=0)
@ -106,7 +106,7 @@ CO_OP_TRANSLATOR_METADATA:
print(classification_report(y_test,y_pred))
```
كما رأينا من قبل، الدقة جيدة:
كما رأينا سابقًا، الدقة جيدة:
```output
precision recall f1-score support
@ -124,9 +124,9 @@ CO_OP_TRANSLATOR_METADATA:
### تحويل النموذج الخاص بك إلى Onnx
تأكد من إجراء التحويل باستخدام العدد الصحيح من التنسورات. تحتوي مجموعة البيانات هذه على 380 مكونًا مدرجًا، لذا تحتاج إلى تدوين هذا الرقم في `FloatTensorType`:
تأكد من إجراء التحويل باستخدام الرقم الصحيح للتنسور. تحتوي هذه المجموعة من البيانات على 380 مكونًا مدرجًا، لذا تحتاج إلى تدوين هذا الرقم في `FloatTensorType`:
1. قم بالتحويل باستخدام عدد التنسورات 380.
1. قم بالتحويل باستخدام رقم تنسور 380.
```python
from skl2onnx import convert_sklearn
@ -136,7 +136,7 @@ CO_OP_TRANSLATOR_METADATA:
options = {id(model): {'nocl': True, 'zipmap': False}}
```
1. أنشئ ملف onx واحفظه كملف **model.onnx**:
1. قم بإنشاء ملف onx واحفظه كملف **model.onnx**:
```python
onx = convert_sklearn(model, initial_types=initial_type, options=options)
@ -144,15 +144,15 @@ CO_OP_TRANSLATOR_METADATA:
f.write(onx.SerializeToString())
```
> ملاحظة، يمكنك تمرير [خيارات](https://onnx.ai/sklearn-onnx/parameterized.html) في نص التحويل الخاص بك. في هذه الحالة، قمنا بتمرير 'nocl' ليكون True و'zipmap' ليكون False. نظرًا لأن هذا نموذج تصنيف، لديك خيار إزالة ZipMap الذي ينتج قائمة من القواميس (غير ضروري). يشير `nocl` إلى تضمين معلومات الفئة في النموذج. قم بتقليل حجم النموذج الخاص بك عن طريق تعيين `nocl` إلى 'True'.
> ملاحظة، يمكنك تمرير [خيارات](https://onnx.ai/sklearn-onnx/parameterized.html) في نص التحويل الخاص بك. في هذه الحالة، قمنا بتمرير 'nocl' ليكون True و 'zipmap' ليكون False. نظرًا لأن هذا نموذج تصنيف، لديك خيار إزالة ZipMap الذي ينتج قائمة من القواميس (غير ضروري). `nocl` يشير إلى تضمين معلومات التصنيف في النموذج. قم بتقليل حجم النموذج الخاص بك عن طريق تعيين `nocl` إلى 'True'.
تشغيل الدفتر بالكامل الآن سيبني نموذج Onnx ويحفظه في هذا المجلد.
تشغيل دفتر الملاحظات بالكامل الآن سيبني نموذج Onnx ويحفظه في هذا المجلد.
## عرض النموذج الخاص بك
نماذج Onnx ليست مرئية جدًا في Visual Studio Code، ولكن هناك برنامج مجاني جيد يستخدمه العديد من الباحثين لعرض النموذج للتأكد من أنه تم بناؤه بشكل صحيح. قم بتنزيل [Netron](https://github.com/lutzroeder/Netron) وافتح ملف model.onnx الخاص بك. يمكنك رؤية نموذجك البسيط مصورًا، مع مدخلاته الـ 380 والمصنف المدرج:
نماذج Onnx ليست مرئية جدًا في Visual Studio Code، ولكن هناك برنامج مجاني جيد يستخدمه العديد من الباحثين لتصور النموذج للتأكد من أنه تم بناؤه بشكل صحيح. قم بتنزيل [Netron](https://github.com/lutzroeder/Netron) وافتح ملف model.onnx الخاص بك. يمكنك رؤية النموذج البسيط الخاص بك مصورًا، مع مدخلاته الـ 380 والمصنف المدرج:
![عرض Netron](../../../../translated_images/netron.a05f39410211915e0f95e2c0e8b88f41e7d13d725faf660188f3802ba5c9e831.ar.png)
![عرض Netron](../../../../4-Classification/4-Applied/images/netron.png)
Netron هو أداة مفيدة لعرض النماذج الخاصة بك.
@ -160,7 +160,7 @@ Netron هو أداة مفيدة لعرض النماذج الخاصة بك.
## بناء تطبيق ويب للتوصية
يمكنك استخدام النموذج الخاص بك مباشرة في تطبيق ويب. تتيح لك هذه البنية أيضًا تشغيله محليًا وحتى في وضع عدم الاتصال إذا لزم الأمر. ابدأ بإنشاء ملف `index.html` في نفس المجلد حيث قمت بتخزين ملف `model.onnx`.
يمكنك استخدام النموذج الخاص بك مباشرة في تطبيق ويب. هذه البنية تتيح لك أيضًا تشغيله محليًا وحتى في وضع غير متصل إذا لزم الأمر. ابدأ بإنشاء ملف `index.html` في نفس المجلد حيث قمت بتخزين ملف `model.onnx`.
1. في هذا الملف _index.html_، أضف العلامات التالية:
@ -221,11 +221,11 @@ Netron هو أداة مفيدة لعرض النماذج الخاصة بك.
</div>
```
لاحظ أن كل مربع اختيار تم إعطاؤه قيمة. تعكس هذه القيمة الفهرس حيث يوجد المكون وفقًا لمجموعة البيانات. التفاح، على سبيل المثال، في هذه القائمة الأبجدية، يشغل العمود الخامس، لذا فإن قيمته هي '4' لأننا نبدأ العد من 0. يمكنك استشارة [جدول المكونات](../../../../4-Classification/data/ingredient_indexes.csv) لاكتشاف فهرس مكون معين.
لاحظ أن كل مربع اختيار تم إعطاؤه قيمة. هذا يعكس الفهرس حيث يتم العثور على المكون وفقًا لمجموعة البيانات. التفاح، على سبيل المثال، في هذه القائمة الأبجدية، يحتل العمود الخامس، لذا قيمته هي '4' لأننا نبدأ العد من 0. يمكنك الرجوع إلى [جدول بيانات المكونات](../../../../4-Classification/data/ingredient_indexes.csv) لاكتشاف فهرس مكون معين.
أثناء استمرارك في العمل في ملف index.html، أضف كتلة نصية حيث يتم استدعاء النموذج بعد إغلاق العلامة `</div>`.
أثناء استمرار العمل في ملف index.html، أضف كتلة نصية حيث يتم استدعاء النموذج بعد الإغلاق النهائي لـ `</div>`.
1. أولاً، استورد [Onnx Runtime](https://www.onnxruntime.ai/):
1. أولاً، قم باستيراد [Onnx Runtime](https://www.onnxruntime.ai/):
```html
<script src="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.9.0/dist/ort.min.js"></script>
@ -233,7 +233,7 @@ Netron هو أداة مفيدة لعرض النماذج الخاصة بك.
> يتم استخدام Onnx Runtime لتمكين تشغيل نماذج Onnx الخاصة بك عبر مجموعة واسعة من منصات الأجهزة، بما في ذلك التحسينات وواجهة برمجة التطبيقات للاستخدام.
1. بمجرد أن تكون بيئة التشغيل في مكانها، يمكنك استدعاؤها:
1. بمجرد أن يكون Runtime في مكانه، يمكنك استدعاؤه:
```html
<script>
@ -287,41 +287,41 @@ Netron هو أداة مفيدة لعرض النماذج الخاصة بك.
في هذا الكود، هناك عدة أمور تحدث:
1. قمت بإنشاء مصفوفة من 380 قيمة ممكنة (1 أو 0) ليتم تعيينها وإرسالها إلى النموذج للاستدلال، بناءً على ما إذا كان مربع الاختيار للمكون محددًا.
1. قمت بإنشاء مصفوفة من 380 قيمة ممكنة (1 أو 0) ليتم إعدادها وإرسالها إلى النموذج للاستنتاج، بناءً على ما إذا كان مربع اختيار المكون محددًا.
2. قمت بإنشاء مصفوفة من مربعات الاختيار وطريقة لتحديد ما إذا كانت محددة في وظيفة `init` التي يتم استدعاؤها عند بدء التطبيق. عندما يتم تحديد مربع اختيار، يتم تعديل مصفوفة `ingredients` لتعكس المكون المختار.
3. قمت بإنشاء وظيفة `testCheckboxes` التي تتحقق مما إذا كان أي مربع اختيار قد تم تحديده.
4. تستخدم وظيفة `startInference` عند الضغط على الزر، وإذا تم تحديد أي مربع اختيار، تبدأ عملية الاستدلال.
5. تتضمن روتين الاستدلال:
4. تستخدم وظيفة `startInference` عندما يتم الضغط على الزر، وإذا تم تحديد أي مربع اختيار، تبدأ الاستنتاج.
5. يتضمن روتين الاستنتاج:
1. إعداد تحميل غير متزامن للنموذج
2. إنشاء بنية Tensor لإرسالها إلى النموذج
3. إنشاء 'feeds' التي تعكس الإدخال `float_input` الذي قمت بإنشائه عند تدريب النموذج الخاص بك (يمكنك استخدام Netron للتحقق من هذا الاسم)
3. إنشاء 'feeds' التي تعكس الإدخال `float_input` الذي قمت بإنشائه عند تدريب النموذج الخاص بك (يمكنك استخدام Netron للتحقق من الاسم)
4. إرسال هذه 'feeds' إلى النموذج وانتظار الرد
## اختبار التطبيق الخاص بك
افتح جلسة طرفية في Visual Studio Code في المجلد حيث يوجد ملف index.html الخاص بك. تأكد من أن لديك [http-server](https://www.npmjs.com/package/http-server) مثبتًا عالميًا، واكتب `http-server` في الموجه. يجب أن يفتح localhost ويمكنك عرض تطبيق الويب الخاص بك. تحقق من المأكولات الموصى بها بناءً على المكونات المختلفة:
افتح جلسة طرفية في Visual Studio Code في المجلد حيث يوجد ملف index.html الخاص بك. تأكد من أن لديك [http-server](https://www.npmjs.com/package/http-server) مثبتًا عالميًا، واكتب `http-server` في الموجه. يجب أن يفتح localhost ويمكنك عرض تطبيق الويب الخاص بك. تحقق من الطبق الموصى به بناءً على المكونات المختلفة:
![تطبيق ويب المكونات](../../../../translated_images/web-app.4c76450cabe20036f8ec6d5e05ccc0c1c064f0d8f2fe3304d3bcc0198f7dc139.ar.png)
![تطبيق ويب المكونات](../../../../4-Classification/4-Applied/images/web-app.png)
تهانينا، لقد أنشأت تطبيق ويب للتوصية يحتوي على عدد قليل من الحقول. خذ بعض الوقت لتطوير هذا النظام!
تهانينا، لقد قمت بإنشاء تطبيق ويب للتوصية مع بعض الحقول. خذ بعض الوقت لتطوير هذا النظام!
## 🚀تحدي
## 🚀التحدي
تطبيق الويب الخاص بك بسيط جدًا، لذا استمر في تطويره باستخدام المكونات وفهارسها من بيانات [ingredient_indexes](../../../../4-Classification/data/ingredient_indexes.csv). ما هي تركيبات النكهات التي تعمل على إنشاء طبق وطني معين؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/26/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
بينما تناول هذا الدرس فقط فائدة إنشاء نظام توصية لمكونات الطعام، فإن هذا المجال من تطبيقات تعلم الآلة غني جدًا بالأمثلة. اقرأ المزيد حول كيفية بناء هذه الأنظمة:
بينما تناول هذا الدرس فقط فائدة إنشاء نظام توصية لمكونات الطعام، فإن هذا المجال من تطبيقات تعلم الآلة غني بالأمثلة. اقرأ المزيد حول كيفية بناء هذه الأنظمة:
- https://www.sciencedirect.com/topics/computer-science/recommendation-engine
- https://www.technologyreview.com/2014/08/25/171547/the-ultimate-challenge-for-recommendation-engines/
- https://www.technologyreview.com/2015/03/23/168831/everything-is-a-recommendation/
## الواجب
## الواجب
[بناء نظام توصية جديد](assignment.md)
[قم ببناء نظام توصية جديد](assignment.md)
---

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "0ab69b161efd7a41d325ee28b29415d7",
"translation_date": "2025-08-29T13:20:23+00:00",
"original_hash": "730225ea274c9174fe688b21d421539d",
"translation_date": "2025-09-04T20:43:28+00:00",
"source_file": "5-Clustering/1-Visualize/README.md",
"language_code": "ar"
}
@ -15,7 +15,7 @@ CO_OP_TRANSLATOR_METADATA:
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو. أثناء دراستك لتعلم الآلة باستخدام التجميع، استمتع ببعض أغاني الرقص النيجيرية - هذه أغنية مشهورة من عام 2014 لفرقة PSquare.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
### مقدمة
@ -25,7 +25,7 @@ CO_OP_TRANSLATOR_METADATA:
[![Introduction to ML](https://img.youtube.com/vi/esmzYhuFnds/0.jpg)](https://youtu.be/esmzYhuFnds "Introduction to Clustering")
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: يقدم جون غوتاغ من MIT مقدمة عن التجميع.
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: جون غوتاغ من MIT يقدم التجميع.
في بيئة مهنية، يمكن استخدام التجميع لتحديد أشياء مثل تقسيم السوق، أو تحديد الفئات العمرية التي تشتري منتجات معينة، على سبيل المثال. استخدام آخر يمكن أن يكون اكتشاف الشذوذ، ربما لاكتشاف الاحتيال من مجموعة بيانات معاملات بطاقات الائتمان. أو قد تستخدم التجميع لتحديد الأورام في مجموعة من الفحوصات الطبية.
@ -33,9 +33,9 @@ CO_OP_TRANSLATOR_METADATA:
> 🎓 من المثير للاهتمام أن تحليل التجميع نشأ في مجالات الأنثروبولوجيا وعلم النفس في ثلاثينيات القرن الماضي. هل يمكنك تخيل كيف كان يمكن استخدامه؟
بدلاً من ذلك، يمكنك استخدامه لتجميع نتائج البحث - مثل الروابط التسويقية أو الصور أو المراجعات، على سبيل المثال. يكون التجميع مفيدًا عندما يكون لديك مجموعة بيانات كبيرة تريد تقليلها وإجراء تحليل أكثر تفصيلاً عليها، لذا يمكن استخدام هذه التقنية لفهم البيانات قبل بناء نماذج أخرى.
بدلاً من ذلك، يمكنك استخدامه لتجميع نتائج البحث - مثل الروابط التسويقية أو الصور أو المراجعات، على سبيل المثال. يكون التجميع مفيدًا عندما يكون لديك مجموعة بيانات كبيرة تريد تقليلها وتريد إجراء تحليل أكثر تفصيلاً عليها، لذا يمكن استخدام هذه التقنية لفهم البيانات قبل بناء نماذج أخرى.
✅ بمجرد تنظيم بياناتك في مجموعات، يمكنك تعيين معرف مجموعة لها، وهذه التقنية يمكن أن تكون مفيدة عند الحفاظ على خصوصية مجموعة البيانات؛ يمكنك بدلاً من ذلك الإشارة إلى نقطة بيانات بمعرف المجموعة الخاص بها، بدلاً من بيانات تعريفية أكثر كشفًا. هل يمكنك التفكير في أسباب أخرى قد تجعلك تشير إلى معرف مجموعة بدلاً من عناصر أخرى من المجموعة لتحديدها؟
✅ بمجرد تنظيم بياناتك في مجموعات، يمكنك تعيين معرف مجموعة لها، ويمكن أن تكون هذه التقنية مفيدة عند الحفاظ على خصوصية مجموعة البيانات؛ يمكنك بدلاً من ذلك الإشارة إلى نقطة بيانات بمعرف المجموعة الخاص بها، بدلاً من بيانات تعريفية أكثر كشفًا. هل يمكنك التفكير في أسباب أخرى قد تجعلك تشير إلى معرف مجموعة بدلاً من عناصر أخرى من المجموعة لتحديدها؟
تعرف على المزيد حول تقنيات التجميع في هذا [الوحدة التعليمية](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott).
@ -43,77 +43,71 @@ CO_OP_TRANSLATOR_METADATA:
[يوفر Scikit-learn مجموعة كبيرة](https://scikit-learn.org/stable/modules/clustering.html) من الطرق لتنفيذ التجميع. يعتمد النوع الذي تختاره على حالتك. وفقًا للتوثيق، لكل طريقة فوائد مختلفة. إليك جدول مبسط للطرق المدعومة من Scikit-learn وحالات الاستخدام المناسبة لها:
| اسم الطريقة | حالة الاستخدام |
| اسم الطريقة | حالة الاستخدام |
| :--------------------------- | :--------------------------------------------------------------------- |
| K-Means | غرض عام، استقرائي |
| Affinity propagation | العديد من المجموعات غير المتساوية، استقرائي |
| Mean-shift | العديد من المجموعات غير المتساوية، استقرائي |
| Spectral clustering | مجموعات قليلة ومتساوية، استنتاجي |
| Ward hierarchical clustering | العديد من المجموعات المقيدة، استنتاجي |
| Agglomerative clustering | العديد من المجموعات المقيدة، مسافات غير إقليدية، استنتاجي |
| DBSCAN | هندسة غير مسطحة، مجموعات غير متساوية، استنتاجي |
| OPTICS | هندسة غير مسطحة، مجموعات غير متساوية بكثافة متغيرة، استنتاجي |
| Gaussian mixtures | هندسة مسطحة، استقرائي |
| BIRCH | مجموعة بيانات كبيرة مع نقاط شاذة، استقرائي |
> 🎓 كيفية إنشاء المجموعات تعتمد بشكل كبير على كيفية جمع نقاط البيانات في مجموعات. دعونا نوضح بعض المصطلحات:
| Affinity propagation | العديد من المجموعات غير المتساوية، استقرائي |
| Mean-shift | العديد من المجموعات غير المتساوية، استقرائي |
| Spectral clustering | مجموعات قليلة ومتساوية، استنتاجي |
| Ward hierarchical clustering | العديد من المجموعات المقيدة، استنتاجي |
| Agglomerative clustering | العديد من المجموعات المقيدة، مسافات غير إقليدية، استنتاجي |
| DBSCAN | هندسة غير مسطحة، مجموعات غير متساوية، استنتاجي |
| OPTICS | هندسة غير مسطحة، مجموعات غير متساوية بكثافة متغيرة، استنتاجي |
| Gaussian mixtures | هندسة مسطحة، استقرائي |
| BIRCH | مجموعة بيانات كبيرة مع نقاط شاذة، استقرائي |
> 🎓 كيف ننشئ المجموعات يعتمد بشكل كبير على كيفية جمع نقاط البيانات في مجموعات. دعونا نوضح بعض المصطلحات:
>
> 🎓 ['استنتاجي' مقابل 'استقرائي'](https://wikipedia.org/wiki/Transduction_(machine_learning))
>
> الاستنتاج المستمد من الحالات التدريبية الملاحظة التي ترتبط بحالات اختبار محددة. الاستدلال الاستقرائي مشتق من الحالات التدريبية التي ترتبط بقواعد عامة يتم تطبيقها بعد ذلك فقط على حالات الاختبار.
> الاستنتاج الاستقرائي يعتمد على حالات تدريب ملاحظة تُطبق على قواعد عامة، بينما الاستنتاج الاستنتاجي يعتمد على حالات تدريب ملاحظة تُطبق على حالات اختبار محددة.
>
> مثال: تخيل أن لديك مجموعة بيانات معنونة جزئيًا. بعض الأشياء هي "أسطوانات"، وبعضها "أقراص مدمجة"، وبعضها فارغ. مهمتك هي توفير تسميات للفارغات. إذا اخترت نهجًا استقرائيًا، ستقوم بتدريب نموذج يبحث عن "أسطوانات" و"أقراص مدمجة"، وتطبيق تلك التسميات على بياناتك غير المعنونة. هذا النهج سيواجه صعوبة في تصنيف الأشياء التي هي في الواقع "كاسيتات". من ناحية أخرى، يتعامل النهج الاستنتاجي مع هذه البيانات غير المعروفة بشكل أكثر فعالية حيث يعمل على تجميع العناصر المتشابهة معًا ثم يطبق تسمية على المجموعة. في هذه الحالة، قد تعكس المجموعات "أشياء موسيقية دائرية" و"أشياء موسيقية مربعة".
> مثال: تخيل أن لديك مجموعة بيانات معنونة جزئيًا. بعض العناصر "أسطوانات"، وبعضها "أقراص مدمجة"، وبعضها فارغ. إذا اخترت نهجًا استقرائيًا، ستدرب نموذجًا يبحث عن "أسطوانات" و"أقراص مدمجة"، وتطبق هذه التصنيفات على البيانات غير المعنونة. هذا النهج سيواجه صعوبة في تصنيف الأشياء التي هي في الواقع "كاسيتات". أما النهج الاستنتاجي، فيتعامل مع هذه البيانات غير المعروفة بشكل أكثر فعالية حيث يعمل على تجميع العناصر المتشابهة معًا ثم يطبق تصنيفًا على المجموعة.
>
> 🎓 ['هندسة غير مسطحة' مقابل 'مسطحة'](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)
>
> مشتقة من المصطلحات الرياضية، تشير الهندسة غير المسطحة مقابل المسطحة إلى قياس المسافات بين النقاط إما بطرق هندسية "مسطحة" ([إقليدية](https://wikipedia.org/wiki/Euclidean_geometry)) أو "غير مسطحة" (غير إقليدية).
> مشتقة من المصطلحات الرياضية، تشير الهندسة المسطحة إلى قياس المسافات بين النقاط باستخدام الطرق الإقليدية، بينما تشير الهندسة غير المسطحة إلى استخدام الطرق غير الإقليدية.
>
>'مسطحة' في هذا السياق تشير إلى الهندسة الإقليدية (التي يتم تدريس أجزاء منها كالهندسة "المستوية")، و'غير مسطحة' تشير إلى الهندسة غير الإقليدية. ما علاقة الهندسة بتعلم الآلة؟ حسنًا، كحقلين متجذرين في الرياضيات، يجب أن يكون هناك طريقة مشتركة لقياس المسافات بين النقاط في المجموعات، ويمكن القيام بذلك بطريقة "مسطحة" أو "غير مسطحة"، اعتمادًا على طبيعة البيانات. [المسافات الإقليدية](https://wikipedia.org/wiki/Euclidean_distance) تُقاس كطول قطعة مستقيمة بين نقطتين. [المسافات غير الإقليدية](https://wikipedia.org/wiki/Non-Euclidean_geometry) تُقاس على طول منحنى. إذا كانت بياناتك، عند تصورها، لا تبدو وكأنها موجودة على مستوى مستوٍ، فقد تحتاج إلى استخدام خوارزمية متخصصة للتعامل معها.
>
![Flat vs Nonflat Geometry Infographic](../../../../translated_images/flat-nonflat.d1c8c6e2a96110c1d57fa0b72913f6aab3c245478524d25baf7f4a18efcde224.ar.png)
> رسم توضيحي بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
![Flat vs Nonflat Geometry Infographic](../../../../5-Clustering/1-Visualize/images/flat-nonflat.png)
> إنفوجرافيك بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
>
> 🎓 ['المسافات'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)
>
> يتم تعريف المجموعات بواسطة مصفوفة المسافات الخاصة بها، أي المسافات بين النقاط. يمكن قياس هذه المسافة بطرق مختلفة. يتم تعريف المجموعات الإقليدية بواسطة متوسط قيم النقاط، وتحتوي على "مركز" أو نقطة مركزية. يتم قياس المسافات بالتالي بواسطة المسافة إلى هذا المركز. تشير المسافات غير الإقليدية إلى "clustroids"، النقطة الأقرب إلى النقاط الأخرى. يمكن تعريف clustroids بدورها بطرق مختلفة.
> تُعرف المجموعات بمصفوفة المسافات الخاصة بها، أي المسافات بين النقاط. يمكن قياس هذه المسافة بطرق مختلفة. المجموعات الإقليدية تُعرف بمتوسط قيم النقاط، وتحتوي على "مركز" أو نقطة مركزية. تُقاس المسافات بناءً على المسافة إلى هذا المركز. المسافات غير الإقليدية تشير إلى "clustroids"، النقطة الأقرب إلى النقاط الأخرى.
>
> 🎓 ['مقيدة'](https://wikipedia.org/wiki/Constrained_clustering)
>
> [التجميع المقيد](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) يقدم التعلم "شبه الموجه" إلى هذه الطريقة غير الموجهة. يتم تصنيف العلاقات بين النقاط على أنها "لا يمكن الربط" أو "يجب الربط" بحيث يتم فرض بعض القواعد على مجموعة البيانات.
> [التجميع المقيد](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf) يقدم التعلم "شبه الموجه" إلى هذه الطريقة غير الموجهة. يتم وضع قواعد على العلاقات بين النقاط مثل "لا يمكن الربط" أو "يجب الربط".
>
>مثال: إذا تم إطلاق خوارزمية على دفعة من البيانات غير المعنونة أو شبه المعنونة، قد تكون المجموعات التي تنتجها ذات جودة ضعيفة. في المثال أعلاه، قد تقوم المجموعات بتجميع "أشياء موسيقية دائرية" و"أشياء موسيقية مربعة" و"أشياء مثلثة" و"بسكويت". إذا تم إعطاء بعض القيود، أو القواعد التي يجب اتباعها ("يجب أن يكون العنصر مصنوعًا من البلاستيك"، "يجب أن يكون العنصر قادرًا على إنتاج الموسيقى")، يمكن أن يساعد ذلك في "تقييد" الخوارزمية لاتخاذ خيارات أفضل.
>
> 🎓 'الكثافة'
>
> البيانات التي تعتبر "صاخبة" تُعتبر "كثيفة". قد تثبت المسافات بين النقاط في كل من مجموعاتها، عند الفحص، أنها أكثر أو أقل كثافة، أو "مزدحمة"، وبالتالي تحتاج هذه البيانات إلى التحليل باستخدام طريقة التجميع المناسبة. [هذا المقال](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html) يوضح الفرق بين استخدام خوارزميات K-Means مقابل HDBSCAN لاستكشاف مجموعة بيانات صاخبة بكثافة مجموعات غير متساوية.
> مثال: إذا تُركت خوارزمية حرة على مجموعة بيانات غير معنونة أو معنونة جزئيًا، قد تكون المجموعات الناتجة ذات جودة ضعيفة. إذا أُعطيت بعض القيود، مثل "يجب أن يكون العنصر مصنوعًا من البلاستيك"، يمكن أن يساعد ذلك في تحسين جودة المجموعات.
## خوارزميات التجميع
هناك أكثر من 100 خوارزمية للتجميع، ويعتمد استخدامها على طبيعة البيانات المتاحة. دعونا نناقش بعض الخوارزميات الرئيسية:
- **التجميع الهرمي**. إذا تم تصنيف كائن بناءً على قربه من كائن قريب، بدلاً من كائن بعيد، يتم تشكيل المجموعات بناءً على مسافة أعضائها من وإلى الكائنات الأخرى. التجميع التراكمي في Scikit-learn هو تجميع هرمي.
- **التجميع الهرمي**. إذا تم تصنيف كائن بناءً على قربه من كائن قريب بدلاً من كائن بعيد، يتم تشكيل المجموعات بناءً على المسافات بين أعضائها. التجميع التكتلي في Scikit-learn هو تجميع هرمي.
![Hierarchical clustering Infographic](../../../../translated_images/hierarchical.bf59403aa43c8c47493bfdf1cc25230f26e45f4e38a3d62e8769cd324129ac15.ar.png)
> رسم توضيحي بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
![Hierarchical clustering Infographic](../../../../5-Clustering/1-Visualize/images/hierarchical.png)
> إنفوجرافيك بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **التجميع المركزي**. تتطلب هذه الخوارزمية الشهيرة اختيار "k"، أو عدد المجموعات التي سيتم تشكيلها، وبعد ذلك تحدد الخوارزمية النقطة المركزية للمجموعة وتجمع البيانات حول تلك النقطة. [التجميع باستخدام K-means](https://wikipedia.org/wiki/K-means_clustering) هو نسخة شائعة من التجميع المركزي. يتم تحديد المركز بواسطة المتوسط الأقرب، ومن هنا جاء الاسم. يتم تقليل المسافة المربعة من المجموعة.
- **التجميع المركزي**. يتطلب هذا الخوارزمية الشائعة اختيار "k"، أو عدد المجموعات المراد تشكيلها، وبعد ذلك تحدد الخوارزمية النقطة المركزية للمجموعة وتجمع البيانات حول تلك النقطة. [التجميع باستخدام K-means](https://wikipedia.org/wiki/K-means_clustering) هو نسخة شائعة من هذا النوع.
![Centroid clustering Infographic](../../../../translated_images/centroid.097fde836cf6c9187d0b2033e9f94441829f9d86f4f0b1604dd4b3d1931aee34.ar.png)
> رسم توضيحي بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
![Centroid clustering Infographic](../../../../5-Clustering/1-Visualize/images/centroid.png)
> إنفوجرافيك بواسطة [Dasani Madipalli](https://twitter.com/dasani_decoded)
- **التجميع القائم على التوزيع**. يعتمد على النمذجة الإحصائية، يركز التجميع القائم على التوزيع على تحديد احتمال انتماء نقطة بيانات إلى مجموعة، وتعيينها وفقًا لذلك. تنتمي طرق المزيج الغاوسي إلى هذا النوع.
- **التجميع القائم على التوزيع**. يعتمد على النمذجة الإحصائية، حيث يركز على تحديد احتمال انتماء نقطة بيانات إلى مجموعة معينة.
- **التجميع القائم على الكثافة**. يتم تعيين نقاط البيانات إلى مجموعات بناءً على كثافتها، أو تجمعها حول بعضها البعض. تعتبر نقاط البيانات البعيدة عن المجموعة نقاط شاذة أو ضوضاء. تنتمي DBSCAN وMean-shift وOPTICS إلى هذا النوع من التجميع.
- **التجميع القائم على الكثافة**. يتم تعيين نقاط البيانات إلى مجموعات بناءً على كثافتها، أو تجمعها حول بعضها البعض. النقاط البعيدة عن المجموعة تُعتبر شذوذًا أو ضوضاء.
- **التجميع القائم على الشبكة**. بالنسبة لمجموعات البيانات متعددة الأبعاد، يتم إنشاء شبكة ويتم تقسيم البيانات بين خلايا الشبكة، مما يؤدي إلى إنشاء مجموعات.
- **التجميع القائم على الشبكة**. بالنسبة لمجموعات البيانات متعددة الأبعاد، يتم إنشاء شبكة وتقسيم البيانات بين خلايا الشبكة، مما يؤدي إلى إنشاء مجموعات.
## تمرين - قم بتجميع بياناتك
## تمرين - تجميع بياناتك
يتم تعزيز تقنية التجميع بشكل كبير من خلال التصور المناسب، لذا دعونا نبدأ بتصور بيانات الموسيقى الخاصة بنا. سيساعدنا هذا التمرين في تحديد أي من طرق التجميع يجب أن نستخدمها بشكل أكثر فعالية لطبيعة هذه البيانات.
التجميع كطريقة يعتمد بشكل كبير على التصور الصحيح، لذا دعونا نبدأ بتصور بيانات الموسيقى الخاصة بنا. سيساعدنا هذا التمرين في تحديد الطريقة الأكثر فعالية للتجميع التي يمكننا استخدامها لطبيعة هذه البيانات.
1. افتح ملف [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/notebook.ipynb) في هذا المجلد.
1. قم باستيراد حزمة `Seaborn` للحصول على تصور جيد للبيانات.
1. استورد حزمة `Seaborn` للحصول على تصور جيد للبيانات.
```python
!pip install seaborn
@ -131,7 +125,7 @@ CO_OP_TRANSLATOR_METADATA:
تحقق من الأسطر القليلة الأولى من البيانات:
| | الاسم | الألبوم | الفنان | النوع الموسيقي الرئيسي | تاريخ الإصدار | الطول | الشعبية | القابلية للرقص | الصوتية | الطاقة | الآلية | الحضور | الصوت | الكلامية | الإيقاع | توقيع الوقت |
| | الاسم | الألبوم | الفنان | النوع الموسيقي الرئيسي | تاريخ الإصدار | الطول | الشعبية | القابلية للرقص | الصوتية | الطاقة | الآلية | الحيوية | الصوت | الكلامية | الإيقاع | توقيع الوقت |
| --- | ------------------------ | ---------------------------- | ------------------- | ---------------- | ------------ | ------ | ---------- | ------------ | ------------ | ------ | ---------------- | -------- | -------- | ----------- | ------- | -------------- |
| 0 | Sparky | Mandy & The Jungle | Cruel Santino | alternative r&b | 2019 | 144000 | 48 | 0.666 | 0.851 | 0.42 | 0.534 | 0.11 | -6.699 | 0.0829 | 133.015 | 5 |
| 1 | shuga rush | EVERYTHING YOU HEARD IS TRUE | Odunsi (The Engine) | afropop | 2020 | 89488 | 30 | 0.71 | 0.0822 | 0.683 | 0.000169 | 0.101 | -5.64 | 0.36 | 129.993 | 3 |
@ -139,7 +133,7 @@ CO_OP_TRANSLATOR_METADATA:
| 3 | Confident / Feeling Cool | Enjoy Your Life | Lady Donli | nigerian pop | 2019 | 175135 | 14 | 0.894 | 0.798 | 0.611 | 0.000187 | 0.0964 | -4.961 | 0.113 | 111.087 | 4 |
| 4 | wanted you | rare. | Odunsi (The Engine) | afropop | 2018 | 152049 | 25 | 0.702 | 0.116 | 0.833 | 0.91 | 0.348 | -6.044 | 0.0447 | 105.115 | 4 |
1. احصل على بعض المعلومات حول إطار البيانات باستخدام `info()`:
1. احصل على بعض المعلومات حول إطار البيانات باستخدام الأمر `info()`:
```python
df.info()
@ -173,7 +167,7 @@ CO_OP_TRANSLATOR_METADATA:
memory usage: 66.4+ KB
```
1. تحقق مرة أخرى من القيم الفارغة باستخدام `isnull()` وتأكد من أن المجموع يساوي 0:
1. تحقق مرة أخرى من القيم الفارغة باستخدام الأمر `isnull()` وتأكد من أن المجموع يساوي 0:
```python
df.isnull().sum()
@ -222,7 +216,7 @@ CO_OP_TRANSLATOR_METADATA:
انظر إلى القيم العامة للبيانات. لاحظ أن الشعبية يمكن أن تكون "0"، مما يظهر الأغاني التي ليس لها تصنيف. دعنا نزيل هذه القيم قريبًا.
1. استخدم مخططًا شريطيًا لمعرفة الأنواع الموسيقية الأكثر شعبية:
1. استخدم مخطط الأعمدة لمعرفة الأنواع الموسيقية الأكثر شعبية:
```python
import seaborn as sns
@ -234,11 +228,11 @@ CO_OP_TRANSLATOR_METADATA:
plt.title('Top genres',color = 'blue')
```
![الأكثر شعبية](../../../../translated_images/popular.9c48d84b3386705f98bf44e26e9655bee9eb7c849d73be65195e37895bfedb5d.ar.png)
![الأكثر شعبية](../../../../5-Clustering/1-Visualize/images/popular.png)
✅ إذا كنت ترغب في رؤية المزيد من القيم العليا، قم بتغيير `[:5]` إلى قيمة أكبر، أو قم بإزالتها لرؤية الكل.
لاحظ أنه عندما يتم وصف النوع الموسيقي الأعلى بأنه "مفقود"، فهذا يعني أن Spotify لم يصنفه، لذا دعنا نتخلص منه.
لاحظ أنه عندما يتم وصف النوع الموسيقي الأعلى بأنه "Missing"، فهذا يعني أن Spotify لم يصنفه، لذا دعنا نتخلص منه.
1. تخلص من البيانات المفقودة عن طريق تصفيتها:
@ -253,9 +247,9 @@ CO_OP_TRANSLATOR_METADATA:
الآن تحقق مرة أخرى من الأنواع الموسيقية:
![الأكثر شعبية](../../../../translated_images/all-genres.1d56ef06cefbfcd61183023834ed3cb891a5ee638a3ba5c924b3151bf80208d7.ar.png)
![الأكثر شعبية](../../../../5-Clustering/1-Visualize/images/all-genres.png)
1. بشكل عام، الأنواع الموسيقية الثلاثة الأعلى تهيمن على هذه المجموعة من البيانات. دعنا نركز على `afro dancehall`، `afropop`، و `nigerian pop`، بالإضافة إلى تصفية المجموعة لإزالة أي قيمة شعبية تساوي 0 (مما يعني أنها لم تصنف بشعبية في المجموعة ويمكن اعتبارها ضوضاء لأغراضنا):
1. بشكل عام، الأنواع الموسيقية الثلاثة الأولى تهيمن على هذا الإطار. دعنا نركز على `afro dancehall`، `afropop`، و `nigerian pop`، بالإضافة إلى تصفية الإطار لإزالة أي قيمة شعبية تساوي 0 (مما يعني أنها لم تصنف بشعبية في الإطار ويمكن اعتبارها ضوضاء لأغراضنا):
```python
df = df[(df['artist_top_genre'] == 'afro dancehall') | (df['artist_top_genre'] == 'afropop') | (df['artist_top_genre'] == 'nigerian pop')]
@ -267,7 +261,7 @@ CO_OP_TRANSLATOR_METADATA:
plt.title('Top genres',color = 'blue')
```
1. قم بإجراء اختبار سريع لمعرفة ما إذا كانت البيانات تتوافق بطريقة قوية بشكل خاص:
1. قم باختبار سريع لمعرفة ما إذا كانت البيانات ترتبط بطريقة قوية بشكل خاص:
```python
corrmat = df.corr(numeric_only=True)
@ -275,21 +269,21 @@ CO_OP_TRANSLATOR_METADATA:
sns.heatmap(corrmat, vmax=.8, square=True)
```
![الارتباطات](../../../../translated_images/correlation.a9356bb798f5eea51f47185968e1ebac5c078c92fce9931e28ccf0d7fab71c2b.ar.png)
![الارتباطات](../../../../5-Clustering/1-Visualize/images/correlation.png)
الارتباط القوي الوحيد هو بين `energy` و `loudness`، وهو ليس مفاجئًا جدًا، نظرًا لأن الموسيقى الصاخبة عادة ما تكون مليئة بالطاقة. بخلاف ذلك، تكون الارتباطات ضعيفة نسبيًا. سيكون من المثير للاهتمام معرفة ما يمكن أن تفعله خوارزمية التجميع بهذه البيانات.
الارتباط القوي الوحيد هو بين `energy` و `loudness`، وهو ليس مفاجئًا جدًا، نظرًا لأن الموسيقى الصاخبة عادة ما تكون مليئة بالطاقة. بخلاف ذلك، الارتباطات ضعيفة نسبيًا. سيكون من المثير للاهتمام معرفة ما يمكن أن تفعله خوارزمية التجميع بهذه البيانات.
> 🎓 لاحظ أن الارتباط لا يعني السببية! لدينا دليل على الارتباط ولكن ليس لدينا دليل على السببية. [موقع ويب مسلي](https://tylervigen.com/spurious-correlations) يحتوي على بعض الرسوم التي تؤكد هذه النقطة.
> 🎓 لاحظ أن الارتباط لا يعني السببية! لدينا دليل على الارتباط ولكن ليس لدينا دليل على السببية. [موقع ويب ممتع](https://tylervigen.com/spurious-correlations) يحتوي على بعض الرسوم التي تؤكد هذه النقطة.
هل هناك أي تقارب في هذه المجموعة من البيانات حول شعبية الأغنية المتصورة وقابليتها للرقص؟ يظهر FacetGrid أن هناك دوائر متحدة المركز تتماشى، بغض النظر عن النوع الموسيقي. هل يمكن أن تكون الأذواق النيجيرية تتقارب عند مستوى معين من القابلية للرقص لهذا النوع الموسيقي؟
هل هناك أي تقارب في هذه البيانات حول شعبية الأغنية المتصورة وقابليتها للرقص؟ يظهر مخطط FacetGrid أن هناك دوائر متحدة المركز تتماشى، بغض النظر عن النوع الموسيقي. هل يمكن أن تكون الأذواق النيجيرية تتقارب عند مستوى معين من القابلية للرقص لهذا النوع الموسيقي؟
✅ جرب نقاط بيانات مختلفة (مثل الطاقة، الصخب، الكلامية) والمزيد من الأنواع الموسيقية أو أنواع مختلفة. ماذا يمكنك أن تكتشف؟ ألقِ نظرة على جدول `df.describe()` لرؤية الانتشار العام لنقاط البيانات.
✅ جرب نقاط بيانات مختلفة (مثل الطاقة، الصخب، الكلامية) والمزيد من الأنواع الموسيقية أو أنواع مختلفة. ماذا يمكنك أن تكتشف؟ ألق نظرة على جدول `df.describe()` لرؤية الانتشار العام لنقاط البيانات.
### تمرين - توزيع البيانات
هل هذه الأنواع الموسيقية الثلاثة مختلفة بشكل كبير في تصور قابليتها للرقص، بناءً على شعبيتها؟
هل هذه الأنواع الثلاثة مختلفة بشكل كبير في تصور قابليتها للرقص بناءً على شعبيتها؟
1. قم بفحص توزيع بيانات الأنواع الموسيقية الثلاثة الأعلى للشعبية وقابليتها للرقص على محور x و y معين.
1. قم بفحص توزيع بيانات الأنواع الثلاثة العليا للشعبية وقابليتها للرقص على محور x و y معين.
```python
sns.set_theme(style="ticks")
@ -303,11 +297,11 @@ CO_OP_TRANSLATOR_METADATA:
يمكنك اكتشاف دوائر متحدة المركز حول نقطة تقارب عامة، تظهر توزيع النقاط.
> 🎓 لاحظ أن هذا المثال يستخدم رسم KDE (تقدير كثافة النواة) الذي يمثل البيانات باستخدام منحنى كثافة احتمالية مستمر. يتيح لنا ذلك تفسير البيانات عند العمل مع توزيعات متعددة.
> 🎓 لاحظ أن هذا المثال يستخدم مخطط KDE (تقدير كثافة النواة) الذي يمثل البيانات باستخدام منحنى كثافة احتمالية مستمر. هذا يسمح لنا بتفسير البيانات عند العمل مع توزيعات متعددة.
بشكل عام، الأنواع الموسيقية الثلاثة تتماشى بشكل فضفاض من حيث شعبيتها وقابليتها للرقص. تحديد التجمعات في هذه البيانات المتراصة سيكون تحديًا:
بشكل عام، الأنواع الثلاثة تتماشى بشكل فضفاض من حيث شعبيتها وقابليتها للرقص. تحديد التجمعات في هذه البيانات المتراصة سيكون تحديًا:
![التوزيع](../../../../translated_images/distribution.9be11df42356ca958dc8e06e87865e09d77cab78f94fe4fea8a1e6796c64dc4b.ar.png)
![التوزيع](../../../../5-Clustering/1-Visualize/images/distribution.png)
1. قم بإنشاء مخطط مبعثر:
@ -317,9 +311,9 @@ CO_OP_TRANSLATOR_METADATA:
.add_legend()
```
يظهر مخطط مبعثر على نفس المحاور نمطًا مشابهًا للتقارب.
يظهر مخطط مبعثر لنفس المحاور نمطًا مشابهًا للتقارب.
![Facetgrid](../../../../translated_images/facetgrid.9b2e65ce707eba1f983b7cdfed5d952e60f385947afa3011df6e3cc7d200eb5b.ar.png)
![Facetgrid](../../../../5-Clustering/1-Visualize/images/facetgrid.png)
بشكل عام، للتجميع، يمكنك استخدام المخططات المبعثرة لإظهار تجمعات البيانات، لذا فإن إتقان هذا النوع من التصور مفيد جدًا. في الدرس التالي، سنأخذ هذه البيانات المصفاة ونستخدم التجميع باستخدام k-means لاكتشاف مجموعات في هذه البيانات التي تبدو متداخلة بطرق مثيرة للاهتمام.
@ -329,13 +323,13 @@ CO_OP_TRANSLATOR_METADATA:
استعدادًا للدرس التالي، قم بإنشاء مخطط حول خوارزميات التجميع المختلفة التي قد تكتشفها وتستخدمها في بيئة الإنتاج. ما هي أنواع المشاكل التي تحاول خوارزميات التجميع معالجتها؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
قبل تطبيق خوارزميات التجميع، كما تعلمنا، من الجيد فهم طبيعة مجموعة البيانات الخاصة بك. اقرأ المزيد عن هذا الموضوع [هنا](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
قبل تطبيق خوارزميات التجميع، كما تعلمنا، من الجيد فهم طبيعة إطار البيانات الخاص بك. اقرأ المزيد عن هذا الموضوع [هنا](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html)
[هذه المقالة المفيدة](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) تشرح الطرق المختلفة التي تتصرف بها خوارزميات التجميع المختلفة، بالنظر إلى أشكال البيانات المختلفة.
[هذه المقالة المفيدة](https://www.freecodecamp.org/news/8-clustering-algorithms-in-machine-learning-that-all-data-scientists-should-know/) تشرح لك الطرق المختلفة التي تتصرف بها خوارزميات التجميع المختلفة، بالنظر إلى أشكال البيانات المختلفة.
## الواجب
@ -344,4 +338,4 @@ CO_OP_TRANSLATOR_METADATA:
---
**إخلاء المسؤولية**:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.

@ -1,53 +1,53 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "085d571097d201810720df4cd379f8c2",
"translation_date": "2025-08-29T13:26:00+00:00",
"original_hash": "7cdd17338d9bbd7e2171c2cd462eb081",
"translation_date": "2025-09-04T20:44:23+00:00",
"source_file": "5-Clustering/2-K-Means/README.md",
"language_code": "ar"
}
-->
# التجميع باستخدام K-Means
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/29/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
في هذا الدرس، ستتعلم كيفية إنشاء مجموعات باستخدام مكتبة Scikit-learn ومجموعة بيانات الموسيقى النيجيرية التي قمت باستيرادها سابقًا. سنغطي أساسيات K-Means للتجميع. تذكر أنه، كما تعلمت في الدرس السابق، هناك العديد من الطرق للعمل مع المجموعات والطريقة التي تستخدمها تعتمد على بياناتك. سنجرب K-Means لأنه التقنية الأكثر شيوعًا للتجميع. لنبدأ!
في هذه الدرس، ستتعلم كيفية إنشاء مجموعات باستخدام مكتبة Scikit-learn وبيانات الموسيقى النيجيرية التي قمت باستيرادها سابقًا. سنغطي أساسيات K-Means للتجميع. تذكر أنه كما تعلمت في الدرس السابق، هناك العديد من الطرق للعمل مع المجموعات والطريقة التي تستخدمها تعتمد على بياناتك. سنجرب K-Means لأنه التقنية الأكثر شيوعًا للتجميع. لنبدأ!
المصطلحات التي ستتعرف عليها:
المصطلحات التي ستتعلم عنها:
- تقييم Silhouette
- طريقة Elbow
- طريقة الكوع
- القصور الذاتي (Inertia)
- التباين (Variance)
- التباين
## المقدمة
[التجميع باستخدام K-Means](https://wikipedia.org/wiki/K-means_clustering) هو طريقة مشتقة من مجال معالجة الإشارات. تُستخدم لتقسيم وتصنيف مجموعات البيانات إلى 'k' مجموعات باستخدام سلسلة من الملاحظات. تعمل كل ملاحظة على تجميع نقطة بيانات معينة بالقرب من أقرب 'متوسط'، أو النقطة المركزية للمجموعة.
[التجميع باستخدام K-Means](https://wikipedia.org/wiki/K-means_clustering) هو طريقة مشتقة من مجال معالجة الإشارات. تُستخدم لتقسيم وتجزئة مجموعات البيانات إلى "k" مجموعات باستخدام سلسلة من الملاحظات. تعمل كل ملاحظة على تجميع نقطة البيانات الأقرب إلى "المتوسط" أو النقطة المركزية للمجموعة.
يمكن تصور المجموعات كـ [مخططات Voronoi](https://wikipedia.org/wiki/Voronoi_diagramالتي تتضمن نقطة (أو 'بذرة') ومنطقتها المقابلة.
يمكن تصور المجموعات كـ [مخططات Voronoi](https://wikipedia.org/wiki/Voronoi_diagramوالتي تتضمن نقطة (أو "بذرة") ومنطقتها المقابلة.
![مخطط Voronoi](../../../../translated_images/voronoi.1dc1613fb0439b9564615eca8df47a4bcd1ce06217e7e72325d2406ef2180795.ar.png)
![مخطط Voronoi](../../../../5-Clustering/2-K-Means/images/voronoi.png)
> رسم توضيحي من [Jen Looper](https://twitter.com/jenlooper)
> رسم توضيحي بواسطة [Jen Looper](https://twitter.com/jenlooper)
تتم عملية التجميع باستخدام K-Means [في ثلاث خطوات](https://scikit-learn.org/stable/modules/clustering.html#k-means):
عملية التجميع باستخدام K-Means [تُنفذ في ثلاث خطوات](https://scikit-learn.org/stable/modules/clustering.html#k-means):
1. يختار الخوارزمية عددًا من النقاط المركزية 'k' عن طريق أخذ عينات من مجموعة البيانات. بعد ذلك، تقوم بالتكرار:
1. تعين كل عينة إلى أقرب مركز.
2. تنشئ مراكز جديدة عن طريق حساب متوسط القيم لجميع العينات المخصصة للمراكز السابقة.
3. ثم تحسب الفرق بين المراكز الجديدة والقديمة وتكرر العملية حتى تستقر المراكز.
1. يختار الخوارزمية عددًا من النقاط المركزية "k" عن طريق أخذ عينات من مجموعة البيانات. بعد ذلك، تبدأ في التكرار:
1. تُخصص كل عينة إلى أقرب نقطة مركزية.
2. تُنشئ نقاط مركزية جديدة عن طريق حساب متوسط القيم لجميع العينات المخصصة للنقاط المركزية السابقة.
3. ثم تُحسب الفرق بين النقاط المركزية الجديدة والقديمة وتكرر العملية حتى تستقر النقاط المركزية.
أحد عيوب استخدام K-Means هو أنك ستحتاج إلى تحديد 'k'، أي عدد المراكز. لحسن الحظ، تساعد طريقة 'elbow' في تقدير قيمة بداية جيدة لـ 'k'. ستجربها بعد قليل.
أحد العيوب في استخدام K-Means هو أنك ستحتاج إلى تحديد "k"، أي عدد النقاط المركزية. لحسن الحظ، تساعد طريقة "الكوع" في تقدير قيمة جيدة كبداية لـ "k". ستجربها قريبًا.
## المتطلبات الأساسية
ستعمل في ملف [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) الخاص بهذا الدرس، والذي يتضمن استيراد البيانات وتنظيفها الأولي الذي قمت به في الدرس السابق.
ستعمل في ملف [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) الخاص بهذا الدرس، والذي يتضمن استيراد البيانات والتنظيف الأولي الذي قمت به في الدرس السابق.
## التمرين - التحضير
ابدأ بإلقاء نظرة أخرى على بيانات الأغاني.
1. أنشئ مخططًا صندوقيًا، باستخدام `boxplot()` لكل عمود:
1. أنشئ مخططًا صندوقيًا باستخدام `boxplot()` لكل عمود:
```python
plt.figure(figsize=(20,20), dpi=200)
@ -91,9 +91,9 @@ CO_OP_TRANSLATOR_METADATA:
هذه البيانات تحتوي على بعض الضوضاء: من خلال ملاحظة كل عمود كمخطط صندوقي، يمكنك رؤية القيم الشاذة.
![القيم الشاذة](../../../../translated_images/boxplots.8228c29dabd0f29227dd38624231a175f411f1d8d4d7c012cb770e00e4fdf8b6.ar.png)
![القيم الشاذة](../../../../5-Clustering/2-K-Means/images/boxplots.png)
يمكنك مراجعة مجموعة البيانات وإزالة هذه القيم الشاذة، ولكن ذلك سيجعل البيانات قليلة جدًا.
يمكنك المرور عبر مجموعة البيانات وإزالة هذه القيم الشاذة، ولكن ذلك سيجعل البيانات قليلة جدًا.
1. في الوقت الحالي، اختر الأعمدة التي ستستخدمها في تمرين التجميع. اختر الأعمدة ذات النطاقات المتشابهة وقم بترميز عمود `artist_top_genre` كبيانات رقمية:
@ -110,7 +110,7 @@ CO_OP_TRANSLATOR_METADATA:
y = le.transform(y)
```
1. الآن تحتاج إلى اختيار عدد المجموعات المستهدفة. أنت تعلم أن هناك 3 أنواع من الأغاني التي قمنا بتحديدها من مجموعة البيانات، لذا دعنا نجرب 3:
1. الآن تحتاج إلى اختيار عدد المجموعات المستهدفة. تعرف أن هناك 3 أنواع من الأغاني التي استخرجناها من مجموعة البيانات، لذا دعنا نجرب 3:
```python
from sklearn.cluster import KMeans
@ -127,9 +127,9 @@ CO_OP_TRANSLATOR_METADATA:
y_cluster_kmeans
```
سترى مصفوفة مطبوعة تحتوي على المجموعات المتوقعة (0، 1، أو 2) لكل صف في إطار البيانات.
سترى مصفوفة مطبوعة تحتوي على المجموعات المتوقعة (0، 1، أو 2) لكل صف من إطار البيانات.
1. استخدم هذه المصفوفة لحساب 'تقييم Silhouette':
1. استخدم هذه المصفوفة لحساب "تقييم Silhouette":
```python
from sklearn import metrics
@ -139,13 +139,13 @@ CO_OP_TRANSLATOR_METADATA:
## تقييم Silhouette
ابحث عن تقييم Silhouette أقرب إلى 1. يتراوح هذا التقييم بين -1 و 1، وإذا كان التقييم 1، فإن المجموعة كثيفة ومنفصلة بشكل جيد عن المجموعات الأخرى. القيمة القريبة من 0 تمثل مجموعات متداخلة مع عينات قريبة جدًا من حدود القرار للمجموعات المجاورة. [(المصدر)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
ابحث عن تقييم Silhouette أقرب إلى 1. يتراوح هذا التقييم بين -1 و 1، وإذا كان التقييم 1، فإن المجموعة كثيفة ومفصولة جيدًا عن المجموعات الأخرى. القيمة القريبة من 0 تمثل مجموعات متداخلة مع عينات قريبة جدًا من حدود القرار للمجموعات المجاورة. [(المصدر)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
تقييمنا هو **0.53**، وهو في المنتصف. يشير ذلك إلى أن بياناتنا ليست مناسبة تمامًا لهذا النوع من التجميع، ولكن دعنا نستمر.
تقييمنا هو **0.53**، لذا فهو في المنتصف. يشير ذلك إلى أن بياناتنا ليست مناسبة بشكل خاص لهذا النوع من التجميع، ولكن دعنا نواصل.
### التمرين - بناء نموذج
1. استورد `KMeans` وابدأ عملية التجميع.
1. قم باستيراد `KMeans` وابدأ عملية التجميع.
```python
from sklearn.cluster import KMeans
@ -162,19 +162,19 @@ CO_OP_TRANSLATOR_METADATA:
> 🎓 النطاق: هذه هي التكرارات لعملية التجميع.
> 🎓 random_state: "يحدد توليد الأرقام العشوائية لتهيئة المراكز." [المصدر](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓 random_state: "يحدد توليد الأرقام العشوائية لتحديد النقاط المركزية." [المصدر](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓 WCSS: "مجموع المربعات داخل المجموعة" يقيس متوسط المسافة المربعة لجميع النقاط داخل المجموعة إلى مركز المجموعة. [المصدر](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce).
> 🎓 WCSS: "مجموع المربعات داخل المجموعة" يقيس متوسط المسافة المربعة لجميع النقاط داخل المجموعة إلى النقطة المركزية للمجموعة. [المصدر](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce).
> 🎓 القصور الذاتي: تحاول خوارزميات K-Means اختيار المراكز لتقليل 'القصور الذاتي'، "وهو مقياس لمدى تماسك المجموعات داخليًا." [المصدر](https://scikit-learn.org/stable/modules/clustering.html). يتم إلحاق القيمة بمتغير wcss في كل تكرار.
> 🎓 القصور الذاتي: تحاول خوارزمية K-Means اختيار النقاط المركزية لتقليل "القصور الذاتي"، "وهو مقياس لمدى تماسك المجموعات داخليًا." [المصدر](https://scikit-learn.org/stable/modules/clustering.html). يتم إلحاق القيمة إلى متغير wcss في كل تكرار.
> 🎓 k-means++: في [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) يمكنك استخدام تحسين 'k-means++'، الذي "يهيئ المراكز لتكون (بشكل عام) بعيدة عن بعضها البعض، مما يؤدي إلى نتائج أفضل على الأرجح من التهيئة العشوائية."
> 🎓 k-means++: في [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) يمكنك استخدام تحسين "k-means++"، الذي "يبدأ النقاط المركزية بحيث تكون (عادةً) بعيدة عن بعضها البعض، مما يؤدي إلى نتائج أفضل على الأرجح مقارنة بالتحديد العشوائي."
### طريقة Elbow
### طريقة الكوع
في السابق، افترضت أنه، لأنك استهدفت 3 أنواع من الأغاني، يجب أن تختار 3 مجموعات. ولكن هل هذا صحيح؟
سابقًا، افترضت أنه نظرًا لأنك استهدفت 3 أنواع من الأغاني، يجب اختيار 3 مجموعات. ولكن هل هذا صحيح؟
1. استخدم طريقة 'elbow' للتأكد.
1. استخدم طريقة "الكوع" للتأكد.
```python
plt.figure(figsize=(10,5))
@ -185,13 +185,13 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
استخدم متغير `wcss` الذي قمت ببنائه في الخطوة السابقة لإنشاء مخطط يظهر مكان 'الانحناء' في الرسم البياني، مما يشير إلى العدد الأمثل للمجموعات. ربما يكون **3** بالفعل!
استخدم متغير `wcss` الذي أنشأته في الخطوة السابقة لإنشاء مخطط يظهر فيه "الانحناء" في الكوع، مما يشير إلى العدد الأمثل للمجموعات. ربما يكون **3** بالفعل!
![طريقة Elbow](../../../../translated_images/elbow.72676169eed744ff03677e71334a16c6b8f751e9e716e3d7f40dd7cdef674cca.ar.png)
![طريقة الكوع](../../../../5-Clustering/2-K-Means/images/elbow.png)
## التمرين - عرض المجموعات
1. جرب العملية مرة أخرى، هذه المرة مع تحديد ثلاث مجموعات، واعرض المجموعات كمخطط مبعثر:
1. جرب العملية مرة أخرى، هذه المرة بتحديد ثلاث مجموعات، واعرض المجموعات كمخطط مبعثر:
```python
from sklearn.cluster import KMeans
@ -216,46 +216,46 @@ CO_OP_TRANSLATOR_METADATA:
print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
```
دقة هذا النموذج ليست جيدة جدًا، وشكل المجموعات يعطيك تلميحًا عن السبب.
دقة هذا النموذج ليست جيدة جدًا، وشكل المجموعات يعطيك فكرة عن السبب.
![المجموعات](../../../../translated_images/clusters.b635354640d8e4fd4a49ef545495518e7be76172c97c13bd748f5b79f171f69a.ar.png)
![المجموعات](../../../../5-Clustering/2-K-Means/images/clusters.png)
هذه البيانات غير متوازنة جدًا، وغير مترابطة بشكل كافٍ، وهناك تباين كبير بين قيم الأعمدة لتجميعها بشكل جيد. في الواقع، المجموعات التي تتشكل ربما تكون متأثرة بشكل كبير أو منحازة بفعل الفئات الثلاثة التي حددناها أعلاه. كان ذلك جزءًا من عملية التعلم!
هذه البيانات غير متوازنة جدًا، وغير مترابطة بشكل كافٍ وهناك الكثير من التباين بين قيم الأعمدة لتجميعها بشكل جيد. في الواقع، المجموعات التي تتشكل ربما تكون متأثرة بشكل كبير أو منحرفة بسبب الفئات الثلاثة التي حددناها أعلاه. كانت هذه عملية تعلم!
في توثيق Scikit-learn، يمكنك أن ترى أن نموذجًا مثل هذا، مع مجموعات غير محددة بشكل جيد، يعاني من مشكلة 'التباين':
في وثائق Scikit-learn، يمكنك أن ترى أن نموذجًا مثل هذا، مع مجموعات غير محددة بشكل جيد، لديه مشكلة "التباين":
![نماذج بها مشاكل](../../../../translated_images/problems.f7fb539ccd80608e1f35c319cf5e3ad1809faa3c08537aead8018c6b5ba2e33a.ar.png)
![نماذج بها مشاكل](../../../../5-Clustering/2-K-Means/images/problems.png)
> رسم توضيحي من Scikit-learn
## التباين
يُعرف التباين بأنه "متوسط الفروق المربعة عن المتوسط" [(المصدر)](https://www.mathsisfun.com/data/standard-deviation.html). في سياق مشكلة التجميع هذه، يشير إلى البيانات التي تميل أرقامها إلى التباعد بشكل كبير عن المتوسط.
يُعرف التباين بأنه "متوسط الفروق المربعة من المتوسط" [(المصدر)](https://www.mathsisfun.com/data/standard-deviation.html). في سياق مشكلة التجميع هذه، يشير إلى البيانات التي تميل أرقام مجموعة البيانات إلى التباعد كثيرًا عن المتوسط.
✅ هذه لحظة رائعة للتفكير في جميع الطرق التي يمكنك من خلالها تصحيح هذه المشكلة. هل تقوم بتعديل البيانات أكثر؟ استخدام أعمدة مختلفة؟ استخدام خوارزمية مختلفة؟ تلميح: جرب [تقييس بياناتك](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) لتطبيعها واختبار أعمدة أخرى.
✅ هذه لحظة رائعة للتفكير في جميع الطرق التي يمكنك من خلالها تصحيح هذه المشكلة. هل يمكنك تعديل البيانات أكثر؟ استخدام أعمدة مختلفة؟ استخدام خوارزمية مختلفة؟ تلميح: جرب [توسيع نطاق بياناتك](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/) لتطبيعها واختبار أعمدة أخرى.
> جرب هذا '[حاسبة التباين](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' لفهم المفهوم بشكل أكبر.
> جرب هذا '[حاسبة التباين](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)' لفهم المفهوم بشكل أفضل.
---
## 🚀تحدي
## 🚀التحدي
اقضِ بعض الوقت مع هذا الدفتر، وعدّل المعلمات. هل يمكنك تحسين دقة النموذج عن طريق تنظيف البيانات أكثر (إزالة القيم الشاذة، على سبيل المثال)؟ يمكنك استخدام الأوزان لإعطاء وزن أكبر لعينات بيانات معينة. ماذا يمكنك أن تفعل أيضًا لإنشاء مجموعات أفضل؟
اقضِ بعض الوقت مع هذا الدفتر، وقم بتعديل المعلمات. هل يمكنك تحسين دقة النموذج عن طريق تنظيف البيانات أكثر (إزالة القيم الشاذة، على سبيل المثال)؟ يمكنك استخدام أوزان لإعطاء وزن أكبر لعينات بيانات معينة. ماذا يمكنك أن تفعل أيضًا لإنشاء مجموعات أفضل؟
تلميح: جرب تقييس بياناتك. هناك كود معلق في الدفتر يضيف التقييس القياسي لجعل أعمدة البيانات أكثر تشابهًا من حيث النطاق. ستجد أنه بينما ينخفض تقييم Silhouette، يصبح 'الانحناء' في الرسم البياني لطريقة Elbow أكثر سلاسة. يحدث هذا لأن ترك البيانات دون تقييس يسمح للبيانات ذات التباين الأقل بأن تحمل وزنًا أكبر. اقرأ المزيد عن هذه المشكلة [هنا](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).
تلميح: جرب توسيع نطاق بياناتك. هناك كود معلق في الدفتر يضيف التوسيع القياسي لجعل أعمدة البيانات تبدو أكثر تشابهًا من حيث النطاق. ستجد أنه بينما ينخفض تقييم Silhouette، يصبح "الانحناء" في مخطط الكوع أكثر سلاسة. هذا لأن ترك البيانات غير موسعة يسمح للبيانات ذات التباين الأقل بأن تحمل وزنًا أكبر. اقرأ المزيد عن هذه المشكلة [هنا](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/30/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
ألقِ نظرة على محاكي K-Means [مثل هذا](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). يمكنك استخدام هذه الأداة لتصور نقاط البيانات النموذجية وتحديد مراكزها. يمكنك تعديل عشوائية البيانات، وعدد المجموعات، وعدد المراكز. هل يساعدك هذا في فهم كيفية تجميع البيانات؟
ألقِ نظرة على محاكي K-Means [مثل هذا](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). يمكنك استخدام هذه الأداة لتصور نقاط البيانات النموذجية وتحديد النقاط المركزية لها. يمكنك تعديل عشوائية البيانات، عدد المجموعات وعدد النقاط المركزية. هل يساعدك هذا في الحصول على فكرة عن كيفية تجميع البيانات؟
كما يمكنك الاطلاع على [هذه النشرة حول K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) من جامعة ستانفورد.
## الواجب
[جرّب طرق تجميع مختلفة](assignment.md)
[جرب طرق تجميع مختلفة](assignment.md)
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,66 +1,66 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "89e923cf3e8bdff9662536e8bf9516e6",
"translation_date": "2025-08-29T14:30:03+00:00",
"original_hash": "1c2ec40cf55c98a028a359c27ef7e45a",
"translation_date": "2025-09-04T20:54:44+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/README.md",
"language_code": "ar"
}
-->
# مقدمة في معالجة اللغة الطبيعية
تتناول هذه الدرس لمحة تاريخية ومفاهيم مهمة حول *معالجة اللغة الطبيعية*، وهو مجال فرعي من *اللغويات الحاسوبية*.
تتناول هذه الدرس تاريخًا موجزًا ومفاهيم مهمة عن *معالجة اللغة الطبيعية*، وهو مجال فرعي من *اللغويات الحاسوبية*.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/31/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## مقدمة
## المقدمة
تُعرف معالجة اللغة الطبيعية (NLP) بأنها واحدة من أكثر المجالات شهرة حيث تم تطبيق التعلم الآلي واستخدامه في برامج الإنتاج.
✅ هل يمكنك التفكير في برامج تستخدمها يوميًا وربما تحتوي على بعض تقنيات معالجة اللغة الطبيعية؟ ماذا عن برامج معالجة النصوص أو التطبيقات المحمولة التي تستخدمها بانتظام؟
✅ هل يمكنك التفكير في برامج تستخدمها يوميًا والتي ربما تحتوي على بعض تقنيات معالجة اللغة الطبيعية؟ ماذا عن برامج معالجة النصوص أو التطبيقات المحمولة التي تستخدمها بانتظام؟
ستتعلم في هذا الدرس:
ستتعلم عن:
- **فكرة اللغات**. كيف تطورت اللغات وما هي المجالات الرئيسية لدراستها.
- **التعريف والمفاهيم**. ستتعلم أيضًا تعريفات ومفاهيم حول كيفية معالجة الحواسيب للنصوص، بما في ذلك التحليل النحوي، القواعد، وتحديد الأسماء والأفعال. هناك بعض المهام البرمجية في هذا الدرس، وسيتم تقديم العديد من المفاهيم المهمة التي ستتعلم برمجتها لاحقًا في الدروس القادمة.
- **فكرة اللغات**. كيف تطورت اللغات وما هي المجالات الرئيسية للدراسة.
- **التعريف والمفاهيم**. ستتعلم أيضًا التعريفات والمفاهيم حول كيفية معالجة الحواسيب للنصوص، بما في ذلك التحليل النحوي، القواعد، وتحديد الأسماء والأفعال. هناك بعض المهام البرمجية في هذا الدرس، ويتم تقديم عدة مفاهيم مهمة ستتعلم كيفية برمجتها لاحقًا في الدروس القادمة.
## اللغويات الحاسوبية
اللغويات الحاسوبية هي مجال بحث وتطوير يمتد لعقود عديدة يدرس كيفية عمل الحواسيب مع اللغات، بل وحتى فهمها، ترجمتها، والتواصل بها. معالجة اللغة الطبيعية (NLP) هو مجال ذو صلة يركز على كيفية معالجة الحواسيب للغات "الطبيعية"، أي اللغات البشرية.
اللغويات الحاسوبية هي مجال بحث وتطوير على مدى عقود يدرس كيفية تعامل الحواسيب مع اللغات، بل وحتى فهمها وترجمتها والتواصل بها. معالجة اللغة الطبيعية (NLP) هو مجال ذو صلة يركز على كيفية معالجة الحواسيب للغات "الطبيعية"، أي لغات البشر.
### مثال - الإملاء الصوتي على الهاتف
### مثال - الإملاء على الهاتف
إذا سبق لك أن أمليت على هاتفك بدلاً من الكتابة أو سألت مساعدًا افتراضيًا سؤالًا، فقد تم تحويل كلامك إلى نص ثم معالجته أو *تحليله* من اللغة التي تحدثت بها. بعد ذلك، تم معالجة الكلمات المفتاحية المكتشفة إلى صيغة يمكن للهاتف أو المساعد فهمها والعمل بناءً عليها.
إذا سبق لك أن أمليت على هاتفك بدلاً من الكتابة أو سألت مساعدًا افتراضيًا سؤالًا، فقد تم تحويل كلامك إلى نص ثم معالجته أو *تحليله* من اللغة التي تحدثت بها. الكلمات المفتاحية المكتشفة تم معالجتها بعد ذلك إلى صيغة يمكن للهاتف أو المساعد فهمها والعمل بناءً عليها.
![الفهم](../../../../translated_images/comprehension.619708fc5959b0f6a24ebffba2ad7b0625391a476141df65b43b59de24e45c6f.ar.png)
> الفهم اللغوي الحقيقي صعب! الصورة من [Jen Looper](https://twitter.com/jenlooper)
![الفهم](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png)
> الفهم اللغوي الحقيقي صعب! الصورة بواسطة [Jen Looper](https://twitter.com/jenlooper)
### كيف أصبحت هذه التقنية ممكنة؟
هذا ممكن لأن شخصًا ما كتب برنامجًا حاسوبيًا للقيام بذلك. قبل بضعة عقود، توقع بعض كتاب الخيال العلمي أن الناس سيتحدثون إلى حواسيبهم بشكل رئيسي، وأن الحواسيب ستفهم دائمًا ما يقصدونه. للأسف، تبين أن هذه مشكلة أصعب مما تخيلها الكثيرون، وعلى الرغم من أن المشكلة أصبحت مفهومة بشكل أفضل اليوم، إلا أن هناك تحديات كبيرة لتحقيق معالجة "مثالية" للغة الطبيعية عندما يتعلق الأمر بفهم معنى الجملة. هذه مشكلة صعبة بشكل خاص عندما يتعلق الأمر بفهم الفكاهة أو اكتشاف المشاعر مثل السخرية في الجملة.
هذا ممكن لأن شخصًا ما كتب برنامجًا حاسوبيًا للقيام بذلك. قبل بضعة عقود، توقع بعض كتاب الخيال العلمي أن الناس سيتحدثون إلى حواسيبهم بشكل رئيسي، وأن الحواسيب ستفهم دائمًا ما يقصدونه بالضبط. للأسف، تبين أن هذه مشكلة أصعب مما تخيلها الكثيرون، وعلى الرغم من أنها أصبحت مشكلة مفهومة بشكل أفضل اليوم، إلا أن هناك تحديات كبيرة في تحقيق معالجة لغة طبيعية "مثالية" عندما يتعلق الأمر بفهم معنى الجملة. هذه مشكلة صعبة بشكل خاص عندما يتعلق الأمر بفهم الفكاهة أو اكتشاف المشاعر مثل السخرية في الجملة.
في هذه المرحلة، قد تتذكر دروس المدرسة حيث كان المعلم يشرح أجزاء القواعد في الجملة. في بعض البلدان، يتم تعليم الطلاب القواعد واللغويات كمادة مخصصة، ولكن في العديد من البلدان، يتم تضمين هذه المواضيع كجزء من تعلم اللغة: سواء كانت لغتك الأولى في المدرسة الابتدائية (تعلم القراءة والكتابة) وربما لغة ثانية في المرحلة الثانوية. لا تقلق إذا لم تكن خبيرًا في التمييز بين الأسماء والأفعال أو الظروف والصفات!
في هذه المرحلة، قد تتذكر دروس المدرسة حيث كان المعلم يغطي أجزاء القواعد في الجملة. في بعض البلدان، يتم تعليم الطلاب القواعد واللغويات كمادة مخصصة، ولكن في العديد من البلدان، يتم تضمين هذه المواضيع كجزء من تعلم اللغة: إما لغتك الأولى في المدرسة الابتدائية (تعلم القراءة والكتابة) وربما لغة ثانية في المدرسة الثانوية. لا تقلق إذا لم تكن خبيرًا في التفريق بين الأسماء والأفعال أو الظروف والصفات!
إذا كنت تجد صعوبة في التفرقة بين *الحاضر البسيط* و*الحاضر المستمر*، فأنت لست وحدك. هذا تحدٍ للكثير من الناس، حتى الناطقين الأصليين للغة. الخبر السار هو أن الحواسيب جيدة جدًا في تطبيق القواعد الرسمية، وستتعلم كتابة كود يمكنه *تحليل* الجملة كما يفعل الإنسان. التحدي الأكبر الذي ستتناوله لاحقًا هو فهم *المعنى* و*المشاعر* في الجملة.
إذا كنت تجد صعوبة في التفريق بين *الحاضر البسيط* و*الحاضر المستمر*، فأنت لست وحدك. هذا أمر صعب بالنسبة للكثير من الناس، حتى المتحدثين الأصليين للغة. الخبر السار هو أن الحواسيب جيدة جدًا في تطبيق القواعد الرسمية، وستتعلم كتابة كود يمكنه *تحليل* الجملة كما يفعل الإنسان. التحدي الأكبر الذي ستفحصه لاحقًا هو فهم *المعنى* و*المشاعر* في الجملة.
## المتطلبات الأساسية
المتطلب الرئيسي لهذا الدرس هو القدرة على قراءة وفهم لغة هذا الدرس. لا توجد مسائل رياضية أو معادلات لحلها. بينما كتب المؤلف الأصلي هذا الدرس باللغة الإنجليزية، فإنه مترجم أيضًا إلى لغات أخرى، لذا قد تكون تقرأ ترجمة. هناك أمثلة حيث يتم استخدام عدد من اللغات المختلفة (لمقارنة قواعدها المختلفة). هذه الأمثلة *غير* مترجمة، ولكن النص التوضيحي مترجم، لذا يجب أن يكون المعنى واضحًا.
المتطلب الأساسي الرئيسي لهذا الدرس هو القدرة على قراءة وفهم لغة هذا الدرس. لا توجد مشاكل رياضية أو معادلات لحلها. بينما كتب المؤلف الأصلي هذا الدرس باللغة الإنجليزية، فإنه مترجم أيضًا إلى لغات أخرى، لذا قد تكون تقرأ ترجمة. هناك أمثلة حيث يتم استخدام عدد من اللغات المختلفة (لمقارنة قواعد اللغات المختلفة). هذه *ليست* مترجمة، ولكن النص التوضيحي مترجم، لذا يجب أن يكون المعنى واضحًا.
بالنسبة للمهام البرمجية، ستستخدم لغة Python، والأمثلة تستخدم Python 3.8.
بالنسبة للمهام البرمجية، ستستخدم Python والأمثلة تستخدم Python 3.8.
في هذا القسم، ستحتاج إلى:
- **فهم Python 3**. فهم لغة البرمجة Python 3، حيث يستخدم هذا الدرس المدخلات، الحلقات، قراءة الملفات، والمصفوفات.
- **Visual Studio Code + الإضافة**. سنستخدم Visual Studio Code وإضافته الخاصة بـ Python. يمكنك أيضًا استخدام بيئة تطوير Python التي تفضلها.
- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) هي مكتبة مبسطة لمعالجة النصوص في Python. اتبع التعليمات على موقع TextBlob لتثبيتها على نظامك (قم بتثبيت corpora أيضًا كما هو موضح أدناه):
- **فهم Python 3**. فهم لغة البرمجة Python 3، يستخدم هذا الدرس الإدخال، الحلقات، قراءة الملفات، والمصفوفات.
- **Visual Studio Code + الإضافة**. سنستخدم Visual Studio Code وإضافته الخاصة بـ Python. يمكنك أيضًا استخدام بيئة تطوير Python التي تختارها.
- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) هي مكتبة مبسطة لمعالجة النصوص في Python. اتبع التعليمات على موقع TextBlob لتثبيتها على نظامك (قم بتثبيت corpora أيضًا، كما هو موضح أدناه):
```bash
pip install -U textblob
python -m textblob.download_corpora
```
> 💡 نصيحة: يمكنك تشغيل Python مباشرة في بيئات VS Code. تحقق من [التوثيق](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) لمزيد من المعلومات.
> 💡 نصيحة: يمكنك تشغيل Python مباشرة في بيئات VS Code. تحقق من [المستندات](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) لمزيد من المعلومات.
## التحدث إلى الآلات
@ -68,47 +68,47 @@ CO_OP_TRANSLATOR_METADATA:
### اختبار تورينج
عندما كان تورينج يبحث في *الذكاء الاصطناعي* في خمسينيات القرن الماضي، فكر في إمكانية إجراء اختبار محادثة بين إنسان وحاسوب (عبر مراسلات مكتوبة) حيث لا يستطيع الإنسان في المحادثة تحديد ما إذا كان يتحدث مع إنسان آخر أم حاسوب.
عندما كان تورينج يبحث في *الذكاء الاصطناعي* في الخمسينيات، فكر فيما إذا كان يمكن إجراء اختبار محادثة بين إنسان وحاسوب (عبر مراسلة مكتوبة) حيث لا يكون الإنسان في المحادثة متأكدًا مما إذا كان يتحدث مع إنسان آخر أو حاسوب.
إذا لم يستطع الإنسان بعد فترة معينة من المحادثة تحديد ما إذا كانت الإجابات من حاسوب أم لا، فهل يمكن القول إن الحاسوب *يفكر*؟
إذا، بعد فترة معينة من المحادثة، لم يتمكن الإنسان من تحديد ما إذا كانت الإجابات من حاسوب أم لا، فهل يمكن القول إن الحاسوب *يفكر*؟
### الإلهام - "لعبة التقليد"
### الإلهام - لعبة التقليد
جاءت الفكرة من لعبة حفلات تُسمى *لعبة التقليد* حيث يكون المحقق في غرفة بمفرده ومكلف بتحديد أي من شخصين (في غرفة أخرى) هو ذكر وأيهما أنثى. يمكن للمحقق إرسال ملاحظات، ويجب أن يحاول التفكير في أسئلة تكشف إجاباتها المكتوبة عن جنس الشخص الغامض. بالطبع، يحاول اللاعبون في الغرفة الأخرى خداع المحقق من خلال الإجابة بطريقة تضلله أو تربكه، مع إعطاء انطباع بالإجابة بصدق.
جاءت الفكرة من لعبة حفلات تُسمى *لعبة التقليد* حيث يكون المحقق في غرفة بمفرده ومكلفًا بتحديد أي من شخصين (في غرفة أخرى) هما ذكر وأنثى على التوالي. يمكن للمحقق إرسال ملاحظات، ويجب أن يحاول التفكير في أسئلة حيث تكشف الإجابات المكتوبة عن جنس الشخص الغامض. بالطبع، يحاول اللاعبون في الغرفة الأخرى خداع المحقق من خلال الإجابة على الأسئلة بطريقة تضلله أو تربكه، مع إعطاء انطباع بالإجابة بصدق.
### تطوير إليزا
في ستينيات القرن الماضي، طور عالم من معهد MIT يُدعى *جوزيف وايزنبوم* [*إليزا*](https://wikipedia.org/wiki/ELIZA)، وهي "معالج نفسي" حاسوبي يسأل الإنسان أسئلة ويعطي انطباعًا بفهم إجاباته. ومع ذلك، بينما كانت إليزا قادرة على تحليل الجملة وتحديد بعض التركيبات النحوية والكلمات المفتاحية لتقديم إجابة معقولة، لم يكن يمكن القول إنها *تفهم* الجملة. إذا قُدمت إليزا بجملة بصيغة "**أنا** <u>حزين</u>"، فقد تعيد ترتيب الكلمات وتستبدل بعضها لتكوين الإجابة "منذ متى **أنت** <u>حزين</u>؟".
في الستينيات، طور عالم من MIT يُدعى *جوزيف وايزنباوم* [*إليزا*](https://wikipedia.org/wiki/ELIZA)، وهي "معالج نفسي" حاسوبي يسأل الإنسان أسئلة ويعطي انطباعًا بفهم الإجابات. ومع ذلك، بينما يمكن لإليزا تحليل الجملة وتحديد بعض التركيبات النحوية والكلمات المفتاحية لإعطاء إجابة معقولة، لا يمكن القول إنها *تفهم* الجملة. إذا تم تقديم جملة لإليزا بصيغة "**أنا** <u>حزين</u>"، فقد تعيد ترتيب الكلمات وتستبدلها لتكوين الرد "منذ متى **كنت** <u>حزينًا</u>".
هذا أعطى انطباعًا بأن إليزا فهمت العبارة وطرحت سؤالًا متابعًا، بينما في الواقع، كانت تغير الزمن وتضيف بعض الكلمات. إذا لم تستطع إليزا تحديد كلمة مفتاحية لديها إجابة لها، فإنها تقدم إجابة عشوائية قد تكون قابلة للتطبيق على العديد من العبارات المختلفة. يمكن خداع إليزا بسهولة، على سبيل المثال إذا كتب المستخدم "**أنت** <u>دراجة</u>"، فقد ترد بـ "منذ متى **أنا** <u>دراجة</u>؟"، بدلاً من إجابة أكثر منطقية.
هذا أعطى انطباعًا بأن إليزا فهمت العبارة وكانت تسأل سؤالًا متابعًا، بينما في الواقع كانت تغير الزمن وتضيف بعض الكلمات. إذا لم تتمكن إليزا من تحديد كلمة مفتاحية لديها رد عليها، فإنها ستعطي ردًا عشوائيًا يمكن أن يكون مناسبًا للعديد من العبارات المختلفة. يمكن خداع إليزا بسهولة، على سبيل المثال إذا كتب المستخدم "**أنت** <u>دراجة</u>"، فقد ترد بـ "منذ متى **كنت** <u>دراجة</u>؟"، بدلاً من رد أكثر منطقية.
[![الدردشة مع إليزا](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "الدردشة مع إليزا")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو عن برنامج إليزا الأصلي
> ملاحظة: يمكنك قراءة الوصف الأصلي لـ [إليزا](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) الذي نُشر عام 1966 إذا كان لديك حساب ACM. بدلاً من ذلك، اقرأ عن إليزا على [ويكيبيديا](https://wikipedia.org/wiki/ELIZA).
> ملاحظة: يمكنك قراءة الوصف الأصلي لـ [إليزا](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract) المنشور عام 1966 إذا كان لديك حساب ACM. بدلاً من ذلك، اقرأ عن إليزا على [ويكيبيديا](https://wikipedia.org/wiki/ELIZA).
## تمرين - برمجة روبوت محادثة بسيط
روبوت المحادثة، مثل إليزا، هو برنامج يستخرج مدخلات المستخدم ويبدو وكأنه يفهم ويستجيب بذكاء. على عكس إليزا، لن يحتوي روبوتنا على العديد من القواعد التي تعطيه انطباعًا بإجراء محادثة ذكية. بدلاً من ذلك، سيكون لروبوتنا قدرة واحدة فقط، وهي استمرار المحادثة بإجابات عشوائية قد تعمل في أي محادثة تافهة تقريبًا.
روبوت المحادثة، مثل إليزا، هو برنامج يستخرج مدخلات المستخدم ويبدو أنه يفهم ويستجيب بذكاء. على عكس إليزا، لن يحتوي روبوتنا على عدة قواعد تعطيه انطباعًا بإجراء محادثة ذكية. بدلاً من ذلك، سيكون لدى روبوتنا قدرة واحدة فقط، وهي استمرار المحادثة بردود عشوائية قد تعمل في أي محادثة بسيطة تقريبًا.
### الخطة
خطواتك عند بناء روبوت محادثة:
1. طباعة تعليمات توضح للمستخدم كيفية التفاعل مع الروبوت.
2. بدء حلقة.
1. قبول مدخلات المستخدم.
2. إذا طلب المستخدم الخروج، يتم إنهاء البرنامج.
3. معالجة مدخلات المستخدم وتحديد الإجابة (في هذه الحالة، الإجابة هي اختيار عشوائي من قائمة من الإجابات العامة الممكنة).
4. طباعة الإجابة.
3. العودة إلى الخطوة 2.
1. طباعة تعليمات تنصح المستخدم بكيفية التفاعل مع الروبوت
2. بدء حلقة
1. قبول مدخلات المستخدم
2. إذا طلب المستخدم الخروج، فقم بالخروج
3. معالجة مدخلات المستخدم وتحديد الرد (في هذه الحالة، الرد هو اختيار عشوائي من قائمة الردود العامة الممكنة)
4. طباعة الرد
3. العودة إلى الخطوة 2
### بناء الروبوت
لنقم بإنشاء الروبوت الآن. سنبدأ بتعريف بعض العبارات.
1. قم بإنشاء هذا الروبوت بنفسك في Python باستخدام الإجابات العشوائية التالية:
1. قم بإنشاء هذا الروبوت بنفسك في Python باستخدام الردود العشوائية التالية:
```python
random_responses = ["That is quite interesting, please tell me more.",
@ -119,7 +119,7 @@ CO_OP_TRANSLATOR_METADATA:
"Did you catch the game last night?"]
```
هنا مثال على المخرجات لتوجيهك (مدخلات المستخدم تبدأ بـ `>`):
إليك بعض المخرجات النموذجية لتوجيهك (مدخلات المستخدم تظهر على الأسطر التي تبدأ بـ `>`):
```output
Hello, I am Marvin, the simple robot.
@ -142,34 +142,34 @@ CO_OP_TRANSLATOR_METADATA:
It was nice talking to you, goodbye!
```
حل محتمل لهذه المهمة موجود [هنا](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py)
يمكن العثور على حل محتمل للمهمة [هنا](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py)
✅ توقف وفكر
1. هل تعتقد أن الإجابات العشوائية قد "تخدع" شخصًا ليعتقد أن الروبوت يفهمه بالفعل؟
1. هل تعتقد أن الردود العشوائية قد "تخدع" شخصًا ليعتقد أن الروبوت يفهمه بالفعل؟
2. ما الميزات التي يحتاجها الروبوت ليكون أكثر فعالية؟
3. إذا كان الروبوت يمكنه حقًا "فهم" معنى الجملة، فهل يحتاج إلى "تذكر" معنى الجمل السابقة في المحادثة أيضًا؟
3. إذا كان الروبوت يمكنه بالفعل "فهم" معنى الجملة، هل يحتاج إلى "تذكر" معنى الجمل السابقة في المحادثة أيضًا؟
---
## 🚀تحدي
اختر أحد العناصر في قسم "توقف وفكر" أعلاه وحاول إما تنفيذه في الكود أو كتابة حل على الورق باستخدام الكود الوهمي (pseudocode).
اختر أحد عناصر "توقف وفكر" أعلاه وحاول إما تنفيذه في الكود أو كتابة حل على الورق باستخدام الكود الوهمي.
في الدرس التالي، ستتعلم عن عدد من الطرق الأخرى لتحليل اللغة الطبيعية والتعلم الآلي.
في الدرس التالي، ستتعلم عن عدد من الأساليب الأخرى لتحليل اللغة الطبيعية والتعلم الآلي.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/32/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
اطلع على المراجع أدناه كفرص إضافية للقراءة.
اطلع على المراجع أدناه كفرص قراءة إضافية.
### المراجع
1. شوبيرت، لينهارت، "اللغويات الحاسوبية"، *موسوعة ستانفورد للفلسفة* (إصدار ربيع 2020)، إدوارد ن. زالتا (محرر)، الرابط = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
1. شوبيرت، لينهارت، "اللغويات الحاسوبية"، *موسوعة ستانفورد للفلسفة* (إصدار ربيع 2020)، تحرير إدوارد ن. زالتا، URL = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
2. جامعة برينستون "حول WordNet." [WordNet](https://wordnet.princeton.edu/). جامعة برينستون. 2010.
## الواجب
## الواجب
[ابحث عن روبوت](assignment.md)

@ -1,55 +1,55 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6534e145d52a3890590d27be75386e5d",
"translation_date": "2025-08-29T14:19:34+00:00",
"original_hash": "5f3cb462e3122e1afe7ab0050ccf2bd3",
"translation_date": "2025-09-04T20:53:06+00:00",
"source_file": "6-NLP/2-Tasks/README.md",
"language_code": "ar"
}
-->
# مهام وتقنيات معالجة اللغة الطبيعية الشائعة
# مهام وتقنيات شائعة في معالجة اللغة الطبيعية
في معظم مهام *معالجة اللغة الطبيعية*، يجب تقسيم النص المراد معالجته، وفحصه، وتخزين النتائج أو مقارنتها مع القواعد ومجموعات البيانات. تتيح هذه المهام للمبرمج استنتاج _المعنى_ أو _النية_ أو فقط _تكرار_ المصطلحات والكلمات في النص.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/33/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
دعونا نستكشف التقنيات الشائعة المستخدمة في معالجة النصوص. عند دمجها مع التعلم الآلي، تساعد هذه التقنيات في تحليل كميات كبيرة من النصوص بكفاءة. ومع ذلك، قبل تطبيق التعلم الآلي على هذه المهام، دعونا نفهم المشكلات التي يواجهها متخصص معالجة اللغة الطبيعية.
دعونا نستكشف التقنيات الشائعة المستخدمة في معالجة النصوص. عند دمجها مع التعلم الآلي، تساعدك هذه التقنيات على تحليل كميات كبيرة من النصوص بكفاءة. ولكن قبل تطبيق التعلم الآلي على هذه المهام، دعونا نفهم المشكلات التي يواجهها متخصصو معالجة اللغة الطبيعية.
## المهام الشائعة في معالجة اللغة الطبيعية
هناك طرق مختلفة لتحليل النص الذي تعمل عليه. هناك مهام يمكنك تنفيذها ومن خلالها يمكنك فهم النص واستخلاص الاستنتاجات. عادةً ما يتم تنفيذ هذه المهام بشكل متسلسل.
هناك طرق مختلفة لتحليل النص الذي تعمل عليه. هناك مهام يمكنك تنفيذها، ومن خلال هذه المهام يمكنك فهم النص واستخلاص استنتاجات. عادةً ما يتم تنفيذ هذه المهام بترتيب معين.
### تقسيم النص إلى وحدات (Tokenization)
### تقسيم النصوص (Tokenization)
ربما تكون أول خطوة تقوم بها معظم خوارزميات معالجة اللغة الطبيعية هي تقسيم النص إلى وحدات أو كلمات. على الرغم من أن هذا يبدو بسيطًا، إلا أن التعامل مع علامات الترقيم وفواصل الكلمات والجمل في اللغات المختلفة يمكن أن يجعل الأمر معقدًا. قد تحتاج إلى استخدام طرق مختلفة لتحديد الحدود.
ربما تكون أول خطوة تقوم بها معظم خوارزميات معالجة اللغة الطبيعية هي تقسيم النص إلى وحدات صغيرة، أو كلمات. على الرغم من أن هذا يبدو بسيطًا، إلا أن التعامل مع علامات الترقيم وفواصل الكلمات والجمل في لغات مختلفة قد يجعل الأمر معقدًا. قد تحتاج إلى استخدام طرق مختلفة لتحديد الفواصل.
![تقسيم النص إلى وحدات](../../../../translated_images/tokenization.1641a160c66cd2d93d4524e8114e93158a9ce0eba3ecf117bae318e8a6ad3487.ar.png)
> تقسيم جملة من **Pride and Prejudice**. تصميم بواسطة [Jen Looper](https://twitter.com/jenlooper)
![تقسيم النصوص](../../../../6-NLP/2-Tasks/images/tokenization.png)
> تقسيم جملة من **كبرياء وتحامل**. رسم توضيحي بواسطة [Jen Looper](https://twitter.com/jenlooper)
### التضمين (Embeddings)
[تضمين الكلمات](https://wikipedia.org/wiki/Word_embedding) هو طريقة لتحويل بيانات النص إلى أرقام. يتم التضمين بطريقة تجعل الكلمات ذات المعاني المتشابهة أو الكلمات المستخدمة معًا تتجمع معًا.
[تضمين الكلمات](https://wikipedia.org/wiki/Word_embedding) هو طريقة لتحويل بيانات النصوص إلى أرقام. يتم التضمين بطريقة تجعل الكلمات ذات المعاني المتشابهة أو الكلمات المستخدمة معًا تتجمع في مجموعات.
![تضمين الكلمات](../../../../translated_images/embedding.2cf8953c4b3101d188c2f61a5de5b6f53caaa5ad4ed99236d42bc3b6bd6a1fe2.ar.png)
> "أكن أعلى درجات الاحترام لأعصابك، فهي أصدقائي القدامى." - تضمين الكلمات لجملة من **Pride and Prejudice**. تصميم بواسطة [Jen Looper](https://twitter.com/jenlooper)
![تضمين الكلمات](../../../../6-NLP/2-Tasks/images/embedding.png)
> "لدي أعلى احترام لأعصابك، فهي أصدقائي القدامى." - تضمين الكلمات لجملة من **كبرياء وتحامل**. رسم توضيحي بواسطة [Jen Looper](https://twitter.com/jenlooper)
✅ جرب [هذه الأداة المثيرة](https://projector.tensorflow.org/) لتجربة تضمين الكلمات. النقر على كلمة واحدة يظهر مجموعات من الكلمات المشابهة: "toy" تتجمع مع "disney"، "lego"، "playstation"، و"console".
✅ جرّب [هذه الأداة المثيرة](https://projector.tensorflow.org/) لتجربة تضمين الكلمات. عند النقر على كلمة واحدة، تظهر مجموعات من الكلمات المشابهة: 'toy' تتجمع مع 'disney'، 'lego'، 'playstation'، و'console'.
### التحليل النحوي وتحديد أجزاء الكلام (Parsing & Part-of-speech Tagging)
### التحليل النحوي وتحديد أجزاء الكلام
كل كلمة تم تقسيمها يمكن تصنيفها كجزء من الكلام - اسم، فعل، أو صفة. الجملة `the quick red fox jumped over the lazy brown dog` قد يتم تصنيفها كالتالي: fox = اسم، jumped = فعل.
يمكن تصنيف كل كلمة تم تقسيمها كجزء من الكلام - اسم، فعل، أو صفة. الجملة `الثعلب الأحمر السريع قفز فوق الكلب البني الكسول` قد يتم تصنيفها نحويًا كالتالي: الثعلب = اسم، قفز = فعل.
![التحليل النحوي](../../../../translated_images/parse.d0c5bbe1106eae8fe7d60a183cd1736c8b6cec907f38000366535f84f3036101.ar.png)
![التحليل النحوي](../../../../6-NLP/2-Tasks/images/parse.png)
> تحليل جملة من **Pride and Prejudice**. تصميم بواسطة [Jen Looper](https://twitter.com/jenlooper)
> تحليل جملة من **كبرياء وتحامل**. رسم توضيحي بواسطة [Jen Looper](https://twitter.com/jenlooper)
التحليل النحوي هو التعرف على الكلمات المرتبطة ببعضها البعض في الجملة - على سبيل المثال `the quick red fox jumped` هو تسلسل صفة-اسم-فعل منفصل عن تسلسل `lazy brown dog`.
التحليل النحوي هو التعرف على الكلمات المرتبطة ببعضها البعض في الجملة - على سبيل المثال `الثعلب الأحمر السريع قفز` هو تسلسل صفة-اسم-فعل منفصل عن تسلسل `الكلب البني الكسول`.
### تكرار الكلمات والعبارات
إجراء مفيد عند تحليل نص كبير هو بناء قاموس لكل كلمة أو عبارة ذات اهتمام وعدد مرات ظهورها. العبارة `the quick red fox jumped over the lazy brown dog` تحتوي على تكرار للكلمة "the" بمقدار 2.
إجراء مفيد عند تحليل نص كبير هو بناء قاموس لكل كلمة أو عبارة ذات أهمية وعدد مرات ظهورها. العبارة `الثعلب الأحمر السريع قفز فوق الكلب البني الكسول` تحتوي على تكرار للكلمة "the" بمقدار 2.
دعونا نلقي نظرة على نص مثال حيث نعد تكرار الكلمات. قصيدة "The Winners" لروديارد كيبلينغ تحتوي على المقطع التالي:
دعونا نلقي نظرة على نص كمثال حيث نحسب تكرار الكلمات. قصيدة "The Winners" لرديارد كبلينغ تحتوي على المقطع التالي:
```output
What the moral? Who rides may read.
@ -60,78 +60,74 @@ Down to Gehenna or up to the Throne,
He travels the fastest who travels alone.
```
نظرًا لأن تكرار العبارات يمكن أن يكون حساسًا لحالة الأحرف أو غير حساس حسب الحاجة، فإن العبارة `a friend` لها تكرار بمقدار 2 و`the` لها تكرار بمقدار 6، و`travels` بمقدار 2.
نظرًا لأن تكرار العبارات يمكن أن يكون حساسًا أو غير حساس لحالة الأحرف حسب الحاجة، فإن العبارة `a friend` تظهر بتكرار 2 و`the` تظهر بتكرار 6، و`travels` تظهر بتكرار 2.
### N-grams
يمكن تقسيم النص إلى تسلسلات من الكلمات بطول محدد، كلمة واحدة (unigram)، كلمتين (bigrams)، ثلاث كلمات (trigrams) أو أي عدد من الكلمات (n-grams).
يمكن تقسيم النص إلى تسلسلات من الكلمات بطول معين، كلمة واحدة (unigram)، كلمتين (bigram)، ثلاث كلمات (trigram) أو أي عدد من الكلمات (n-grams).
على سبيل المثال `the quick red fox jumped over the lazy brown dog` مع درجة n-gram بمقدار 2 ينتج n-grams التالية:
على سبيل المثال، الجملة `الثعلب الأحمر السريع قفز فوق الكلب البني الكسول` مع قيمة n-gram تساوي 2 تنتج n-grams التالية:
1. the quick
2. quick red
3. red fox
4. fox jumped
5. jumped over
6. over the
7. the lazy
8. lazy brown
9. brown dog
1. الثعلب الأحمر
2. الأحمر السريع
3. السريع قفز
4. قفز فوق
5. فوق الكلب
6. الكلب البني
7. البني الكسول
قد يكون من الأسهل تصورها كصندوق متحرك فوق الجملة. هنا هو المثال لـ n-grams من 3 كلمات، حيث يتم تمييز n-gram في كل جملة:
قد يكون من الأسهل تصورها كصندوق متحرك فوق الجملة. هنا مثال لـ n-grams من 3 كلمات، حيث يتم تمييز n-gram في كل جملة:
1. <u>**the quick red**</u> fox jumped over the lazy brown dog
2. the **<u>quick red fox</u>** jumped over the lazy brown dog
3. the quick **<u>red fox jumped</u>** over the lazy brown dog
4. the quick red **<u>fox jumped over</u>** the lazy brown dog
5. the quick red fox **<u>jumped over the</u>** lazy brown dog
6. the quick red fox jumped **<u>over the lazy</u>** brown dog
7. the quick red fox jumped over <u>**the lazy brown**</u> dog
8. the quick red fox jumped over the **<u>lazy brown dog</u>**
1. <u>**الثعلب الأحمر السريع**</u> قفز فوق الكلب البني الكسول
2. الثعلب **<u>الأحمر السريع قفز</u>** فوق الكلب البني الكسول
3. الثعلب الأحمر **<u>السريع قفز فوق</u>** الكلب البني الكسول
4. الثعلب الأحمر السريع **<u>قفز فوق الكلب</u>** البني الكسول
5. الثعلب الأحمر السريع قفز **<u>فوق الكلب البني</u>** الكسول
6. الثعلب الأحمر السريع قفز فوق **<u>الكلب البني الكسول</u>**
![نافذة n-grams المتحركة](../../../../6-NLP/2-Tasks/images/n-grams.gif)
![نافذة n-grams](../../../../6-NLP/2-Tasks/images/n-grams.gif)
> قيمة N-gram بمقدار 3: تصميم بواسطة [Jen Looper](https://twitter.com/jenlooper)
> قيمة n-gram تساوي 3: رسم توضيحي بواسطة [Jen Looper](https://twitter.com/jenlooper)
### استخراج العبارات الاسمية
في معظم الجمل، هناك اسم يكون هو الموضوع أو المفعول به للجملة. في اللغة الإنجليزية، غالبًا ما يمكن التعرف عليه بوجود "a" أو "an" أو "the" قبله. تحديد الموضوع أو المفعول به للجملة عن طريق "استخراج العبارة الاسمية" هو مهمة شائعة في معالجة اللغة الطبيعية عند محاولة فهم معنى الجملة.
في معظم الجمل، هناك اسم يكون هو الموضوع أو المفعول به في الجملة. في اللغة الإنجليزية، يمكن التعرف عليه غالبًا بوجود 'a' أو 'an' أو 'the' قبله. التعرف على الموضوع أو المفعول به في الجملة عن طريق 'استخراج العبارة الاسمية' هو مهمة شائعة في معالجة اللغة الطبيعية عند محاولة فهم معنى الجملة.
✅ في الجملة "I cannot fix on the hour, or the spot, or the look or the words, which laid the foundation. It is too long ago. I was in the middle before I knew that I had begun."، هل يمكنك تحديد العبارات الاسمية؟
في الجملة `the quick red fox jumped over the lazy brown dog` هناك عبارتان اسميتان: **quick red fox** و**lazy brown dog**.
في الجملة `الثعلب الأحمر السريع قفز فوق الكلب البني الكسول` هناك عبارتان اسميتان: **الثعلب الأحمر السريع** و**الكلب البني الكسول**.
### تحليل المشاعر
يمكن تحليل الجملة أو النص لمعرفة المشاعر، أو مدى *إيجابيته* أو *سلبيته*. يتم قياس المشاعر من حيث *القطبية* و*الموضوعية/الذاتية*. يتم قياس القطبية من -1.0 إلى 1.0 (سلبي إلى إيجابي) ومن 0.0 إلى 1.0 (الأكثر موضوعية إلى الأكثر ذاتية).
يمكن تحليل جملة أو نص لتحديد المشاعر، أو مدى *إيجابيتها* أو *سلبيتها*. يتم قياس المشاعر من حيث *القطبية* و*الموضوعية/الذاتية*. يتم قياس القطبية من -1.0 إلى 1.0 (سلبي إلى إيجابي) والموضوعية من 0.0 إلى 1.0 (أكثر موضوعية إلى أكثر ذاتية).
✅ لاحقًا ستتعلم أن هناك طرقًا مختلفة لتحديد المشاعر باستخدام التعلم الآلي، ولكن إحدى الطرق هي وجود قائمة بالكلمات والعبارات التي يتم تصنيفها كإيجابية أو سلبية بواسطة خبير بشري وتطبيق هذا النموذج على النص لحساب درجة القطبية. هل ترى كيف يمكن أن تعمل هذه الطريقة في بعض الظروف وأقل في أخرى؟
✅ لاحقًا ستتعلم أن هناك طرقًا مختلفة لتحديد المشاعر باستخدام التعلم الآلي، ولكن إحدى الطرق هي وجود قائمة بالكلمات والعبارات المصنفة كإيجابية أو سلبية بواسطة خبير بشري وتطبيق هذا النموذج على النص لحساب درجة القطبية. هل ترى كيف يمكن أن تعمل هذه الطريقة في بعض الحالات وأقل في حالات أخرى؟
### التصريف
التصريف يتيح لك أخذ كلمة والحصول على صيغة المفرد أو الجمع لها.
### التوحيد (Lemmatization)
### التأسيس (Lemmatization)
*اللمّة* هي الجذر أو الكلمة الرئيسية لمجموعة من الكلمات، على سبيل المثال *flew*، *flies*، *flying* لها لمّة الفعل *fly*.
*التأسيس* هو الجذر أو الكلمة الرئيسية لمجموعة من الكلمات، على سبيل المثال *flew*، *flies*، *flying* لها جذر الفعل *fly*.
هناك أيضًا قواعد بيانات مفيدة متاحة للباحث في معالجة اللغة الطبيعية، وأبرزها:
هناك أيضًا قواعد بيانات مفيدة متاحة للباحثين في معالجة اللغة الطبيعية، وأبرزها:
### WordNet
[WordNet](https://wordnet.princeton.edu/) هي قاعدة بيانات للكلمات، المرادفات، الأضداد والعديد من التفاصيل الأخرى لكل كلمة في العديد من اللغات المختلفة. إنها مفيدة للغاية عند محاولة بناء الترجمات، المدقق الإملائي، أو أدوات اللغة من أي نوع.
[WordNet](https://wordnet.princeton.edu/) هي قاعدة بيانات للكلمات، المرادفات، الأضداد والعديد من التفاصيل الأخرى لكل كلمة في العديد من اللغات المختلفة. إنها مفيدة للغاية عند محاولة بناء الترجمات، المدققات الإملائية، أو أدوات اللغة من أي نوع.
## مكتبات معالجة اللغة الطبيعية
لحسن الحظ، لا تحتاج إلى بناء كل هذه التقنيات بنفسك، حيث توجد مكتبات Python ممتازة تجعلها أكثر سهولة للمطورين الذين ليسوا متخصصين في معالجة اللغة الطبيعية أو التعلم الآلي. تتضمن الدروس القادمة المزيد من الأمثلة على هذه المكتبات، ولكن هنا ستتعلم بعض الأمثلة المفيدة لمساعدتك في المهمة التالية.
لحسن الحظ، لست بحاجة إلى بناء كل هذه التقنيات بنفسك، حيث توجد مكتبات بايثون ممتازة تجعلها أكثر سهولة للمطورين الذين ليسوا متخصصين في معالجة اللغة الطبيعية أو التعلم الآلي. تتضمن الدروس القادمة المزيد من الأمثلة على هذه المكتبات، ولكن هنا ستتعلم بعض الأمثلة المفيدة لمساعدتك في المهمة التالية.
### تمرين - استخدام مكتبة `TextBlob`
دعونا نستخدم مكتبة تسمى TextBlob لأنها تحتوي على واجهات برمجية مفيدة للتعامل مع هذه الأنواع من المهام. TextBlob "تعتمد على العملاقين [NLTK](https://nltk.org) و[pattern](https://github.com/clips/pattern)، وتعمل بشكل جيد مع كليهما." تحتوي على قدر كبير من التعلم الآلي المدمج في واجهاتها البرمجية.
دعونا نستخدم مكتبة تسمى TextBlob لأنها تحتوي على واجهات برمجية مفيدة للتعامل مع هذا النوع من المهام. TextBlob "تعتمد على العملاقين [NLTK](https://nltk.org) و[pattern](https://github.com/clips/pattern)، وتعمل بشكل جيد مع كليهما." تحتوي على قدر كبير من التعلم الآلي المدمج في واجهاتها البرمجية.
> ملاحظة: دليل [البدء السريع](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) متاح لـ TextBlob ويوصى به للمطورين ذوي الخبرة في Python.
> ملاحظة: يتوفر [دليل البدء السريع](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) لـ TextBlob وهو موصى به لمطوري بايثون ذوي الخبرة.
عند محاولة تحديد *العبارات الاسمية*، تقدم TextBlob عدة خيارات للمستخرجين للعثور على العبارات الاسمية.
عند محاولة التعرف على *العبارات الاسمية*، تقدم TextBlob عدة خيارات من المستخلصات للعثور على العبارات الاسمية.
1. ألقِ نظرة على `ConllExtractor`.
@ -147,18 +143,18 @@ He travels the fastest who travels alone.
np = user_input_blob.noun_phrases
```
> ما الذي يحدث هنا؟ [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) هو "مستخرج للعبارات الاسمية يستخدم تحليل الكتل المدرب باستخدام مجموعة بيانات ConLL-2000." يشير ConLL-2000 إلى مؤتمر تعلم اللغة الطبيعية الحسابية لعام 2000. كل عام، استضاف المؤتمر ورشة عمل لمعالجة مشكلة صعبة في معالجة اللغة الطبيعية، وفي عام 2000 كانت المشكلة هي تقسيم العبارات الاسمية. تم تدريب نموذج على صحيفة وول ستريت جورنال، باستخدام "الأقسام 15-18 كبيانات تدريب (211727 رمزًا) والقسم 20 كبيانات اختبار (47377 رمزًا)". يمكنك الاطلاع على الإجراءات المستخدمة [هنا](https://www.clips.uantwerpen.be/conll2000/chunking/) والنتائج [هنا](https://ifarm.nl/erikt/research/np-chunking.html).
> ما الذي يحدث هنا؟ [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) هو "مستخلص للعبارات الاسمية يستخدم تحليل القطع المدرب باستخدام مجموعة بيانات ConLL-2000." يشير ConLL-2000 إلى مؤتمر 2000 حول التعلم الحاسوبي للغة الطبيعية. كل عام، يستضيف المؤتمر ورشة عمل لمعالجة مشكلة صعبة في معالجة اللغة الطبيعية، وفي عام 2000 كانت المشكلة هي تقسيم العبارات الاسمية. تم تدريب نموذج على صحيفة وول ستريت جورنال، باستخدام "الأقسام 15-18 كبيانات تدريب (211727 رمزًا) والقسم 20 كبيانات اختبار (47377 رمزًا)". يمكنك الاطلاع على الإجراءات المستخدمة [هنا](https://www.clips.uantwerpen.be/conll2000/chunking/) والنتائج [هنا](https://ifarm.nl/erikt/research/np-chunking.html).
### تحدي - تحسين الروبوت الخاص بك باستخدام معالجة اللغة الطبيعية
### التحدي - تحسين الروبوت الخاص بك باستخدام معالجة اللغة الطبيعية
في الدرس السابق، قمت ببناء روبوت بسيط للأسئلة والأجوبة. الآن، ستجعل "مارفن" أكثر تعاطفًا من خلال تحليل مدخلاتك لمعرفة المشاعر وطباعة استجابة تتناسب مع المشاعر. ستحتاج أيضًا إلى تحديد `noun_phrase` وطرح أسئلة حولها.
في الدرس السابق، قمت ببناء روبوت بسيط للأسئلة والأجوبة. الآن، ستجعل "مارفن" أكثر تعاطفًا من خلال تحليل مدخلاتك لتحديد المشاعر وطباعة استجابة تتناسب مع المشاعر. ستحتاج أيضًا إلى التعرف على `noun_phrase` وطرح أسئلة حولها.
خطواتك عند بناء روبوت محادثة أفضل:
1. طباعة التعليمات التي تنصح المستخدم بكيفية التفاعل مع الروبوت
2. بدء الحلقة
2. بدء حلقة
1. قبول مدخلات المستخدم
2. إذا طلب المستخدم الخروج، قم بالخروج
2. إذا طلب المستخدم الخروج، قم بإنهاء البرنامج
3. معالجة مدخلات المستخدم وتحديد استجابة المشاعر المناسبة
4. إذا تم اكتشاف عبارة اسمية في المشاعر، قم بجمعها واطلب المزيد من المدخلات حول هذا الموضوع
5. طباعة الاستجابة
@ -196,27 +192,27 @@ Hmm, that's not great. Can you tell me more about old hounddogs?
It was nice talking to you, goodbye!
```
يمكنك العثور على حل محتمل للمهمة [هنا](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py)
إحدى الحلول الممكنة للمهمة موجودة [هنا](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py)
✅ تحقق من المعرفة
1. هل تعتقد أن الاستجابات المتعاطفة قد "تخدع" شخصًا ليعتقد أن الروبوت يفهمه بالفعل؟
2. هل يجعل تحديد العبارة الاسمية الروبوت أكثر "إقناعًا"؟
3. لماذا قد يكون استخراج "العبارة الاسمية" من الجملة أمرًا مفيدًا؟
2. هل يجعل التعرف على العبارة الاسمية الروبوت أكثر "إقناعًا"؟
3. لماذا يعتبر استخراج "العبارة الاسمية" من الجملة أمرًا مفيدًا؟
---
قم بتنفيذ الروبوت في التحقق من المعرفة السابق واختبره على صديق. هل يمكنه خداعهم؟ هل يمكنك جعل الروبوت الخاص بك أكثر "إقناعًا"؟
قم بتنفيذ الروبوت في التحقق من المعرفة السابق واختبره مع صديق. هل يمكنه خداعهم؟ هل يمكنك جعل الروبوت الخاص بك أكثر "إقناعًا"؟
## 🚀تحدي
## 🚀التحدي
خذ مهمة من التحقق من المعرفة السابق وحاول تنفيذها. اختبر الروبوت على صديق. هل يمكنه خداعهم؟ هل يمكنك جعل الروبوت الخاص بك أكثر "إقناعًا"؟
خذ مهمة من التحقق من المعرفة السابق وحاول تنفيذها. اختبر الروبوت مع صديق. هل يمكنه خداعهم؟ هل يمكنك جعل الروبوت الخاص بك أكثر "إقناعًا"؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/34/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
في الدروس القادمة، ستتعلم المزيد عن تحليل المشاعر. ابحث عن هذه التقنية المثيرة في مقالات مثل تلك الموجودة على [KDNuggets](https://www.kdnuggets.com/tag/nlp)
في الدروس القليلة القادمة، ستتعلم المزيد عن تحليل المشاعر. ابحث عن هذه التقنية المثيرة في مقالات مثل تلك الموجودة على [KDNuggets](https://www.kdnuggets.com/tag/nlp)
## الواجب

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6396d5d8617572cd2ac1de74fb0deb22",
"translation_date": "2025-08-29T14:32:31+00:00",
"original_hash": "be03c8182982b87ced155e4e9d1438e8",
"translation_date": "2025-09-04T20:55:11+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/README.md",
"language_code": "ar"
}
@ -11,9 +11,9 @@ CO_OP_TRANSLATOR_METADATA:
في الدروس السابقة، تعلمت كيفية بناء روبوت أساسي باستخدام `TextBlob`، وهي مكتبة تحتوي على تقنيات تعلم آلي خلف الكواليس لأداء مهام معالجة اللغة الطبيعية الأساسية مثل استخراج العبارات الاسمية. أحد التحديات المهمة في اللغويات الحاسوبية هو الترجمة الدقيقة لجملة من لغة منطوقة أو مكتوبة إلى أخرى.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/35/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
الترجمة هي مشكلة صعبة للغاية بسبب وجود آلاف اللغات، ولكل منها قواعد نحوية مختلفة تمامًا. إحدى الطرق هي تحويل القواعد النحوية الرسمية للغة واحدة، مثل الإنجليزية، إلى هيكل غير معتمد على اللغة، ثم ترجمتها عن طريق تحويلها مرة أخرى إلى لغة أخرى. هذه الطريقة تتطلب الخطوات التالية:
الترجمة مشكلة صعبة للغاية بسبب وجود آلاف اللغات، ولكل منها قواعد نحوية مختلفة تمامًا. إحدى الطرق هي تحويل القواعد النحوية الرسمية للغة واحدة، مثل الإنجليزية، إلى هيكل غير معتمد على اللغة، ثم ترجمتها عن طريق تحويلها مرة أخرى إلى لغة أخرى. هذه الطريقة تتطلب الخطوات التالية:
1. **التحديد**. تحديد أو تصنيف الكلمات في اللغة المدخلة إلى أسماء، أفعال، إلخ.
2. **إنشاء الترجمة**. إنتاج ترجمة مباشرة لكل كلمة بتنسيق اللغة المستهدفة.
@ -30,7 +30,7 @@ CO_OP_TRANSLATOR_METADATA:
العبارة الإنجليزية `I feel happy` في الأيرلندية ستكون `Tá athas orm`. الترجمة *الحرفية* ستكون `Happy is upon me`.
المتحدث الأيرلندي الذي يترجم إلى الإنجليزية سيقول `I feel happy`، وليس `Happy is upon me`، لأنه يفهم معنى الجملة، حتى لو كانت الكلمات وهيكل الجملة مختلفين.
المتحدث الأيرلندي الذي يترجم إلى الإنجليزية سيقول `I feel happy` وليس `Happy is upon me`، لأنه يفهم معنى الجملة، حتى لو كانت الكلمات وهيكل الجملة مختلفين.
الترتيب الرسمي للجملة في الأيرلندية هو:
@ -40,7 +40,7 @@ CO_OP_TRANSLATOR_METADATA:
## الترجمة
برنامج الترجمة البسيط قد يترجم الكلمات فقط، متجاهلاً هيكل الجملة.
برنامج ترجمة بسيط قد يترجم الكلمات فقط، متجاهلاً هيكل الجملة.
✅ إذا كنت قد تعلمت لغة ثانية (أو ثالثة أو أكثر) كشخص بالغ، ربما بدأت بالتفكير بلغتك الأم، وترجمة المفهوم كلمة بكلمة في ذهنك إلى اللغة الثانية، ثم التحدث بترجمتك. هذا مشابه لما تفعله برامج الترجمة البسيطة. من المهم تجاوز هذه المرحلة لتحقيق الطلاقة!
@ -50,17 +50,17 @@ CO_OP_TRANSLATOR_METADATA:
### طرق التعلم الآلي
حتى الآن، تعلمت عن نهج القواعد الرسمية لمعالجة اللغة الطبيعية. نهج آخر هو تجاهل معنى الكلمات، وبدلاً من ذلك استخدام التعلم الآلي لاكتشاف الأنماط. يمكن أن يعمل هذا في الترجمة إذا كان لديك الكثير من النصوص (مجموعة نصوص) أو نصوص (مجموعات نصوص) في كل من اللغة الأصلية واللغة المستهدفة.
حتى الآن، تعلمت عن نهج القواعد الرسمية لمعالجة اللغة الطبيعية. نهج آخر هو تجاهل معنى الكلمات، و_بدلاً من ذلك استخدام التعلم الآلي لاكتشاف الأنماط_. يمكن أن يعمل هذا في الترجمة إذا كان لديك الكثير من النصوص (مجموعة نصوص) أو نصوص (مجموعات نصوص) في كل من اللغة الأصلية واللغة المستهدفة.
على سبيل المثال، ضع في اعتبارك حالة *Pride and Prejudice*، وهي رواية إنجليزية مشهورة كتبتها جين أوستن في عام 1813. إذا قمت بمراجعة الكتاب باللغة الإنجليزية وترجمة بشرية للكتاب باللغة *الفرنسية*، يمكنك اكتشاف عبارات في أحدهما تُترجم بشكل *اصطلاحي* إلى الآخر. ستقوم بذلك بعد قليل.
على سبيل المثال، ضع في اعتبارك حالة *Pride and Prejudice*، وهي رواية إنجليزية معروفة كتبتها جين أوستن في عام 1813. إذا قمت بمراجعة الكتاب باللغة الإنجليزية وترجمة بشرية للكتاب باللغة *الفرنسية*، يمكنك اكتشاف عبارات في أحدهما تُترجم بشكل *اصطلاحي* إلى الآخر. ستقوم بذلك بعد قليل.
على سبيل المثال، عندما تُترجم عبارة إنجليزية مثل `I have no money` حرفيًا إلى الفرنسية، قد تصبح `Je n'ai pas de monnaie`. "Monnaie" هي كلمة فرنسية خادعة، حيث أن 'money' و 'monnaie' ليسا مترادفين. ترجمة أفضل قد يقوم بها إنسان ستكون `Je n'ai pas d'argent`، لأنها تنقل المعنى بشكل أفضل بأنك لا تملك المال (بدلاً من 'الفكة' التي هي معنى 'monnaie').
![monnaie](../../../../translated_images/monnaie.606c5fa8369d5c3b3031ef0713e2069485c87985dd475cd9056bdf4c76c1f4b8.ar.png)
![monnaie](../../../../6-NLP/3-Translation-Sentiment/images/monnaie.png)
> الصورة بواسطة [Jen Looper](https://twitter.com/jenlooper)
إذا كان لدى نموذج التعلم الآلي عدد كافٍ من الترجمات البشرية لبناء نموذج عليها، يمكنه تحسين دقة الترجمات من خلال تحديد الأنماط الشائعة في النصوص التي تم ترجمتها مسبقًا بواسطة متحدثين بشريين خبراء في كلا اللغتين.
إذا كان لدى نموذج التعلم الآلي ما يكفي من الترجمات البشرية لبناء نموذج عليها، يمكنه تحسين دقة الترجمات من خلال تحديد الأنماط الشائعة في النصوص التي تم ترجمتها سابقًا بواسطة متحدثين بشريين خبراء في كلا اللغتين.
### تمرين - الترجمة
@ -78,11 +78,11 @@ print(blob.translate(to="fr"))
يقوم `TextBlob` بعمل جيد جدًا في الترجمة: "C'est une vérité universellement reconnue, qu'un homme célibataire en possession d'une bonne fortune doit avoir besoin d'une femme!".
يمكن القول إن ترجمة TextBlob أكثر دقة، في الواقع، من الترجمة الفرنسية للكتاب عام 1932 بواسطة V. Leconte و Ch. Pressoir:
يمكن القول إن ترجمة TextBlob أكثر دقة، في الواقع، من الترجمة الفرنسية لعام 1932 للكتاب بواسطة V. Leconte و Ch. Pressoir:
"C'est une vérité universelle qu'un célibataire pourvu d'une belle fortune doit avoir envie de se marier, et, si peu que l'on sache de son sentiment à cet egard, lorsqu'il arrive dans une nouvelle résidence, cette idée est si bien fixée dans l'esprit de ses voisins qu'ils le considèrent sur-le-champ comme la propriété légitime de l'une ou l'autre de leurs filles."
في هذه الحالة، الترجمة المستندة إلى التعلم الآلي تقوم بعمل أفضل من المترجم البشري الذي يضيف كلمات غير ضرورية إلى النص الأصلي للمؤلف من أجل "التوضيح".
في هذه الحالة، الترجمة المستندة إلى التعلم الآلي تقوم بعمل أفضل من المترجم البشري الذي يضيف كلمات غير ضرورية إلى النص الأصلي لتوضيح المعنى.
> ما الذي يحدث هنا؟ ولماذا TextBlob جيد جدًا في الترجمة؟ حسنًا، خلف الكواليس، يستخدم Google Translate، وهو ذكاء اصطناعي متقدم قادر على تحليل ملايين العبارات للتنبؤ بأفضل النصوص للمهمة المطلوبة. لا يوجد شيء يدوي يحدث هنا وتحتاج إلى اتصال بالإنترنت لاستخدام `blob.translate`.
@ -90,27 +90,27 @@ print(blob.translate(to="fr"))
## تحليل المشاعر
مجال آخر يمكن أن يعمل فيه التعلم الآلي بشكل جيد جدًا هو تحليل المشاعر. النهج غير المستند إلى التعلم الآلي لتحليل المشاعر هو تحديد الكلمات والعبارات التي تكون 'إيجابية' و'سلبية'. ثم، بالنظر إلى نص جديد، يتم حساب القيمة الإجمالية للكلمات الإيجابية والسلبية والمحايدة لتحديد المشاعر العامة.
مجال آخر يمكن أن يعمل فيه التعلم الآلي بشكل جيد جدًا هو تحليل المشاعر. النهج غير المستند إلى التعلم الآلي لتحليل المشاعر هو تحديد الكلمات والعبارات التي تكون 'إيجابية' و'سلبية'. ثم، عند إعطاء نص جديد، يتم حساب القيمة الإجمالية للكلمات الإيجابية والسلبية والمحايدة لتحديد المشاعر العامة.
هذا النهج يمكن خداعه بسهولة كما قد تكون رأيت في مهمة Marvin - الجملة `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` هي جملة ذات مشاعر سلبية ساخرة، لكن الخوارزمية البسيطة تكتشف 'great'، 'wonderful'، 'glad' كإيجابية و 'waste'، 'lost' و 'dark' ككلمات سلبية. المشاعر العامة تتأثر بهذه الكلمات المتضاربة.
هذا النهج يمكن خداعه بسهولة كما قد رأيت في مهمة Marvin - الجملة `Great, that was a wonderful waste of time, I'm glad we are lost on this dark road` هي جملة ساخرة ذات مشاعر سلبية، لكن الخوارزمية البسيطة تكتشف 'great'، 'wonderful'، 'glad' كإيجابية و'waste'، 'lost' و'dark' ككلمات سلبية. المشاعر العامة تتأثر بهذه الكلمات المتضاربة.
✅ توقف لحظة وفكر في كيفية التعبير عن السخرية كمتحدثين بشريين. يلعب تنغيم الصوت دورًا كبيرًا. حاول قول العبارة "Well, that film was awesome" بطرق مختلفة لاكتشاف كيف ينقل صوتك المعنى.
✅ توقف لحظة وفكر في كيفية تعبيرنا عن السخرية كمتحدثين بشريين. يلعب نبرة الصوت دورًا كبيرًا. حاول قول العبارة "Well, that film was awesome" بطرق مختلفة لاكتشاف كيف تنقل نبرة صوتك المعنى.
### طرق التعلم الآلي
النهج المستند إلى التعلم الآلي سيكون جمع نصوص سلبية وإيجابية يدويًا - تغريدات، أو مراجعات أفلام، أو أي شيء حيث أعطى الإنسان تقييمًا *ورأيًا مكتوبًا*. ثم يمكن تطبيق تقنيات معالجة اللغة الطبيعية على الآراء والتقييمات، بحيث تظهر الأنماط (على سبيل المثال، مراجعات الأفلام الإيجابية تميل إلى احتواء عبارة 'Oscar worthy' أكثر من مراجعات الأفلام السلبية، أو مراجعات المطاعم الإيجابية تقول 'gourmet' أكثر بكثير من 'disgusting').
> ⚖️ **مثال**: إذا كنت تعمل في مكتب سياسي وكان هناك قانون جديد قيد المناقشة، قد يكتب الناخبون إلى المكتب برسائل دعم أو رسائل ضد القانون الجديد. لنفترض أنك مكلف بقراءة الرسائل وفرزها في مجموعتين، *مع* و *ضد*. إذا كانت هناك الكثير من الرسائل، قد تشعر بالإرهاق أثناء محاولة قراءتها جميعًا. ألن يكون من الجيد إذا كان هناك روبوت يمكنه قراءة جميع الرسائل نيابة عنك، فهمها وإخبارك في أي مجموعة تنتمي كل رسالة؟
> ⚖️ **مثال**: إذا كنت تعمل في مكتب سياسي وكان هناك قانون جديد قيد المناقشة، قد يكتب الناخبون إلى المكتب برسائل دعم أو رسائل ضد القانون الجديد. لنفترض أنك مكلف بقراءة الرسائل وفرزها في مجموعتين، *مع* و *ضد*. إذا كانت هناك الكثير من الرسائل، قد تشعر بالإرهاق عند محاولة قراءتها جميعًا. ألن يكون من الجيد إذا كان بإمكان روبوت قراءة جميع الرسائل نيابة عنك، وفهمها وإخبارك بأي مجموعة تنتمي كل رسالة؟
>
> إحدى الطرق لتحقيق ذلك هي استخدام التعلم الآلي. ستقوم بتدريب النموذج بجزء من الرسائل *ضد* وجزء من الرسائل *مع*. النموذج سيميل إلى ربط العبارات والكلمات بالجانب ضد والجانب مع، *ولكنه لن يفهم أيًا من المحتوى*، فقط أن كلمات وأنماط معينة من المرجح أن تظهر في رسالة *ضد* أو رسالة *مع*. يمكنك اختباره ببعض الرسائل التي لم تستخدمها لتدريب النموذج، ومعرفة ما إذا كان يصل إلى نفس النتيجة التي وصلت إليها. ثم، بمجرد أن تكون راضيًا عن دقة النموذج، يمكنك معالجة الرسائل المستقبلية دون الحاجة إلى قراءة كل واحدة.
> إحدى الطرق لتحقيق ذلك هي استخدام التعلم الآلي. ستقوم بتدريب النموذج بجزء من الرسائل *ضد* وجزء من الرسائل *مع*. النموذج سيميل إلى ربط العبارات والكلمات بالجانب ضد والجانب مع، *ولكنه لن يفهم أيًا من المحتوى*، فقط أن كلمات وأنماط معينة من المرجح أن تظهر في رسالة ضد أو رسالة مع. يمكنك اختباره ببعض الرسائل التي لم تستخدمها لتدريب النموذج، ومعرفة ما إذا كان يصل إلى نفس النتيجة التي وصلت إليها. ثم، بمجرد أن تكون راضيًا عن دقة النموذج، يمكنك معالجة الرسائل المستقبلية دون الحاجة إلى قراءة كل واحدة.
✅ هل يبدو هذا العملية مشابهة للعمليات التي استخدمتها في الدروس السابقة؟
## تمرين - جمل ذات مشاعر
## تمرين - جمل عاطفية
يتم قياس المشاعر باستخدام *القطبية* من -1 إلى 1، مما يعني أن -1 هي المشاعر الأكثر سلبية، و1 هي المشاعر الأكثر إيجابية. يتم قياس المشاعر أيضًا بدرجة من 0 - 1 للموضوعية (0) والذاتية (1).
يتم قياس المشاعر باستخدام *القطبية* من -1 إلى 1، مما يعني أن -1 هي المشاعر الأكثر سلبية، و1 هي المشاعر الأكثر إيجابية. يتم قياس المشاعر أيضًا بدرجة من 0 إلى 1 للموضوعية (0) والذاتية (1).
ألقِ نظرة أخرى على *Pride and Prejudice* لجين أوستن. النص متاح هنا في [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). المثال أدناه يظهر برنامجًا قصيرًا يحلل مشاعر الجملة الأولى والأخيرة من الكتاب ويعرض درجة قطبية المشاعر ودرجة الموضوعية/الذاتية.
ألقِ نظرة أخرى على *Pride and Prejudice* لجين أوستن. النص متاح هنا في [Project Gutenberg](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm). المثال أدناه يظهر برنامجًا قصيرًا يحلل المشاعر للجمل الأولى والأخيرة من الكتاب ويعرض قطبية المشاعر ودرجة الموضوعية/الذاتية.
يجب عليك استخدام مكتبة `TextBlob` (الموصوفة أعلاه) لتحديد `sentiment` (لا تحتاج إلى كتابة حاسبة مشاعر خاصة بك) في المهمة التالية.
@ -139,18 +139,18 @@ Darcy, as well as Elizabeth, really loved them; and they were
uniting them. has a sentiment of Sentiment(polarity=0.7, subjectivity=0.8)
```
## تحدي - تحقق من قطبية المشاعر
## التحدي - تحقق من قطبية المشاعر
مهمتك هي تحديد، باستخدام قطبية المشاعر، ما إذا كان *Pride and Prejudice* يحتوي على جمل إيجابية تمامًا أكثر من الجمل السلبية تمامًا. لهذه المهمة، يمكنك افتراض أن درجة القطبية 1 أو -1 هي إيجابية تمامًا أو سلبية تمامًا على التوالي.
مهمتك هي تحديد، باستخدام قطبية المشاعر، ما إذا كان *Pride and Prejudice* يحتوي على جمل إيجابية تمامًا أكثر من الجمل السلبية تمامًا. لهذه المهمة، يمكنك افتراض أن درجة القطبية 1 أو -1 هي إيجابية أو سلبية تمامًا على التوالي.
**الخطوات:**
1. قم بتنزيل [نسخة من Pride and Prejudice](https://www.gutenberg.org/files/1342/1342-h/1342-h.htm) من Project Gutenberg كملف .txt. قم بإزالة البيانات الوصفية في بداية ونهاية الملف، تاركًا النص الأصلي فقط
2. افتح الملف في Python واستخرج المحتويات كسلسلة نصية
3. أنشئ TextBlob باستخدام سلسلة النصوص الخاصة بالكتاب
3. أنشئ TextBlob باستخدام سلسلة الكتاب
4. قم بتحليل كل جملة في الكتاب في حلقة
1. إذا كانت القطبية 1 أو -1، قم بتخزين الجملة في مصفوفة أو قائمة للرسائل الإيجابية أو السلبية
5. في النهاية، قم بطباعة جميع الجمل الإيجابية والجمل السلبية (بشكل منفصل) وعدد كل منها.
5. في النهاية، اطبع جميع الجمل الإيجابية والجمل السلبية (بشكل منفصل) وعدد كل منها.
إليك [حل نموذجي](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/3-Translation-Sentiment/solution/notebook.ipynb).
@ -177,18 +177,18 @@ Darcy, as well as Elizabeth, really loved them; and they were
- The pause was to Elizabeths feelings dreadful.
- It would be dreadful!
✅ أي شخص مهتم بجين أوستن سيفهم أنها غالبًا ما تستخدم كتبها لانتقاد الجوانب الأكثر سخافة في مجتمع إنجلترا في عصر الوصاية. إليزابيث بينيت، الشخصية الرئيسية في *Pride and Prejudice*، هي مراقبة اجتماعية بارعة (مثل المؤلفة) ولغتها غالبًا ما تكون مليئة بالتلميحات. حتى السيد دارسي (الحب الرئيسي في القصة) يلاحظ استخدام إليزابيث المرح والمزاح للغة: "لقد كان لي شرف معرفتك لفترة كافية لأعرف أنك تجد متعة كبيرة في التعبير عن آراء ليست في الواقع آرائك."
✅ أي شخص متمرس في أعمال جين أوستن سيفهم أنها غالبًا ما تستخدم كتبها لانتقاد الجوانب الأكثر سخافة في مجتمع العصر الريجنسي الإنجليزي. إليزابيث بينيت، الشخصية الرئيسية في *Pride and Prejudice*، هي مراقبة اجتماعية بارعة (مثل المؤلفة) ولغتها غالبًا ما تكون مليئة بالتلميحات. حتى السيد دارسي (الحبيب في القصة) يلاحظ استخدام إليزابيث المرح والماكر للغة: "لقد تعرفت عليك بما يكفي لأعرف أنك تجد متعة كبيرة في التعبير عن آراء ليست في الواقع آرائك."
---
## 🚀تحدي
## 🚀التحدي
هل يمكنك تحسين Marvin أكثر عن طريق استخراج ميزات أخرى من مدخلات المستخدم؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/36/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
هناك العديد من الطرق لاستخلاص المشاعر من النصوص. فكر في التطبيقات التجارية التي قد تستفيد من هذه التقنية. فكر أيضًا في كيفية احتمال حدوث أخطاء عند استخدامها. اقرأ المزيد عن الأنظمة المتطورة الجاهزة للمؤسسات التي تحلل المشاعر مثل [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). جرّب بعض الجمل من رواية "كبرياء وتحامل" المذكورة أعلاه، وشاهد ما إذا كان بإمكانها اكتشاف الفروق الدقيقة.
هناك العديد من الطرق لاستخراج المشاعر من النصوص. فكر في التطبيقات التجارية التي قد تستفيد من هذه التقنية. فكر في كيفية حدوث الأخطاء. اقرأ المزيد عن الأنظمة المتقدمة الجاهزة للمؤسسات التي تحلل المشاعر مثل [Azure Text Analysis](https://docs.microsoft.com/azure/cognitive-services/Text-Analytics/how-tos/text-analytics-how-to-sentiment-analysis?tabs=version-3-1?WT.mc_id=academic-77952-leestott). جرب بعض الجمل من رواية "كبرياء وتحامل" المذكورة أعلاه، وانظر إذا كان بإمكانها اكتشاف الفروق الدقيقة.
## المهمة
@ -197,4 +197,4 @@ Darcy, as well as Elizabeth, really loved them; and they were
---
**إخلاء المسؤولية**:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,44 +1,44 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "3c4738bb0836dd838c552ab9cab7e09d",
"translation_date": "2025-08-29T14:22:40+00:00",
"original_hash": "8d32dadeda93c6fb5c43619854882ab1",
"translation_date": "2025-09-04T20:53:38+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/README.md",
"language_code": "ar"
}
-->
# تحليل المشاعر باستخدام تقييمات الفنادق - معالجة البيانات
في هذا القسم، ستستخدم التقنيات التي تعلمتها في الدروس السابقة لإجراء تحليل استكشافي للبيانات على مجموعة بيانات كبيرة. بمجرد أن تحصل على فهم جيد لفائدة الأعمدة المختلفة، ستتعلم:
في هذا القسم، ستستخدم التقنيات التي تعلمتها في الدروس السابقة لإجراء تحليل استكشافي للبيانات لمجموعة بيانات كبيرة. بمجرد أن تحصل على فهم جيد لفائدة الأعمدة المختلفة، ستتعلم:
- كيفية إزالة الأعمدة غير الضرورية
- كيفية حساب بيانات جديدة بناءً على الأعمدة الموجودة
- كيفية حفظ مجموعة البيانات الناتجة لاستخدامها في التحدي النهائي
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/37/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
### المقدمة
حتى الآن، تعلمت أن البيانات النصية تختلف تمامًا عن البيانات الرقمية. إذا كانت النصوص مكتوبة أو منطوقة من قبل البشر، يمكن تحليلها لاكتشاف الأنماط والتكرارات، المشاعر والمعاني. تأخذك هذه الدرسة إلى مجموعة بيانات حقيقية مع تحدٍ حقيقي: **[515K تقييمات فنادق في أوروبا](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** وتشمل [رخصة CC0: المجال العام](https://creativecommons.org/publicdomain/zero/1.0/). تم جمع البيانات من Booking.com من مصادر عامة. منشئ مجموعة البيانات هو Jiashen Liu.
حتى الآن، تعلمت أن البيانات النصية تختلف تمامًا عن البيانات الرقمية. إذا كانت النصوص مكتوبة أو منطوقة من قبل البشر، يمكن تحليلها لاكتشاف الأنماط والتكرارات، المشاعر والمعاني. تأخذك هذه الدرسة إلى مجموعة بيانات حقيقية مع تحدٍ حقيقي: **[515K تقييمات فنادق في أوروبا](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe)** وتشمل [رخصة CC0: Public Domain](https://creativecommons.org/publicdomain/zero/1.0/). تم جمع البيانات من Booking.com من مصادر عامة. منشئ مجموعة البيانات هو Jiashen Liu.
### التحضير
ستحتاج إلى:
- القدرة على تشغيل دفاتر .ipynb باستخدام Python 3
- مكتبة pandas
- مكتبة NLTK، [والتي يجب تثبيتها محليًا](https://www.nltk.org/install.html)
- مجموعة البيانات المتوفرة على Kaggle [515K تقييمات فنادق في أوروبا](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). حجمها حوالي 230 ميجابايت بعد فك الضغط. قم بتنزيلها إلى مجلد `/data` الجذر المرتبط بهذه الدروس.
* القدرة على تشغيل دفاتر .ipynb باستخدام Python 3
* مكتبة pandas
* مكتبة NLTK، [والتي يجب تثبيتها محليًا](https://www.nltk.org/install.html)
* مجموعة البيانات المتوفرة على Kaggle [515K تقييمات فنادق في أوروبا](https://www.kaggle.com/jiashenliu/515k-hotel-reviews-data-in-europe). حجمها حوالي 230 ميجابايت بعد فك الضغط. قم بتنزيلها إلى مجلد `/data` الجذر المرتبط بهذه الدروس.
## التحليل الاستكشافي للبيانات
## تحليل استكشافي للبيانات
يفترض هذا التحدي أنك تقوم ببناء روبوت توصيات للفنادق باستخدام تحليل المشاعر وتقييمات الضيوف. تتضمن مجموعة البيانات التي ستستخدمها تقييمات لـ 1493 فندقًا مختلفًا في 6 مدن.
باستخدام Python، ومجموعة بيانات تقييمات الفنادق، وتحليل المشاعر باستخدام NLTK، يمكنك اكتشاف:
باستخدام Python، مجموعة بيانات تقييمات الفنادق، وتحليل المشاعر باستخدام NLTK، يمكنك اكتشاف:
- ما هي الكلمات والعبارات الأكثر استخدامًا في التقييمات؟
- هل تتطابق *العلامات* الرسمية التي تصف الفندق مع درجات التقييم (على سبيل المثال، هل التقييمات السلبية أكثر لفندق معين من قبل *عائلة مع أطفال صغار* مقارنة بـ *مسافر منفرد*، مما قد يشير إلى أنه أفضل لـ *المسافرين المنفردين*
- هل تتفق درجات المشاعر في NLTK مع التقييم الرقمي للمراجع؟
* ما هي الكلمات والعبارات الأكثر استخدامًا في التقييمات؟
* هل تتطابق *العلامات* الرسمية التي تصف الفندق مع درجات التقييم (على سبيل المثال، هل التقييمات السلبية لفندق معين أكثر شيوعًا من قبل *عائلة مع أطفال صغار* مقارنة بـ *مسافر منفرد*، مما قد يشير إلى أنه أفضل لـ *المسافرين المنفردين*
* هل تتفق درجات المشاعر في NLTK مع التقييم الرقمي للمراجع؟
#### مجموعة البيانات
@ -51,26 +51,26 @@ CO_OP_TRANSLATOR_METADATA:
هنا تم تجميعها بطريقة قد تكون أسهل للفحص:
##### أعمدة الفندق
- `Hotel_Name`, `Hotel_Address`, `lat` (خط العرض), `lng` (خط الطول)
- باستخدام *lat* و*lng* يمكنك رسم خريطة باستخدام Python تُظهر مواقع الفنادق (ربما يتم تلوينها حسب التقييمات السلبية والإيجابية)
- من الواضح أن Hotel_Address ليس مفيدًا لنا، وربما نستبدله بدولة لتسهيل الفرز والبحث
* `Hotel_Name`, `Hotel_Address`, `lat` (خط العرض), `lng` (خط الطول)
* باستخدام *lat* و *lng* يمكنك رسم خريطة باستخدام Python تُظهر مواقع الفنادق (ربما يتم تلوينها حسب التقييمات السلبية والإيجابية)
* من الواضح أن Hotel_Address ليس مفيدًا لنا، وربما نستبدله بدولة لتسهيل الفرز والبحث
**أعمدة المراجعات العامة للفندق**
- `Average_Score`
- وفقًا لمنشئ مجموعة البيانات، هذا العمود هو *متوسط تقييم الفندق، محسوب بناءً على أحدث تعليق في العام الماضي*. يبدو أن هذه طريقة غير عادية لحساب التقييم، ولكن بما أن هذه هي البيانات المستخرجة، يمكننا قبولها كما هي في الوقت الحالي.
* `Average_Score`
* وفقًا لمنشئ مجموعة البيانات، هذا العمود هو *متوسط تقييم الفندق، محسوب بناءً على أحدث تعليق في العام الماضي*. يبدو أن هذه طريقة غير عادية لحساب التقييم، ولكن بما أن هذه هي البيانات المستخرجة، يمكننا أخذها كما هي الآن.
✅ بناءً على الأعمدة الأخرى في هذه البيانات، هل يمكنك التفكير في طريقة أخرى لحساب متوسط التقييم؟
- `Total_Number_of_Reviews`
- إجمالي عدد التقييمات التي تلقاها هذا الفندق - ليس من الواضح (دون كتابة بعض الأكواد) ما إذا كان هذا يشير إلى التقييمات في مجموعة البيانات.
- `Additional_Number_of_Scoring`
- يعني أن التقييم تم تقديمه ولكن لم يتم كتابة مراجعة إيجابية أو سلبية من قبل المراجع.
* `Total_Number_of_Reviews`
* إجمالي عدد التقييمات التي تلقاها هذا الفندق - ليس من الواضح (دون كتابة بعض التعليمات البرمجية) ما إذا كان هذا يشير إلى التقييمات في مجموعة البيانات.
* `Additional_Number_of_Scoring`
* يعني أن التقييم تم تقديمه ولكن لم يتم كتابة مراجعة إيجابية أو سلبية من قبل المراجع
**أعمدة المراجعات**
- `Reviewer_Score`
- هذه قيمة رقمية بأقصى حد عشري واحد بين القيم الدنيا والقصوى 2.5 و10
- هذه قيمة رقمية بأقصى عدد عشري واحد بين القيم الدنيا والقصوى 2.5 و 10
- لم يتم توضيح سبب كون 2.5 هو أدنى تقييم ممكن
- `Negative_Review`
- إذا لم يكتب المراجع شيئًا، سيكون هذا الحقل "**No Negative**"
@ -82,46 +82,46 @@ CO_OP_TRANSLATOR_METADATA:
- لاحظ أن المراجع قد يكتب مراجعة سلبية في عمود المراجعة الإيجابية (على سبيل المثال، "لا يوجد شيء جيد في هذا الفندق على الإطلاق")
- `Review_Total_Positive_Word_Counts`
- تشير أعداد الكلمات الإيجابية الأعلى إلى تقييم أعلى (دون التحقق من المشاعر)
- `Review_Date` و`days_since_review`
- يمكن تطبيق مقياس حداثة أو قدم على المراجعة (قد لا تكون المراجعات القديمة دقيقة مثل المراجعات الجديدة بسبب تغييرات في إدارة الفندق، أو تجديدات، أو إضافة مرافق مثل مسبح)
- `Review_Date` و `days_since_review`
- يمكن تطبيق مقياس حداثة أو قدم على المراجعة (قد لا تكون المراجعات القديمة دقيقة مثل الجديدة بسبب تغييرات في إدارة الفندق، أو تجديدات، أو إضافة مرافق مثل مسبح)
- `Tags`
- هذه أوصاف قصيرة قد يختارها المراجع لوصف نوع الضيف الذي كان عليه (على سبيل المثال، منفرد أو عائلة)، نوع الغرفة التي حصل عليها، مدة الإقامة وكيفية تقديم المراجعة.
- لسوء الحظ، استخدام هذه العلامات يمثل مشكلة، تحقق من القسم أدناه الذي يناقش فائدتها.
- لسوء الحظ، استخدام هذه العلامات يمثل مشكلة، تحقق من القسم أدناه الذي يناقش فائدتها
**أعمدة المراجع**
- `Total_Number_of_Reviews_Reviewer_Has_Given`
- قد يكون هذا عاملًا في نموذج التوصية، على سبيل المثال، إذا كان بإمكانك تحديد أن المراجعين الأكثر إنتاجية الذين لديهم مئات المراجعات كانوا أكثر ميلًا إلى السلبية بدلاً من الإيجابية. ومع ذلك، فإن المراجع لأي مراجعة معينة غير معرف برمز فريد، وبالتالي لا يمكن ربطه بمجموعة من المراجعات. هناك 30 مراجعًا لديهم 100 مراجعة أو أكثر، ولكن من الصعب رؤية كيف يمكن أن يساعد ذلك في نموذج التوصية.
- قد يكون هذا عاملًا في نموذج التوصيات، على سبيل المثال، إذا كان بإمكانك تحديد أن المراجعين الأكثر إنتاجية الذين لديهم مئات المراجعات كانوا أكثر ميلًا لأن يكونوا سلبيين بدلاً من إيجابيين. ومع ذلك، فإن المراجع لأي مراجعة معينة غير معرف برمز فريد، وبالتالي لا يمكن ربطه بمجموعة من المراجعات. هناك 30 مراجعًا لديهم 100 مراجعة أو أكثر، ولكن من الصعب رؤية كيف يمكن أن يساعد ذلك في نموذج التوصيات.
- `Reviewer_Nationality`
- قد يعتقد البعض أن بعض الجنسيات أكثر ميلًا لتقديم مراجعات إيجابية أو سلبية بسبب ميول وطنية. كن حذرًا عند بناء مثل هذه الآراء القصصية في نماذجك. هذه قوالب نمطية وطنية (وأحيانًا عرقية)، وكل مراجع هو فرد كتب مراجعة بناءً على تجربته. قد تكون قد تمت تصفيتها من خلال العديد من العدسات مثل إقاماتهم الفندقية السابقة، المسافة التي قطعوها، ومزاجهم الشخصي. التفكير بأن جنسيتهم كانت السبب في تقييمهم أمر يصعب تبريره.
- قد يعتقد البعض أن بعض الجنسيات أكثر ميلًا لتقديم مراجعة إيجابية أو سلبية بسبب ميول وطنية. كن حذرًا عند بناء مثل هذه الآراء القصصية في نماذجك. هذه قوالب نمطية وطنية (وأحيانًا عرقية)، وكل مراجع هو فرد كتب مراجعة بناءً على تجربته. قد تكون التجربة قد تمت تصفيتها من خلال العديد من العدسات مثل إقاماتهم الفندقية السابقة، المسافة التي قطعوها، ومزاجهم الشخصي. من الصعب تبرير أن جنسيتهم كانت السبب وراء تقييمهم.
##### أمثلة
| متوسط التقييم | إجمالي عدد التقييمات | تقييم المراجع | المراجعة السلبية | المراجعة الإيجابية | العلامات |
| -------------- | ---------------------- | ---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- |
| 7.8 | 1945 | 2.5 | هذا ليس فندقًا حاليًا بل موقع بناء. تعرضت للإزعاج من الضوضاء غير المقبولة طوال اليوم أثناء الراحة بعد رحلة طويلة والعمل في الغرفة. طلبت تغيير الغرفة ولكن لم تكن هناك غرفة هادئة متاحة. الأسوأ من ذلك، تم تحميلي رسومًا زائدة. غادرت في المساء لأنني كنت بحاجة إلى مغادرة مبكرة جدًا. مكان رهيب. لا تعاقب نفسك بالحجز هنا. | لا شيء. مكان رهيب. ابتعد. | رحلة عمل، زوجان، غرفة مزدوجة قياسية، إقامة لمدة ليلتين |
| 7.8 | 1945 | 2.5 | هذا ليس فندقًا حاليًا بل موقع بناء. تعرضت للإزعاج من الصباح الباكر وطوال اليوم بضوضاء بناء غير مقبولة أثناء الراحة بعد رحلة طويلة والعمل في الغرفة. كان الناس يعملون طوال اليوم باستخدام المطارق في الغرف المجاورة. طلبت تغيير الغرفة ولكن لم تكن هناك غرفة هادئة متاحة. لجعل الأمور أسوأ، تم تحميلي رسومًا زائدة. غادرت في المساء لأنني كنت بحاجة إلى مغادرة رحلة مبكرة جدًا وتلقيت فاتورة مناسبة. بعد يوم، قام الفندق بخصم آخر دون موافقتي بمبلغ يزيد عن السعر المحجوز. إنه مكان فظيع. لا تعاقب نفسك بالحجز هنا. | لا شيء. مكان رهيب. ابتعد. | رحلة عمل، زوجان، غرفة مزدوجة قياسية، أقاموا ليلتين |
كما ترى، لم يكن هذا الضيف سعيدًا بإقامته في هذا الفندق. الفندق لديه متوسط تقييم جيد يبلغ 7.8 و1945 مراجعة، لكن هذا المراجع أعطاه 2.5 وكتب 115 كلمة عن مدى سلبية إقامته. إذا لم يكتبوا شيئًا على الإطلاق في عمود المراجعة الإيجابية، قد تستنتج أنه لم يكن هناك شيء إيجابي، ولكن للأسف كتبوا 7 كلمات تحذيرية. إذا قمنا فقط بعد الكلمات بدلاً من معنى الكلمات أو مشاعرها، قد نحصل على رؤية مشوهة لنية المراجع. الغريب أن تقييمهم بـ 2.5 محير، لأنه إذا كانت الإقامة في الفندق سيئة جدًا، فلماذا يعطونه أي نقاط على الإطلاق؟ عند التحقيق في مجموعة البيانات عن كثب، ستلاحظ أن أدنى تقييم ممكن هو 2.5، وليس 0. وأعلى تقييم ممكن هو 10.
كما ترى، لم يكن هذا الضيف سعيدًا بإقامته في هذا الفندق. الفندق لديه متوسط تقييم جيد يبلغ 7.8 و1945 مراجعة، لكن هذا المراجع أعطاه 2.5 وكتب 115 كلمة عن مدى سلبية إقامته. إذا لم يكتبوا شيئًا على الإطلاق في عمود المراجعة الإيجابية، يمكنك أن تستنتج أنه لم يكن هناك شيء إيجابي، ولكن للأسف كتبوا 7 كلمات تحذيرية. إذا قمنا فقط بعد الكلمات بدلاً من معنى الكلمات أو مشاعرها، فقد نحصل على رؤية مشوهة لنية المراجع. الغريب أن تقييمهم بـ 2.5 محير، لأنه إذا كانت الإقامة في الفندق سيئة جدًا، فلماذا يعطونه أي نقاط على الإطلاق؟ عند التحقيق في مجموعة البيانات عن كثب، ستلاحظ أن أدنى تقييم ممكن هو 2.5، وليس 0. وأعلى تقييم ممكن هو 10.
##### العلامات
كما ذكر أعلاه، عند النظر لأول مرة، يبدو أن فكرة استخدام `Tags` لتصنيف البيانات منطقية. لسوء الحظ، هذه العلامات ليست موحدة، مما يعني أنه في فندق معين، قد تكون الخيارات *غرفة فردية*، *غرفة مزدوجة*، و*غرفة توأم*، ولكن في الفندق التالي، تكون *غرفة فردية ديلوكس*، *غرفة كلاسيكية كوين*، و*غرفة تنفيذية كينغ*. قد تكون هذه نفس الأشياء، ولكن هناك العديد من الاختلافات بحيث يصبح الخيار:
كما ذكر أعلاه، عند النظر لأول مرة، يبدو أن فكرة استخدام `Tags` لتصنيف البيانات منطقية. لسوء الحظ، هذه العلامات ليست موحدة، مما يعني أنه في فندق معين، قد تكون الخيارات *غرفة فردية*، *غرفة مزدوجة*، و*غرفة توأم*، ولكن في الفندق التالي، تكون *غرفة فردية ديلوكس*، *غرفة كوين كلاسيكية*، و*غرفة كينغ تنفيذية*. قد تكون هذه نفس الأشياء، ولكن هناك العديد من الاختلافات بحيث يصبح الخيار:
1. محاولة تغيير جميع المصطلحات إلى معيار واحد، وهو أمر صعب للغاية، لأنه ليس من الواضح ما هو مسار التحويل في كل حالة (على سبيل المثال، *غرفة فردية كلاسيكية* تتطابق مع *غرفة فردية* ولكن *غرفة كوين متفوقة مع إطلالة على الحديقة أو المدينة* أصعب في المطابقة)
2. يمكننا اتخاذ نهج NLP وقياس تكرار مصطلحات معينة مثل *منفرد*، *مسافر عمل*، أو *عائلة مع أطفال صغار* كما تنطبق على كل فندق، وإدخال ذلك في التوصية.
1. يمكننا اتخاذ نهج NLP وقياس تكرار مصطلحات معينة مثل *منفرد*، *مسافر عمل*، أو *عائلة مع أطفال صغار* كما تنطبق على كل فندق، وإدخال ذلك في نموذج التوصية
العلامات عادةً (ولكن ليس دائمًا) تكون حقلًا واحدًا يحتوي على قائمة من 5 إلى 6 قيم مفصولة بفواصل تتماشى مع *نوع الرحلة*، *نوع الضيوف*، *نوع الغرفة*، *عدد الليالي*، و*نوع الجهاز الذي تم تقديم المراجعة عليه*. ومع ذلك، نظرًا لأن بعض المراجعين لا يملؤون كل حقل (قد يتركون واحدًا فارغًا)، فإن القيم ليست دائمًا بنفس الترتيب.
عادةً ما تكون العلامات (ولكن ليس دائمًا) حقلًا واحدًا يحتوي على قائمة من 5 إلى 6 قيم مفصولة بفواصل تتماشى مع *نوع الرحلة*، *نوع الضيوف*، *نوع الغرفة*، *عدد الليالي*، و*نوع الجهاز الذي تم تقديم المراجعة عليه*. ومع ذلك، نظرًا لأن بعض المراجعين لا يملأون كل حقل (قد يتركون واحدًا فارغًا)، فإن القيم ليست دائمًا بنفس الترتيب.
كمثال، خذ *نوع المجموعة*. هناك 1025 إمكانية فريدة في هذا الحقل في عمود `Tags`، وللأسف فقط بعضها يشير إلى مجموعة (بعضها يشير إلى نوع الغرفة وما إلى ذلك). إذا قمت بتصفية فقط القيم التي تشير إلى العائلة، تحتوي النتائج على العديد من النتائج من نوع *غرفة عائلية*. إذا قمت بتضمين مصطلح *مع*، أي عد القيم *عائلة مع*، تكون النتائج أفضل، مع أكثر من 80,000 من أصل 515,000 نتيجة تحتوي على العبارة "عائلة مع أطفال صغار" أو "عائلة مع أطفال كبار".
كمثال، خذ *نوع المجموعة*. هناك 1025 إمكانية فريدة في هذا الحقل في عمود `Tags`، وللأسف فقط بعض منها يشير إلى مجموعة (بعضها يشير إلى نوع الغرفة وما إلى ذلك). إذا قمت بتصفية فقط القيم التي تذكر العائلة، تحتوي النتائج على العديد من النتائج من نوع *غرفة عائلية*. إذا قمت بتضمين مصطلح *مع*، أي عد القيم *عائلة مع*، تكون النتائج أفضل، مع أكثر من 80,000 من 515,000 نتيجة تحتوي على العبارة "عائلة مع أطفال صغار" أو "عائلة مع أطفال كبار".
هذا يعني أن عمود العلامات ليس عديم الفائدة تمامًا بالنسبة لنا، ولكنه سيحتاج إلى بعض العمل لجعله مفيدًا.
هذا يعني أن عمود العلامات ليس عديم الفائدة تمامًا بالنسبة لنا، ولكنه سيتطلب بعض العمل لجعله مفيدًا.
##### متوسط تقييم الفندق
هناك عدد من الغرائب أو التناقضات مع مجموعة البيانات التي لا أستطيع فهمها، ولكنها موضحة هنا لتكون على دراية بها عند بناء نماذجك. إذا اكتشفتها، يرجى إخبارنا في قسم المناقشة!
تحتوي مجموعة البيانات على الأعمدة التالية المتعلقة بمتوسط التقييم وعدد المراجعات:
تحتوي مجموعة البيانات على الأعمدة التالية المتعلقة بمتوسط التقييم وعدد التقييمات:
1. Hotel_Name
2. Additional_Number_of_Scoring
@ -129,23 +129,22 @@ CO_OP_TRANSLATOR_METADATA:
4. Total_Number_of_Reviews
5. Reviewer_Score
الفندق الوحيد الذي يحتوي على أكبر عدد من المراجعات في هذه المجموعة هو *Britannia International Hotel Canary Wharf* مع 4789 مراجعة من أصل 515,000. ولكن إذا نظرنا إلى قيمة `Total_Number_of_Reviews` لهذا الفندق، فهي 9086. قد تستنتج أن هناك العديد من التقييمات بدون مراجعات، لذا ربما يجب أن نضيف قيمة عمود `Additional_Number_of_Scoring`. تلك القيمة هي 2682، وإضافتها إلى 4789 تعطينا 7471، وهو ما يزال أقل بـ 1615 من `Total_Number_of_Reviews`.
الفندق الوحيد الذي يحتوي على أكبر عدد من التقييمات في هذه المجموعة هو *Britannia International Hotel Canary Wharf* مع 4789 تقييمًا من أصل 515,000. ولكن إذا نظرنا إلى قيمة `Total_Number_of_Reviews` لهذا الفندق، فهي 9086. قد تستنتج أن هناك العديد من التقييمات بدون مراجعات، لذا ربما يجب أن نضيف قيمة عمود `Additional_Number_of_Scoring`. تلك القيمة هي 2682، وإضافتها إلى 4789 تعطينا 7471، وهو ما يزال أقل بـ 1615 من `Total_Number_of_Reviews`.
إذا أخذت عمود `Average_Score`، قد تستنتج أنه متوسط المراجعات في مجموعة البيانات، ولكن الوصف من Kaggle هو "*متوسط تقييم الفندق، محسوب بناءً على أحدث تعليق في العام الماضي*". هذا لا يبدو مفيدًا جدًا، ولكن يمكننا حساب متوسطنا الخاص بناءً على تقييمات المراجعين في مجموعة البيانات. باستخدام نفس الفندق كمثال، متوسط تقييم الفندق المعطى هو 7.1 ولكن التقييم المحسوب (متوسط تقييمات المراجعين *في* مجموعة البيانات) هو 6.8. هذا قريب، ولكنه ليس نفس القيمة، ويمكننا فقط التخمين أن التقييمات المعطاة في مراجعات `Additional_Number_of_Scoring` زادت المتوسط إلى 7.1. لسوء الحظ، مع عدم وجود طريقة لاختبار أو إثبات هذا الافتراض، من الصعب استخدام أو الوثوق بـ `Average_Score`، `Additional_Number_of_Scoring` و`Total_Number_of_Reviews` عندما تستند إلى، أو تشير إلى، بيانات لا نملكها.
إذا أخذت عمود `Average_Score`، قد تستنتج أنه متوسط التقييمات في مجموعة البيانات، ولكن الوصف من Kaggle هو "*متوسط تقييم الفندق، محسوب بناءً على أحدث تعليق في العام الماضي*". هذا لا يبدو مفيدًا جدًا، ولكن يمكننا حساب متوسطنا الخاص بناءً على تقييمات المراجعين في مجموعة البيانات. باستخدام نفس الفندق كمثال، متوسط تقييم الفندق المعطى هو 7.1 ولكن التقييم المحسوب (متوسط تقييمات المراجعين *في* مجموعة البيانات) هو 6.8. هذا قريب، ولكنه ليس نفس القيمة، ويمكننا فقط التخمين بأن التقييمات المعطاة في مراجعات `Additional_Number_of_Scoring` زادت المتوسط إلى 7.1. لسوء الحظ، مع عدم وجود طريقة لاختبار أو إثبات هذا الافتراض، من الصعب استخدام أو الوثوق بـ `Average_Score`، `Additional_Number_of_Scoring` و `Total_Number_of_Reviews` عندما تستند إلى، أو تشير إلى، بيانات لا نملكها.
لتعقيد الأمور أكثر، الفندق الذي يحتوي على ثاني أعلى عدد من المراجعات لديه متوسط تقييم محسوب يبلغ 8.12 ومتوسط التقييم في مجموعة البيانات هو 8.1. هل هذا التقييم صحيح مصادفة أم أن الفندق الأول هو التناقض؟
في حال كان هذا الفندق حالة شاذة، وربما تكون معظم القيم متطابقة (لكن بعضها لا يتطابق لسبب ما)، سنكتب برنامجًا قصيرًا لاستكشاف القيم في مجموعة البيانات وتحديد الاستخدام الصحيح (أو عدم الاستخدام) لهذه القيم.
لتعقيد الأمور أكثر، الفندق الذي يحتوي على ثاني أعلى عدد من التقييمات لديه متوسط تقييم محسوب يبلغ 8.12 ومتوسط التقييم في مجموعة البيانات هو 8.1. هل هذا التقييم الصحيح مجرد صدفة أم أن الفندق الأول هو التناقض؟
> 🚨 ملاحظة تحذيرية
>
> عند العمل مع هذه المجموعة من البيانات، ستكتب كودًا يحسب شيئًا من النص دون الحاجة إلى قراءة النص أو تحليله بنفسك. هذه هي جوهر معالجة اللغة الطبيعية (NLP)، تفسير المعنى أو المشاعر دون الحاجة إلى تدخل بشري. ومع ذلك، قد تقرأ بعض المراجعات السلبية. أنصحك بعدم القيام بذلك، لأنك لست بحاجة لذلك. بعض هذه المراجعات سخيفة أو غير ذات صلة، مثل "الطقس لم يكن جيدًا"، وهو أمر خارج عن سيطرة الفندق أو أي شخص. ولكن هناك جانب مظلم لبعض المراجعات أيضًا. أحيانًا تكون المراجعات السلبية عنصرية أو متحيزة جنسيًا أو عمرية. هذا أمر مؤسف ولكنه متوقع في مجموعة بيانات مأخوذة من موقع عام. بعض المراجعين يتركون مراجعات قد تجدها غير لائقة أو مزعجة أو مؤلمة. من الأفضل أن تدع الكود يقيس المشاعر بدلاً من قراءتها بنفسك والتأثر بها. ومع ذلك، فإن الذين يكتبون مثل هذه الأمور هم أقلية، لكنهم موجودون.
## تمرين - استكشاف البيانات
على احتمال أن يكون هذا الفندق حالة شاذة، وأن معظم القيم قد تتطابق (ولكن بعضها لا يتطابق لسبب ما)، سنكتب برنامجًا قصيرًا بعد ذلك لاستكشاف القيم في مجموعة البيانات وتحديد الاستخدام الصحيح (أو عدم الاستخدام) للقيم.
> 🚨 ملاحظة تحذيرية
>
> عند العمل مع هذه المجموعة من البيانات، ستكتب كودًا يحسب شيئًا من النص دون الحاجة إلى قراءة النص أو تحليله بنفسك. هذه هي جوهر معالجة اللغة الطبيعية (NLP)، تفسير المعنى أو المشاعر دون الحاجة إلى تدخل بشري. ومع ذلك، من الممكن أن تقرأ بعض المراجعات السلبية. أنصحك بعدم القيام بذلك، لأنك لست بحاجة لذلك. بعض هذه المراجعات سخيفة أو غير ذات صلة، مثل "الطقس لم يكن جيدًا"، وهو أمر خارج عن سيطرة الفندق أو أي شخص آخر. ولكن هناك جانب مظلم لبعض المراجعات أيضًا. أحيانًا تكون المراجعات السلبية عنصرية، أو متحيزة ضد الجنس، أو العمر. هذا أمر مؤسف ولكنه متوقع في مجموعة بيانات مأخوذة من موقع عام. بعض المراجعين يتركون مراجعات قد تجدها غير مستساغة، أو غير مريحة، أو مزعجة. من الأفضل أن تدع الكود يقيس المشاعر بدلاً من قراءتها بنفسك والتأثر بها. ومع ذلك، فإن من يكتبون مثل هذه الأمور هم أقلية، لكنهم موجودون بكل الأحوال.
## التمرين - استكشاف البيانات
### تحميل البيانات
يكفي النظر إلى البيانات بصريًا، الآن ستكتب بعض الكود للحصول على إجابات! يستخدم هذا القسم مكتبة pandas. أول مهمة لك هي التأكد من أنه يمكنك تحميل وقراءة بيانات CSV. تحتوي مكتبة pandas على أداة تحميل CSV سريعة، ويتم وضع النتيجة في إطار بيانات، كما في الدروس السابقة. يحتوي ملف CSV الذي نقوم بتحميله على أكثر من نصف مليون صف، ولكن فقط 17 عمودًا. توفر pandas العديد من الطرق القوية للتفاعل مع إطار البيانات، بما في ذلك القدرة على إجراء عمليات على كل صف.
لقد اكتفينا من فحص البيانات بصريًا، الآن حان الوقت لكتابة بعض الأكواد والحصول على إجابات! هذا القسم يستخدم مكتبة pandas. أول مهمة لك هي التأكد من أنك تستطيع تحميل وقراءة بيانات CSV. مكتبة pandas تحتوي على أداة سريعة لتحميل ملفات CSV، والنتيجة يتم وضعها في DataFrame، كما رأينا في الدروس السابقة. ملف CSV الذي نقوم بتحميله يحتوي على أكثر من نصف مليون صف، ولكن فقط 17 عمودًا. توفر pandas العديد من الطرق القوية للتفاعل مع DataFrame، بما في ذلك القدرة على إجراء عمليات على كل صف.
من هنا فصاعدًا في هذا الدرس، ستكون هناك مقتطفات من الكود وبعض الشروحات للكود وبعض المناقشات حول ما تعنيه النتائج. استخدم الملف _notebook.ipynb_ المرفق لكتابة الكود الخاص بك.
من الآن فصاعدًا في هذا الدرس، ستجد مقتطفات من الأكواد مع بعض الشروحات عنها ومناقشة حول ما تعنيه النتائج. استخدم الملف _notebook.ipynb_ المرفق لكتابة الأكواد الخاصة بك.
لنبدأ بتحميل ملف البيانات الذي ستستخدمه:
@ -162,48 +161,48 @@ end = time.time()
print("Loading took " + str(round(end - start, 2)) + " seconds")
```
الآن بعد أن تم تحميل البيانات، يمكننا إجراء بعض العمليات عليها. احتفظ بهذا الكود في أعلى البرنامج للجزء التالي.
الآن بعد أن تم تحميل البيانات، يمكننا إجراء بعض العمليات عليها. احتفظ بهذا الكود في أعلى برنامجك للجزء التالي.
## استكشاف البيانات
في هذه الحالة، البيانات بالفعل *نظيفة*، مما يعني أنها جاهزة للعمل عليها، ولا تحتوي على أحرف بلغات أخرى قد تسبب مشاكل للخوارزميات التي تتوقع أحرفًا باللغة الإنجليزية فقط.
في هذه الحالة، البيانات بالفعل *نظيفة*، مما يعني أنها جاهزة للعمل عليها، ولا تحتوي على أحرف بلغات أخرى قد تسبب مشاكل للخوارزميات التي تتوقع فقط أحرفًا إنجليزية.
✅ قد تضطر إلى العمل مع بيانات تحتاج إلى بعض المعالجة الأولية لتنسيقها قبل تطبيق تقنيات معالجة اللغة الطبيعية، ولكن ليس هذه المرة. إذا اضطررت لذلك، كيف ستتعامل مع الأحرف غير الإنجليزية؟
✅ قد تضطر أحيانًا إلى العمل مع بيانات تحتاج إلى معالجة أولية لتنسيقها قبل تطبيق تقنيات معالجة اللغة الطبيعية (NLP)، ولكن ليس هذه المرة. إذا كان عليك ذلك، كيف ستتعامل مع الأحرف غير الإنجليزية؟
خذ لحظة للتأكد من أنه بمجرد تحميل البيانات، يمكنك استكشافها باستخدام الكود. من السهل جدًا التركيز على الأعمدة `Negative_Review` و `Positive_Review`. هذه الأعمدة مليئة بالنص الطبيعي لمعالجة خوارزميات معالجة اللغة الطبيعية. ولكن انتظر! قبل أن تبدأ في معالجة اللغة الطبيعية وتحليل المشاعر، يجب أن تتبع الكود أدناه للتحقق مما إذا كانت القيم المعطاة في مجموعة البيانات تتطابق مع القيم التي تحسبها باستخدام pandas.
خذ لحظة للتأكد من أنه بمجرد تحميل البيانات، يمكنك استكشافها باستخدام الكود. من السهل جدًا أن ترغب في التركيز على العمودين `Negative_Review` و`Positive_Review`. هذان العمودان مليئان بالنصوص الطبيعية التي يمكن لخوارزميات NLP الخاصة بك معالجتها. ولكن انتظر! قبل أن تبدأ في معالجة اللغة الطبيعية وتحليل المشاعر، يجب أن تتبع الكود أدناه للتأكد من أن القيم الموجودة في مجموعة البيانات تتطابق مع القيم التي تحسبها باستخدام pandas.
## عمليات إطار البيانات
## عمليات DataFrame
المهمة الأولى في هذا الدرس هي التحقق مما إذا كانت الافتراضات التالية صحيحة عن طريق كتابة كود يفحص إطار البيانات (دون تغييره).
المهمة الأولى في هذا الدرس هي التحقق مما إذا كانت الافتراضات التالية صحيحة عن طريق كتابة كود يفحص DataFrame (دون تغييرها).
> مثل العديد من مهام البرمجة، هناك عدة طرق لإكمال ذلك، ولكن النصيحة الجيدة هي القيام بذلك بأبسط وأسهل طريقة ممكنة، خاصة إذا كان ذلك سيكون أسهل للفهم عندما تعود إلى هذا الكود في المستقبل. مع إطارات البيانات، هناك واجهة برمجية شاملة غالبًا ما تحتوي على طريقة للقيام بما تريد بكفاءة.
> كما هو الحال مع العديد من مهام البرمجة، هناك عدة طرق لإكمال هذه المهمة، ولكن النصيحة الجيدة هي القيام بذلك بأبسط وأسهل طريقة ممكنة، خاصة إذا كان ذلك سيجعل الكود أسهل للفهم عند العودة إليه في المستقبل. مع DataFrames، هناك واجهة برمجية شاملة (API) غالبًا ما تحتوي على طريقة فعالة لتحقيق ما تريد.
تعامل مع الأسئلة التالية كمهام برمجية وحاول الإجابة عليها دون النظر إلى الحل.
1. اطبع *الشكل* الخاص بإطار البيانات الذي قمت بتحميله للتو (الشكل هو عدد الصفوف والأعمدة).
2. احسب عدد مرات تكرار الجنسيات للمراجعين:
1. اطبع *الشكل* (shape) الخاص بـ DataFrame الذي قمت بتحميله للتو (الشكل هو عدد الصفوف والأعمدة).
2. احسب تكرار الجنسيات للمراجعين:
1. كم عدد القيم المميزة الموجودة في العمود `Reviewer_Nationality` وما هي؟
2. ما هي الجنسية الأكثر شيوعًا بين المراجعين في مجموعة البيانات (اطبع البلد وعدد المراجعات)؟
3. ما هي الجنسيات العشر الأكثر تكرارًا التالية، وعدد مرات تكرارها؟
3. ما هو الفندق الأكثر مراجعة لكل من الجنسيات العشر الأكثر تكرارًا؟
4. كم عدد المراجعات لكل فندق (عدد مرات تكرار الفندق) في مجموعة البيانات؟
5. بينما يوجد عمود `Average_Score` لكل فندق في مجموعة البيانات، يمكنك أيضًا حساب متوسط النقاط (الحصول على متوسط جميع نقاط المراجعين في مجموعة البيانات لكل فندق). أضف عمودًا جديدًا إلى إطار البيانات بعنوان `Calc_Average_Score` يحتوي على هذا المتوسط المحسوب.
6. هل هناك أي فنادق لديها نفس القيمة (مقربة إلى مكان عشري واحد) في العمودين `Average_Score` و `Calc_Average_Score`؟
1. حاول كتابة دالة Python تأخذ سلسلة (صف) كوسيطة وتقارن القيم، وتطبع رسالة عندما تكون القيم غير متساوية. ثم استخدم الطريقة `.apply()` لمعالجة كل صف باستخدام الدالة.
7. احسب واطبع عدد الصفوف التي تحتوي على قيم "No Negative" في العمود `Negative_Review`.
8. احسب واطبع عدد الصفوف التي تحتوي على قيم "No Positive" في العمود `Positive_Review`.
9. احسب واطبع عدد الصفوف التي تحتوي على قيم "No Positive" في العمود `Positive_Review` **و** قيم "No Negative" في العمود `Negative_Review`.
3. ما هي أكثر 10 جنسيات تكرارًا بعد ذلك، وعدد مرات تكرارها؟
3. ما هو الفندق الذي تمت مراجعته بشكل متكرر لكل من أكثر 10 جنسيات للمراجعين؟
4. كم عدد المراجعات لكل فندق (تكرار المراجعات لكل فندق) في مجموعة البيانات؟
5. على الرغم من وجود عمود `Average_Score` لكل فندق في مجموعة البيانات، يمكنك أيضًا حساب متوسط التقييم (بحساب متوسط جميع تقييمات المراجعين في مجموعة البيانات لكل فندق). أضف عمودًا جديدًا إلى DataFrame بعنوان `Calc_Average_Score` يحتوي على المتوسط المحسوب.
6. هل هناك فنادق لها نفس القيمة (بعد التقريب إلى منزلة عشرية واحدة) في عمودي `Average_Score` و`Calc_Average_Score`؟
1. حاول كتابة دالة Python تأخذ Series (صف) كمدخل وتقارن القيم، وتطبع رسالة عندما تكون القيم غير متساوية. ثم استخدم الطريقة `.apply()` لمعالجة كل صف باستخدام الدالة.
7. احسب واطبع عدد الصفوف التي تحتوي على القيم "No Negative" في العمود `Negative_Review`.
8. احسب واطبع عدد الصفوف التي تحتوي على القيم "No Positive" في العمود `Positive_Review`.
9. احسب واطبع عدد الصفوف التي تحتوي على القيم "No Positive" في العمود `Positive_Review` **و** "No Negative" في العمود `Negative_Review`.
### إجابات الكود
1. اطبع *الشكل* الخاص بإطار البيانات الذي قمت بتحميله للتو (الشكل هو عدد الصفوف والأعمدة).
1. اطبع *الشكل* الخاص بـ DataFrame الذي قمت بتحميله للتو (الشكل هو عدد الصفوف والأعمدة).
```python
print("The shape of the data (rows, cols) is " + str(df.shape))
> The shape of the data (rows, cols) is (515738, 17)
```
2. احسب عدد مرات تكرار الجنسيات للمراجعين:
2. احسب تكرار الجنسيات للمراجعين:
1. كم عدد القيم المميزة الموجودة في العمود `Reviewer_Nationality` وما هي؟
2. ما هي الجنسية الأكثر شيوعًا بين المراجعين في مجموعة البيانات (اطبع البلد وعدد المراجعات)؟
@ -230,7 +229,7 @@ print("Loading took " + str(round(end - start, 2)) + " seconds")
Name: Reviewer_Nationality, Length: 227, dtype: int64
```
3. ما هي الجنسيات العشر الأكثر تكرارًا التالية، وعدد مرات تكرارها؟
3. ما هي أكثر 10 جنسيات تكرارًا بعد ذلك، وعدد مرات تكرارها؟
```python
print("The highest frequency reviewer nationality is " + str(nationality_freq.index[0]).strip() + " with " + str(nationality_freq[0]) + " reviews.")
@ -253,7 +252,7 @@ print("Loading took " + str(round(end - start, 2)) + " seconds")
France 7296
```
3. ما هو الفندق الأكثر مراجعة لكل من الجنسيات العشر الأكثر تكرارًا؟
3. ما هو الفندق الذي تمت مراجعته بشكل متكرر لكل من أكثر 10 جنسيات للمراجعين؟
```python
# What was the most frequently reviewed hotel for the top 10 nationalities
@ -277,7 +276,7 @@ print("Loading took " + str(round(end - start, 2)) + " seconds")
The most reviewed hotel for Canada was St James Court A Taj Hotel London with 61 reviews.
```
4. كم عدد المراجعات لكل فندق (عدد مرات تكرار الفندق) في مجموعة البيانات؟
4. كم عدد المراجعات لكل فندق (تكرار المراجعات لكل فندق) في مجموعة البيانات؟
```python
# First create a new dataframe based on the old one, removing the uneeded columns
@ -291,18 +290,18 @@ print("Loading took " + str(round(end - start, 2)) + " seconds")
display(hotel_freq_df)
```
| اسم الفندق | إجمالي عدد المراجعات | عدد المراجعات الموجودة |
| :----------------------------------------: | :---------------------: | :-----------------: |
| Britannia International Hotel Canary Wharf | 9086 | 4789 |
| Park Plaza Westminster Bridge London | 12158 | 4169 |
| Copthorne Tara Hotel London Kensington | 7105 | 3578 |
| ... | ... | ... |
| Mercure Paris Porte d Orleans | 110 | 10 |
| Hotel Wagner | 135 | 10 |
| Hotel Gallitzinberg | 173 | 8 |
| :----------------------------------------: | :-------------------: | :---------------------: |
| Britannia International Hotel Canary Wharf | 9086 | 4789 |
| Park Plaza Westminster Bridge London | 12158 | 4169 |
| Copthorne Tara Hotel London Kensington | 7105 | 3578 |
| ... | ... | ... |
| Mercure Paris Porte d Orleans | 110 | 10 |
| Hotel Wagner | 135 | 10 |
| Hotel Gallitzinberg | 173 | 8 |
قد تلاحظ أن النتائج *المحصورة في مجموعة البيانات* لا تتطابق مع القيمة الموجودة في `Total_Number_of_Reviews`. من غير الواضح ما إذا كانت هذه القيمة في مجموعة البيانات تمثل إجمالي عدد المراجعات التي حصل عليها الفندق، ولكن لم يتم جمعها جميعًا، أو حسابًا آخر. لا يتم استخدام `Total_Number_of_Reviews` في النموذج بسبب هذا الغموض.
قد تلاحظ أن النتائج *المحسوبة في مجموعة البيانات* لا تتطابق مع القيمة في `Total_Number_of_Reviews`. من غير الواضح ما إذا كانت هذه القيمة في مجموعة البيانات تمثل إجمالي عدد المراجعات التي حصل عليها الفندق، ولكن لم يتم جمعها جميعًا، أو إذا كان هناك حساب آخر. لا يتم استخدام `Total_Number_of_Reviews` في النموذج بسبب هذا الغموض.
5. بينما يوجد عمود `Average_Score` لكل فندق في مجموعة البيانات، يمكنك أيضًا حساب متوسط النقاط (الحصول على متوسط جميع نقاط المراجعين في مجموعة البيانات لكل فندق). أضف عمودًا جديدًا إلى إطار البيانات بعنوان `Calc_Average_Score` يحتوي على هذا المتوسط المحسوب. اطبع الأعمدة `Hotel_Name`، `Average_Score`، و `Calc_Average_Score`.
5. على الرغم من وجود عمود `Average_Score` لكل فندق في مجموعة البيانات، يمكنك أيضًا حساب متوسط التقييم (بحساب متوسط جميع تقييمات المراجعين في مجموعة البيانات لكل فندق). أضف عمودًا جديدًا إلى DataFrame بعنوان `Calc_Average_Score` يحتوي على المتوسط المحسوب. اطبع الأعمدة `Hotel_Name`، `Average_Score`، و`Calc_Average_Score`.
```python
# define a function that takes a row and performs some calculation with it
@ -324,29 +323,29 @@ print("Loading took " + str(round(end - start, 2)) + " seconds")
display(review_scores_df[["Average_Score_Difference", "Average_Score", "Calc_Average_Score", "Hotel_Name"]])
```
قد تتساءل أيضًا عن قيمة `Average_Score` ولماذا تكون أحيانًا مختلفة عن متوسط النقاط المحسوب. بما أننا لا نستطيع معرفة سبب تطابق بعض القيم، ولكن البعض الآخر لديه اختلاف، فمن الأفضل في هذه الحالة استخدام نقاط المراجعات التي لدينا لحساب المتوسط بأنفسنا. ومع ذلك، فإن الاختلافات عادة ما تكون صغيرة جدًا، إليك الفنادق التي لديها أكبر انحراف بين متوسط النقاط في مجموعة البيانات والمتوسط المحسوب:
قد تتساءل أيضًا عن قيمة `Average_Score` ولماذا تكون أحيانًا مختلفة عن متوسط التقييم المحسوب. بما أننا لا نستطيع معرفة سبب تطابق بعض القيم، ولكن وجود اختلاف في أخرى، فمن الأفضل في هذه الحالة استخدام تقييمات المراجعين التي لدينا لحساب المتوسط بأنفسنا. ومع ذلك، فإن الفروقات عادة ما تكون صغيرة، وهذه هي الفنادق التي لديها أكبر انحراف عن متوسط التقييم في مجموعة البيانات والمتوسط المحسوب:
| فرق متوسط النقاط | متوسط النقاط | المتوسط المحسوب | اسم الفندق |
| :----------------------: | :-----------: | :----------------: | ------------------------------------------: |
| -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria |
| -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery |
| -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans |
| -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel |
| -0.5 | 7.0 | 7.5 | Hotel Royal Elys es |
| ... | ... | ... | ... |
| 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre |
| 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur |
| 0.9 | 6.8 | 5.9 | Villa Eugenie |
| 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux |
| 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar |
| فرق متوسط التقييم | متوسط التقييم | المتوسط المحسوب | اسم الفندق |
| :----------------: | :-----------: | :--------------: | ------------------------------------------: |
| -0.8 | 7.7 | 8.5 | Best Western Hotel Astoria |
| -0.7 | 8.8 | 9.5 | Hotel Stendhal Place Vend me Paris MGallery |
| -0.7 | 7.5 | 8.2 | Mercure Paris Porte d Orleans |
| -0.7 | 7.9 | 8.6 | Renaissance Paris Vendome Hotel |
| -0.5 | 7.0 | 7.5 | Hotel Royal Elys es |
| ... | ... | ... | ... |
| 0.7 | 7.5 | 6.8 | Mercure Paris Op ra Faubourg Montmartre |
| 0.8 | 7.1 | 6.3 | Holiday Inn Paris Montparnasse Pasteur |
| 0.9 | 6.8 | 5.9 | Villa Eugenie |
| 0.9 | 8.6 | 7.7 | MARQUIS Faubourg St Honor Relais Ch teaux |
| 1.3 | 7.2 | 5.9 | Kube Hotel Ice Bar |
مع وجود فندق واحد فقط لديه فرق في النقاط أكبر من 1، يعني ذلك أنه يمكننا تجاهل الفرق واستخدام المتوسط المحسوب.
مع وجود فندق واحد فقط لديه فرق في التقييم أكبر من 1، فهذا يعني أنه يمكننا على الأرجح تجاهل الفرق واستخدام متوسط التقييم المحسوب.
6. احسب واطبع عدد الصفوف التي تحتوي على قيم "No Negative" في العمود `Negative_Review`.
6. احسب واطبع عدد الصفوف التي تحتوي على القيم "No Negative" في العمود `Negative_Review`.
7. احسب واطبع عدد الصفوف التي تحتوي على قيم "No Positive" في العمود `Positive_Review`.
7. احسب واطبع عدد الصفوف التي تحتوي على القيم "No Positive" في العمود `Positive_Review`.
8. احسب واطبع عدد الصفوف التي تحتوي على قيم "No Positive" في العمود `Positive_Review` **و** قيم "No Negative" في العمود `Negative_Review`.
8. احسب واطبع عدد الصفوف التي تحتوي على القيم "No Positive" في العمود `Positive_Review` **و** "No Negative" في العمود `Negative_Review`.
```python
# with lambdas:
@ -393,22 +392,22 @@ print("Loading took " + str(round(end - start, 2)) + " seconds")
Sum took 0.19 seconds
```
قد تكون لاحظت أن هناك 127 صفًا تحتوي على قيم "No Negative" و "No Positive" في الأعمدة `Negative_Review` و `Positive_Review` على التوالي. هذا يعني أن المراجع أعطى الفندق درجة رقمية، لكنه امتنع عن كتابة مراجعة إيجابية أو سلبية. لحسن الحظ، هذا عدد صغير من الصفوف (127 من أصل 515738، أو 0.02%)، لذا من المحتمل ألا يؤثر ذلك على النموذج أو النتائج في أي اتجاه معين، ولكن قد لا تتوقع أن تحتوي مجموعة بيانات المراجعات على صفوف بدون مراجعات، لذا من المفيد استكشاف البيانات لاكتشاف صفوف مثل هذه.
قد تكون لاحظت أن هناك 127 صفًا تحتوي على القيم "No Negative" و"No Positive" في العمودين `Negative_Review` و`Positive_Review` على التوالي. هذا يعني أن المراجع أعطى الفندق تقييمًا رقميًا، لكنه امتنع عن كتابة مراجعة إيجابية أو سلبية. لحسن الحظ، هذا عدد صغير من الصفوف (127 من أصل 515738، أو 0.02%)، لذا من المحتمل ألا يؤثر ذلك على النموذج أو النتائج في أي اتجاه معين، ولكن قد لا تتوقع أن تحتوي مجموعة بيانات المراجعات على صفوف بدون مراجعات، لذا من المفيد استكشاف البيانات لاكتشاف صفوف مثل هذه.
الآن بعد أن استكشفت مجموعة البيانات، في الدرس التالي ستقوم بتصفية البيانات وإضافة تحليل المشاعر.
الآن بعد أن قمت باستكشاف مجموعة البيانات، في الدرس التالي ستقوم بتصفية البيانات وإضافة بعض تحليلات المشاعر.
---
## 🚀تحدي
يوضح هذا الدرس، كما رأينا في الدروس السابقة، مدى أهمية فهم بياناتك وعيوبها قبل إجراء العمليات عليها. البيانات النصية، على وجه الخصوص، تحتاج إلى تدقيق دقيق. استكشف مجموعات بيانات مختلفة مليئة بالنصوص وحاول اكتشاف المناطق التي قد تؤدي إلى إدخال تحيز أو مشاعر منحرفة في النموذج.
يوضح هذا الدرس، كما رأينا في الدروس السابقة، مدى أهمية فهم بياناتك وخصائصها قبل إجراء العمليات عليها. البيانات النصية، على وجه الخصوص، تتطلب تدقيقًا دقيقًا. قم بالبحث في مجموعات بيانات مختلفة تحتوي على نصوص واكتشف المجالات التي قد تؤدي إلى إدخال تحيز أو مشاعر مشوهة في النموذج.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/38/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
خذ [مسار التعلم هذا حول معالجة اللغة الطبيعية](https://docs.microsoft.com/learn/paths/explore-natural-language-processing/?WT.mc_id=academic-77952-leestott) لاكتشاف الأدوات التي يمكنك تجربتها عند بناء نماذج تعتمد على النصوص والكلام.
## الواجب
## الواجب
[NLTK](assignment.md)

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a2aa4e9b91b9640db2c15363c4299d8b",
"translation_date": "2025-08-29T14:35:51+00:00",
"original_hash": "2c742993fe95d5bcbb2846eda3d442a1",
"translation_date": "2025-09-04T20:55:47+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/README.md",
"language_code": "ar"
}
@ -11,7 +11,7 @@ CO_OP_TRANSLATOR_METADATA:
الآن بعد أن قمت باستكشاف مجموعة البيانات بالتفصيل، حان الوقت لتصفية الأعمدة واستخدام تقنيات معالجة اللغة الطبيعية (NLP) على مجموعة البيانات للحصول على رؤى جديدة حول الفنادق.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/39/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
### عمليات التصفية وتحليل المشاعر
@ -19,22 +19,27 @@ CO_OP_TRANSLATOR_METADATA:
## تمرين: المزيد من معالجة البيانات
قم بتنظيف البيانات قليلاً. أضف أعمدة ستكون مفيدة لاحقًا، غيّر القيم في أعمدة أخرى، واحذف أعمدة معينة تمامًا.
قم بتنظيف البيانات بشكل أكبر. أضف أعمدة ستكون مفيدة لاحقًا، غيّر القيم في أعمدة أخرى، واحذف أعمدة معينة تمامًا.
1. معالجة الأعمدة الأولية
1. احذف العمودين `lat` و`lng`.
1. احذف `lat` و `lng`
2. استبدل قيم `Hotel_Address` بالقيم التالية (إذا كان العنوان يحتوي على اسم المدينة والبلد، قم بتغييره ليشمل فقط المدينة والبلد).
المدن والبلدان الوحيدة الموجودة في مجموعة البيانات هي:
أمستردام، هولندا
برشلونة، إسبانيا
لندن، المملكة المتحدة
ميلانو، إيطاليا
باريس، فرنسا
فيينا، النمسا
أمستردام، هولندا
برشلونة، إسبانيا
لندن، المملكة المتحدة
ميلانو، إيطاليا
باريس، فرنسا
فيينا، النمسا
```python
def replace_address(row):
@ -65,20 +70,20 @@ CO_OP_TRANSLATOR_METADATA:
| Hotel_Address | Hotel_Name |
| :--------------------- | :--------: |
| Amsterdam, Netherlands | 105 |
| Barcelona, Spain | 211 |
| London, United Kingdom | 400 |
| Milan, Italy | 162 |
| Paris, France | 458 |
| Vienna, Austria | 158 |
| أمستردام، هولندا | 105 |
| برشلونة، إسبانيا | 211 |
| لندن، المملكة المتحدة | 400 |
| ميلانو، إيطاليا | 162 |
| باريس، فرنسا | 458 |
| فيينا، النمسا | 158 |
2. معالجة أعمدة المراجعات العامة للفنادق
2. معالجة أعمدة المراجعات الميتا للفنادق
1. احذف العمود `Additional_Number_of_Scoring`.
1. احذف `Additional_Number_of_Scoring`
2. استبدل `Total_Number_of_Reviews` بعدد المراجعات الفعلي لهذا الفندق الموجود في مجموعة البيانات.
2. استبدل `Total_Number_of_Reviews` بعدد المراجعات الفعلي لذلك الفندق الموجود في مجموعة البيانات
3. استبدل `Average_Score` بالنتيجة التي قمت بحسابها بنفسك.
3. استبدل `Average_Score` بالنتيجة التي قمنا بحسابها بأنفسنا
```python
# Drop `Additional_Number_of_Scoring`
@ -90,35 +95,35 @@ CO_OP_TRANSLATOR_METADATA:
3. معالجة أعمدة المراجعات
1. احذف الأعمدة `Review_Total_Negative_Word_Counts`، `Review_Total_Positive_Word_Counts`، `Review_Date` و`days_since_review`.
2. احتفظ بالأعمدة `Reviewer_Score`، `Negative_Review`، و`Positive_Review` كما هي.
1. احذف `Review_Total_Negative_Word_Counts`، `Review_Total_Positive_Word_Counts`، `Review_Date` و `days_since_review`
3. احتفظ بـ `Tags` في الوقت الحالي.
2. احتفظ بـ `Reviewer_Score`، `Negative_Review`، و `Positive_Review` كما هي.
3. احتفظ بـ `Tags` في الوقت الحالي
- سنقوم بإجراء عمليات تصفية إضافية على العلامات في القسم التالي، ثم سيتم حذف العلامات.
- سنقوم ببعض عمليات التصفية الإضافية على العلامات في القسم التالي ثم سيتم حذف العلامات
4. معالجة أعمدة المراجعين
1. احذف العمود `Total_Number_of_Reviews_Reviewer_Has_Given`.
2. احتفظ بـ `Reviewer_Nationality`.
1. احذف `Total_Number_of_Reviews_Reviewer_Has_Given`
2. احتفظ بـ `Reviewer_Nationality`
### أعمدة العلامات
عمود `Tag` يمثل مشكلة لأنه عبارة عن قائمة (في شكل نصي) مخزنة في العمود. لسوء الحظ، فإن ترتيب وعدد الأقسام الفرعية في هذا العمود ليس دائمًا نفسه. من الصعب على الإنسان تحديد العبارات الصحيحة التي يجب التركيز عليها، لأن هناك 515,000 صف و1427 فندقًا، ولكل منها خيارات مختلفة قليلاً يمكن أن يختارها المراجع. هنا يأتي دور معالجة اللغة الطبيعية (NLP). يمكنك مسح النص والعثور على العبارات الأكثر شيوعًا وعدّها.
لسوء الحظ، نحن لسنا مهتمين بالكلمات الفردية، بل بالعبارات متعددة الكلمات (مثل *رحلة عمل*). تشغيل خوارزمية توزيع التكرار للعبارات متعددة الكلمات على هذا الكم الهائل من البيانات (6762646 كلمة) قد يستغرق وقتًا طويلاً للغاية، ولكن دون النظر إلى البيانات، يبدو أن ذلك ضروري. هنا تكون فائدة تحليل البيانات الاستكشافي، لأنه من خلال عينة من العلامات مثل `['رحلة عمل', 'مسافر منفرد', 'غرفة فردية', 'أقام 5 ليالٍ', 'تم الإرسال من جهاز محمول']`، يمكنك البدء في التساؤل عما إذا كان من الممكن تقليل المعالجة بشكل كبير. لحسن الحظ، يمكن ذلك - ولكن أولاً تحتاج إلى اتباع بعض الخطوات لتحديد العلامات ذات الأهمية.
لسوء الحظ، نحن لسنا مهتمين بالكلمات الفردية، بل بالعبارات متعددة الكلمات (مثل *رحلة عمل*). تشغيل خوارزمية توزيع تكرار العبارات متعددة الكلمات على هذا الكم من البيانات (6762646 كلمة) قد يستغرق وقتًا طويلاً للغاية، ولكن بدون النظر إلى البيانات، يبدو أن ذلك ضروري. هنا تأتي فائدة تحليل البيانات الاستكشافي، لأنه من خلال رؤية عينة من العلامات مثل `['رحلة عمل', 'مسافر منفرد', 'غرفة فردية', 'أقام 5 ليالٍ', 'تم الإرسال من جهاز محمول']`، يمكنك البدء في التساؤل عما إذا كان من الممكن تقليل المعالجة التي يجب القيام بها بشكل كبير. لحسن الحظ، يمكن ذلك - ولكن أولاً تحتاج إلى اتباع بعض الخطوات لتحديد العلامات ذات الأهمية.
### تصفية العلامات
تذكر أن الهدف من مجموعة البيانات هو إضافة مشاعر وأعمدة تساعدك في اختيار أفضل فندق (لنفسك أو ربما لمهمة عميل يطلب منك إنشاء روبوت توصيات للفنادق). تحتاج إلى أن تسأل نفسك ما إذا كانت العلامات مفيدة أم لا في مجموعة البيانات النهائية. هنا تفسير واحد (إذا كنت بحاجة إلى مجموعة البيانات لأسباب أخرى، قد تختلف العلامات التي تبقى/تُزال):
تذكر أن الهدف من مجموعة البيانات هو إضافة مشاعر وأعمدة تساعدك في اختيار أفضل فندق (لنفسك أو ربما لمهمة عميل يطلب منك إنشاء روبوت توصية للفنادق). تحتاج إلى أن تسأل نفسك ما إذا كانت العلامات مفيدة أم لا في مجموعة البيانات النهائية. هنا تفسير واحد (إذا كنت بحاجة إلى مجموعة البيانات لأسباب أخرى، قد تختلف العلامات التي تبقى/تُزال):
1. نوع الرحلة ذو صلة، ويجب أن يبقى.
2. نوع مجموعة الضيوف مهم، ويجب أن يبقى.
3. نوع الغرفة أو الجناح أو الاستوديو الذي أقام فيه الضيف غير ذي صلة (جميع الفنادق تحتوي على غرف متشابهة تقريبًا).
4. الجهاز الذي تم إرسال المراجعة منه غير ذي صلة.
5. عدد الليالي التي أقامها المراجع *قد* يكون ذا صلة إذا كنت تعتقد أن الإقامات الأطول تعني إعجابهم بالفندق أكثر، ولكنه احتمال ضعيف، وربما غير ذي صلة.
1. نوع الرحلة ذو صلة، ويجب أن يبقى
2. نوع مجموعة الضيوف مهم، ويجب أن يبقى
3. نوع الغرفة أو الجناح أو الاستوديو الذي أقام فيه الضيف غير ذي صلة (جميع الفنادق تحتوي على غرف متشابهة تقريبًا)
4. الجهاز الذي تم إرسال المراجعة منه غير ذي صلة
5. عدد الليالي التي أقامها المراجع *قد* يكون ذا صلة إذا كنت تعتقد أن الإقامات الأطول تعني أنهم أحبوا الفندق أكثر، ولكنه احتمال ضعيف، وربما غير ذي صلة
باختصار، **احتفظ بنوعين من العلامات وأزل الباقي**.
@ -133,9 +138,9 @@ df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
تصبح كل علامة شيئًا مثل: `رحلة عمل، مسافر منفرد، غرفة فردية، أقام 5 ليالٍ، تم الإرسال من جهاز محمول`.
بعد ذلك نجد مشكلة. بعض المراجعات، أو الصفوف، تحتوي على 5 أعمدة، وبعضها 3، وبعضها 6. هذا نتيجة لكيفية إنشاء مجموعة البيانات، ومن الصعب إصلاحها. تريد الحصول على عدد تكرار لكل عبارة، ولكنها في ترتيب مختلف في كل مراجعة، لذا قد يكون العدد غير دقيق، وقد لا يحصل الفندق على علامة مستحقة.
بعد ذلك نجد مشكلة. بعض المراجعات، أو الصفوف، تحتوي على 5 أعمدة، وبعضها 3، وبعضها 6. هذا نتيجة لكيفية إنشاء مجموعة البيانات، ومن الصعب إصلاحها. تريد الحصول على عدد تكرار كل عبارة، ولكنها في ترتيب مختلف في كل مراجعة، لذا قد يكون العدد غير دقيق، وقد لا يحصل الفندق على علامة مستحقة له.
بدلاً من ذلك، ستستخدم الترتيب المختلف لصالحك، لأن كل علامة هي عبارة متعددة الكلمات ولكنها مفصولة بفاصلة! أبسط طريقة للقيام بذلك هي إنشاء 6 أعمدة مؤقتة مع إدخال كل علامة في العمود المقابل لترتيبها في العلامة. يمكنك بعد ذلك دمج الأعمدة الستة في عمود واحد كبير وتشغيل طريقة `value_counts()` على العمود الناتج. عند طباعته، سترى أن هناك 2428 علامة فريدة. هنا عينة صغيرة:
بدلاً من ذلك، ستستخدم الترتيب المختلف لصالحنا، لأن كل علامة هي عبارة متعددة الكلمات ولكنها مفصولة أيضًا بفاصلة! أبسط طريقة للقيام بذلك هي إنشاء 6 أعمدة مؤقتة مع إدخال كل علامة في العمود المقابل لترتيبها في العلامة. يمكنك بعد ذلك دمج الأعمدة الستة في عمود كبير واحد وتشغيل طريقة `value_counts()` على العمود الناتج. عند طباعته، سترى أن هناك 2428 علامة فريدة. هنا عينة صغيرة:
| Tag | Count |
| ------------------------------ | ------ |
@ -166,24 +171,24 @@ df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
### إزالة علامات مدة الإقامة
إزالة هذه العلامات هي الخطوة الأولى، حيث تقلل العدد الإجمالي للعلامات التي يجب أخذها في الاعتبار قليلاً. لاحظ أنك لا تزيلها من مجموعة البيانات، بل تختار فقط إزالتها من الاعتبار كقيم للعد/الحفظ في مجموعة بيانات المراجعات.
إزالة هذه العلامات هي الخطوة الأولى، حيث تقلل العدد الإجمالي للعلامات التي يجب أخذها في الاعتبار قليلاً. لاحظ أنك لا تزيلها من مجموعة البيانات، بل تختار إزالتها من الاعتبار كقيم للعد/الحفظ في مجموعة بيانات المراجعات.
| مدة الإقامة | العدد |
| مدة الإقامة | Count |
| ------------- | ------ |
| أقام ليلة واحدة | 193645 |
| أقام ليلتين | 133937 |
| أقام 3 ليالٍ | 95821 |
| أقام 4 ليالٍ | 47817 |
| أقام 5 ليالٍ | 20845 |
| أقام 6 ليالٍ | 9776 |
| أقام 7 ليالٍ | 7399 |
| أقام 8 ليالٍ | 2502 |
| أقام 9 ليالٍ | 1293 |
| ... | ... |
هناك مجموعة كبيرة من الغرف، الأجنحة، الاستوديوهات، الشقق وما إلى ذلك. جميعها تعني تقريبًا نفس الشيء وليست ذات صلة بك، لذا قم بإزالتها من الاعتبار.
| نوع الغرفة | العدد |
| أقام ليلتين | 133937 |
| أقام 3 ليالٍ | 95821 |
| أقام 4 ليالٍ | 47817 |
| أقام 5 ليالٍ | 20845 |
| أقام 6 ليالٍ | 9776 |
| أقام 7 ليالٍ | 7399 |
| أقام 8 ليالٍ | 2502 |
| أقام 9 ليالٍ | 1293 |
| ... | ... |
هناك مجموعة كبيرة ومتنوعة من الغرف، الأجنحة، الاستوديوهات، الشقق وما إلى ذلك. جميعها تعني تقريبًا نفس الشيء وليست ذات صلة بك، لذا قم بإزالتها من الاعتبار.
| نوع الغرفة | Count |
| --------------------------- | ----- |
| غرفة مزدوجة | 35207 |
| غرفة مزدوجة قياسية | 32248 |
@ -202,14 +207,14 @@ df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
| زوجان | 252294 |
| مسافر منفرد | 108545 |
| رحلة عمل | 82939 |
| مجموعة (تم دمجها مع مسافرين مع أصدقاء) | 67535 |
| مجموعة (مجمعة مع مسافرين مع أصدقاء) | 67535 |
| عائلة مع أطفال صغار | 61015 |
| عائلة مع أطفال كبار | 26349 |
| مع حيوان أليف | 1405 |
يمكنك القول إن `مسافرين مع أصدقاء` تعني نفس الشيء تقريبًا مثل `مجموعة`، وسيكون من العدل دمج الاثنين كما هو موضح أعلاه. الكود لتحديد العلامات الصحيحة موجود في [دفتر العلامات](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb).
يمكنك القول إن `مسافرين مع أصدقاء` هو نفسه `مجموعة` تقريبًا، وسيكون من العدل دمج الاثنين كما هو موضح أعلاه. الكود لتحديد العلامات الصحيحة موجود في [دفتر العلامات](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb).
الخطوة الأخيرة هي إنشاء أعمدة جديدة لكل من هذه العلامات. ثم، لكل صف مراجعة، إذا كان عمود `Tag` يطابق أحد الأعمدة الجديدة، أضف 1، وإذا لم يكن كذلك، أضف 0. النتيجة النهائية ستكون عدداً يوضح عدد المراجعين الذين اختاروا هذا الفندق (بالمجمل) لأغراض مثل العمل مقابل الترفيه، أو لإحضار حيوان أليف، وهذه معلومات مفيدة عند التوصية بفندق.
الخطوة الأخيرة هي إنشاء أعمدة جديدة لكل من هذه العلامات. ثم، لكل صف مراجعة، إذا كان عمود `Tag` يطابق أحد الأعمدة الجديدة، أضف 1، وإذا لم يكن كذلك، أضف 0. النتيجة النهائية ستكون عدًا لعدد المراجعين الذين اختاروا هذا الفندق (بالمجمل) لأغراض مثل العمل أو الترفيه، أو لإحضار حيوان أليف، وهذه معلومات مفيدة عند التوصية بفندق.
```python
# Process the Tags into new columns
@ -268,13 +273,13 @@ df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False)
### إزالة الكلمات الشائعة
إذا قمت بتشغيل تحليل المشاعر على أعمدة المراجعات السلبية والإيجابية، فقد يستغرق ذلك وقتًا طويلاً. في اختبار على جهاز لابتوب قوي بمعالج سريع، استغرق الأمر 12-14 دقيقة اعتمادًا على مكتبة تحليل المشاعر المستخدمة. هذا وقت طويل نسبيًا، لذا يستحق التحقيق إذا كان بالإمكان تسريعه.
إذا قمت بتشغيل تحليل المشاعر على أعمدة المراجعات السلبية والإيجابية، فقد يستغرق ذلك وقتًا طويلاً. عند الاختبار على جهاز لابتوب قوي بمعالج سريع، استغرق الأمر 12-14 دقيقة اعتمادًا على مكتبة تحليل المشاعر المستخدمة. هذا وقت طويل نسبيًا، لذا يستحق التحقيق إذا كان بالإمكان تسريعه.
إزالة الكلمات الشائعة، أو الكلمات الإنجليزية الشائعة التي لا تؤثر على مشاعر الجملة، هي الخطوة الأولى. من خلال إزالتها، يجب أن يعمل تحليل المشاعر بشكل أسرع، دون أن يكون أقل دقة (لأن الكلمات الشائعة لا تؤثر على المشاعر، لكنها تبطئ التحليل).
إزالة الكلمات الشائعة، أو الكلمات الإنجليزية الشائعة التي لا تؤثر على مشاعر الجملة، هي الخطوة الأولى. من خلال إزالتها، يجب أن يعمل تحليل المشاعر بشكل أسرع، ولكن دون أن يكون أقل دقة (لأن الكلمات الشائعة لا تؤثر على المشاعر، لكنها تبطئ التحليل).
أطول مراجعة سلبية كانت تحتوي على 395 كلمة، ولكن بعد إزالة الكلمات الشائعة، أصبحت تحتوي على 195 كلمة.
كانت أطول مراجعة سلبية تحتوي على 395 كلمة، ولكن بعد إزالة الكلمات الشائعة، أصبحت 195 كلمة.
إزالة الكلمات الشائعة هي أيضًا عملية سريعة، حيث استغرقت إزالة الكلمات الشائعة من عمودين للمراجعات عبر 515,000 صف 3.3 ثانية على جهاز الاختبار. قد تستغرق وقتًا أطول أو أقل قليلاً حسب سرعة وحدة المعالجة المركزية لجهازك، وذاكرة الوصول العشوائي، وما إذا كان لديك SSD أم لا، وبعض العوامل الأخرى. قصر مدة العملية يعني أنه إذا حسّنت وقت تحليل المشاعر، فإنها تستحق التنفيذ.
إزالة الكلمات الشائعة هي أيضًا عملية سريعة، حيث استغرقت إزالة الكلمات الشائعة من عمودي المراجعات عبر 515,000 صف 3.3 ثانية على جهاز الاختبار. قد تستغرق وقتًا أطول أو أقل قليلاً حسب سرعة وحدة المعالجة المركزية لجهازك، وذاكرة الوصول العشوائي، وما إذا كان لديك SSD أم لا، وبعض العوامل الأخرى. قصر مدة العملية يعني أنه إذا حسّنت وقت تحليل المشاعر، فإنها تستحق التنفيذ.
```python
from nltk.corpus import stopwords
@ -296,12 +301,12 @@ df.Negative_Review = df.Negative_Review.apply(remove_stopwords)
df.Positive_Review = df.Positive_Review.apply(remove_stopwords)
```
### تنفيذ تحليل المشاعر
الآن يجب عليك حساب تحليل المشاعر لكل من عمودي المراجعات السلبية والإيجابية، وتخزين النتيجة في عمودين جديدين. سيكون اختبار المشاعر هو مقارنتها بتقييم المراجع لنفس المراجعة. على سبيل المثال، إذا أظهرت المشاعر أن المراجعة السلبية كانت ذات مشاعر إيجابية للغاية (1) والمراجعة الإيجابية كانت أيضًا (1)، ولكن المراجع أعطى الفندق أدنى تقييم ممكن، فهذا يعني أن نص المراجعة لا يتطابق مع التقييم، أو أن محلل المشاعر لم يتمكن من التعرف على المشاعر بشكل صحيح. يجب أن تتوقع أن تكون بعض نتائج تحليل المشاعر خاطئة تمامًا، وغالبًا ما يكون ذلك قابلاً للتفسير، على سبيل المثال قد تكون المراجعة ساخرة للغاية: "بالطبع أحببت النوم في غرفة بدون تدفئة"، وقد يعتقد محلل المشاعر أن هذا شعور إيجابي، على الرغم من أن الإنسان الذي يقرأها سيعرف أنها سخرية.
### إجراء تحليل المشاعر
يوفر NLTK محللات مشاعر مختلفة للتعلم منها، ويمكنك استبدالها ورؤية ما إذا كانت المشاعر أكثر أو أقل دقة. يتم استخدام تحليل المشاعر VADER هنا.
الآن يجب عليك حساب تحليل المشاعر لكل من عمودي المراجعات السلبية والإيجابية، وتخزين النتيجة في عمودين جديدين. اختبار المشاعر سيكون بمقارنتها مع تقييم المراجع لنفس المراجعة. على سبيل المثال، إذا اعتقد تحليل المشاعر أن المراجعة السلبية كانت ذات مشاعر إيجابية للغاية (1) والمراجعة الإيجابية كانت ذات مشاعر إيجابية للغاية (1)، ولكن المراجع أعطى الفندق أدنى تقييم ممكن، فإن النص قد لا يتطابق مع التقييم، أو أن محلل المشاعر لم يتمكن من التعرف على المشاعر بشكل صحيح. يجب أن تتوقع أن تكون بعض نتائج المشاعر خاطئة تمامًا، وغالبًا ما يكون ذلك قابلاً للتفسير، مثل أن تكون المراجعة ساخرة للغاية "بالطبع أحببت النوم في غرفة بدون تدفئة" ويعتقد محلل المشاعر أن هذا شعور إيجابي، على الرغم من أن الإنسان الذي يقرأها سيعرف أنها سخرية.
تقدم NLTK محللات مشاعر مختلفة للتعلم معها، ويمكنك استبدالها وتجربة ما إذا كانت المشاعر أكثر أو أقل دقة. يتم استخدام تحليل المشاعر VADER هنا.
> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
> Hutto, C.J. & Gilbert, E.E. (2014). VADER: نموذج قائم على القواعد لتحليل المشاعر في نصوص وسائل التواصل الاجتماعي. المؤتمر الدولي الثامن للمدونات ووسائل التواصل الاجتماعي (ICWSM-14). آن أربور، ميشيغان، يونيو 2014.
```python
from nltk.sentiment.vader import SentimentIntensityAnalyzer
@ -320,7 +325,7 @@ def calc_sentiment(review):
return vader_sentiment.polarity_scores(review)["compound"]
```
لاحقًا في برنامجك عندما تكون مستعدًا لحساب المشاعر، يمكنك تطبيقها على كل مراجعة كما يلي:
لاحقًا في برنامجك، عندما تكون جاهزًا لحساب المشاعر، يمكنك تطبيقه على كل مراجعة كما يلي:
```python
# Add a negative sentiment and positive sentiment column
@ -332,7 +337,7 @@ end = time.time()
print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds")
```
يستغرق هذا حوالي 120 ثانية على جهازي، ولكن قد يختلف على كل جهاز. إذا كنت تريد طباعة النتائج ورؤية ما إذا كانت المشاعر تتطابق مع المراجعة:
يستغرق هذا حوالي 120 ثانية على جهاز الكمبيوتر الخاص بي، ولكن قد يختلف ذلك على كل جهاز. إذا كنت ترغب في طباعة النتائج ومعرفة ما إذا كانت المشاعر تتطابق مع المراجعة:
```python
df = df.sort_values(by=["Negative_Sentiment"], ascending=True)
@ -341,7 +346,7 @@ df = df.sort_values(by=["Positive_Sentiment"], ascending=True)
print(df[["Positive_Review", "Positive_Sentiment"]])
```
آخر شيء يجب القيام به مع الملف قبل استخدامه في التحدي هو حفظه! يجب عليك أيضًا التفكير في إعادة ترتيب جميع الأعمدة الجديدة بحيث تكون سهلة الاستخدام (بالنسبة للإنسان، هذا تغيير تجميلي).
آخر شيء يجب القيام به مع الملف قبل استخدامه في التحدي هو حفظه! يجب أيضًا أن تفكر في إعادة ترتيب جميع الأعمدة الجديدة بحيث تكون سهلة التعامل (بالنسبة للإنسان، هذا تغيير تجميلي).
```python
# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)
@ -353,26 +358,26 @@ df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False)
يجب عليك تشغيل الكود بالكامل لـ [دفتر التحليل](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (بعد تشغيل [دفتر التصفية](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) لإنشاء ملف Hotel_Reviews_Filtered.csv).
لمراجعة الخطوات:
لمراجعة الخطوات، هي:
1. تم استكشاف ملف البيانات الأصلي **Hotel_Reviews.csv** في الدرس السابق باستخدام [دفتر الاستكشاف](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb)
2. تم تصفية Hotel_Reviews.csv باستخدام [دفتر التصفية](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) مما نتج عنه **Hotel_Reviews_Filtered.csv**
3. تم معالجة Hotel_Reviews_Filtered.csv باستخدام [دفتر تحليل المشاعر](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) مما نتج عنه **Hotel_Reviews_NLP.csv**
4. استخدم Hotel_Reviews_NLP.csv في تحدي معالجة اللغة الطبيعية أدناه
2. يتم تصفية Hotel_Reviews.csv بواسطة [دفتر التصفية](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb) مما ينتج عنه **Hotel_Reviews_Filtered.csv**
3. يتم معالجة Hotel_Reviews_Filtered.csv بواسطة [دفتر تحليل المشاعر](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) مما ينتج عنه **Hotel_Reviews_NLP.csv**
4. استخدم Hotel_Reviews_NLP.csv في تحدي NLP أدناه
### الخلاصة
### الخاتمة
عندما بدأت، كان لديك مجموعة بيانات تحتوي على أعمدة وبيانات ولكن لم يكن بالإمكان التحقق من جميعها أو استخدامها. لقد استكشفت البيانات، وقمت بتصفية ما لا تحتاجه، وحولت العلامات إلى شيء مفيد، وحسبت متوسطاتك الخاصة، وأضفت بعض الأعمدة الخاصة بالمشاعر، ومن المحتمل أنك تعلمت بعض الأشياء المثيرة للاهتمام حول معالجة النصوص الطبيعية.
عندما بدأت، كان لديك مجموعة بيانات تحتوي على أعمدة وبيانات ولكن لم يكن بالإمكان التحقق من جميعها أو استخدامها. لقد استكشفت البيانات، وقمت بتصفية ما لا تحتاجه، وحولت العلامات إلى شيء مفيد، وحسبت متوسطاتك الخاصة، وأضفت بعض أعمدة المشاعر، ومن المحتمل أنك تعلمت أشياء مثيرة للاهتمام حول معالجة النصوص الطبيعية.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/40/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## التحدي
الآن بعد أن قمت بتحليل مجموعة البيانات الخاصة بك للمشاعر، حاول استخدام الاستراتيجيات التي تعلمتها في هذا المنهج (مثل التجميع) لتحديد الأنماط المتعلقة بالمشاعر.
الآن بعد أن قمت بتحليل مجموعة البيانات الخاصة بك للمشاعر، حاول استخدام الاستراتيجيات التي تعلمتها في هذا المنهج (التجميع، ربما؟) لتحديد الأنماط حول المشاعر.
## المراجعة والدراسة الذاتية
خذ [هذا المقرر التعليمي](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) لتتعلم المزيد واستخدام أدوات مختلفة لاستكشاف المشاعر في النصوص.
خذ [هذه الوحدة التعليمية](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott) لتتعلم المزيد واستخدام أدوات مختلفة لاستكشاف المشاعر في النصوص.
## الواجب
@ -381,4 +386,4 @@ df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False)
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية المصدر الرسمي. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,41 +1,41 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "3150d40f36a77857316ecaed5f31e856",
"translation_date": "2025-08-29T13:12:37+00:00",
"original_hash": "662b509c39eee205687726636d0a8455",
"translation_date": "2025-09-04T20:42:33+00:00",
"source_file": "7-TimeSeries/1-Introduction/README.md",
"language_code": "ar"
}
-->
# مقدمة في التنبؤ بالسلاسل الزمنية
![ملخص عن السلاسل الزمنية في رسم توضيحي](../../../../translated_images/ml-timeseries.fb98d25f1013fc0c59090030080b5d1911ff336427bec31dbaf1ad08193812e9.ar.png)
![ملخص السلاسل الزمنية في رسم تخطيطي](../../../../sketchnotes/ml-timeseries.png)
> رسم توضيحي من [Tomomi Imura](https://www.twitter.com/girlie_mac)
> رسم تخطيطي بواسطة [Tomomi Imura](https://www.twitter.com/girlie_mac)
في هذا الدرس والدرس التالي، ستتعلم قليلاً عن التنبؤ بالسلاسل الزمنية، وهو جزء مثير وقيم من أدوات عالِم تعلم الآلة، ولكنه أقل شهرة مقارنة بمواضيع أخرى. التنبؤ بالسلاسل الزمنية يشبه "الكرة البلورية": بناءً على الأداء السابق لمتغير مثل السعر، يمكنك التنبؤ بقيمته المستقبلية المحتملة.
في هذه الدرس والدرس التالي، ستتعلم قليلاً عن التنبؤ بالسلاسل الزمنية، وهو جزء مثير وقيم من مهارات عالم تعلم الآلة، ولكنه أقل شهرة مقارنة بمواضيع أخرى. التنبؤ بالسلاسل الزمنية يشبه "الكرة البلورية": بناءً على الأداء السابق لمتغير مثل السعر، يمكنك التنبؤ بقيمته المحتملة في المستقبل.
[![مقدمة في التنبؤ بالسلاسل الزمنية](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "مقدمة في التنبؤ بالسلاسل الزمنية")
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو عن التنبؤ بالسلاسل الزمنية
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/41/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
هذا المجال مفيد ومثير وله قيمة حقيقية للأعمال، نظرًا لتطبيقاته المباشرة على مشكلات التسعير والمخزون وسلاسل التوريد. على الرغم من أن تقنيات التعلم العميق بدأت تُستخدم للحصول على رؤى أعمق لتحسين التنبؤ بالأداء المستقبلي، إلا أن التنبؤ بالسلاسل الزمنية لا يزال مجالًا يعتمد بشكل كبير على تقنيات تعلم الآلة الكلاسيكية.
إنه مجال مفيد ومثير للاهتمام وله قيمة حقيقية للأعمال، نظرًا لتطبيقه المباشر على مشاكل التسعير، المخزون، وقضايا سلسلة التوريد. بينما بدأت تقنيات التعلم العميق تُستخدم للحصول على رؤى أفضل للتنبؤ بالأداء المستقبلي، يظل التنبؤ بالسلاسل الزمنية مجالًا يعتمد بشكل كبير على تقنيات تعلم الآلة الكلاسيكية.
> يمكن العثور على منهج مفيد للسلاسل الزمنية من جامعة Penn State [هنا](https://online.stat.psu.edu/stat510/lesson/1)
> يمكن العثور على منهج السلاسل الزمنية المفيد لجامعة بنسلفانيا [هنا](https://online.stat.psu.edu/stat510/lesson/1)
## مقدمة
افترض أنك تدير مجموعة من عدادات مواقف السيارات الذكية التي توفر بيانات حول مدى تكرار استخدامها ومدة استخدامها بمرور الوقت.
افترض أنك تدير مجموعة من عدادات مواقف السيارات الذكية التي توفر بيانات حول مدى استخدامها ومدتها بمرور الوقت.
> ماذا لو كان بإمكانك التنبؤ، بناءً على الأداء السابق للعداد، بقيمته المستقبلية وفقًا لقوانين العرض والطلب؟
التنبؤ بدقة بالوقت المناسب لاتخاذ إجراء لتحقيق هدفك هو تحدٍ يمكن معالجته باستخدام التنبؤ بالسلاسل الزمنية. قد لا يكون من السار للناس أن يتم فرض رسوم أعلى في أوقات الذروة عندما يبحثون عن موقف للسيارات، ولكنه سيكون وسيلة مؤكدة لتوليد الإيرادات لتنظيف الشوارع!
التنبؤ بدقة بالوقت المناسب لاتخاذ إجراء لتحقيق هدفك هو تحدٍ يمكن معالجته باستخدام التنبؤ بالسلاسل الزمنية. قد لا يكون من السار للناس أن يتم فرض رسوم أعلى في أوقات الذروة عندما يبحثون عن مكان لركن سياراتهم، ولكنه سيكون طريقة مؤكدة لتوليد الإيرادات لتنظيف الشوارع!
دعونا نستكشف بعض أنواع خوارزميات السلاسل الزمنية ونبدأ دفتر ملاحظات لتنظيف وإعداد بعض البيانات. البيانات التي ستقوم بتحليلها مأخوذة من مسابقة التنبؤ GEFCom2014. تتكون من 3 سنوات من بيانات الحمل الكهربائي ودرجات الحرارة على مدار الساعة بين عامي 2012 و2014. بناءً على الأنماط التاريخية للحمل الكهربائي ودرجات الحرارة، يمكنك التنبؤ بالقيم المستقبلية للحمل الكهربائي.
دعونا نستكشف بعض أنواع خوارزميات السلاسل الزمنية ونبدأ دفتر ملاحظات لتنظيف وإعداد بعض البيانات. البيانات التي ستقوم بتحليلها مأخوذة من مسابقة التنبؤ GEFCom2014. تتكون من 3 سنوات من قيم الأحمال الكهربائية ودرجات الحرارة لكل ساعة بين عامي 2012 و2014. بناءً على الأنماط التاريخية للأحمال الكهربائية ودرجات الحرارة، يمكنك التنبؤ بالقيم المستقبلية للأحمال الكهربائية.
في هذا المثال، ستتعلم كيفية التنبؤ بخطوة زمنية واحدة للأمام باستخدام بيانات الحمل التاريخية فقط. ومع ذلك، قبل البدء، من المفيد فهم ما يحدث وراء الكواليس.
في هذا المثال، ستتعلم كيفية التنبؤ بخطوة زمنية واحدة إلى الأمام، باستخدام بيانات الأحمال التاريخية فقط. ومع ذلك، قبل البدء، من المفيد فهم ما يحدث خلف الكواليس.
## بعض التعريفات
@ -43,25 +43,25 @@ CO_OP_TRANSLATOR_METADATA:
🎓 **السلاسل الزمنية**
في الرياضيات، "السلاسل الزمنية هي سلسلة من نقاط البيانات المفهرسة (أو المدرجة أو المرسومة) بترتيب زمني. الأكثر شيوعًا، السلاسل الزمنية هي تسلسل مأخوذ عند نقاط متتالية متساوية التباعد في الزمن." مثال على السلاسل الزمنية هو القيمة اليومية لإغلاق [مؤشر داو جونز الصناعي](https://wikipedia.org/wiki/Time_series). يتم استخدام الرسوم البيانية للسلاسل الزمنية والنمذجة الإحصائية بشكل متكرر في معالجة الإشارات، التنبؤ بالطقس، التنبؤ بالزلازل، وغيرها من المجالات حيث تحدث الأحداث ويمكن رسم نقاط البيانات بمرور الوقت.
في الرياضيات، "السلاسل الزمنية هي سلسلة من نقاط البيانات المفهرسة (أو المدرجة أو المرسومة) بترتيب زمني. غالبًا ما تكون السلاسل الزمنية عبارة عن تسلسل مأخوذ عند نقاط متساوية التباعد في الزمن." مثال على السلاسل الزمنية هو القيمة اليومية للإغلاق لمؤشر [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series). يتم استخدام مخططات السلاسل الزمنية والنمذجة الإحصائية بشكل متكرر في معالجة الإشارات، التنبؤ بالطقس، التنبؤ بالزلازل، وغيرها من المجالات حيث تحدث الأحداث ويمكن رسم نقاط البيانات بمرور الوقت.
🎓 **تحليل السلاسل الزمنية**
تحليل السلاسل الزمنية هو تحليل البيانات المذكورة أعلاه. يمكن أن تأخذ بيانات السلاسل الزمنية أشكالًا مختلفة، بما في ذلك "السلاسل الزمنية المتقطعة" التي تكتشف الأنماط في تطور السلاسل الزمنية قبل وبعد حدث مقاطع. يعتمد نوع التحليل المطلوب للسلاسل الزمنية على طبيعة البيانات. يمكن أن تأخذ بيانات السلاسل الزمنية نفسها شكل سلسلة من الأرقام أو الأحرف.
تحليل السلاسل الزمنية هو تحليل البيانات المذكورة أعلاه. يمكن أن تأخذ بيانات السلاسل الزمنية أشكالًا مميزة، بما في ذلك "السلاسل الزمنية المتقطعة" التي تكتشف الأنماط في تطور السلاسل الزمنية قبل وبعد حدث مقاطع. يعتمد نوع التحليل المطلوب للسلاسل الزمنية على طبيعة البيانات. يمكن أن تكون بيانات السلاسل الزمنية نفسها عبارة عن سلسلة من الأرقام أو الأحرف.
يتم إجراء التحليل باستخدام مجموعة متنوعة من الطرق، بما في ذلك المجال الترددي والمجال الزمني، الخطي وغير الخطي، والمزيد. [تعرف على المزيد](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) حول الطرق المختلفة لتحليل هذا النوع من البيانات.
يتم إجراء التحليل باستخدام مجموعة متنوعة من الطرق، بما في ذلك المجال الترددي والمجال الزمني، الخطية وغير الخطية، والمزيد. [تعرف على المزيد](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) حول الطرق العديدة لتحليل هذا النوع من البيانات.
🎓 **التنبؤ بالسلاسل الزمنية**
التنبؤ بالسلاسل الزمنية هو استخدام نموذج للتنبؤ بالقيم المستقبلية بناءً على الأنماط التي أظهرتها البيانات التي تم جمعها سابقًا كما حدثت في الماضي. على الرغم من أنه من الممكن استخدام نماذج الانحدار لاستكشاف بيانات السلاسل الزمنية، إلا أن مثل هذه البيانات يتم تحليلها بشكل أفضل باستخدام أنواع خاصة من النماذج.
التنبؤ بالسلاسل الزمنية هو استخدام نموذج للتنبؤ بالقيم المستقبلية بناءً على الأنماط التي تظهرها البيانات التي تم جمعها سابقًا كما حدثت في الماضي. بينما يمكن استخدام نماذج الانحدار لاستكشاف بيانات السلاسل الزمنية، مع مؤشرات الزمن كمتغيرات x على مخطط، فإن هذه البيانات يتم تحليلها بشكل أفضل باستخدام أنواع خاصة من النماذج.
بيانات السلاسل الزمنية هي قائمة من الملاحظات المرتبة، على عكس البيانات التي يمكن تحليلها باستخدام الانحدار الخطي. النموذج الأكثر شيوعًا هو ARIMA، وهو اختصار لـ "Autoregressive Integrated Moving Average".
بيانات السلاسل الزمنية هي قائمة من الملاحظات المرتبة، على عكس البيانات التي يمكن تحليلها بواسطة الانحدار الخطي. النموذج الأكثر شيوعًا هو ARIMA، وهو اختصار لـ "Autoregressive Integrated Moving Average".
[نماذج ARIMA](https://online.stat.psu.edu/stat510/lesson/1/1.1) "تربط القيمة الحالية لسلسلة بالقيم السابقة وأخطاء التنبؤ السابقة." وهي الأنسب لتحليل بيانات المجال الزمني، حيث يتم ترتيب البيانات بمرور الوقت.
[نماذج ARIMA](https://online.stat.psu.edu/stat510/lesson/1/1.1) "تربط القيمة الحالية للسلسلة بالقيم السابقة وأخطاء التنبؤ السابقة." وهي الأنسب لتحليل بيانات المجال الزمني، حيث يتم ترتيب البيانات بمرور الوقت.
> هناك عدة أنواع من نماذج ARIMA، يمكنك التعرف عليها [هنا](https://people.duke.edu/~rnau/411arim.htm) وستتعرف عليها في الدرس التالي.
في الدرس التالي، ستقوم ببناء نموذج ARIMA باستخدام [السلاسل الزمنية أحادية المتغير](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm)، التي تركز على متغير واحد يتغير قيمته بمرور الوقت. مثال على هذا النوع من البيانات هو [مجموعة البيانات هذه](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) التي تسجل تركيز ثاني أكسيد الكربون الشهري في مرصد ماونا لوا:
في الدرس التالي، ستقوم ببناء نموذج ARIMA باستخدام [السلاسل الزمنية أحادية المتغير](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm)، التي تركز على متغير واحد يتغير قيمته بمرور الوقت. مثال على هذا النوع من البيانات هو [هذه المجموعة](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) التي تسجل تركيز ثاني أكسيد الكربون الشهري في مرصد ماونا لوا:
| CO2 | YearMonth | Year | Month |
| :----: | :-------: | :---: | :---: |
@ -78,25 +78,25 @@ CO_OP_TRANSLATOR_METADATA:
| 329.25 | 1975.88 | 1975 | 11 |
| 330.97 | 1975.96 | 1975 | 12 |
✅ حدد المتغير الذي يتغير بمرور الوقت في هذه المجموعة من البيانات
✅ حدد المتغير الذي يتغير بمرور الوقت في هذه المجموعة.
## خصائص بيانات السلاسل الزمنية التي يجب أخذها في الاعتبار
عند النظر إلى بيانات السلاسل الزمنية، قد تلاحظ أنها تحتوي على [خصائص معينة](https://online.stat.psu.edu/stat510/lesson/1/1.1) تحتاج إلى أخذها في الاعتبار ومعالجتها لفهم أنماطها بشكل أفضل. إذا اعتبرت بيانات السلاسل الزمنية كإشارة محتملة تريد تحليلها، يمكن اعتبار هذه الخصائص كضوضاء. غالبًا ما تحتاج إلى تقليل هذه "الضوضاء" من خلال تعويض بعض هذه الخصائص باستخدام تقنيات إحصائية.
عند النظر إلى بيانات السلاسل الزمنية، قد تلاحظ أنها تحتوي على [خصائص معينة](https://online.stat.psu.edu/stat510/lesson/1/1.1) تحتاج إلى أخذها في الاعتبار والتخفيف منها لفهم أنماطها بشكل أفضل. إذا اعتبرت بيانات السلاسل الزمنية كإشارة محتملة تريد تحليلها، يمكن اعتبار هذه الخصائص كضوضاء. غالبًا ما تحتاج إلى تقليل هذه "الضوضاء" عن طريق تعويض بعض هذه الخصائص باستخدام بعض التقنيات الإحصائية.
فيما يلي بعض المفاهيم التي يجب أن تعرفها للعمل مع السلاسل الزمنية:
إليك بعض المفاهيم التي يجب أن تعرفها لتتمكن من العمل مع السلاسل الزمنية:
🎓 **الاتجاهات**
الاتجاهات تُعرف بأنها زيادات ونقصانات قابلة للقياس بمرور الوقت. [اقرأ المزيد](https://machinelearningmastery.com/time-series-trends-in-python). في سياق السلاسل الزمنية، يتعلق الأمر بكيفية استخدام الاتجاهات وإذا لزم الأمر، إزالتها من السلاسل الزمنية.
الاتجاهات تُعرف بأنها زيادات وانخفاضات قابلة للقياس بمرور الوقت. [اقرأ المزيد](https://machinelearningmastery.com/time-series-trends-in-python). في سياق السلاسل الزمنية، يتعلق الأمر بكيفية استخدام وإزالة الاتجاهات إذا لزم الأمر من السلاسل الزمنية.
🎓 **[الموسمية](https://machinelearningmastery.com/time-series-seasonality-with-python/)**
الموسمية تُعرف بأنها التقلبات الدورية، مثل الاندفاعات الموسمية التي قد تؤثر على المبيعات، على سبيل المثال. [اطلع على](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) كيفية عرض أنواع مختلفة من الرسوم البيانية للموسمية في البيانات.
الموسمية تُعرف بأنها تقلبات دورية، مثل اندفاعات العطلات التي قد تؤثر على المبيعات، على سبيل المثال. [اطلع](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) على كيفية عرض أنواع مختلفة من المخططات الموسمية في البيانات.
🎓 **القيم الشاذة**
القيم الشاذة هي تلك التي تكون بعيدة عن التباين القياسي للبيانات.
القيم الشاذة تكون بعيدة عن تباين البيانات القياسي.
🎓 **الدورة طويلة الأمد**
@ -108,21 +108,21 @@ CO_OP_TRANSLATOR_METADATA:
🎓 **التغيرات المفاجئة**
قد تعرض البيانات تغيرًا مفاجئًا قد يحتاج إلى مزيد من التحليل. على سبيل المثال، الإغلاق المفاجئ للأعمال بسبب COVID تسبب في تغييرات في البيانات.
قد تعرض البيانات تغيرًا مفاجئًا قد يحتاج إلى تحليل إضافي. على سبيل المثال، الإغلاق المفاجئ للأعمال بسبب COVID تسبب في تغييرات في البيانات.
هنا [مثال على رسم بياني للسلاسل الزمنية](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) يظهر الإنفاق اليومي على العملة داخل اللعبة على مدار بضع سنوات. هل يمكنك تحديد أي من الخصائص المذكورة أعلاه في هذه البيانات؟
إليك [مخطط سلسلة زمنية نموذجي](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) يظهر الإنفاق اليومي على العملة داخل اللعبة على مدى عدة سنوات. هل يمكنك تحديد أي من الخصائص المذكورة أعلاه في هذه البيانات؟
![إنفاق العملة داخل اللعبة](../../../../translated_images/currency.e7429812bfc8c6087b2d4c410faaa4aaa11b2fcaabf6f09549b8249c9fbdb641.ar.png)
![إنفاق العملة داخل اللعبة](../../../../7-TimeSeries/1-Introduction/images/currency.png)
## تمرين - البدء ببيانات استخدام الطاقة
لنبدأ بإنشاء نموذج للسلاسل الزمنية للتنبؤ باستخدام الطاقة المستقبلي بناءً على الاستخدام السابق.
لنبدأ بإنشاء نموذج سلسلة زمنية للتنبؤ باستخدام الطاقة في المستقبل بناءً على الاستخدام السابق.
> البيانات في هذا المثال مأخوذة من مسابقة التنبؤ GEFCom2014. تتكون من 3 سنوات من بيانات الحمل الكهربائي ودرجات الحرارة على مدار الساعة بين عامي 2012 و2014.
> البيانات في هذا المثال مأخوذة من مسابقة التنبؤ GEFCom2014. تتكون من 3 سنوات من قيم الأحمال الكهربائية ودرجات الحرارة لكل ساعة بين عامي 2012 و2014.
>
> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli and Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016.
1. في مجلد `working` لهذا الدرس، افتح ملف _notebook.ipynb_. ابدأ بإضافة المكتبات التي ستساعدك على تحميل البيانات وتصويرها:
1. في مجلد `working` الخاص بهذا الدرس، افتح ملف _notebook.ipynb_. ابدأ بإضافة المكتبات التي ستساعدك في تحميل البيانات وتصويرها.
```python
import os
@ -131,7 +131,7 @@ CO_OP_TRANSLATOR_METADATA:
%matplotlib inline
```
لاحظ أنك تستخدم الملفات من مجلد `common` المرفق الذي يقوم بإعداد بيئتك وتحميل البيانات.
لاحظ أنك تستخدم الملفات من مجلد `common` المرفق الذي يقوم بإعداد بيئتك ومعالجة تنزيل البيانات.
2. بعد ذلك، قم بفحص البيانات كإطار بيانات باستخدام `load_data()` و `head()`:
@ -141,7 +141,7 @@ CO_OP_TRANSLATOR_METADATA:
energy.head()
```
يمكنك أن ترى أن هناك عمودين يمثلان التاريخ والحمل:
يمكنك رؤية أن هناك عمودين يمثلان التاريخ والحمل:
| | load |
| :-----------------: | :----: |
@ -160,9 +160,9 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![رسم الطاقة](../../../../translated_images/energy-plot.5fdac3f397a910bc6070602e9e45bea8860d4c239354813fa8fc3c9d556f5bad.ar.png)
![مخطط الطاقة](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png)
4. الآن، قم برسم الأسبوع الأول من يوليو 2014، عن طريق توفيره كمدخل إلى `energy` بالنمط `[من التاريخ]: [إلى التاريخ]`:
4. الآن، قم برسم الأسبوع الأول من يوليو 2014، عن طريق توفيره كمدخل إلى `energy` في نمط `[من التاريخ]: [إلى التاريخ]`:
```python
energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
@ -171,19 +171,19 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![يوليو](../../../../translated_images/july-2014.9e1f7c318ec6d5b30b0d7e1e20be3643501f64a53f3d426d7c7d7b62addb335e.ar.png)
![يوليو](../../../../7-TimeSeries/1-Introduction/images/july-2014.png)
رسم جميل! ألقِ نظرة على هذه الرسوم البيانية وحاول تحديد أي من الخصائص المذكورة أعلاه. ماذا يمكننا أن نستنتج من خلال تصور البيانات؟
مخطط جميل! ألقِ نظرة على هذه المخططات وحاول تحديد أي من الخصائص المذكورة أعلاه. ماذا يمكننا استنتاجه من خلال تصور البيانات؟
في الدرس التالي، ستقوم بإنشاء نموذج ARIMA لإجراء بعض التنبؤات.
في الدرس التالي، ستقوم بإنشاء نموذج ARIMA لإنشاء بعض التنبؤات.
---
## 🚀تحدي
قم بعمل قائمة بجميع الصناعات ومجالات البحث التي يمكنك التفكير فيها والتي ستستفيد من التنبؤ بالسلاسل الزمنية. هل يمكنك التفكير في تطبيق لهذه التقنيات في الفنون؟ في الاقتصاد القياسي؟ في البيئة؟ في البيع بالتجزئة؟ في الصناعة؟ في التمويل؟ أين أيضًا؟
قم بعمل قائمة بجميع الصناعات ومجالات البحث التي يمكنك التفكير فيها والتي ستستفيد من التنبؤ بالسلاسل الزمنية. هل يمكنك التفكير في تطبيق لهذه التقنيات في الفنون؟ في الاقتصاد القياسي؟ في علم البيئة؟ في البيع بالتجزئة؟ في الصناعة؟ في التمويل؟ أين أيضًا؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/42/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية

@ -1,45 +1,45 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2f400075e003e749fdb0d6b3b4787a99",
"translation_date": "2025-08-29T13:09:11+00:00",
"original_hash": "917dbf890db71a322f306050cb284749",
"translation_date": "2025-09-04T20:41:47+00:00",
"source_file": "7-TimeSeries/2-ARIMA/README.md",
"language_code": "ar"
}
-->
# التنبؤ بالسلاسل الزمنية باستخدام ARIMA
في الدرس السابق، تعلمت قليلاً عن التنبؤ بالسلاسل الزمنية وقمت بتحميل مجموعة بيانات تظهر تقلبات الحمل الكهربائي على مدى فترة زمنية.
في الدرس السابق، تعلمت قليلاً عن التنبؤ بالسلاسل الزمنية وقمت بتحميل مجموعة بيانات تُظهر تقلبات الحمل الكهربائي على مدى فترة زمنية.
[![مقدمة إلى ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Introduction to ARIMA")
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: مقدمة قصيرة عن نماذج ARIMA. المثال مقدم باستخدام لغة R، لكن المفاهيم عامة.
> 🎥 انقر على الصورة أعلاه لمشاهدة فيديو: مقدمة قصيرة عن نماذج ARIMA. المثال مُنفذ باستخدام R، لكن المفاهيم عامة.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/43/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المقدمة
في هذا الدرس، ستتعرف على طريقة محددة لبناء نماذج باستخدام [ARIMA: *التكامل التلقائي* *المتوسط المتحرك*](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). نماذج ARIMA مناسبة بشكل خاص لتحليل البيانات التي تظهر [عدم الثبات](https://wikipedia.org/wiki/Stationary_process).
في هذا الدرس، ستتعرف على طريقة محددة لبناء النماذج باستخدام [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). تُعتبر نماذج ARIMA مناسبة بشكل خاص لتلائم البيانات التي تُظهر [عدم الثبات](https://wikipedia.org/wiki/Stationary_process).
## المفاهيم العامة
للتعامل مع ARIMA، هناك بعض المفاهيم التي تحتاج إلى معرفتها:
لكي تتمكن من العمل مع ARIMA، هناك بعض المفاهيم التي تحتاج إلى معرفتها:
- 🎓 **الثبات**. من منظور إحصائي، يشير الثبات إلى البيانات التي لا يتغير توزيعها عند تحريكها عبر الزمن. البيانات غير الثابتة تظهر تقلبات بسبب الاتجاهات التي يجب تحويلها لتحليلها. على سبيل المثال، يمكن أن تؤدي الموسمية إلى تقلبات في البيانات ويمكن التخلص منها من خلال عملية "التفريق الموسمي".
- 🎓 **الثبات**. من منظور إحصائي، يشير الثبات إلى البيانات التي لا يتغير توزيعها عند تحريكها عبر الزمن. أما البيانات غير الثابتة، فتُظهر تقلبات بسبب الاتجاهات التي يجب تحويلها لتحليلها. على سبيل المثال، يمكن أن تُدخل الموسمية تقلبات في البيانات ويمكن التخلص منها من خلال عملية "الفرق الموسمي".
- 🎓 **[التفريق](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. يشير التفريق، مرة أخرى من منظور إحصائي، إلى عملية تحويل البيانات غير الثابتة لجعلها ثابتة عن طريق إزالة الاتجاه غير الثابت. "التفريق يزيل التغيرات في مستوى السلسلة الزمنية، مما يلغي الاتجاه والموسمية وبالتالي يثبت المتوسط للسلسلة الزمنية." [ورقة بحثية بواسطة Shixiong وآخرين](https://arxiv.org/abs/1904.07632)
- 🎓 **[الفرق](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. يشير الفرق في البيانات، من منظور إحصائي، إلى عملية تحويل البيانات غير الثابتة لجعلها ثابتة عن طريق إزالة الاتجاه غير الثابت. "الفرق يزيل التغيرات في مستوى السلسلة الزمنية، مما يلغي الاتجاه والموسمية وبالتالي يثبت المتوسط للسلسلة الزمنية." [ورقة بحثية لـ Shixiong وآخرين](https://arxiv.org/abs/1904.07632)
## ARIMA في سياق السلاسل الزمنية
دعونا نفكك أجزاء ARIMA لفهم كيفية مساعدتها في نمذجة السلاسل الزمنية ومساعدتنا في التنبؤ بها.
- **AR - الانحدار التلقائي**. كما يشير الاسم، تقوم نماذج الانحدار التلقائي بالنظر إلى الوراء في الزمن لتحليل القيم السابقة في بياناتك وتكوين افتراضات حولها. تُعرف هذه القيم السابقة بـ "التأخيرات". مثال على ذلك هو البيانات التي تظهر مبيعات الأقلام الشهرية. إجمالي مبيعات كل شهر يُعتبر "متغير متطور" في مجموعة البيانات. يتم بناء هذا النموذج حيث يتم "انحدار المتغير المتطور محل الاهتمام على قيمه السابقة (أي التأخيرات)." [ويكيبيديا](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)
- **AR - الانحدار الذاتي**. كما يوحي الاسم، تنظر النماذج الانحدارية الذاتية إلى "الماضي" لتحليل القيم السابقة في بياناتك وتكوين افتراضات حولها. تُسمى هذه القيم السابقة بـ "الفجوات الزمنية". مثال على ذلك هو البيانات التي تُظهر مبيعات الأقلام الشهرية. إجمالي مبيعات كل شهر يُعتبر "متغيرًا متطورًا" في مجموعة البيانات. يتم بناء هذا النموذج على أساس أن "المتغير المتطور محل الاهتمام يتم انحداره على قيمه السابقة (أي الفجوات الزمنية)." [ويكيبيديا](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)
- **I - التكامل**. على عكس نماذج ARMA المشابهة، يشير الحرف "I" في ARIMA إلى الجانب *[المتكامل](https://wikipedia.org/wiki/Order_of_integration)*. يتم تكامل البيانات عندما يتم تطبيق خطوات التفريق للتخلص من عدم الثبات.
- **I - التكامل**. على عكس النماذج المشابهة مثل 'ARMA'، يشير الحرف 'I' في ARIMA إلى الجانب *[المتكامل](https://wikipedia.org/wiki/Order_of_integration)*. يتم "تكامل" البيانات عند تطبيق خطوات الفرق لإزالة عدم الثبات.
- **MA - المتوسط المتحرك**. يشير جانب [المتوسط المتحرك](https://wikipedia.org/wiki/Moving-average_model) في هذا النموذج إلى المتغير الناتج الذي يتم تحديده من خلال مراقبة القيم الحالية والسابقة للتأخيرات.
- **MA - المتوسط المتحرك**. يشير جانب [المتوسط المتحرك](https://wikipedia.org/wiki/Moving-average_model) في هذا النموذج إلى المتغير الناتج الذي يتم تحديده من خلال مراقبة القيم الحالية والسابقة للفجوات الزمنية.
الخلاصة: يتم استخدام ARIMA لجعل النموذج يتناسب مع الشكل الخاص لبيانات السلاسل الزمنية بأكبر قدر ممكن من الدقة.
الخلاصة: تُستخدم ARIMA لجعل النموذج يتلاءم مع الشكل الخاص لبيانات السلاسل الزمنية بأكبر قدر ممكن من الدقة.
## تمرين - بناء نموذج ARIMA
@ -47,7 +47,7 @@ CO_OP_TRANSLATOR_METADATA:
1. قم بتشغيل الدفتر لتحميل مكتبة Python `statsmodels`؛ ستحتاجها لنماذج ARIMA.
1. قم بتحميل المكتبات الضرورية.
1. قم بتحميل المكتبات اللازمة.
1. الآن، قم بتحميل المزيد من المكتبات المفيدة لرسم البيانات:
@ -79,7 +79,7 @@ CO_OP_TRANSLATOR_METADATA:
energy.head(10)
```
1. قم برسم جميع بيانات الطاقة المتاحة من يناير 2012 إلى ديسمبر 2014. لا ينبغي أن تكون هناك مفاجآت حيث رأينا هذه البيانات في الدرس السابق:
1. قم برسم جميع بيانات الطاقة المتاحة من يناير 2012 إلى ديسمبر 2014. لا ينبغي أن تكون هناك مفاجآت لأننا رأينا هذه البيانات في الدرس السابق:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
@ -92,16 +92,16 @@ CO_OP_TRANSLATOR_METADATA:
### إنشاء مجموعات بيانات التدريب والاختبار
الآن تم تحميل بياناتك، يمكنك فصلها إلى مجموعات تدريب واختبار. ستقوم بتدريب النموذج على مجموعة التدريب. كما هو الحال دائمًا، بعد انتهاء النموذج من التدريب، ستقوم بتقييم دقته باستخدام مجموعة الاختبار. تحتاج إلى التأكد من أن مجموعة الاختبار تغطي فترة زمنية لاحقة لمجموعة التدريب لضمان أن النموذج لا يحصل على معلومات من الفترات الزمنية المستقبلية.
الآن بعد أن تم تحميل بياناتك، يمكنك فصلها إلى مجموعات تدريب واختبار. ستقوم بتدريب النموذج الخاص بك على مجموعة التدريب. وكالعادة، بعد أن ينتهي النموذج من التدريب، ستقوم بتقييم دقته باستخدام مجموعة الاختبار. تحتاج إلى التأكد من أن مجموعة الاختبار تغطي فترة زمنية لاحقة لمجموعة التدريب لضمان أن النموذج لا يحصل على معلومات من فترات زمنية مستقبلية.
1. خصص فترة شهرين من 1 سبتمبر إلى 31 أكتوبر 2014 لمجموعة التدريب. ستتضمن مجموعة الاختبار فترة شهرين من 1 نوفمبر إلى 31 ديسمبر 2014:
1. خصص فترة شهرين من 1 سبتمبر إلى 31 أكتوبر 2014 لمجموعة التدريب. ستشمل مجموعة الاختبار فترة الشهرين من 1 نوفمبر إلى 31 ديسمبر 2014:
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
نظرًا لأن هذه البيانات تعكس استهلاك الطاقة اليومي، هناك نمط موسمي قوي، لكن الاستهلاك يشبه إلى حد كبير الاستهلاك في الأيام الأخيرة.
نظرًا لأن هذه البيانات تعكس استهلاك الطاقة اليومي، هناك نمط موسمي قوي، ولكن الاستهلاك يكون أكثر تشابهًا مع الاستهلاك في الأيام الأخيرة.
1. قم بتصور الفروقات:
@ -114,17 +114,17 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![بيانات التدريب والاختبار](../../../../translated_images/train-test.8928d14e5b91fc942f0ca9201b2d36c890ea7e98f7619fd94f75de3a4c2bacb9.ar.png)
![بيانات التدريب والاختبار](../../../../7-TimeSeries/2-ARIMA/images/train-test.png)
لذلك، استخدام نافذة زمنية صغيرة نسبيًا لتدريب البيانات يجب أن يكون كافيًا.
> ملاحظة: نظرًا لأن الوظيفة التي نستخدمها لتناسب نموذج ARIMA تستخدم التحقق داخل العينة أثناء التناسب، سنقوم بتجاهل بيانات التحقق.
> ملاحظة: نظرًا لأن الوظيفة التي نستخدمها لتلائم نموذج ARIMA تستخدم التحقق داخل العينة أثناء التلاؤم، سنقوم بتجاهل بيانات التحقق.
### تحضير البيانات للتدريب
الآن، تحتاج إلى تحضير البيانات للتدريب عن طريق تصفية البيانات وتوسيع نطاقها. قم بتصفية مجموعة البيانات لتشمل فقط الفترات الزمنية والأعمدة التي تحتاجها، وقم بتوسيع النطاق لضمان عرض البيانات في النطاق 0,1.
الآن، تحتاج إلى تحضير البيانات للتدريب عن طريق تصفيتها وتوسيع نطاقها. قم بتصفية مجموعة البيانات الخاصة بك لتشمل فقط الفترات الزمنية والأعمدة التي تحتاجها، وقم بتوسيع النطاق لضمان أن البيانات تقع في النطاق 0,1.
1. قم بتصفية مجموعة البيانات الأصلية لتشمل فقط الفترات الزمنية المذكورة لكل مجموعة وتضمين العمود المطلوب "load" بالإضافة إلى التاريخ:
1. قم بتصفية مجموعة البيانات الأصلية لتشمل فقط الفترات الزمنية المذكورة لكل مجموعة، مع تضمين العمود المطلوب 'load' بالإضافة إلى التاريخ:
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
@ -157,11 +157,11 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![الأصلية](../../../../translated_images/original.b2b15efe0ce92b8745918f071dceec2231661bf49c8db6918e3ff4b3b0b183c2.ar.png)
![الأصلية](../../../../7-TimeSeries/2-ARIMA/images/original.png)
> البيانات الأصلية
![الموسعة](../../../../translated_images/scaled.e35258ca5cd3d43f86d5175e584ba96b38d51501f234abf52e11f4fe2631e45f.ar.png)
![الموسعة](../../../../7-TimeSeries/2-ARIMA/images/scaled.png)
> البيانات الموسعة
@ -179,16 +179,18 @@ CO_OP_TRANSLATOR_METADATA:
الآن تحتاج إلى اتباع عدة خطوات:
1. قم بتعريف النموذج عن طريق استدعاء `SARIMAX()` وتمرير معلمات النموذج: المعلمات p، d، و q، بالإضافة إلى المعلمات P، D، و Q.
2. قم بتحضير النموذج لمجموعة بيانات التدريب عن طريق استدعاء وظيفة fit().
3. قم بعمل توقعات عن طريق استدعاء وظيفة `forecast()` وتحديد عدد الخطوات (الأفق) للتنبؤ.
2. قم بتحضير النموذج لبيانات التدريب عن طريق استدعاء وظيفة `fit()`.
3. قم بإجراء التنبؤات عن طريق استدعاء وظيفة `forecast()` وتحديد عدد الخطوات (الأفق) للتنبؤ.
> 🎓 ما هي كل هذه المعلمات؟ في نموذج ARIMA، هناك 3 معلمات تُستخدم للمساعدة في نمذجة الجوانب الرئيسية للسلسلة الزمنية: الموسمية، الاتجاه، والضوضاء. هذه المعلمات هي:
`p`: المعلمة المرتبطة بجانب الانحدار التلقائي للنموذج، والذي يدمج القيم *السابقة*.
`d`: المعلمة المرتبطة بالجزء المتكامل للنموذج، والذي يؤثر على مقدار *التفريق* (🎓 تذكر التفريق 👆؟) الذي يتم تطبيقه على السلسلة الزمنية.
`p`: المعلمة المرتبطة بجانب الانحدار الذاتي للنموذج، والذي يدمج القيم *السابقة*.
`d`: المعلمة المرتبطة بالجزء المتكامل للنموذج، والتي تؤثر على مقدار *الفرق* (🎓 تذكر الفرق 👆؟) الذي يتم تطبيقه على السلسلة الزمنية.
`q`: المعلمة المرتبطة بجانب المتوسط المتحرك للنموذج.
> ملاحظة: إذا كانت بياناتك تحتوي على جانب موسمي - كما هو الحال هنا -، نستخدم نموذج ARIMA الموسمي (SARIMA). في هذه الحالة تحتاج إلى استخدام مجموعة أخرى من المعلمات: `P`، `D`، و `Q` التي تصف نفس الارتباطات مثل `p`، `d`، و `q`، ولكنها تتعلق بالجوانب الموسمية للنموذج.
> ملاحظة: إذا كانت بياناتك تحتوي على جانب موسمي - كما هو الحال هنا -، نستخدم نموذج ARIMA الموسمي (SARIMA). في هذه الحالة، تحتاج إلى استخدام مجموعة أخرى من المعلمات: `P`، `D`، و `Q` التي تصف نفس الارتباطات مثل `p`، `d`، و `q`، ولكنها تتعلق بالمكونات الموسمية للنموذج.
1. ابدأ بتحديد قيمة الأفق المفضلة لديك. لنحاول 3 ساعات:
@ -198,7 +200,7 @@ CO_OP_TRANSLATOR_METADATA:
print('Forecasting horizon:', HORIZON, 'hours')
```
اختيار أفضل القيم لمعلمات نموذج ARIMA يمكن أن يكون تحديًا لأنه يعتمد إلى حد كبير على التقدير الشخصي ويستغرق وقتًا. قد تفكر في استخدام وظيفة `auto_arima()` من مكتبة [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html).
اختيار أفضل القيم لمعلمات نموذج ARIMA يمكن أن يكون تحديًا لأنه يعتمد إلى حد كبير على التقدير الشخصي ويستغرق وقتًا. يمكنك التفكير في استخدام وظيفة `auto_arima()` من مكتبة [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html).
1. في الوقت الحالي، جرب بعض الاختيارات اليدوية للعثور على نموذج جيد.
@ -218,17 +220,17 @@ CO_OP_TRANSLATOR_METADATA:
### تقييم النموذج الخاص بك
لتقييم النموذج الخاص بك، يمكنك تنفيذ ما يسمى بـ `التحقق التدريجي`. في الممارسة العملية، يتم إعادة تدريب نماذج السلاسل الزمنية في كل مرة تصبح فيها بيانات جديدة متاحة. يتيح ذلك للنموذج تقديم أفضل توقع عند كل خطوة زمنية.
لتقييم النموذج الخاص بك، يمكنك تنفيذ ما يُسمى بـ `التحقق التدريجي`. في الممارسة العملية، يتم إعادة تدريب نماذج السلاسل الزمنية في كل مرة تصبح فيها بيانات جديدة متاحة. يسمح هذا للنموذج بتقديم أفضل تنبؤ في كل خطوة زمنية.
ابدأ من بداية السلسلة الزمنية باستخدام هذه التقنية، قم بتدريب النموذج على مجموعة بيانات التدريب. ثم قم بعمل توقع للخطوة الزمنية التالية. يتم تقييم التوقع مقابل القيمة المعروفة. يتم توسيع مجموعة التدريب لتشمل القيمة المعروفة ويتم تكرار العملية.
ابدأ من بداية السلسلة الزمنية باستخدام هذه التقنية، قم بتدريب النموذج على مجموعة بيانات التدريب. ثم قم بإجراء تنبؤ على الخطوة الزمنية التالية. يتم تقييم التنبؤ مقابل القيمة المعروفة. يتم بعد ذلك توسيع مجموعة التدريب لتشمل القيمة المعروفة ويتم تكرار العملية.
> ملاحظة: يجب أن تحافظ على نافذة مجموعة التدريب ثابتة لتحقيق تدريب أكثر كفاءة بحيث في كل مرة تضيف ملاحظة جديدة إلى مجموعة التدريب، تقوم بإزالة الملاحظة من بداية المجموعة.
> ملاحظة: يجب أن تحافظ على نافذة مجموعة التدريب ثابتة لتحقيق تدريب أكثر كفاءة، بحيث في كل مرة تضيف ملاحظة جديدة إلى مجموعة التدريب، تقوم بإزالة الملاحظة من بداية المجموعة.
تقدم هذه العملية تقديرًا أكثر قوة لكيفية أداء النموذج في الممارسة العملية. ومع ذلك، يأتي ذلك بتكلفة حسابية لإنشاء العديد من النماذج. هذا مقبول إذا كانت البيانات صغيرة أو إذا كان النموذج بسيطًا، ولكن قد يكون مشكلة على نطاق واسع.
توفر هذه العملية تقديرًا أكثر دقة لكيفية أداء النموذج في الممارسة العملية. ومع ذلك، فإنها تأتي بتكلفة حسابية بسبب إنشاء العديد من النماذج. هذا مقبول إذا كانت البيانات صغيرة أو إذا كان النموذج بسيطًا، ولكنه قد يكون مشكلة على نطاق واسع.
التحقق التدريجي هو المعيار الذهبي لتقييم نماذج السلاسل الزمنية ويوصى به لمشاريعك الخاصة.
يُعتبر التحقق التدريجي المعيار الذهبي لتقييم نماذج السلاسل الزمنية ويوصى به لمشاريعك الخاصة.
1. أولاً، قم بإنشاء نقطة بيانات اختبار لكل خطوة أفق.
1. أولاً، قم بإنشاء نقطة بيانات اختبار لكل خطوة أفقية.
```python
test_shifted = test.copy()
@ -248,9 +250,9 @@ CO_OP_TRANSLATOR_METADATA:
| 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 |
| 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 |
يتم تحريك البيانات أفقيًا وفقًا لنقطة الأفق الخاصة بها.
يتم إزاحة البيانات أفقيًا وفقًا لنقطة الأفق.
1. قم بعمل توقعات على بيانات الاختبار باستخدام هذا النهج في نافذة متحركة في حلقة بحجم طول بيانات الاختبار:
1. قم بإجراء التنبؤات على بيانات الاختبار باستخدام هذا النهج المتحرك في حلقة بحجم طول بيانات الاختبار:
```python
%%time
@ -293,7 +295,7 @@ CO_OP_TRANSLATOR_METADATA:
3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795]
```
1. قارن التوقعات بالحمل الفعلي:
1. قارن التنبؤات بالحمل الفعلي:
```python
eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)])
@ -313,18 +315,17 @@ CO_OP_TRANSLATOR_METADATA:
| 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 |
| 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 |
لاحظ توقعات البيانات لكل ساعة، مقارنة بالحمل الفعلي. ما مدى دقة ذلك؟
لاحظ التنبؤ بالبيانات لكل ساعة، مقارنة بالحمل الفعلي. ما مدى دقة هذا؟
### تحقق من دقة النموذج
تحقق من دقة النموذج الخاص بك عن طريق اختبار متوسط الخطأ النسبي المطلق (MAPE) لجميع التوقعات.
تحقق من دقة النموذج الخاص بك عن طريق اختبار متوسط نسبة الخطأ المطلق (MAPE) لجميع التنبؤات.
> **🧮 أظهر لي الرياضيات**
>
> ![MAPE](../../../../translated_images/mape.fd87bbaf4d346846df6af88b26bf6f0926bf9a5027816d5e23e1200866e3e8a4.ar.png)
> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png)
>
> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) تُستخدم لعرض دقة التنبؤ كنسبة تُعرّفها الصيغة أعلاه. يتم تقسيم الفرق بين القيم الفعلية والمتوقعة على القيم الفعلية.
"يتم جمع القيمة المطلقة في هذه العملية لكل نقطة متوقعة في الزمن، ثم يتم تقسيمها على عدد النقاط الملائمة n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error)
> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) تُستخدم لعرض دقة التنبؤ كنسبة تُعرّفها الصيغة أعلاه. يتم قسمة الفرق بين القيم الفعلية والمتوقعة على القيم الفعلية.
> "يتم جمع القيمة المطلقة في هذا الحساب لكل نقطة متوقعة في الزمن وقسمتها على عدد النقاط الملائمة n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error)
1. عبر عن المعادلة في الكود:
```python
@ -339,7 +340,7 @@ CO_OP_TRANSLATOR_METADATA:
print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%')
```
MAPE لتوقع خطوة واحدة: 0.5570581332313952 %
MAPE لتوقع خطوة واحدة: 0.5570581332313952 %
1. اطبع MAPE لتوقع متعدد الخطوات:
@ -381,7 +382,7 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![نموذج سلسلة زمنية](../../../../translated_images/accuracy.2c47fe1bf15f44b3656651c84d5e2ba9b37cd929cd2aa8ab6cc3073f50570f4e.ar.png)
![نموذج سلسلة زمنية](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png)
🏆 رسم جميل جدًا، يظهر نموذجًا بدقة جيدة. عمل رائع!
@ -391,7 +392,7 @@ CO_OP_TRANSLATOR_METADATA:
استكشف الطرق المختلفة لاختبار دقة نموذج السلاسل الزمنية. لقد تناولنا MAPE في هذا الدرس، ولكن هل هناك طرق أخرى يمكنك استخدامها؟ قم بالبحث عنها وقم بتوضيحها. يمكن العثور على وثيقة مفيدة [هنا](https://otexts.com/fpp2/accuracy.html)
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/44/)
## [اختبار ما بعد الدرس](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
@ -404,4 +405,4 @@ CO_OP_TRANSLATOR_METADATA:
---
**إخلاء المسؤولية**:
تم ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو عدم دقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.

@ -1,41 +1,41 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "f80e513b3279869e7661e3190cc83076",
"translation_date": "2025-08-29T13:15:57+00:00",
"original_hash": "482bccabe1df958496ea71a3667995cd",
"translation_date": "2025-09-04T20:43:01+00:00",
"source_file": "7-TimeSeries/3-SVR/README.md",
"language_code": "ar"
}
-->
# التنبؤ بالسلاسل الزمنية باستخدام نموذج Support Vector Regressor
# التنبؤ بالسلاسل الزمنية باستخدام نموذج دعم المتجهات للتراجع
في الدرس السابق، تعلمت كيفية استخدام نموذج ARIMA للتنبؤ بالسلاسل الزمنية. الآن ستتعرف على نموذج Support Vector Regressor، وهو نموذج يستخدم للتنبؤ بالبيانات المستمرة.
في الدرس السابق، تعلمت كيفية استخدام نموذج ARIMA لإجراء توقعات السلاسل الزمنية. الآن ستتعرف على نموذج دعم المتجهات للتراجع (Support Vector Regressor)، وهو نموذج يستخدم للتنبؤ بالبيانات المستمرة.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/51/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المقدمة
في هذا الدرس، ستكتشف طريقة محددة لبناء النماذج باستخدام [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) للتنبؤ، أو **SVR: Support Vector Regressor**.
في هذا الدرس، ستكتشف طريقة محددة لبناء نماذج باستخدام [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) للتراجع، أو **SVR: دعم المتجهات للتراجع**.
### SVR في سياق السلاسل الزمنية [^1]
قبل فهم أهمية SVR في التنبؤ بالسلاسل الزمنية، إليك بعض المفاهيم المهمة التي تحتاج إلى معرفتها:
- **الانحدار:** تقنية تعلم تحت الإشراف تُستخدم للتنبؤ بالقيم المستمرة من مجموعة معينة من المدخلات. الفكرة هي ملاءمة منحنى (أو خط) في فضاء الميزات يحتوي على أكبر عدد من النقاط. [اضغط هنا](https://en.wikipedia.org/wiki/Regression_analysis) لمزيد من المعلومات.
- **Support Vector Machine (SVM):** نوع من نماذج التعلم الآلي تحت الإشراف يُستخدم للتصنيف، والانحدار، واكتشاف القيم الشاذة. النموذج هو عبارة عن مستوى فائق في فضاء الميزات، والذي يعمل كحد فاصل في حالة التصنيف، وكأفضل خط ملائم في حالة الانحدار. في SVM، يتم استخدام دالة Kernel لتحويل مجموعة البيانات إلى فضاء بأبعاد أعلى بحيث يمكن فصلها بسهولة. [اضغط هنا](https://en.wikipedia.org/wiki/Support-vector_machine) لمزيد من المعلومات عن SVM.
- **Support Vector Regressor (SVR):** نوع من SVM يُستخدم لإيجاد أفضل خط ملائم (والذي يكون في حالة SVM مستوى فائق) يحتوي على أكبر عدد من النقاط.
- **التراجع:** تقنية تعلم تحت إشراف تُستخدم للتنبؤ بالقيم المستمرة من مجموعة معينة من المدخلات. الفكرة هي ملاءمة منحنى (أو خط) في فضاء الميزات يحتوي على أكبر عدد ممكن من نقاط البيانات. [اضغط هنا](https://en.wikipedia.org/wiki/Regression_analysis) لمزيد من المعلومات.
- **آلة دعم المتجهات (SVM):** نوع من نماذج التعلم الآلي تحت إشراف يُستخدم للتصنيف، التراجع، واكتشاف القيم الشاذة. النموذج هو مستوى فائق في فضاء الميزات، والذي يعمل كحد في حالة التصنيف، وكأفضل خط ملاءمة في حالة التراجع. في SVM، يتم استخدام دالة Kernel عادةً لتحويل مجموعة البيانات إلى فضاء بأبعاد أعلى، بحيث يمكن فصلها بسهولة. [اضغط هنا](https://en.wikipedia.org/wiki/Support-vector_machine) لمزيد من المعلومات حول SVM.
- **دعم المتجهات للتراجع (SVR):** نوع من SVM، يُستخدم لإيجاد أفضل خط ملاءمة (والذي في حالة SVM هو مستوى فائق) يحتوي على أكبر عدد ممكن من نقاط البيانات.
### لماذا SVR؟ [^1]
في الدرس السابق، تعلمت عن ARIMA، وهو طريقة إحصائية خطية ناجحة جدًا لتوقع بيانات السلاسل الزمنية. ومع ذلك، في العديد من الحالات، تحتوي بيانات السلاسل الزمنية على *لاخطية*، والتي لا يمكن تمثيلها بواسطة النماذج الخطية. في مثل هذه الحالات، قدرة SVM على أخذ اللاخطية في البيانات بعين الاعتبار تجعل SVR ناجحًا في التنبؤ بالسلاسل الزمنية.
في الدرس السابق، تعلمت عن ARIMA، وهو طريقة إحصائية خطية ناجحة جدًا لتوقع بيانات السلاسل الزمنية. ومع ذلك، في العديد من الحالات، تحتوي بيانات السلاسل الزمنية على *لاخطية*، والتي لا يمكن نمذجتها بواسطة النماذج الخطية. في مثل هذه الحالات، قدرة SVM على أخذ اللاخطية في البيانات بعين الاعتبار في مهام التراجع تجعل SVR ناجحًا في التنبؤ بالسلاسل الزمنية.
## تمرين - بناء نموذج SVR
الخطوات الأولى لتحضير البيانات مشابهة لتلك التي تم تناولها في الدرس السابق عن [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA).
الخطوات الأولى لتحضير البيانات هي نفسها كما في الدرس السابق حول [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA).
افتح المجلد [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) في هذا الدرس وابحث عن الملف [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb). [^2]
1. قم بتشغيل الملف واستيراد المكتبات اللازمة: [^2]
1. قم بتشغيل الدفتر واستيراد المكتبات اللازمة: [^2]
```python
import sys
@ -56,7 +56,7 @@ CO_OP_TRANSLATOR_METADATA:
from common.utils import load_data, mape
```
2. قم بتحميل البيانات من ملف `/data/energy.csv` إلى إطار بيانات Pandas وألقِ نظرة عليها: [^2]
2. قم بتحميل البيانات من ملف `/data/energy.csv` إلى إطار بيانات Pandas وألقِ نظرة: [^2]
```python
energy = load_data('../../data')[['load']]
@ -71,15 +71,15 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![البيانات الكاملة](../../../../translated_images/full-data.a82ec9957e580e976f651a4fc38f280b9229c6efdbe3cfe7c60abaa9486d2cbe.ar.png)
![البيانات الكاملة](../../../../7-TimeSeries/3-SVR/images/full-data.png)
الآن، دعنا نبني نموذج SVR الخاص بنا.
### إنشاء مجموعات التدريب والاختبار
الآن بعد أن تم تحميل بياناتك، يمكنك تقسيمها إلى مجموعات تدريب واختبار. بعد ذلك، ستقوم بإعادة تشكيل البيانات لإنشاء مجموعة بيانات تعتمد على خطوات زمنية، وهو أمر ضروري لنموذج SVR. ستقوم بتدريب النموذج على مجموعة التدريب. بعد انتهاء التدريب، ستقوم بتقييم دقته على مجموعة التدريب، ومجموعة الاختبار، ثم مجموعة البيانات الكاملة لرؤية الأداء العام. يجب أن تتأكد من أن مجموعة الاختبار تغطي فترة زمنية لاحقة لمجموعة التدريب لضمان أن النموذج لا يحصل على معلومات من الفترات الزمنية المستقبلية [^2] (وهي حالة تُعرف باسم *الإفراط في التكيف*).
الآن تم تحميل بياناتك، لذا يمكنك فصلها إلى مجموعات تدريب واختبار. بعد ذلك ستقوم بإعادة تشكيل البيانات لإنشاء مجموعة بيانات تعتمد على خطوات زمنية، والتي ستكون ضرورية لـ SVR. ستقوم بتدريب النموذج على مجموعة التدريب. بعد انتهاء التدريب، ستقوم بتقييم دقته على مجموعة التدريب، مجموعة الاختبار، ثم مجموعة البيانات الكاملة لرؤية الأداء العام. يجب أن تتأكد من أن مجموعة الاختبار تغطي فترة لاحقة في الزمن مقارنة بمجموعة التدريب لضمان أن النموذج لا يحصل على معلومات من فترات زمنية مستقبلية [^2] (وهي حالة تُعرف باسم *الإفراط في التكيف*).
1. خصص فترة شهرين من 1 سبتمبر إلى 31 أكتوبر 2014 لمجموعة التدريب. ستشمل مجموعة الاختبار فترة الشهرين من 1 نوفمبر إلى 31 ديسمبر 2014: [^2]
1. خصص فترة شهرين من 1 سبتمبر إلى 31 أكتوبر 2014 لمجموعة التدريب. ستشمل مجموعة الاختبار فترة شهرين من 1 نوفمبر إلى 31 ديسمبر 2014: [^2]
```python
train_start_dt = '2014-11-01 00:00:00'
@ -97,13 +97,13 @@ CO_OP_TRANSLATOR_METADATA:
plt.show()
```
![بيانات التدريب والاختبار](../../../../translated_images/train-test.ead0cecbfc341921d4875eccf25fed5eefbb860cdbb69cabcc2276c49e4b33e5.ar.png)
![بيانات التدريب والاختبار](../../../../7-TimeSeries/3-SVR/images/train-test.png)
### تحضير البيانات للتدريب
الآن، تحتاج إلى تحضير البيانات للتدريب عن طريق تصفيتها وتوسيع نطاقها. قم بتصفية مجموعة البيانات لتشمل فقط الفترات الزمنية والأعمدة التي تحتاجها، وقم بتوسيع النطاق لضمان أن البيانات تقع في النطاق 0,1.
الآن، تحتاج إلى تحضير البيانات للتدريب عن طريق إجراء التصفية والتحجيم للبيانات. قم بتصفية مجموعة البيانات لتشمل فقط الفترات الزمنية والأعمدة التي تحتاجها، وقم بالتحجيم لضمان أن البيانات يتم عرضها في النطاق 0,1.
1. قم بتصفية مجموعة البيانات الأصلية لتشمل فقط الفترات الزمنية المذكورة لكل مجموعة، مع تضمين العمود المطلوب 'load' بالإضافة إلى التاريخ: [^2]
1. قم بتصفية مجموعة البيانات الأصلية لتشمل فقط الفترات الزمنية المذكورة لكل مجموعة، وتشمل فقط العمود المطلوب 'load' بالإضافة إلى التاريخ: [^2]
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
@ -118,14 +118,14 @@ CO_OP_TRANSLATOR_METADATA:
Test data shape: (48, 1)
```
2. قم بتوسيع نطاق بيانات التدريب لتكون في النطاق (0, 1): [^2]
2. قم بتحجيم بيانات التدريب لتكون في النطاق (0, 1): [^2]
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
```
4. الآن، قم بتوسيع نطاق بيانات الاختبار: [^2]
4. الآن، قم بتحجيم بيانات الاختبار: [^2]
```python
test['load'] = scaler.transform(test)
@ -133,7 +133,7 @@ CO_OP_TRANSLATOR_METADATA:
### إنشاء بيانات مع خطوات زمنية [^1]
بالنسبة لنموذج SVR، تحتاج إلى تحويل بيانات الإدخال لتكون بالشكل `[batch, timesteps]`. لذلك، ستقوم بإعادة تشكيل بيانات `train_data` و`test_data` الحالية بحيث يكون هناك بُعد جديد يشير إلى الخطوات الزمنية.
بالنسبة لـ SVR، تقوم بتحويل بيانات الإدخال لتكون بالشكل `[batch, timesteps]`. لذا، تقوم بإعادة تشكيل `train_data` و `test_data` الحالية بحيث يكون هناك بُعد جديد يشير إلى الخطوات الزمنية.
```python
# Converting to numpy arrays
@ -141,13 +141,13 @@ train_data = train.values
test_data = test.values
```
في هذا المثال، نأخذ `timesteps = 5`. وبالتالي، تكون المدخلات للنموذج هي البيانات لأول 4 خطوات زمنية، والمخرجات ستكون البيانات للخطوة الزمنية الخامسة.
في هذا المثال، نأخذ `timesteps = 5`. لذا، تكون المدخلات للنموذج هي البيانات لأول 4 خطوات زمنية، والمخرجات ستكون البيانات للخطوة الزمنية الخامسة.
```python
timesteps=5
```
تحويل بيانات التدريب إلى مصفوفة ثنائية الأبعاد باستخدام تعبيرات قائمة متداخلة:
تحويل بيانات التدريب إلى مصفوفة ثنائية الأبعاد باستخدام استيعاب القوائم المتداخلة:
```python
train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0]
@ -188,11 +188,11 @@ print(x_test.shape, y_test.shape)
الآن، حان الوقت لتنفيذ SVR. لقراءة المزيد عن هذا التنفيذ، يمكنك الرجوع إلى [هذا التوثيق](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). بالنسبة لتنفيذنا، نتبع هذه الخطوات:
1. تعريف النموذج عن طريق استدعاء `SVR()` وتمرير معلمات النموذج: kernel، gamma، c وepsilon.
2. تحضير النموذج لبيانات التدريب عن طريق استدعاء دالة `fit()`.
3. إجراء التنبؤات عن طريق استدعاء دالة `predict()`.
1. تعريف النموذج عن طريق استدعاء `SVR()` وتمرير معلمات النموذج: kernel، gamma، c و epsilon
2. تحضير النموذج لبيانات التدريب عن طريق استدعاء وظيفة `fit()`
3. إجراء التنبؤات عن طريق استدعاء وظيفة `predict()`
الآن نقوم بإنشاء نموذج SVR. هنا نستخدم [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel)، ونحدد معلمات gamma، C وepsilon كالتالي: 0.5، 10 و0.05 على التوالي.
الآن نقوم بإنشاء نموذج SVR. هنا نستخدم [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel)، ونحدد معلمات gamma، C و epsilon كـ 0.5، 10 و 0.05 على التوالي.
```python
model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05)
@ -224,11 +224,11 @@ print(y_train_pred.shape, y_test_pred.shape)
لقد قمت ببناء نموذج SVR الخاص بك! الآن نحتاج إلى تقييمه.
### تقييم النموذج [^1]
### تقييم النموذج الخاص بك [^1]
للتقييم، أولاً سنعيد توسيع نطاق البيانات إلى مداها الأصلي. بعد ذلك، للتحقق من الأداء، سنقوم برسم السلاسل الزمنية الأصلية والمتوقعة، وأيضًا طباعة نتيجة MAPE.
للتقييم، أولاً سنقوم بإعادة تحجيم البيانات إلى مقياسنا الأصلي. ثم، للتحقق من الأداء، سنقوم برسم مخطط السلاسل الزمنية الأصلية والمتوقعة، وأيضًا طباعة نتيجة MAPE.
إعادة توسيع نطاق المخرجات المتوقعة والأصلية:
إعادة تحجيم المخرجات المتوقعة والأصلية:
```python
# Scaling the predictions
@ -248,7 +248,7 @@ print(len(y_train), len(y_test))
#### التحقق من أداء النموذج على بيانات التدريب والاختبار [^1]
نستخرج الطوابع الزمنية من مجموعة البيانات لعرضها على المحور x في الرسم البياني. لاحظ أننا نستخدم أول ```timesteps-1``` قيمة كمدخل لأول مخرج، لذا ستبدأ الطوابع الزمنية للمخرجات بعد ذلك.
نستخرج الطوابع الزمنية من مجموعة البيانات لعرضها على محور x في المخطط. لاحظ أننا نستخدم أول ```timesteps-1``` قيمة كمدخل لأول مخرج، لذا ستبدأ الطوابع الزمنية للمخرجات بعد ذلك.
```python
train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:]
@ -273,9 +273,9 @@ plt.title("Training data prediction")
plt.show()
```
![تنبؤ بيانات التدريب](../../../../translated_images/train-data-predict.3c4ef4e78553104ffdd53d47a4c06414007947ea328e9261ddf48d3eafdefbbf.ar.png)
![تنبؤ بيانات التدريب](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png)
طباعة MAPE لبيانات التدريب:
طباعة MAPE لبيانات التدريب
```python
print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')
@ -285,7 +285,7 @@ print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')
MAPE for training data: 1.7195710200875551 %
```
رسم التنبؤات لبيانات الاختبار:
رسم التنبؤات لبيانات الاختبار
```python
plt.figure(figsize=(10,3))
@ -296,9 +296,9 @@ plt.xlabel('Timestamp')
plt.show()
```
![تنبؤ بيانات الاختبار](../../../../translated_images/test-data-predict.8afc47ee7e52874f514ebdda4a798647e9ecf44a97cc927c535246fcf7a28aa9.ar.png)
![تنبؤ بيانات الاختبار](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png)
طباعة MAPE لبيانات الاختبار:
طباعة MAPE لبيانات الاختبار
```python
print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')
@ -308,7 +308,7 @@ print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')
MAPE for testing data: 1.2623790187854018 %
```
🏆 لقد حصلت على نتيجة جيدة جدًا على مجموعة بيانات الاختبار!
🏆 لديك نتيجة جيدة جدًا على مجموعة بيانات الاختبار!
### التحقق من أداء النموذج على مجموعة البيانات الكاملة [^1]
@ -352,7 +352,7 @@ plt.xlabel('Timestamp')
plt.show()
```
![تنبؤ البيانات الكاملة](../../../../translated_images/full-data-predict.4f0fed16a131c8f3bcc57a3060039dc7f2f714a05b07b68c513e0fe7fb3d8964.ar.png)
![تنبؤ البيانات الكاملة](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png)
```python
print('MAPE: ', mape(Y_pred, Y)*100, '%')
@ -362,21 +362,21 @@ print('MAPE: ', mape(Y_pred, Y)*100, '%')
MAPE: 2.0572089029888656 %
```
🏆 رسومات رائعة جدًا، تُظهر نموذجًا بدقة جيدة. عمل رائع!
🏆 مخططات رائعة جدًا، تُظهر نموذجًا بدقة جيدة. عمل رائع!
---
## 🚀تحدي
- حاول تعديل معلمات النموذج (gamma، C، epsilon) أثناء إنشائه وقم بتقييم النتائج على البيانات لمعرفة أي مجموعة من المعلمات تعطي أفضل النتائج على بيانات الاختبار. لمعرفة المزيد عن هذه المعلمات، يمكنك الرجوع إلى [التوثيق هنا](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel).
- حاول استخدام دوال kernel مختلفة للنموذج وقم بتحليل أدائها على مجموعة البيانات. يمكنك العثور على وثيقة مفيدة [هنا](https://scikit-learn.org/stable/modules/svm.html#kernel-functions).
- حاول استخدام قيم مختلفة لـ `timesteps` للنموذج للنظر إلى الوراء لإجراء التنبؤ.
- حاول تعديل معلمات النموذج (gamma، C، epsilon) أثناء إنشاء النموذج وقم بتقييم البيانات لمعرفة أي مجموعة من المعلمات تعطي أفضل النتائج على بيانات الاختبار. لمعرفة المزيد عن هذه المعلمات، يمكنك الرجوع إلى الوثيقة [هنا](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel).
- حاول استخدام وظائف kernel مختلفة للنموذج وتحليل أدائها على مجموعة البيانات. يمكن العثور على وثيقة مفيدة [هنا](https://scikit-learn.org/stable/modules/svm.html#kernel-functions).
- حاول استخدام قيم مختلفة لـ `timesteps` للنموذج للنظر إلى الخلف لإجراء التنبؤ.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/52/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
كان هذا الدرس مقدمة لتطبيق SVR في التنبؤ بالسلاسل الزمنية. لقراءة المزيد عن SVR، يمكنك الرجوع إلى [هذه المدونة](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). يوفر [هذا التوثيق على scikit-learn](https://scikit-learn.org/stable/modules/svm.html) شرحًا أكثر شمولاً حول SVM بشكل عام، [SVRs](https://scikit-learn.org/stable/modules/svm.html#regression) وتفاصيل التنفيذ الأخرى مثل [دوال kernel المختلفة](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) التي يمكن استخدامها ومعلماتها.
كان هذا الدرس لتقديم تطبيق SVR لتوقع السلاسل الزمنية. لقراءة المزيد عن SVR، يمكنك الرجوع إلى [هذه المدونة](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). يوفر [هذا التوثيق على scikit-learn](https://scikit-learn.org/stable/modules/svm.html) شرحًا أكثر شمولاً حول SVMs بشكل عام، [SVRs](https://scikit-learn.org/stable/modules/svm.html#regression) وأيضًا تفاصيل تنفيذ أخرى مثل وظائف [kernel](https://scikit-learn.org/stable/modules/svm.html#kernel-functions) المختلفة التي يمكن استخدامها، ومعلماتها.
## الواجب
@ -384,8 +384,8 @@ MAPE: 2.0572089029888656 %
## الشكر
[^1]: النص، الكود والمخرجات في هذا القسم تم تقديمها من قبل [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD)
[^2]: النص، الكود والمخرجات في هذا القسم مأخوذة من [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA)
[^1]: النص، الكود والمخرجات في هذا القسم تم تقديمها بواسطة [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD)
[^2]: النص، الكود والمخرجات في هذا القسم تم أخذها من [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA)
---

@ -1,46 +1,46 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "0ffe994d1cc881bdeb49226a064116e5",
"translation_date": "2025-08-29T14:09:13+00:00",
"original_hash": "911efd5e595089000cb3c16fce1beab8",
"translation_date": "2025-09-04T20:51:29+00:00",
"source_file": "8-Reinforcement/1-QLearning/README.md",
"language_code": "ar"
}
-->
# مقدمة إلى التعلم التعزيزي وخوارزمية Q-Learning
![ملخص التعلم التعزيزي في التعلم الآلي في رسم توضيحي](../../../../translated_images/ml-reinforcement.94024374d63348dbb3571c343ca7ddabef72adac0b8086d47164b769ba3a8a1d.ar.png)
![ملخص التعلم التعزيزي في التعلم الآلي في رسم توضيحي](../../../../sketchnotes/ml-reinforcement.png)
> رسم توضيحي بواسطة [Tomomi Imura](https://www.twitter.com/girlie_mac)
يتضمن التعلم التعزيزي ثلاثة مفاهيم مهمة: الوكيل، بعض الحالات، ومجموعة من الإجراءات لكل حالة. من خلال تنفيذ إجراء في حالة معينة، يحصل الوكيل على مكافأة. تخيل مرة أخرى لعبة الكمبيوتر "سوبر ماريو". أنت ماريو، وأنت في مستوى من اللعبة، تقف بجانب حافة منحدر. فوقك توجد عملة. كونك ماريو، في مستوى اللعبة، في موقع معين ... هذه هي حالتك. التحرك خطوة واحدة إلى اليمين (إجراء) سيجعلك تسقط من الحافة، وهذا سيمنحك درجة رقمية منخفضة. ومع ذلك، فإن الضغط على زر القفز سيجعلك تحصل على نقطة وستبقى على قيد الحياة. هذا نتيجة إيجابية ويجب أن تمنحك درجة رقمية إيجابية.
يتضمن التعلم التعزيزي ثلاثة مفاهيم مهمة: الوكيل، بعض الحالات، ومجموعة من الإجراءات لكل حالة. من خلال تنفيذ إجراء في حالة معينة، يحصل الوكيل على مكافأة. تخيل مرة أخرى لعبة الكمبيوتر "سوبر ماريو". أنت ماريو، وأنت في مستوى من اللعبة، تقف بجانب حافة منحدر. فوقك توجد عملة معدنية. كونك ماريو، في مستوى معين من اللعبة، في موقع معين... هذه هي حالتك. التحرك خطوة إلى اليمين (إجراء) سيجعلك تسقط من الحافة، وهذا سيمنحك درجة رقمية منخفضة. ومع ذلك، فإن الضغط على زر القفز سيجعلك تحصل على نقطة وستبقى على قيد الحياة. هذا نتيجة إيجابية ويجب أن تمنحك درجة رقمية إيجابية.
باستخدام التعلم التعزيزي والمحاكي (اللعبة)، يمكنك تعلم كيفية لعب اللعبة لزيادة المكافأة إلى أقصى حد، وهي البقاء على قيد الحياة وتسجيل أكبر عدد ممكن من النقاط.
باستخدام التعلم التعزيزي والمحاكاة (اللعبة)، يمكنك تعلم كيفية لعب اللعبة لتحقيق أقصى قدر من المكافآت، وهي البقاء على قيد الحياة وتسجيل أكبر عدد ممكن من النقاط.
[![مقدمة إلى التعلم التعزيزي](https://img.youtube.com/vi/lDq_en8RNOo/0.jpg)](https://www.youtube.com/watch?v=lDq_en8RNOo)
> 🎥 انقر على الصورة أعلاه للاستماع إلى ديمتري وهو يناقش التعلم التعزيزي
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/45/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المتطلبات والإعداد
في هذا الدرس، سنجرب بعض الأكواد بلغة Python. يجب أن تكون قادرًا على تشغيل كود Jupyter Notebook من هذا الدرس، سواء على جهاز الكمبيوتر الخاص بك أو في السحابة.
يمكنك فتح [دفتر الدرس](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) هو تقنية تعلم تتيح لنا تعلم السلوك الأمثل لوكيل **agent** في بيئة **environment** معينة من خلال إجراء العديد من التجارب. يجب أن يكون للوكيل في هذه البيئة هدف **goal**، يتم تعريفه بواسطة دالة مكافأة **reward function**.
**التعلم التعزيزي** (RL) هو تقنية تعلم تتيح لنا تعلم السلوك الأمثل لوكيل **agent** في بيئة **environment** معينة من خلال إجراء العديد من التجارب. يجب أن يكون للوكيل في هذه البيئة هدف **goal** محدد بواسطة دالة مكافأة **reward function**.
## البيئة
للتبسيط، دعونا نعتبر عالم بيتر عبارة عن لوحة مربعة بحجم `width` x `height`، مثل هذه:
للتبسيط، دعونا نعتبر أن عالم بيتر هو لوحة مربعة بحجم `width` x `height`، مثل هذه:
![بيئة بيتر](../../../../translated_images/environment.40ba3cb66256c93fa7e92f6f7214e1d1f588aafa97d266c11d108c5c5d101b6c.ar.png)
![بيئة بيتر](../../../../8-Reinforcement/1-QLearning/images/environment.png)
كل خلية في هذه اللوحة يمكن أن تكون:
@ -67,9 +67,9 @@ m.plot()
في مثالنا، سيكون هدف بيتر هو العثور على تفاحة، مع تجنب الذئب والعوائق الأخرى. للقيام بذلك، يمكنه ببساطة التجول حتى يجد تفاحة.
لذلك، في أي موقع، يمكنه الاختيار بين أحد الإجراءات التالية: أعلى، أسفل، يسار، ويمين.
لذلك، في أي موضع، يمكنه الاختيار بين أحد الإجراءات التالية: أعلى، أسفل، يسار، ويمين.
سنعرّف هذه الإجراءات كقاموس، ونربطها بأزواج من التغييرات المنسقة المقابلة. على سبيل المثال، التحرك إلى اليمين (`R`) سيقابل الزوج `(1,0)`. (كتلة الكود 2):
سنعرّف هذه الإجراءات كقاموس، ونربطها بأزواج من التغيرات المنسقة المقابلة. على سبيل المثال، التحرك إلى اليمين (`R`) سيقابل الزوج `(1,0)`. (كتلة الكود 2):
```python
actions = { "U" : (0,-1), "D" : (0,1), "L" : (-1,0), "R" : (1,0) }
@ -78,9 +78,9 @@ action_idx = { a : i for i,a in enumerate(actions.keys()) }
لتلخيص، الاستراتيجية والهدف في هذا السيناريو هما كما يلي:
- **الاستراتيجية**، الخاصة بوكيلنا (بيتر) يتم تعريفها بواسطة ما يسمى **السياسة**. السياسة هي دالة تعيد الإجراء في أي حالة معينة. في حالتنا، يتم تمثيل حالة المشكلة بواسطة اللوحة، بما في ذلك الموقع الحالي للاعب.
- **الاستراتيجية**، الخاصة بوكيلنا (بيتر) تُعرف بما يسمى **السياسة**. السياسة هي دالة تُرجع الإجراء في أي حالة معينة. في حالتنا، تمثل حالة المشكلة اللوحة، بما في ذلك الموضع الحالي للاعب.
- **الهدف**، من التعلم التعزيزي هو في النهاية تعلم سياسة جيدة تسمح لنا بحل المشكلة بكفاءة. ومع ذلك، كخط أساس، دعونا نعتبر السياسة الأبسط المسماة **المشي العشوائي**.
- **الهدف**، من التعلم التعزيزي هو في النهاية تعلم سياسة جيدة تتيح لنا حل المشكلة بكفاءة. ومع ذلك، كخط أساس، دعونا نعتبر السياسة الأبسط المسماة **المشي العشوائي**.
## المشي العشوائي
@ -115,7 +115,7 @@ action_idx = { a : i for i,a in enumerate(actions.keys()) }
walk(m,random_policy)
```
يجب أن تعيد استدعاء `walk` طول المسار المقابل، والذي يمكن أن يختلف من تشغيل إلى آخر.
يجب أن تُرجع استدعاء `walk` طول المسار المقابل، والذي يمكن أن يختلف من تشغيل إلى آخر.
1. قم بتشغيل تجربة المشي عدة مرات (على سبيل المثال، 100 مرة)، واطبع الإحصائيات الناتجة (كتلة الكود 4):
@ -144,7 +144,7 @@ action_idx = { a : i for i,a in enumerate(actions.keys()) }
لجعل سياستنا أكثر ذكاءً، نحتاج إلى فهم أي الحركات "أفضل" من غيرها. للقيام بذلك، نحتاج إلى تعريف هدفنا.
يمكن تعريف الهدف من حيث **دالة المكافأة**، التي ستعيد قيمة درجة لكل حالة. كلما زاد الرقم، كانت دالة المكافأة أفضل. (كتلة الكود 5)
يمكن تعريف الهدف من خلال **دالة المكافأة**، التي ستُرجع قيمة درجة لكل حالة. كلما زاد الرقم، كانت دالة المكافأة أفضل. (كتلة الكود 5)
```python
move_reward = -0.1
@ -163,21 +163,21 @@ def reward(m,pos=None):
return move_reward
```
الشيء المثير للاهتمام بشأن دوال المكافأة هو أنه في معظم الحالات، *نحصل فقط على مكافأة كبيرة في نهاية اللعبة*. وهذا يعني أن الخوارزمية الخاصة بنا يجب أن تتذكر بطريقة ما الخطوات "الجيدة" التي تؤدي إلى مكافأة إيجابية في النهاية، وتزيد من أهميتها. وبالمثل، يجب تثبيط جميع الحركات التي تؤدي إلى نتائج سيئة.
الشيء المثير للاهتمام حول دوال المكافأة هو أنه في معظم الحالات، *نحصل فقط على مكافأة كبيرة في نهاية اللعبة*. هذا يعني أن خوارزميةنا يجب أن تتذكر بطريقة ما الخطوات "الجيدة" التي تؤدي إلى مكافأة إيجابية في النهاية، وتزيد من أهميتها. وبالمثل، يجب تثبيط جميع الحركات التي تؤدي إلى نتائج سيئة.
## خوارزمية Q-Learning
الخوارزمية التي سنناقشها هنا تسمى **Q-Learning**. في هذه الخوارزمية، يتم تعريف السياسة بواسطة دالة (أو بنية بيانات) تسمى **جدول 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)`.
![بيئة بيتر](../../../../translated_images/env_init.04e8f26d2d60089e128f21d22e5fef57d580e559f0d5937b06c689e5e7cdd438.ar.png)
![بيئة بيتر](../../../../8-Reinforcement/1-QLearning/images/env_init.png)
في مركز كل خلية يوجد "سهم" يشير إلى الاتجاه المفضل للحركة. نظرًا لأن جميع الاتجاهات متساوية، يتم عرض نقطة.
@ -185,13 +185,13 @@ Q = np.ones((width,height,len(actions)),dtype=np.float)*1.0/len(actions)
## جوهر Q-Learning: معادلة بيلمان
بمجرد أن نبدأ في التحرك، سيكون لكل إجراء مكافأة مقابلة، أي يمكننا نظريًا اختيار الإجراء التالي بناءً على أعلى مكافأة فورية. ومع ذلك، في معظم الحالات، لن تحقق الحركة هدفنا المتمثل في الوصول إلى التفاحة، وبالتالي لا يمكننا اتخاذ قرار فوري بشأن الاتجاه الأفضل.
بمجرد أن نبدأ في التحرك، سيكون لكل إجراء مكافأة مقابلة، أي يمكننا نظريًا اختيار الإجراء التالي بناءً على أعلى مكافأة فورية. ومع ذلك، في معظم الحالات، لن تحقق الحركة هدفنا المتمثل في الوصول إلى التفاحة، وبالتالي لا يمكننا أن نقرر فورًا أي اتجاه هو الأفضل.
> تذكر أن النتيجة الفورية ليست هي المهمة، بل النتيجة النهائية، التي سنحصل عليها في نهاية المحاكاة.
لأخذ هذه المكافأة المؤجلة في الاعتبار، نحتاج إلى استخدام مبادئ **[البرمجة الديناميكية](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`
## التحقق من السياسة
@ -207,7 +207,7 @@ def qpolicy_strict(m):
walk(m,qpolicy_strict)
```
> إذا جربت الكود أعلاه عدة مرات، قد تلاحظ أنه أحيانًا "يتوقف"، وتحتاج إلى الضغط على زر الإيقاف في الدفتر لمقاطعته. يحدث هذا لأن هناك حالات قد تشير فيها حالتان إلى بعضهما البعض من حيث قيمة Q المثلى، وفي هذه الحالة ينتهي الأمر بالوكيل بالتحرك بين تلك الحالات إلى ما لا نهاية.
> إذا جربت الكود أعلاه عدة مرات، قد تلاحظ أنه أحيانًا "يتوقف"، وتحتاج إلى الضغط على زر الإيقاف في الدفتر لمقاطعته. يحدث هذا لأن هناك حالات قد تشير فيها حالتان إلى بعضهما البعض من حيث قيمة Q المثلى، وفي هذه الحالة ينتهي الأمر بالوكيل بالتنقل بين تلك الحالات إلى ما لا نهاية.
## 🚀التحدي
@ -217,7 +217,7 @@ walk(m,qpolicy_strict)
## التنقل
سياسة التنقل الأفضل هي تلك التي استخدمناها أثناء التدريب، والتي تجمع بين الاستغلال والاستكشاف. في هذه السياسة، سنختار كل إجراء باحتمالية معينة، تتناسب مع القيم في جدول Q. قد تؤدي هذه الاستراتيجية إلى عودة الوكيل إلى موقع سبق أن استكشفه، ولكن، كما يمكنك أن ترى من الكود أدناه، فإنها تؤدي إلى مسار متوسط قصير جدًا إلى الموقع المطلوب (تذكر أن `print_statistics` يشغل المحاكاة 100 مرة): (كتلة الكود 10)
سياسة التنقل الأفضل هي تلك التي استخدمناها أثناء التدريب، والتي تجمع بين الاستغلال والاستكشاف. في هذه السياسة، سنختار كل إجراء باحتمالية معينة، تتناسب مع القيم في جدول Q. قد تؤدي هذه الاستراتيجية إلى عودة الوكيل إلى موقع سبق أن استكشفه، ولكن كما ترى من الكود أدناه، فإنها تؤدي إلى مسار متوسط قصير جدًا إلى الموقع المطلوب (تذكر أن `print_statistics` يشغل المحاكاة 100 مرة): (كتلة الكود 10)
```python
def qpolicy(m):
@ -235,17 +235,17 @@ print_statistics(qpolicy)
كما ذكرنا، عملية التعلم هي توازن بين الاستكشاف واستغلال المعرفة المكتسبة حول هيكل مساحة المشكلة. لقد رأينا أن نتائج التعلم (القدرة على مساعدة الوكيل في العثور على مسار قصير إلى الهدف) قد تحسنت، ولكن من المثير أيضًا ملاحظة كيف يتصرف متوسط طول المسار أثناء عملية التعلم:
## يمكن تلخيص التعلم كما يلي:
### يمكن تلخيص التعلم كما يلي:
- **زيادة متوسط طول المسار**. ما نراه هنا هو أنه في البداية، يزيد متوسط طول المسار. ربما يرجع ذلك إلى حقيقة أنه عندما لا نعرف شيئًا عن البيئة، فمن المحتمل أن نقع في حالات سيئة، مثل الماء أو الذئب. ومع تعلمنا المزيد واستخدام هذه المعرفة، يمكننا استكشاف البيئة لفترة أطول، ولكننا لا نزال لا نعرف مكان التفاح جيدًا.
- **زيادة متوسط طول المسار**. ما نراه هنا هو أنه في البداية، يزيد متوسط طول المسار. ربما يرجع ذلك إلى أنه عندما لا نعرف شيئًا عن البيئة، فمن المحتمل أن نقع في حالات سيئة، مثل الماء أو الذئب. ومع تعلمنا المزيد واستخدام هذه المعرفة، يمكننا استكشاف البيئة لفترة أطول، ولكننا لا نزال لا نعرف جيدًا مكان التفاح.
- **انخفاض طول المسار مع زيادة التعلم**. بمجرد أن نتعلم بما يكفي، يصبح من الأسهل للوكيل تحقيق الهدف، ويبدأ طول المسار في الانخفاض. ومع ذلك، لا نزال منفتحين على الاستكشاف، لذا غالبًا ما ننحرف بعيدًا عن المسار الأفضل، ونستكشف خيارات جديدة، مما يجعل المسار أطول من المثالي.
- **زيادة الطول بشكل مفاجئ**. ما نلاحظه أيضًا في هذا الرسم البياني هو أنه في مرحلة ما، زاد الطول بشكل مفاجئ. يشير هذا إلى الطبيعة العشوائية للعملية، وأنه يمكننا في مرحلة ما "إفساد" معاملات جدول Q عن طريق استبدالها بقيم جديدة. يجب تقليل هذا بشكل مثالي عن طريق تقليل معدل التعلم (على سبيل المثال، نحو نهاية التدريب، نقوم فقط بتعديل قيم جدول Q بقيمة صغيرة).
- **زيادة الطول بشكل مفاجئ**. ما نلاحظه أيضًا في هذا الرسم البياني هو أنه في مرحلة ما، زاد الطول بشكل مفاجئ. يشير هذا إلى الطبيعة العشوائية للعملية، وأنه يمكننا في مرحلة ما "إفساد" معاملات جدول Q عن طريق الكتابة فوقها بقيم جديدة. يجب تقليل هذا بشكل مثالي عن طريق تقليل معدل التعلم (على سبيل المثال، في نهاية التدريب، نقوم فقط بتعديل قيم جدول Q بقيمة صغيرة).
بشكل عام، من المهم أن نتذكر أن نجاح وجودة عملية التعلم تعتمد بشكل كبير على المعلمات، مثل معدل التعلم، انخفاض معدل التعلم، وعامل الخصم. غالبًا ما يُطلق على هذه المعلمات اسم **المعلمات الفائقة**، لتمييزها عن **المعلمات**، التي نقوم بتحسينها أثناء التدريب (على سبيل المثال، معاملات جدول Q). عملية العثور على أفضل قيم للمعلمات الفائقة تُسمى **تحسين المعلمات الفائقة**، وهي تستحق موضوعًا منفصلًا.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/46/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## الواجب
[عالم أكثر واقعية](assignment.md)
@ -253,4 +253,4 @@ print_statistics(qpolicy)
---
**إخلاء المسؤولية**:
تمت ترجمة هذه الوثيقة باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). على الرغم من أننا نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار الوثيقة الأصلية بلغتها الأصلية المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.

@ -1,23 +1,41 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9660fbd80845c59c15715cb418cd6e23",
"translation_date": "2025-08-29T14:15:19+00:00",
"original_hash": "107d5bb29da8a562e7ae72262d251a75",
"translation_date": "2025-09-04T20:52:36+00:00",
"source_file": "8-Reinforcement/2-Gym/README.md",
"language_code": "ar"
}
-->
## متطلبات مسبقة
# التزلج على CartPole
في هذا الدرس، سنستخدم مكتبة **OpenAI Gym** لمحاكاة بيئات مختلفة. يمكنك تشغيل كود هذا الدرس محليًا (على سبيل المثال، من خلال Visual Studio Code)، وفي هذه الحالة ستفتح المحاكاة في نافذة جديدة. عند تشغيل الكود عبر الإنترنت، قد تحتاج إلى إجراء بعض التعديلات على الكود، كما هو موضح [هنا](https://towardsdatascience.com/rendering-openai-gym-envs-on-binder-and-google-colab-536f99391cc7).
المشكلة التي قمنا بحلها في الدرس السابق قد تبدو وكأنها مشكلة بسيطة وغير قابلة للتطبيق في سيناريوهات الحياة الواقعية. لكن هذا ليس صحيحًا، لأن العديد من مشاكل العالم الحقيقي تشترك في هذا السيناريو - بما في ذلك لعب الشطرنج أو لعبة Go. فهي مشابهة لأن لدينا أيضًا لوحة بقواعد محددة وحالة **منفصلة**.
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المقدمة
في هذا الدرس، سنطبق نفس مبادئ التعلم باستخدام Q-Learning على مشكلة ذات حالة **مستمرة**، أي حالة يتم تحديدها بواسطة رقم حقيقي أو أكثر. سنتعامل مع المشكلة التالية:
> **المشكلة**: إذا أراد بيتر الهروب من الذئب، يجب أن يكون قادرًا على التحرك بسرعة أكبر. سنرى كيف يمكن لبيتر تعلم التزلج، وبالتحديد الحفاظ على التوازن، باستخدام Q-Learning.
![الهروب الكبير!](../../../../8-Reinforcement/2-Gym/images/escape.png)
> بيتر وأصدقاؤه يبدعون للهروب من الذئب! الصورة بواسطة [Jen Looper](https://twitter.com/jenlooper)
سنستخدم نسخة مبسطة من التوازن تُعرف بمشكلة **CartPole**. في عالم CartPole، لدينا شريط أفقي يمكنه التحرك إلى اليسار أو اليمين، والهدف هو الحفاظ على توازن عمود رأسي فوق الشريط.
## المتطلبات الأساسية
في هذا الدرس، سنستخدم مكتبة تُسمى **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/). باستخدام هذه البيئة، يمكننا إنشاء بيئات مختلفة، بدءًا من محاكاة CartPole إلى ألعاب Atari.
في الدرس السابق، كانت قواعد اللعبة والحالة تُحدد بواسطة الفئة `Board` التي قمنا بتعريفها بأنفسنا. هنا سنستخدم بيئة **محاكاة خاصة**، والتي ستقوم بمحاكاة الفيزياء وراء العمود المتوازن. واحدة من أشهر بيئات المحاكاة لتدريب خوارزميات التعلم المعزز تُسمى [Gym](https://gym.openai.com/)، والتي يتم صيانتها بواسطة [OpenAI](https://openai.com/). باستخدام هذه البيئة يمكننا إنشاء بيئات مختلفة من محاكاة CartPole إلى ألعاب Atari.
> **ملاحظة**: يمكنك الاطلاع على بيئات أخرى متاحة من 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
@ -31,11 +49,11 @@ import random
## تمرين - تهيئة بيئة CartPole
للتعامل مع مشكلة توازن العصا، نحتاج إلى تهيئة البيئة المناسبة. كل بيئة مرتبطة بـ:
للعمل مع مشكلة توازن CartPole، نحتاج إلى تهيئة البيئة المناسبة. كل بيئة مرتبطة بـ:
- **مساحة الملاحظة** التي تحدد بنية المعلومات التي نتلقاها من البيئة. بالنسبة لمشكلة CartPole، نتلقى موقع العصا، السرعة، وبعض القيم الأخرى.
- **مساحة الملاحظة** التي تُحدد هيكل المعلومات التي نتلقاها من البيئة. بالنسبة لمشكلة CartPole، نتلقى موقع العمود، السرعة وبعض القيم الأخرى.
- **مساحة الحركة** التي تحدد الإجراءات الممكنة. في حالتنا، مساحة الحركة متقطعة، وتتكون من إجراءين - **يسار** و **يمين**. (كتلة الكود 2)
- **مساحة الحركة** التي تُحدد الإجراءات الممكنة. في حالتنا، مساحة الحركة منفصلة، وتتكون من إجراءين - **يسار** و **يمين**. (كتلة الكود 2)
1. للتهيئة، اكتب الكود التالي:
@ -46,9 +64,9 @@ import random
print(env.action_space.sample())
```
لمعرفة كيفية عمل البيئة، دعنا نقوم بتشغيل محاكاة قصيرة لمدة 100 خطوة. في كل خطوة، نقدم أحد الإجراءات التي يجب اتخاذها - في هذه المحاكاة، نختار إجراءً عشوائيًا من `action_space`.
لرؤية كيفية عمل البيئة، دعنا نقوم بتشغيل محاكاة قصيرة لمدة 100 خطوة. في كل خطوة، نقدم أحد الإجراءات التي يجب اتخاذها - في هذه المحاكاة نختار إجراءً عشوائيًا من `action_space`.
1. قم بتشغيل الكود أدناه وشاهد النتيجة.
1. قم بتشغيل الكود أدناه وشاهد النتائج.
✅ تذكر أنه يُفضل تشغيل هذا الكود على تثبيت Python محلي! (كتلة الكود 3)
@ -63,9 +81,9 @@ import random
يجب أن ترى شيئًا مشابهًا لهذه الصورة:
![عصا غير متوازنة](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif)
![CartPole غير متوازن](../../../../8-Reinforcement/2-Gym/images/cartpole-nobalance.gif)
1. أثناء المحاكاة، نحتاج إلى الحصول على الملاحظات لتحديد كيفية التصرف. في الواقع، تُرجع دالة الخطوة الملاحظات الحالية، ودالة المكافأة، وعلامة الانتهاء التي تشير إلى ما إذا كان من المنطقي متابعة المحاكاة أم لا: (كتلة الكود 4)
1. أثناء المحاكاة، نحتاج إلى الحصول على الملاحظات لتحديد كيفية التصرف. في الواقع، تُرجع وظيفة الخطوة الملاحظات الحالية، دالة المكافأة، وعلامة الانتهاء التي تشير إلى ما إذا كان من المنطقي متابعة المحاكاة أم لا: (كتلة الكود 4)
```python
env.reset()
@ -78,7 +96,7 @@ import random
env.close()
```
ستنتهي برؤية شيء مثل هذا في مخرجات الدفتر:
ستنتهي برؤية شيء مثل هذا في إخراج الدفتر:
```text
[ 0.03403272 -0.24301182 0.02669811 0.2895829 ] -> 1.0
@ -94,40 +112,40 @@ import random
يحتوي متجه الملاحظة الذي يتم إرجاعه في كل خطوة من خطوات المحاكاة على القيم التالية:
- موقع العربة
- سرعة العربة
- زاوية العصا
- معدل دوران العصا
- زاوية العمود
- معدل دوران العمود
1. احصل على الحد الأدنى والحد الأقصى لتلك القيم: (كتلة الكود 5)
1. احصل على الحد الأدنى والحد الأقصى لتلك الأرقام: (كتلة الكود 5)
```python
print(env.observation_space.low)
print(env.observation_space.high)
```
قد تلاحظ أيضًا أن قيمة المكافأة في كل خطوة من خطوات المحاكاة دائمًا ما تكون 1. هذا لأن هدفنا هو البقاء لأطول فترة ممكنة، أي الحفاظ على العصا في وضع رأسي معقول لأطول فترة زمنية.
قد تلاحظ أيضًا أن قيمة المكافأة في كل خطوة من خطوات المحاكاة دائمًا 1. هذا لأن هدفنا هو البقاء لأطول فترة ممكنة، أي الحفاظ على العمود في وضع عمودي بشكل معقول لأطول فترة ممكنة.
✅ في الواقع، تُعتبر محاكاة CartPole محلولة إذا تمكنا من تحقيق متوسط مكافأة قدره 195 على مدى 100 تجربة متتالية.
✅ في الواقع، تُعتبر محاكاة CartPole محلولة إذا تمكنا من الحصول على متوسط مكافأة قدره 195 على مدى 100 تجربة متتالية.
## تقطيع الحالة إلى قيم متقطعة
## تقسيم الحالة إلى قيم منفصلة
في التعلم باستخدام Q-Learning، نحتاج إلى بناء جدول Q-Table يحدد ما يجب فعله في كل حالة. للقيام بذلك، يجب أن تكون الحالة **متقطعة**، وبشكل أكثر دقة، يجب أن تحتوي على عدد محدود من القيم المتقطعة. وبالتالي، نحتاج بطريقة ما إلى **تقطيع** الملاحظات، وتحويلها إلى مجموعة محدودة من الحالات.
في Q-Learning، نحتاج إلى بناء جدول Q الذي يُحدد ما يجب فعله في كل حالة. لكي نتمكن من القيام بذلك، يجب أن تكون الحالة **منفصلة**، وبشكل أكثر دقة، يجب أن تحتوي على عدد محدود من القيم المنفصلة. لذلك، نحتاج بطريقة ما إلى **تقسيم** ملاحظاتنا، وربطها بمجموعة محدودة من الحالات.
هناك عدة طرق يمكننا القيام بذلك:
- **التقسيم إلى فئات**. إذا كنا نعرف النطاق لقيمة معينة، يمكننا تقسيم هذا النطاق إلى عدد من **الفئات**، ثم استبدال القيمة برقم الفئة التي تنتمي إليها. يمكن القيام بذلك باستخدام طريقة [`digitize`](https://numpy.org/doc/stable/reference/generated/numpy.digitize.html) من مكتبة numpy. في هذه الحالة، سنعرف بدقة حجم الحالة، لأنه سيعتمد على عدد الفئات التي نختارها للتقطيع.
- **التقسيم إلى مجموعات**. إذا كنا نعرف نطاق قيمة معينة، يمكننا تقسيم هذا النطاق إلى عدد من **المجموعات**، ثم استبدال القيمة برقم المجموعة التي تنتمي إليها. يمكن القيام بذلك باستخدام طريقة [`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):
@ -143,9 +161,9 @@ import random
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()
@ -159,133 +177,16 @@ import random
env.close()
```
✅ قم بإلغاء تعليق السطر الذي يبدأ بـ `env.render` إذا كنت تريد رؤية كيفية تنفيذ البيئة. وإلا يمكنك تنفيذها في الخلفية، وهو أسرع. سنستخدم هذا التنفيذ "غير المرئي" أثناء عملية Q-Learning.
## بنية جدول Q-Table
في درسنا السابق، كانت الحالة عبارة عن زوج بسيط من الأرقام من 0 إلى 8، وبالتالي كان من الملائم تمثيل جدول Q-Table باستخدام مصفوفة numpy ذات شكل 8x8x2. إذا استخدمنا تقطيع الفئات، فإن حجم متجه الحالة معروف أيضًا، لذا يمكننا استخدام نفس النهج وتمثيل الحالة بمصفوفة ذات شكل 20x20x10x10x2 (حيث أن 2 هو بُعد مساحة الحركة، والأبعاد الأولى تتوافق مع عدد الفئات التي اخترنا استخدامها لكل من المعلمات في مساحة الملاحظة).
ومع ذلك، في بعض الأحيان لا تكون أبعاد مساحة الملاحظة معروفة بدقة. في حالة دالة `discretize`، قد لا نكون متأكدين أبدًا من أن حالتنا تبقى ضمن حدود معينة، لأن بعض القيم الأصلية ليست محددة. وبالتالي، سنستخدم نهجًا مختلفًا قليلاً ونمثل جدول Q-Table باستخدام قاموس.
1. استخدم الزوج *(state, action)* كمفتاح للقاموس، وستكون القيمة هي القيمة المقابلة في جدول Q-Table. (كتلة الكود 9)
```python
Q = {}
actions = (0,1)
def qvalues(state):
return [Q.get((state,a),0) for a in actions]
```
هنا نحدد أيضًا دالة `qvalues()`، التي تُرجع قائمة بقيم جدول Q-Table لحالة معينة تتوافق مع جميع الحركات الممكنة. إذا لم تكن الإدخالات موجودة في جدول Q-Table، سنُرجع القيمة الافتراضية 0.
## لنبدأ التعلم باستخدام Q-Learning
الآن نحن جاهزون لتعليم بيتر كيفية الحفاظ على التوازن!
1. أولاً، لنقم بتحديد بعض المعاملات الفائقة: (كتلة الكود 10)
```python
# hyperparameters
alpha = 0.3
gamma = 0.9
epsilon = 0.90
```
هنا، `alpha` هو **معدل التعلم** الذي يحدد إلى أي مدى يجب علينا تعديل القيم الحالية لجدول Q-Table في كل خطوة. في الدرس السابق، بدأنا بـ 1، ثم قمنا بتقليل `alpha` إلى قيم أقل أثناء التدريب. في هذا المثال، سنبقيه ثابتًا فقط للتبسيط، ويمكنك تجربة تعديل قيم `alpha` لاحقًا.
`gamma` هو **عامل الخصم** الذي يوضح إلى أي مدى يجب أن نعطي الأولوية للمكافأة المستقبلية على المكافأة الحالية.
`epsilon` هو **عامل الاستكشاف/الاستغلال** الذي يحدد ما إذا كان يجب علينا تفضيل الاستكشاف على الاستغلال أو العكس. في خوارزميتنا، سنختار في `epsilon` بالمئة من الحالات الإجراء التالي وفقًا لقيم جدول Q-Table، وفي النسبة المتبقية من الحالات سننفذ إجراءً عشوائيًا. هذا سيسمح لنا باستكشاف مناطق من مساحة البحث التي لم نرها من قبل.
✅ من حيث التوازن - اختيار إجراء عشوائي (الاستكشاف) سيعمل كضربة عشوائية في الاتجاه الخاطئ، وسيتعين على العصا تعلم كيفية استعادة التوازن من تلك "الأخطاء".
### تحسين الخوارزمية
يمكننا أيضًا إجراء تحسينين على خوارزميتنا من الدرس السابق:
- **حساب متوسط المكافأة التراكمية**، على عدد من المحاكاة. سنطبع التقدم كل 5000 تكرار، وسنحسب متوسط المكافأة التراكمية خلال تلك الفترة الزمنية. هذا يعني أنه إذا حصلنا على أكثر من 195 نقطة - يمكننا اعتبار المشكلة محلولة، بجودة أعلى حتى من المطلوب.
- **حساب أقصى نتيجة تراكمية متوسطة**، `Qmax`، وسنخزن جدول Q-Table المقابل لتلك النتيجة. عندما تقوم بتشغيل التدريب، ستلاحظ أحيانًا أن المتوسط التراكمي يبدأ في الانخفاض، ونريد الاحتفاظ بقيم جدول Q-Table التي تتوافق مع أفضل نموذج تم ملاحظته أثناء التدريب.
1. اجمع جميع المكافآت التراكمية في كل محاكاة في متجه `rewards` للرسم لاحقًا. (كتلة الكود 11)
```python
def probs(v,eps=1e-4):
v = v-v.min()+eps
v = v/v.sum()
return v
Qmax = 0
cum_rewards = []
rewards = []
for epoch in range(100000):
obs = env.reset()
done = False
cum_reward=0
# == do the simulation ==
while not done:
s = discretize(obs)
if random.random()<epsilon:
# exploitation - chose the action according to Q-Table probabilities
v = probs(np.array(qvalues(s)))
a = random.choices(actions,weights=v)[0]
else:
# exploration - randomly chose the action
a = np.random.randint(env.action_space.n)
obs, rew, done, info = env.step(a)
cum_reward+=rew
ns = discretize(obs)
Q[(s,a)] = (1 - alpha) * Q.get((s,a),0) + alpha * (rew + gamma * max(qvalues(ns)))
cum_rewards.append(cum_reward)
rewards.append(cum_reward)
# == Periodically print results and calculate average reward ==
if epoch%5000==0:
print(f"{epoch}: {np.average(cum_rewards)}, alpha={alpha}, epsilon={epsilon}")
if np.average(cum_rewards) > Qmax:
Qmax = np.average(cum_rewards)
Qbest = Q
cum_rewards=[]
```
ما قد تلاحظه من تلك النتائج:
- **قريب من هدفنا**. نحن قريبون جدًا من تحقيق الهدف المتمثل في الحصول على 195 مكافأة تراكمية على مدى 100+ تجربة متتالية، أو ربما قد حققنا ذلك بالفعل! حتى إذا حصلنا على أرقام أقل، لا يزال بإمكاننا عدم التأكد، لأننا نحسب المتوسط على مدى 5000 تجربة، بينما يتطلب المعيار الرسمي فقط 100 تجربة.
- **المكافأة تبدأ في الانخفاض**. أحيانًا تبدأ المكافأة في الانخفاض، مما يعني أنه يمكننا "تدمير" القيم التي تم تعلمها بالفعل في جدول Q-Table بالقيم التي تجعل الوضع أسوأ.
هذا الملاحظة تصبح أكثر وضوحًا إذا قمنا برسم تقدم التدريب.
## رسم تقدم التدريب
أثناء التدريب، قمنا بجمع قيمة المكافأة التراكمية في كل تكرار في متجه `rewards`. إليك كيف يبدو عند رسمه مقابل رقم التكرار:
```python
plt.plot(rewards)
```
![التقدم الخام](../../../../translated_images/train_progress_raw.2adfdf2daea09c596fc786fa347a23e9aceffe1b463e2257d20a9505794823ec.ar.png)
من هذا الرسم البياني، لا يمكننا استنتاج أي شيء، بسبب طبيعة عملية التدريب العشوائية التي تختلف فيها مدة جلسات التدريب بشكل كبير. لجعل هذا الرسم أكثر وضوحًا، يمكننا حساب **المتوسط المتحرك** على سلسلة من التجارب، لنقل 100. يمكن القيام بذلك بسهولة باستخدام `np.convolve`: (كتلة الكود 12)
```python
def running_average(x,window):
return np.convolve(x,np.ones(window)/window,mode='valid')
plt.plot(running_average(rewards,100))
```
![تقدم التدريب](../../../../translated_images/train_progress_runav.c71694a8fa9ab35935aff6f109e5ecdfdbdf1b0ae265da49479a81b5fae8f0aa.ar.png)
✅ قم بإلغاء تعليق السطر الذي يبدأ بـ `env.render` إذا كنت تريد رؤية كيفية تنفيذ البيئة. خلاف ذلك، يمكنك تنفيذها في الخلفية، وهو أسرع. سنستخدم هذا التنفيذ "غير المرئي" أثناء عملية Q-Learning.
## تغيير المعاملات الفائقة
## هيكل جدول Q
لجعل التعلم أكثر استقرارًا، من المنطقي تعديل بعض المعاملات الفائقة أثناء التدريب. على وجه الخصوص:
في درسنا السابق، كانت الحالة عبارة عن زوج بسيط من الأرقام من 0 إلى 8، وبالتالي كان من المناسب تمثيل جدول Q بمصفوفة numpy ذات شكل 8x8x2. إذا استخدمنا تقسيم المجموعات، فإن حجم متجه الحالة لدينا معروف أيضًا، لذلك يمكننا استخدام نفس النهج وتمثيل الحالة بمصفوفة ذات شكل 20x20x10x10x2 (هنا 2 هي بُعد مساحة الحركة، والأبعاد الأولى تتوافق مع عدد المجموعات التي اخترنا استخدامها لكل من المعلمات في مساحة الملاحظة).
- **بالنسبة لمعدل التعلم**، `alpha`، يمكننا البدء بقيم قريبة من 1، ثم نستمر في تقليل هذا المعامل. مع مرور الوقت، سنحصل على قيم احتمالية جيدة في جدول Q-Table، وبالتالي يجب علينا تعديلها بشكل طفيف، وليس استبدالها بالكامل بقيم جديدة.
ومع ذلك، في بعض الأحيان لا تكون أبعاد مساحة الملاحظة معروفة بدقة. في حالة وظيفة `discretize`، قد لا نكون متأكدين أبدًا من أن حالتنا تبقى ضمن حدود معينة، لأن بعض القيم الأصلية ليست محدودة. لذلك، سنستخدم نهجًا مختلفًا قليلاً ونمثل جدول Q بواسطة قاموس.
- **زيادة epsilon**. قد نرغب في زيادة `epsilon` ببطء، من أجل تقليل الاستكشاف وزيادة الاستغلال. ربما يكون من المنطقي البدء بقيمة منخفضة لـ `epsilon`، ثم زيادتها تدريجيًا لتقترب من 1.
> **المهمة 1**: جرّب تعديل قيم المعاملات الفائقة (Hyperparameters) وانظر إذا كان بإمكانك تحقيق مكافأة تراكمية أعلى. هل تحصل على أكثر من 195؟
1. استخدم الزوج *(state,action)* كمفتاح للقام
> **المهمة 1**: جرّب تعديل قيم المعاملات الفائقة (hyperparameters) وانظر إذا كان بإمكانك تحقيق مكافأة تراكمية أعلى. هل تحصل على أكثر من 195؟
> **المهمة 2**: لحل المشكلة بشكل رسمي، تحتاج إلى تحقيق متوسط مكافأة قدره 195 عبر 100 تشغيل متتالي. قم بقياس ذلك أثناء التدريب وتأكد من أنك قد حللت المشكلة بشكل رسمي!
## رؤية النتيجة عمليًا
@ -312,18 +213,18 @@ env.close()
## 🚀التحدي
> **المهمة 3**: هنا، كنا نستخدم النسخة النهائية من Q-Table، والتي قد لا تكون الأفضل. تذكر أننا قمنا بتخزين أفضل نسخة أداء من Q-Table في المتغير `Qbest`! جرب نفس المثال باستخدام أفضل نسخة أداء من Q-Table عن طريق نسخ `Qbest` إلى `Q` وشاهد إذا لاحظت الفرق.
> **المهمة 3**: هنا، كنا نستخدم النسخة النهائية من Q-Table، والتي قد لا تكون الأفضل. تذكر أننا قمنا بتخزين أفضل نسخة أداءً من Q-Table في المتغير `Qbest`! جرب نفس المثال باستخدام Q-Table الأفضل أداءً عن طريق نسخ `Qbest` إلى `Q` وشاهد ما إذا كنت تلاحظ الفرق.
> **المهمة 4**: هنا لم نكن نختار أفضل إجراء في كل خطوة، بل كنا نأخذ العينات وفقًا لتوزيع الاحتمالات المقابل. هل سيكون من المنطقي دائمًا اختيار أفضل إجراء، الذي يحتوي على أعلى قيمة في Q-Table؟ يمكن القيام بذلك باستخدام وظيفة `np.argmax` لمعرفة رقم الإجراء الذي يتوافق مع أعلى قيمة في Q-Table. قم بتنفيذ هذه الاستراتيجية وشاهد إذا كانت تحسن التوازن.
> **المهمة 4**: هنا لم نكن نختار أفضل إجراء في كل خطوة، بل كنا نأخذ العينات وفقًا لتوزيع الاحتمالات المقابل. هل سيكون من المنطقي دائمًا اختيار أفضل إجراء، الذي يحتوي على أعلى قيمة في Q-Table؟ يمكن القيام بذلك باستخدام وظيفة `np.argmax` لمعرفة رقم الإجراء الذي يتوافق مع أعلى قيمة في Q-Table. قم بتنفيذ هذه الاستراتيجية وشاهد ما إذا كانت تحسن التوازن.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/48/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## الواجب
[تدريب سيارة جبلية](assignment.md)
[تدريب سيارة الجبل](assignment.md)
## الخاتمة
لقد تعلمنا الآن كيفية تدريب الوكلاء لتحقيق نتائج جيدة فقط من خلال توفير دالة مكافأة تحدد الحالة المطلوبة للعبة، ومنحهم فرصة لاستكشاف مساحة البحث بذكاء. لقد طبقنا بنجاح خوارزمية Q-Learning في حالات البيئات المنفصلة والمستمرة، ولكن مع إجراءات منفصلة.
لقد تعلمنا الآن كيفية تدريب الوكلاء لتحقيق نتائج جيدة فقط من خلال توفير دالة مكافأة تحدد الحالة المرغوبة للعبة، ومنحهم فرصة لاستكشاف مساحة البحث بذكاء. لقد طبقنا بنجاح خوارزمية Q-Learning في حالات البيئات المنفصلة والمستمرة، ولكن مع إجراءات منفصلة.
من المهم أيضًا دراسة الحالات التي تكون فيها حالة الإجراء مستمرة، وعندما تكون مساحة الملاحظة أكثر تعقيدًا، مثل الصورة من شاشة لعبة أتاري. في تلك المشاكل، غالبًا ما نحتاج إلى استخدام تقنيات تعلم الآلة الأكثر قوة، مثل الشبكات العصبية، لتحقيق نتائج جيدة. هذه المواضيع الأكثر تقدمًا هي موضوع دورتنا القادمة الأكثر تقدمًا في الذكاء الاصطناعي.

@ -1,76 +1,76 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "20f18ff565638be615df4174858e4a7f",
"translation_date": "2025-08-29T13:29:26+00:00",
"original_hash": "83320d6b6994909e35d830cebf214039",
"translation_date": "2025-09-04T20:44:49+00:00",
"source_file": "9-Real-World/1-Applications/README.md",
"language_code": "ar"
}
-->
# الملحق: التعلم الآلي في العالم الحقيقي
# ملحق: التعلم الآلي في العالم الحقيقي
![ملخص التعلم الآلي في العالم الحقيقي في رسم تخطيطي](../../../../translated_images/ml-realworld.26ee2746716155771f8076598b6145e6533fe4a9e2e465ea745f46648cbf1b84.ar.png)
> رسم تخطيطي من [Tomomi Imura](https://www.twitter.com/girlie_mac)
![ملخص التعلم الآلي في العالم الحقيقي في رسم تخطيطي](../../../../sketchnotes/ml-realworld.png)
> رسم تخطيطي بواسطة [Tomomi Imura](https://www.twitter.com/girlie_mac)
في هذا المنهج، تعلمت العديد من الطرق لتحضير البيانات للتدريب وإنشاء نماذج تعلم آلي. قمت ببناء سلسلة من نماذج الانحدار الكلاسيكية، والتجميع، والتصنيف، ومعالجة اللغة الطبيعية، ونماذج السلاسل الزمنية. تهانينا! الآن، قد تتساءل عن الغرض من كل هذا... ما هي التطبيقات الواقعية لهذه النماذج؟
في هذا المنهج، تعلمت العديد من الطرق لتحضير البيانات للتدريب وإنشاء نماذج التعلم الآلي. لقد قمت ببناء سلسلة من نماذج الانحدار، التجميع، التصنيف، معالجة اللغة الطبيعية، ونماذج السلاسل الزمنية الكلاسيكية. تهانينا! الآن، قد تتساءل عن الهدف من كل هذا... ما هي التطبيقات الواقعية لهذه النماذج؟
على الرغم من أن الذكاء الاصطناعي، الذي يعتمد عادةً على التعلم العميق، قد جذب الكثير من الاهتمام في الصناعة، إلا أن هناك تطبيقات قيمة لنماذج التعلم الآلي الكلاسيكية. قد تكون تستخدم بعض هذه التطبيقات بالفعل اليوم! في هذا الدرس، ستستكشف كيف تستخدم ثمانية صناعات ومجالات مختلفة هذه النماذج لتحسين أدائها، وجعلها أكثر موثوقية وذكاءً وقيمة للمستخدمين.
على الرغم من أن الذكاء الاصطناعي، الذي يعتمد عادةً على التعلم العميق، قد جذب الكثير من الاهتمام في الصناعة، إلا أن هناك تطبيقات قيمة لنماذج التعلم الآلي الكلاسيكية. قد تكون تستخدم بعض هذه التطبيقات بالفعل اليوم! في هذه الدرسة، ستستكشف كيف تستخدم ثمانية صناعات ومجالات مختلفة هذه الأنواع من النماذج لجعل تطبيقاتها أكثر أداءً، موثوقية، ذكاءً، وقيمة للمستخدمين.
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/49/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## 💰 المالية
يوفر قطاع المالية العديد من الفرص للتعلم الآلي. العديد من المشكلات في هذا المجال يمكن نمذجتها وحلها باستخدام التعلم الآلي.
قطاع المالية يقدم العديد من الفرص للتعلم الآلي. العديد من المشاكل في هذا المجال يمكن نمذجتها وحلها باستخدام التعلم الآلي.
### كشف الاحتيال في بطاقات الائتمان
تعلمنا عن [التجميع باستخدام خوارزمية k-means](../../5-Clustering/2-K-Means/README.md) في وقت سابق من الدورة، ولكن كيف يمكن استخدامه لحل مشكلات تتعلق بالاحتيال في بطاقات الائتمان؟
تعلمنا عن [تجميع k-means](../../5-Clustering/2-K-Means/README.md) في وقت سابق من الدورة، ولكن كيف يمكن استخدامه لحل مشاكل تتعلق بالاحتيال في بطاقات الائتمان؟
تعتبر خوارزمية k-means مفيدة في تقنية كشف الاحتيال في بطاقات الائتمان المعروفة باسم **كشف القيم الشاذة**. القيم الشاذة، أو الانحرافات في الملاحظات حول مجموعة من البيانات، يمكن أن تخبرنا ما إذا كانت بطاقة الائتمان تُستخدم بشكل طبيعي أو إذا كان هناك شيء غير عادي يحدث. كما هو موضح في الورقة البحثية المرتبطة أدناه، يمكنك تصنيف بيانات بطاقات الائتمان باستخدام خوارزمية k-means وتعيين كل معاملة إلى مجموعة بناءً على مدى شذوذها. بعد ذلك، يمكنك تقييم المجموعات الأكثر خطورة لتحديد ما إذا كانت المعاملات احتيالية أم شرعية.
تجميع k-means مفيد في تقنية كشف الاحتيال في بطاقات الائتمان التي تسمى **كشف القيم الشاذة**. القيم الشاذة، أو الانحرافات في الملاحظات حول مجموعة من البيانات، يمكن أن تخبرنا إذا كانت بطاقة الائتمان تُستخدم بشكل طبيعي أو إذا كان هناك شيء غير عادي يحدث. كما هو موضح في الورقة المرتبطة أدناه، يمكنك تصنيف بيانات بطاقات الائتمان باستخدام خوارزمية تجميع k-means وتعيين كل معاملة إلى مجموعة بناءً على مدى كونها شاذة. بعد ذلك، يمكنك تقييم المجموعات الأكثر خطورة للتمييز بين المعاملات الاحتيالية والشرعية.
[مرجع](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.680.1195&rep=rep1&type=pdf)
### إدارة الثروات
في إدارة الثروات، يتولى فرد أو شركة إدارة الاستثمارات نيابة عن عملائهم. وظيفتهم هي الحفاظ على الثروة وتنميتها على المدى الطويل، لذا من الضروري اختيار الاستثمارات التي تحقق أداءً جيدًا.
في إدارة الثروات، يتولى فرد أو شركة التعامل مع الاستثمارات نيابةً عن عملائهم. وظيفتهم هي الحفاظ على الثروة وتنميتها على المدى الطويل، لذا من الضروري اختيار الاستثمارات التي تحقق أداءً جيدًا.
إحدى الطرق لتقييم أداء استثمار معين هي من خلال الانحدار الإحصائي. [الانحدار الخطي](../../2-Regression/1-Tools/README.md) هو أداة قيمة لفهم كيفية أداء صندوق معين مقارنة بمعيار معين. يمكننا أيضًا استنتاج ما إذا كانت نتائج الانحدار ذات دلالة إحصائية، أو مدى تأثيرها على استثمارات العميل. يمكنك حتى توسيع تحليلك باستخدام الانحدار المتعدد، حيث يمكن أخذ عوامل الخطر الإضافية في الاعتبار. للحصول على مثال حول كيفية عمل ذلك لصندوق معين، تحقق من الورقة أدناه حول تقييم أداء الصناديق باستخدام الانحدار.
إحدى الطرق لتقييم أداء استثمار معين هي من خلال الانحدار الإحصائي. [الانحدار الخطي](../../2-Regression/1-Tools/README.md) هو أداة قيمة لفهم كيفية أداء صندوق معين بالنسبة إلى معيار معين. يمكننا أيضًا استنتاج ما إذا كانت نتائج الانحدار ذات دلالة إحصائية، أو مدى تأثيرها على استثمارات العميل. يمكنك حتى توسيع تحليلك باستخدام الانحدار المتعدد، حيث يمكن أخذ عوامل المخاطر الإضافية في الاعتبار. للحصول على مثال عن كيفية عمل ذلك لصندوق معين، تحقق من الورقة أدناه حول تقييم أداء الصندوق باستخدام الانحدار.
[مرجع](http://www.brightwoodventures.com/evaluating-fund-performance-using-regression/)
## 🎓 التعليم
قطاع التعليم هو أيضًا مجال مثير للاهتمام يمكن تطبيق التعلم الآلي فيه. هناك مشكلات مثيرة يمكن معالجتها مثل كشف الغش في الاختبارات أو المقالات أو إدارة التحيز، سواء كان مقصودًا أم لا، في عملية التصحيح.
قطاع التعليم هو أيضًا مجال مثير للاهتمام حيث يمكن تطبيق التعلم الآلي. هناك مشاكل مثيرة يمكن معالجتها مثل كشف الغش في الاختبارات أو المقالات أو إدارة التحيز، سواء كان غير مقصود أو مقصود، في عملية التصحيح.
### التنبؤ بسلوك الطلاب
[Coursera](https://coursera.com)، مزود دورات تعليمية عبر الإنترنت، لديه مدونة تقنية رائعة حيث يناقشون العديد من القرارات الهندسية. في هذه الدراسة، قاموا برسم خط انحدار لاستكشاف أي علاقة بين تقييم NPS (Net Promoter Score) المنخفض والاحتفاظ بالدورة أو الانسحاب منها.
[Coursera](https://coursera.com)، مزود دورات تعليمية مفتوحة عبر الإنترنت، لديه مدونة تقنية رائعة حيث يناقشون العديد من القرارات الهندسية. في هذه الدراسة، قاموا برسم خط انحدار لمحاولة استكشاف أي علاقة بين تقييم NPS (Net Promoter Score) المنخفض والاحتفاظ بالدورة أو الانسحاب منها.
[مرجع](https://medium.com/coursera-engineering/controlled-regression-quantifying-the-impact-of-course-quality-on-learner-retention-31f956bd592a)
### تقليل التحيز
[Grammarly](https://grammarly.com)، مساعد الكتابة الذي يتحقق من الأخطاء الإملائية والنحوية، يستخدم أنظمة [معالجة اللغة الطبيعية](../../6-NLP/README.md) المتقدمة في جميع منتجاته. نشروا دراسة حالة مثيرة للاهتمام في مدونتهم التقنية حول كيفية تعاملهم مع التحيز الجنساني في التعلم الآلي، وهو ما تعلمته في [درس الإنصاف التمهيدي](../../1-Introduction/3-fairness/README.md).
[Grammarly](https://grammarly.com)، مساعد الكتابة الذي يتحقق من الأخطاء الإملائية والنحوية، يستخدم أنظمة [معالجة اللغة الطبيعية](../../6-NLP/README.md) المتقدمة في جميع منتجاته. نشروا دراسة حالة مثيرة للاهتمام في مدونتهم التقنية حول كيفية تعاملهم مع التحيز الجنسي في التعلم الآلي، والذي تعلمت عنه في درسنا [المقدمة إلى الإنصاف](../../1-Introduction/3-fairness/README.md).
[مرجع](https://www.grammarly.com/blog/engineering/mitigating-gender-bias-in-autocorrect/)
## 👜 التجزئة
يمكن لقطاع التجزئة بالتأكيد الاستفادة من استخدام التعلم الآلي، بدءًا من تحسين تجربة العميل إلى إدارة المخزون بطريقة مثلى.
قطاع التجزئة يمكن أن يستفيد بالتأكيد من استخدام التعلم الآلي، بدءًا من تحسين تجربة العملاء إلى إدارة المخزون بطريقة مثلى.
### تخصيص رحلة العميل
في Wayfair، وهي شركة تبيع السلع المنزلية مثل الأثاث، مساعدة العملاء في العثور على المنتجات المناسبة لذوقهم واحتياجاتهم أمر بالغ الأهمية. في هذا المقال، يصف المهندسون من الشركة كيف يستخدمون التعلم الآلي ومعالجة اللغة الطبيعية "لإظهار النتائج المناسبة للعملاء". على وجه الخصوص، تم بناء محرك نية الاستعلام الخاص بهم لاستخدام استخراج الكيانات، تدريب المصنفات، استخراج الأصول والآراء، ووضع علامات على المشاعر في مراجعات العملاء. هذا مثال كلاسيكي على كيفية عمل معالجة اللغة الطبيعية في تجارة التجزئة عبر الإنترنت.
في Wayfair، وهي شركة تبيع السلع المنزلية مثل الأثاث، مساعدة العملاء في العثور على المنتجات المناسبة لذوقهم واحتياجاتهم أمر بالغ الأهمية. في هذه المقالة، يصف المهندسون من الشركة كيف يستخدمون التعلم الآلي ومعالجة اللغة الطبيعية "لإظهار النتائج المناسبة للعملاء". على وجه الخصوص، تم بناء محرك نوايا الاستعلام الخاص بهم لاستخدام استخراج الكيانات، تدريب المصنفات، استخراج الأصول والآراء، ووضع علامات على المشاعر في مراجعات العملاء. هذا مثال كلاسيكي على كيفية عمل معالجة اللغة الطبيعية في التجارة الإلكترونية.
[مرجع](https://www.aboutwayfair.com/tech-innovation/how-we-use-machine-learning-and-natural-language-processing-to-empower-search)
### إدارة المخزون
تعتمد الشركات المبتكرة مثل [StitchFix](https://stitchfix.com)، وهي خدمة صناديق شحن الملابس للمستهلكين، بشكل كبير على التعلم الآلي للتوصيات وإدارة المخزون. تعمل فرق التصميم الخاصة بهم مع فرق البضائع، في الواقع: "أحد علماء البيانات لدينا قام بتجربة خوارزمية جينية وطبقها على الملابس للتنبؤ بما سيكون قطعة ملابس ناجحة لا توجد اليوم. قدمنا ذلك لفريق البضائع والآن يمكنهم استخدامه كأداة."
الشركات المبتكرة والرشيقة مثل [StitchFix](https://stitchfix.com)، وهي خدمة صناديق تشحن الملابس للمستهلكين، تعتمد بشكل كبير على التعلم الآلي للتوصيات وإدارة المخزون. فرق التصميم لديهم تعمل مع فرق البضائع، في الواقع: "أحد علماء البيانات لدينا قام بتجربة خوارزمية جينية وطبقها على الملابس للتنبؤ بما سيكون قطعة ملابس ناجحة لا توجد اليوم. قدمنا ذلك لفريق البضائع والآن يمكنهم استخدامه كأداة."
[مرجع](https://www.zdnet.com/article/how-stitch-fix-uses-machine-learning-to-master-the-science-of-styling/)
## 🏥 الرعاية الصحية
يمكن لقطاع الرعاية الصحية الاستفادة من التعلم الآلي لتحسين مهام البحث وأيضًا المشكلات اللوجستية مثل إعادة إدخال المرضى أو وقف انتشار الأمراض.
قطاع الرعاية الصحية يمكنه الاستفادة من التعلم الآلي لتحسين مهام البحث وأيضًا مشاكل لوجستية مثل إعادة إدخال المرضى أو وقف انتشار الأمراض.
### إدارة التجارب السريرية
تعتبر السمية في التجارب السريرية مصدر قلق كبير لمصنعي الأدوية. ما هي كمية السمية المقبولة؟ في هذه الدراسة، أدى تحليل طرق التجارب السريرية المختلفة إلى تطوير نهج جديد للتنبؤ باحتمالات نتائج التجارب السريرية. على وجه التحديد، تمكنوا من استخدام الغابة العشوائية لإنتاج [مصنف](../../4-Classification/README.md) قادر على التمييز بين مجموعات الأدوية.
السمية في التجارب السريرية هي مصدر قلق كبير لصانعي الأدوية. ما مقدار السمية المقبولة؟ في هذه الدراسة، أدى تحليل طرق التجارب السريرية المختلفة إلى تطوير نهج جديد للتنبؤ باحتمالات نتائج التجارب السريرية. على وجه الخصوص، تمكنوا من استخدام الغابة العشوائية لإنتاج [مصنف](../../4-Classification/README.md) قادر على التمييز بين مجموعات الأدوية.
[مرجع](https://www.sciencedirect.com/science/article/pii/S2451945616302914)
### إدارة إعادة إدخال المرضى
@ -80,78 +80,78 @@ CO_OP_TRANSLATOR_METADATA:
### إدارة الأمراض
ألقت الجائحة الأخيرة الضوء على الطرق التي يمكن أن يساعد بها التعلم الآلي في وقف انتشار الأمراض. في هذا المقال، ستتعرف على استخدام ARIMA، المنحنيات اللوجستية، الانحدار الخطي، وSARIMA. "هذا العمل هو محاولة لحساب معدل انتشار هذا الفيروس وبالتالي التنبؤ بالوفيات، حالات الشفاء، والحالات المؤكدة، مما قد يساعدنا على الاستعداد بشكل أفضل والبقاء على قيد الحياة."
سلطت الجائحة الأخيرة الضوء على الطرق التي يمكن أن يساعد بها التعلم الآلي في وقف انتشار الأمراض. في هذه المقالة، ستتعرف على استخدام ARIMA، منحنيات لوجستية، الانحدار الخطي، وSARIMA. "هذا العمل هو محاولة لحساب معدل انتشار هذا الفيروس وبالتالي التنبؤ بالوفيات، حالات الشفاء، والحالات المؤكدة، بحيث يساعدنا ذلك على الاستعداد بشكل أفضل والبقاء على قيد الحياة."
[مرجع](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7979218/)
## 🌲 البيئة والتكنولوجيا الخضراء
تتكون الطبيعة والبيئة من العديد من الأنظمة الحساسة حيث يتداخل تفاعل الحيوانات والطبيعة. من المهم أن تكون قادرًا على قياس هذه الأنظمة بدقة واتخاذ الإجراءات المناسبة إذا حدث شيء ما، مثل حرائق الغابات أو انخفاض عدد الحيوانات.
الطبيعة والبيئة تتكون من العديد من الأنظمة الحساسة حيث يتداخل الحيوانات والطبيعة. من المهم أن تكون قادرًا على قياس هذه الأنظمة بدقة والتصرف بشكل مناسب إذا حدث شيء ما، مثل حريق غابات أو انخفاض في عدد الحيوانات.
### إدارة الغابات
تعلمت عن [التعلم المعزز](../../8-Reinforcement/README.md) في الدروس السابقة. يمكن أن يكون مفيدًا جدًا عند محاولة التنبؤ بالأنماط في الطبيعة. على وجه الخصوص، يمكن استخدامه لتتبع المشكلات البيئية مثل حرائق الغابات وانتشار الأنواع الغازية. في كندا، استخدم مجموعة من الباحثين التعلم المعزز لبناء نماذج ديناميكيات حرائق الغابات من صور الأقمار الصناعية. باستخدام "عملية الانتشار المكاني (SSP)" المبتكرة، تصوروا حريق الغابة كـ "عامل في أي خلية في المشهد". "مجموعة الإجراءات التي يمكن أن يتخذها الحريق من موقع معين في أي وقت تشمل الانتشار شمالًا، جنوبًا، شرقًا، غربًا، أو عدم الانتشار.
تعلمت عن [التعلم المعزز](../../8-Reinforcement/README.md) في الدروس السابقة. يمكن أن يكون مفيدًا جدًا عند محاولة التنبؤ بأنماط في الطبيعة. على وجه الخصوص، يمكن استخدامه لتتبع المشاكل البيئية مثل حرائق الغابات وانتشار الأنواع الغازية. في كندا، استخدم مجموعة من الباحثين التعلم المعزز لبناء نماذج ديناميكيات حرائق الغابات من صور الأقمار الصناعية. باستخدام عملية "الانتشار المكاني (SSP)" المبتكرة، تصوروا حريق الغابة كـ "وكيل في أي خلية في المناظر الطبيعية." "مجموعة الإجراءات التي يمكن أن يتخذها الحريق من موقع في أي وقت تشمل الانتشار شمالًا، جنوبًا، شرقًا، غربًا أو عدم الانتشار.
هذا النهج يعكس الإعداد المعتاد للتعلم المعزز حيث تكون ديناميكيات عملية اتخاذ القرار الماركوفية (MDP) وظيفة معروفة للانتشار الفوري للحريق." اقرأ المزيد عن الخوارزميات الكلاسيكية المستخدمة من قبل هذه المجموعة في الرابط أدناه.
هذا النهج يعكس الإعداد المعتاد للتعلم المعزز حيث تكون ديناميكيات عملية اتخاذ القرار ماركوف (MDP) وظيفة معروفة للانتشار الفوري للحريق." اقرأ المزيد عن الخوارزميات الكلاسيكية المستخدمة من قبل هذه المجموعة في الرابط أدناه.
[مرجع](https://www.frontiersin.org/articles/10.3389/fict.2018.00006/full)
### استشعار حركة الحيوانات
بينما أحدث التعلم العميق ثورة في تتبع حركات الحيوانات بصريًا (يمكنك بناء [متعقب الدب القطبي الخاص بك](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) هنا)، لا يزال للتعلم الآلي الكلاسيكي مكان في هذه المهمة.
بينما أحدث التعلم العميق ثورة في تتبع حركات الحيوانات بصريًا (يمكنك بناء [متعقب دب قطبي](https://docs.microsoft.com/learn/modules/build-ml-model-with-azure-stream-analytics/?WT.mc_id=academic-77952-leestott) خاص بك هنا)، لا يزال للتعلم الآلي الكلاسيكي مكان في هذه المهمة.
تستخدم المستشعرات لتتبع حركات الحيوانات في المزارع وإنترنت الأشياء هذا النوع من المعالجة البصرية، ولكن تقنيات التعلم الآلي الأساسية أكثر فائدة في معالجة البيانات الأولية. على سبيل المثال، في هذه الورقة، تم مراقبة وتحليل وضعيات الأغنام باستخدام خوارزميات تصنيف مختلفة. قد تتعرف على منحنى ROC في الصفحة 335.
أجهزة الاستشعار لتتبع حركات الحيوانات في المزارع وإنترنت الأشياء تستخدم هذا النوع من المعالجة البصرية، ولكن تقنيات التعلم الآلي الأساسية أكثر فائدة لمعالجة البيانات الأولية. على سبيل المثال، في هذه الورقة، تم مراقبة وتحليل وضعيات الأغنام باستخدام خوارزميات مصنف مختلفة. قد تتعرف على منحنى ROC في الصفحة 335.
[مرجع](https://druckhaus-hofmann.de/gallery/31-wj-feb-2020.pdf)
### ⚡️ إدارة الطاقة
في دروسنا حول [التنبؤ بالسلاسل الزمنية](../../7-TimeSeries/README.mdتناولنا مفهوم عدادات وقوف السيارات الذكية لتوليد الإيرادات لمدينة بناءً على فهم العرض والطلب. يناقش هذا المقال بالتفصيل كيف تم دمج التجميع، الانحدار، والتنبؤ بالسلاسل الزمنية للمساعدة في التنبؤ باستخدام الطاقة المستقبلية في أيرلندا، استنادًا إلى العدادات الذكية.
في دروسنا حول [التنبؤ بالسلاسل الزمنية](../../7-TimeSeries/README.mdاستدعينا مفهوم عدادات وقوف السيارات الذكية لتوليد الإيرادات لمدينة بناءً على فهم العرض والطلب. تناقش هذه المقالة بالتفصيل كيف أن التجميع، الانحدار، والتنبؤ بالسلاسل الزمنية مجتمعين ساعدوا في التنبؤ باستخدام الطاقة المستقبلية في أيرلندا، بناءً على العدادات الذكية.
[مرجع](https://www-cdn.knime.com/sites/default/files/inline-images/knime_bigdata_energy_timeseries_whitepaper.pdf)
## 💼 التأمين
قطاع التأمين هو قطاع آخر يستخدم التعلم الآلي لبناء وتحسين النماذج المالية والاكتوارية القابلة للتطبيق.
قطاع التأمين هو قطاع آخر يستخدم التعلم الآلي لبناء وتحسين نماذج مالية واكتوارية قابلة للتطبيق.
### إدارة التقلبات
MetLife، مزود التأمين على الحياة، شفاف بشأن الطريقة التي يحلل بها ويخفف التقلبات في نماذجه المالية. في هذا المقال، ستلاحظ تصورات التصنيف الثنائي والترتيبي. ستكتشف أيضًا تصورات التنبؤ.
MetLife، مزود التأمين على الحياة، صريح بشأن الطريقة التي يحلل بها ويقلل من التقلبات في نماذجه المالية. في هذه المقالة ستلاحظ تصورات التصنيف الثنائي والرتبي. ستكتشف أيضًا تصورات التنبؤ.
[مرجع](https://investments.metlife.com/content/dam/metlifecom/us/investments/insights/research-topics/macro-strategy/pdf/MetLifeInvestmentManagement_MachineLearnedRanking_070920.pdf)
## 🎨 الفنون، الثقافة، والأدب
في الفنون، على سبيل المثال في الصحافة، هناك العديد من المشكلات المثيرة للاهتمام. كشف الأخبار المزيفة هو مشكلة كبيرة حيث ثبت أنها تؤثر على آراء الناس وحتى تقوض الديمقراطيات. يمكن للمتاحف أيضًا الاستفادة من استخدام التعلم الآلي في كل شيء بدءًا من العثور على الروابط بين القطع الأثرية إلى تخطيط الموارد.
في الفنون، على سبيل المثال في الصحافة، هناك العديد من المشاكل المثيرة للاهتمام. كشف الأخبار المزيفة هو مشكلة كبيرة حيث ثبت أنها تؤثر على رأي الناس وحتى تقوض الديمقراطيات. يمكن أيضًا أن تستفيد المتاحف من استخدام التعلم الآلي في كل شيء بدءًا من إيجاد الروابط بين القطع الأثرية إلى تخطيط الموارد.
### كشف الأخبار المزيفة
أصبح كشف الأخبار المزيفة لعبة القط والفأر في وسائل الإعلام اليوم. في هذا المقال، يقترح الباحثون أن نظامًا يجمع بين العديد من تقنيات التعلم الآلي التي درسناها يمكن اختباره ونشر النموذج الأفضل: "يعتمد هذا النظام على معالجة اللغة الطبيعية لاستخراج الميزات من البيانات، ثم يتم استخدام هذه الميزات لتدريب مصنفي التعلم الآلي مثل Naive Bayes، Support Vector Machine (SVM)، Random Forest (RF)، Stochastic Gradient Descent (SGD)، والانحدار اللوجستي (LR)."
كشف الأخبار المزيفة أصبح لعبة القط والفأر في وسائل الإعلام اليوم. في هذه المقالة، يقترح الباحثون أن نظامًا يجمع بين العديد من تقنيات التعلم الآلي التي درسناها يمكن اختباره ونشر النموذج الأفضل: "هذا النظام يعتمد على معالجة اللغة الطبيعية لاستخراج الميزات من البيانات ثم يتم استخدام هذه الميزات لتدريب مصنفات التعلم الآلي مثل Naive Bayes، Support Vector Machine (SVM)، Random Forest (RF)، Stochastic Gradient Descent (SGD)، والانحدار اللوجستي (LR)."
[مرجع](https://www.irjet.net/archives/V7/i6/IRJET-V7I6688.pdf)
يظهر هذا المقال كيف يمكن أن يؤدي الجمع بين مجالات التعلم الآلي المختلفة إلى إنتاج نتائج مثيرة للاهتمام يمكن أن تساعد في وقف انتشار الأخبار المزيفة وإحداث أضرار حقيقية؛ في هذه الحالة، كان الدافع هو انتشار الشائعات حول علاجات COVID التي أثارت العنف الجماعي.
تظهر هذه المقالة كيف أن الجمع بين مجالات التعلم الآلي المختلفة يمكن أن ينتج نتائج مثيرة للاهتمام يمكن أن تساعد في وقف انتشار الأخبار المزيفة وإحداث أضرار حقيقية؛ في هذه الحالة، كان الدافع هو انتشار الشائعات حول علاجات COVID التي أثارت العنف الجماعي.
### التعلم الآلي في المتاحف
تقف المتاحف على أعتاب ثورة في الذكاء الاصطناعي حيث أصبح تصنيف المجموعات الرقمية والعثور على الروابط بين القطع الأثرية أسهل مع تقدم التكنولوجيا. مشاريع مثل [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) تساعد في فك أسرار المجموعات غير القابلة للوصول مثل أرشيف الفاتيكان. ولكن، الجانب التجاري للمتاحف يستفيد أيضًا من نماذج التعلم الآلي.
المتاحف على أعتاب ثورة الذكاء الاصطناعي حيث أصبح تصنيف المجموعات الرقمية وإيجاد الروابط بين القطع الأثرية أسهل مع تقدم التكنولوجيا. مشاريع مثل [In Codice Ratio](https://www.sciencedirect.com/science/article/abs/pii/S0306457321001035#:~:text=1.,studies%20over%20large%20historical%20sources.) تساعد في فك ألغاز المجموعات غير القابلة للوصول مثل أرشيف الفاتيكان. ولكن، الجانب التجاري للمتاحف يستفيد أيضًا من نماذج التعلم الآلي.
على سبيل المثال، قام معهد الفن في شيكاغو ببناء نماذج للتنبؤ بما يهتم به الجمهور ومتى سيحضر المعارض. الهدف هو إنشاء تجارب زوار فردية ومحسنة في كل مرة يزور فيها المستخدم المتحف. "خلال السنة المالية 2017، تنبأ النموذج بالحضور والإيرادات بدقة تصل إلى 1 بالمائة، كما يقول Andrew Simnick، نائب الرئيس الأول في معهد الفن."
على سبيل المثال، قام معهد الفنون في شيكاغو ببناء نماذج للتنبؤ بما يهتم به الجمهور ومتى سيحضر المعارض. الهدف هو إنشاء تجارب زوار فردية ومُحسنة في كل مرة يزور فيها المستخدم المتحف. "خلال السنة المالية 2017، تنبأ النموذج بالحضور والإيرادات بدقة تصل إلى 1 بالمائة، يقول Andrew Simnick، نائب الرئيس الأول في معهد الفنون."
[مرجع](https://www.chicagobusiness.com/article/20180518/ISSUE01/180519840/art-institute-of-chicago-uses-data-to-make-exhibit-choices)
## 🏷 التسويق
### تقسيم العملاء
تستهدف استراتيجيات التسويق الأكثر فعالية العملاء بطرق مختلفة بناءً على مجموعات متنوعة. يناقش هذا المقال استخدام خوارزميات التجميع لدعم التسويق المتمايز. يساعد التسويق المتمايز الشركات على تحسين التعرف على العلامة التجارية، الوصول إلى المزيد من العملاء، وزيادة الأرباح.
أكثر استراتيجيات التسويق فعالية تستهدف العملاء بطرق مختلفة بناءً على مجموعات متنوعة. تناقش هذه المقالة استخدام خوارزميات التجميع لدعم التسويق المتمايز. يساعد التسويق المتمايز الشركات على تحسين التعرف على العلامة التجارية، الوصول إلى المزيد من العملاء، وكسب المزيد من المال.
[مرجع](https://ai.inqline.com/machine-learning-for-marketing-customer-segmentation/)
## 🚀 التحدي
حدد قطاعًا آخر يستفيد من بعض التقنيات التي تعلمتها في هذا المنهج، واكتشف كيف يستخدم التعلم الآلي.
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/50/)
حدد قطاعًا آخر يستفيد من بعض التقنيات التي تعلمتها في هذا المنهج، واكتشف كيف يستخدم التعلم الآلي.
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
فريق علوم البيانات في Wayfair لديه عدة فيديوهات مثيرة للاهتمام حول كيفية استخدامهم للتعلم الآلي في شركتهم. من المفيد [إلقاء نظرة](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)!
فريق علوم البيانات في Wayfair لديه عدة فيديوهات مثيرة للاهتمام حول كيفية استخدامهم لتعلم الآلة في شركتهم. من المفيد [إلقاء نظرة](https://www.youtube.com/channel/UCe2PjkQXqOuwkW1gw6Ameuw/videos)!
## المهمة
## الواجب
[بحث عن التعلم الآلي](assignment.md)
[بحث عن تعلم الآلة](assignment.md)
---

@ -1,71 +1,71 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "ba0f6e1019351351c8ee4c92867b6a0b",
"translation_date": "2025-08-29T13:32:22+00:00",
"original_hash": "df2b538e8fbb3e91cf0419ae2f858675",
"translation_date": "2025-09-04T20:45:30+00:00",
"source_file": "9-Real-World/2-Debugging-ML-Models/README.md",
"language_code": "ar"
}
-->
# الملحق: تصحيح النماذج في تعلم الآلة باستخدام مكونات لوحة تحكم الذكاء الاصطناعي المسؤول
# ملحق: تصحيح النماذج في تعلم الآلة باستخدام مكونات لوحة القيادة للذكاء الاصطناعي المسؤول
## [اختبار ما قبل المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/5/)
## [اختبار ما قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المقدمة
يؤثر تعلم الآلة على حياتنا اليومية بشكل كبير. فالذكاء الاصطناعي يشق طريقه إلى بعض الأنظمة الأكثر أهمية التي تؤثر علينا كأفراد وعلى مجتمعنا ككل، مثل الرعاية الصحية، والتمويل، والتعليم، والتوظيف. على سبيل المثال، تُستخدم الأنظمة والنماذج في اتخاذ قرارات يومية مثل تشخيص الأمراض أو اكتشاف الاحتيال. ونتيجة لذلك، فإن التقدم في الذكاء الاصطناعي إلى جانب التبني المتسارع له يقابله تطور في توقعات المجتمع وزيادة في التشريعات المنظمة. نرى باستمرار مجالات يفشل فيها الذكاء الاصطناعي في تلبية التوقعات، مما يكشف عن تحديات جديدة، وتبدأ الحكومات في تنظيم حلول الذكاء الاصطناعي. لذلك، من المهم تحليل هذه النماذج لضمان تقديم نتائج عادلة وموثوقة وشاملة وشفافة ومسؤولة للجميع.
يؤثر تعلم الآلة على حياتنا اليومية. الذكاء الاصطناعي يشق طريقه إلى بعض الأنظمة الأكثر أهمية التي تؤثر علينا كأفراد وعلى مجتمعنا، مثل الرعاية الصحية، والتمويل، والتعليم، والتوظيف. على سبيل المثال، يتم استخدام الأنظمة والنماذج في مهام اتخاذ القرارات اليومية، مثل تشخيصات الرعاية الصحية أو اكتشاف الاحتيال. نتيجة لذلك، يتم مواجهة التقدم في الذكاء الاصطناعي مع توقعات اجتماعية متطورة وتنظيم متزايد استجابة لذلك. نرى باستمرار مجالات حيث تستمر أنظمة الذكاء الاصطناعي في خيبة الآمال؛ حيث تكشف عن تحديات جديدة؛ وتبدأ الحكومات في تنظيم حلول الذكاء الاصطناعي. لذلك، من المهم تحليل هذه النماذج لضمان تقديم نتائج عادلة، موثوقة، شاملة، شفافة، ومسؤولة للجميع.
في هذا المنهج، سنستعرض أدوات عملية يمكن استخدامها لتقييم ما إذا كان النموذج يواجه مشكلات تتعلق بالذكاء الاصطناعي المسؤول. تعتمد تقنيات تصحيح تعلم الآلة التقليدية عادةً على حسابات كمية مثل دقة الإجماليات أو متوسط فقدان الخطأ. تخيل ما يمكن أن يحدث عندما تفتقر البيانات التي تستخدمها لبناء هذه النماذج إلى تمثيل معين لفئات ديموغرافية مثل العرق أو الجنس أو الرؤية السياسية أو الدين، أو عندما تكون هذه الفئات ممثلة بشكل غير متناسب. ماذا عن الحالات التي يتم فيها تفسير مخرجات النموذج لتفضيل فئة ديموغرافية معينة؟ يمكن أن يؤدي ذلك إلى تمثيل زائد أو ناقص لهذه الفئات الحساسة، مما يؤدي إلى مشكلات تتعلق بالعدالة أو الشمولية أو الموثوقية. عامل آخر هو أن نماذج تعلم الآلة تُعتبر صناديق سوداء، مما يجعل من الصعب فهم وتفسير ما يدفع توقعات النموذج. كل هذه التحديات تواجه علماء البيانات ومطوري الذكاء الاصطناعي عندما لا تتوفر لديهم الأدوات المناسبة لتصحيح النماذج أو تقييم عدالتها أو موثوقيتها.
في هذا المنهج، سنستعرض أدوات عملية يمكن استخدامها لتقييم ما إذا كان النموذج يواجه مشكلات تتعلق بالذكاء الاصطناعي المسؤول. تقنيات تصحيح تعلم الآلة التقليدية تعتمد عادةً على حسابات كمية مثل دقة التجميع أو متوسط خسارة الخطأ. تخيل ما يمكن أن يحدث عندما تفتقر البيانات التي تستخدمها لبناء هذه النماذج إلى بعض الفئات الديموغرافية، مثل العرق، الجنس، الرؤية السياسية، الدين، أو تمثل هذه الفئات بشكل غير متناسب. ماذا عن عندما يتم تفسير نتائج النموذج لتفضيل فئة ديموغرافية معينة؟ هذا يمكن أن يؤدي إلى تمثيل زائد أو ناقص لهذه المجموعات الحساسة، مما يسبب مشكلات تتعلق بالعدالة، الشمولية، أو الموثوقية في النموذج. عامل آخر هو أن نماذج تعلم الآلة تعتبر صناديق سوداء، مما يجعل من الصعب فهم وتفسير ما يدفع توقعات النموذج. كل هذه تحديات يواجهها علماء البيانات ومطورو الذكاء الاصطناعي عندما لا تتوفر لديهم أدوات كافية لتصحيح وتقييم عدالة أو موثوقية النموذج.
في هذا الدرس، ستتعلم كيفية تصحيح النماذج باستخدام:
في هذه الدرس، ستتعلم كيفية تصحيح نماذجك باستخدام:
- **تحليل الأخطاء**: تحديد الأماكن في توزيع البيانات التي تكون فيها معدلات الخطأ عالية.
- **تحليل الأخطاء**: تحديد المناطق في توزيع البيانات حيث يكون معدل الأخطاء في النموذج مرتفعًا.
- **نظرة عامة على النموذج**: إجراء تحليل مقارن عبر مجموعات بيانات مختلفة لاكتشاف التفاوتات في مقاييس أداء النموذج.
- **تحليل البيانات**: التحقيق في الأماكن التي قد يكون فيها تمثيل زائد أو ناقص للبيانات، مما قد يؤدي إلى انحياز النموذج لفئة ديموغرافية معينة.
- **أهمية الميزات**: فهم الميزات التي تؤثر على توقعات النموذج على المستوى العام أو المحلي.
- **تحليل البيانات**: التحقيق في المناطق التي قد يكون فيها تمثيل زائد أو ناقص للبيانات مما قد يؤدي إلى انحياز النموذج لتفضيل فئة ديموغرافية على أخرى.
- **أهمية الميزات**: فهم الميزات التي تؤثر على توقعات النموذج على المستوى العالمي أو المحلي.
## المتطلبات الأساسية
كشرط أساسي، يُرجى مراجعة [أدوات الذكاء الاصطناعي المسؤول للمطورين](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard)
كشرط أساسي، يرجى مراجعة [أدوات الذكاء الاصطناعي المسؤول للمطورين](https://www.microsoft.com/ai/ai-lab-responsible-ai-dashboard)
> ![صورة متحركة لأدوات الذكاء الاصطناعي المسؤول](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif)
> ![صورة متحركة عن أدوات الذكاء الاصطناعي المسؤول](../../../../9-Real-World/2-Debugging-ML-Models/images/rai-overview.gif)
## تحليل الأخطاء
تعتمد مقاييس أداء النماذج التقليدية المستخدمة لقياس الدقة غالبًا على حسابات تعتمد على التوقعات الصحيحة مقابل التوقعات الخاطئة. على سبيل المثال، يمكن اعتبار أن النموذج دقيق بنسبة 89% مع فقدان خطأ قدره 0.001 أداءً جيدًا. ومع ذلك، فإن الأخطاء غالبًا ما تكون غير موزعة بالتساوي في مجموعة البيانات الأساسية. قد تحصل على درجة دقة نموذج تبلغ 89% ولكن تكتشف أن هناك مناطق معينة في بياناتك يفشل فيها النموذج بنسبة 42%. يمكن أن تؤدي هذه الأنماط من الفشل مع مجموعات بيانات معينة إلى مشكلات تتعلق بالعدالة أو الموثوقية. من الضروري فهم المناطق التي يعمل فيها النموذج بشكل جيد أو لا يعمل. قد تكون المناطق التي تحتوي على عدد كبير من الأخطاء في النموذج تمثل فئة ديموغرافية مهمة.
مقاييس أداء النموذج التقليدية المستخدمة لقياس الدقة تعتمد غالبًا على حسابات صحيحة مقابل توقعات غير صحيحة. على سبيل المثال، تحديد أن النموذج دقيق بنسبة 89% مع خسارة خطأ قدرها 0.001 يمكن اعتباره أداءً جيدًا. لكن الأخطاء غالبًا لا يتم توزيعها بشكل متساوٍ في مجموعة البيانات الأساسية. قد تحصل على درجة دقة نموذج تبلغ 89% ولكن تكتشف أن هناك مناطق مختلفة من بياناتك حيث يفشل النموذج بنسبة 42% من الوقت. عواقب هذه الأنماط الفاشلة مع مجموعات بيانات معينة يمكن أن تؤدي إلى مشكلات تتعلق بالعدالة أو الموثوقية. من الضروري فهم المناطق التي يعمل فيها النموذج بشكل جيد أو لا يعمل. المناطق في البيانات التي تحتوي على عدد كبير من الأخطاء في النموذج قد تكون مجموعة بيانات ديموغرافية مهمة.
![تحليل وتصحيح أخطاء النموذج](../../../../translated_images/ea-error-distribution.117452e1177c1dd84fab2369967a68bcde787c76c6ea7fdb92fcf15d1fce8206.ar.png)
![تحليل وتصحيح أخطاء النموذج](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-distribution.png)
يوضح مكون تحليل الأخطاء في لوحة تحكم الذكاء الاصطناعي المسؤول كيفية توزيع فشل النموذج عبر مجموعات مختلفة باستخدام تصور شجري. هذا مفيد في تحديد الميزات أو المناطق التي تحتوي على معدلات خطأ عالية في مجموعة البيانات الخاصة بك. من خلال رؤية مصدر معظم الأخطاء في النموذج، يمكنك البدء في التحقيق في السبب الجذري. يمكنك أيضًا إنشاء مجموعات بيانات لإجراء التحليل عليها. تساعد هذه المجموعات في عملية التصحيح لتحديد سبب أداء النموذج بشكل جيد في مجموعة معينة ولكنه يخطئ في مجموعة أخرى.
يوضح مكون تحليل الأخطاء في لوحة القيادة للذكاء الاصطناعي المسؤول كيفية توزيع فشل النموذج عبر مجموعات مختلفة باستخدام تصور شجري. هذا مفيد في تحديد الميزات أو المناطق التي تحتوي على معدل خطأ مرتفع في مجموعة البيانات الخاصة بك. من خلال رؤية مصدر معظم الأخطاء في النموذج، يمكنك البدء في التحقيق في السبب الجذري. يمكنك أيضًا إنشاء مجموعات بيانات لإجراء التحليل عليها. تساعد هذه المجموعات في عملية التصحيح لتحديد سبب أداء النموذج الجيد في مجموعة معينة ولكنه يحتوي على أخطاء في مجموعة أخرى.
![تحليل الأخطاء](../../../../translated_images/ea-error-cohort.6886209ea5d438c4daa8bfbf5ce3a7042586364dd3eccda4a4e3d05623ac702a.ar.png)
![تحليل الأخطاء](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-error-cohort.png)
تساعد المؤشرات المرئية على الخريطة الشجرية في تحديد مناطق المشكلة بسرعة. على سبيل المثال، كلما كان لون العقدة الشجرية أغمق باللون الأحمر، زادت نسبة الخطأ.
المؤشرات البصرية على خريطة الشجرة تساعد في تحديد المناطق المشكلة بسرعة. على سبيل المثال، كلما كان لون العقدة الشجرية أغمق باللون الأحمر، كان معدل الخطأ أعلى.
الخريطة الحرارية هي وظيفة تصور أخرى يمكن للمستخدمين استخدامها للتحقيق في معدل الخطأ باستخدام ميزة واحدة أو ميزتين لتحديد المساهمين في أخطاء النموذج عبر مجموعة البيانات بأكملها أو المجموعات.
خريطة الحرارة هي وظيفة تصور أخرى يمكن للمستخدمين استخدامها للتحقيق في معدل الخطأ باستخدام ميزة واحدة أو اثنتين للعثور على مساهم في أخطاء النموذج عبر مجموعة البيانات بأكملها أو المجموعات.
![الخريطة الحرارية لتحليل الأخطاء](../../../../translated_images/ea-heatmap.8d27185e28cee3830c85e1b2e9df9d2d5e5c8c940f41678efdb68753f2f7e56c.ar.png)
![خريطة حرارة لتحليل الأخطاء](../../../../9-Real-World/2-Debugging-ML-Models/images/ea-heatmap.png)
استخدم تحليل الأخطاء عندما تحتاج إلى:
* فهم عميق لكيفية توزيع أخطاء النموذج عبر مجموعة البيانات وعبر عدة أبعاد إدخال وميزات.
* تقسيم مقاييس الأداء الإجمالية لاكتشاف المجموعات الخاطئة تلقائيًا لإبلاغ خطوات التخفيف المستهدفة.
* فهم عميق لكيفية توزيع فشل النموذج عبر مجموعة البيانات وعبر عدة أبعاد للمدخلات والميزات.
* تقسيم مقاييس الأداء الإجمالية لاكتشاف مجموعات البيانات الخاطئة تلقائيًا لإبلاغ خطوات التخفيف المستهدفة.
## نظرة عامة على النموذج
يتطلب تقييم أداء نموذج تعلم الآلة فهمًا شاملاً لسلوكه. يمكن تحقيق ذلك من خلال مراجعة أكثر من مقياس واحد مثل معدل الخطأ، الدقة، الاستدعاء، الدقة، أو متوسط الخطأ المطلق (MAE) لاكتشاف التفاوتات بين مقاييس الأداء. قد يبدو أحد مقاييس الأداء رائعًا، ولكن يمكن كشف الأخطاء في مقياس آخر. بالإضافة إلى ذلك، فإن مقارنة المقاييس للكشف عن التفاوتات عبر مجموعة البيانات بأكملها أو المجموعات يساعد في تسليط الضوء على الأماكن التي يعمل فيها النموذج بشكل جيد أو لا يعمل. هذا مهم بشكل خاص لرؤية أداء النموذج بين الميزات الحساسة مقابل غير الحساسة (مثل العرق، الجنس، أو العمر) للكشف عن أي انحياز محتمل قد يكون لدى النموذج. على سبيل المثال، اكتشاف أن النموذج أكثر خطأً في مجموعة تحتوي على ميزات حساسة يمكن أن يكشف عن انحياز محتمل.
تقييم أداء نموذج تعلم الآلة يتطلب فهمًا شاملاً لسلوكه. يمكن تحقيق ذلك من خلال مراجعة أكثر من مقياس واحد مثل معدل الخطأ، الدقة، الاستدعاء، الدقة، أو متوسط الخطأ المطلق (MAE) للكشف عن التفاوتات بين مقاييس الأداء. قد يبدو أحد مقاييس الأداء رائعًا، ولكن يمكن أن تظهر الأخطاء في مقياس آخر. بالإضافة إلى ذلك، مقارنة المقاييس للكشف عن التفاوتات عبر مجموعة البيانات بأكملها أو المجموعات يساعد في تسليط الضوء على المناطق التي يعمل فيها النموذج بشكل جيد أو لا يعمل. هذا مهم بشكل خاص لرؤية أداء النموذج بين الميزات الحساسة مقابل غير الحساسة (مثل عرق المريض، الجنس، أو العمر) للكشف عن احتمالية وجود عدم عدالة في النموذج. على سبيل المثال، اكتشاف أن النموذج أكثر خطأً في مجموعة تحتوي على ميزات حساسة يمكن أن يكشف عن احتمالية وجود عدم عدالة في النموذج.
يساعد مكون نظرة عامة على النموذج في لوحة تحكم الذكاء الاصطناعي المسؤول ليس فقط في تحليل مقاييس الأداء لتمثيل البيانات في مجموعة معينة، بل يمنح المستخدمين القدرة على مقارنة سلوك النموذج عبر مجموعات مختلفة.
يساعد مكون نظرة عامة على النموذج في لوحة القيادة للذكاء الاصطناعي المسؤول ليس فقط في تحليل مقاييس الأداء لتمثيل البيانات في مجموعة، ولكنه يمنح المستخدمين القدرة على مقارنة سلوك النموذج عبر مجموعات مختلفة.
![مجموعات البيانات - نظرة عامة على النموذج في لوحة تحكم الذكاء الاصطناعي المسؤول](../../../../translated_images/model-overview-dataset-cohorts.dfa463fb527a35a0afc01b7b012fc87bf2cad756763f3652bbd810cac5d6cf33.ar.png)
![مجموعات البيانات - نظرة عامة على النموذج في لوحة القيادة للذكاء الاصطناعي المسؤول](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-dataset-cohorts.png)
تتيح وظيفة التحليل المستندة إلى الميزات للمكون للمستخدمين تضييق نطاق مجموعات البيانات الفرعية ضمن ميزة معينة لتحديد الشذوذ على مستوى دقيق. على سبيل المثال، تحتوي لوحة التحكم على ذكاء مدمج لتوليد مجموعات تلقائيًا لميزة يختارها المستخدم (مثل *"time_in_hospital < 3"* أو *"time_in_hospital >= 7"*). يتيح ذلك للمستخدم عزل ميزة معينة من مجموعة بيانات أكبر لمعرفة ما إذا كانت مؤثرًا رئيسيًا في نتائج النموذج الخاطئة.
وظيفة التحليل القائمة على الميزات للمكون تسمح للمستخدمين بتضييق مجموعات البيانات الفرعية داخل ميزة معينة لتحديد الشذوذ على مستوى دقيق. على سبيل المثال، تحتوي لوحة القيادة على ذكاء مدمج لتوليد مجموعات تلقائيًا لميزة يختارها المستخدم (مثل *"time_in_hospital < 3"* أو *"time_in_hospital >= 7"*). هذا يمكّن المستخدم من عزل ميزة معينة من مجموعة بيانات أكبر لرؤية ما إذا كانت مؤثرًا رئيسيًا في نتائج النموذج الخاطئة.
![مجموعات الميزات - نظرة عامة على النموذج في لوحة تحكم الذكاء الاصطناعي المسؤول](../../../../translated_images/model-overview-feature-cohorts.c5104d575ffd0c80b7ad8ede7703fab6166bfc6f9125dd395dcc4ace2f522f70.ar.png)
![مجموعات الميزات - نظرة عامة على النموذج في لوحة القيادة للذكاء الاصطناعي المسؤول](../../../../9-Real-World/2-Debugging-ML-Models/images/model-overview-feature-cohorts.png)
يدعم مكون نظرة عامة على النموذج فئتين من مقاييس التفاوت:
يدعم مكون نظرة عامة على النموذج نوعين من مقاييس التفاوت:
**التفاوت في أداء النموذج**: تحسب هذه المجموعة من المقاييس التفاوت (الاختلاف) في قيم مقياس الأداء المحدد عبر مجموعات البيانات الفرعية. إليك بعض الأمثلة:
**التفاوت في أداء النموذج**: تحسب هذه المجموعة من المقاييس التفاوت (الفرق) في قيم مقياس الأداء المحدد عبر مجموعات البيانات الفرعية. إليك بعض الأمثلة:
* التفاوت في معدل الدقة
* التفاوت في معدل الخطأ
@ -73,97 +73,97 @@ CO_OP_TRANSLATOR_METADATA:
* التفاوت في الاستدعاء
* التفاوت في متوسط الخطأ المطلق (MAE)
**التفاوت في معدل الاختيار**: يحتوي هذا المقياس على الفرق في معدل الاختيار (التوقع الإيجابي) بين المجموعات الفرعية. مثال على ذلك هو التفاوت في معدلات الموافقة على القروض. معدل الاختيار يعني نسبة نقاط البيانات في كل فئة المصنفة على أنها 1 (في التصنيف الثنائي) أو توزيع قيم التوقعات (في الانحدار).
**التفاوت في معدل الاختيار**: يحتوي هذا المقياس على الفرق في معدل الاختيار (التوقع المفضل) بين المجموعات الفرعية. مثال على ذلك هو التفاوت في معدلات الموافقة على القروض. معدل الاختيار يعني نسبة نقاط البيانات في كل فئة المصنفة كـ 1 (في التصنيف الثنائي) أو توزيع قيم التوقعات (في الانحدار).
## تحليل البيانات
> "إذا عذبت البيانات بما فيه الكفاية، ستعترف بأي شيء" - رونالد كواس
قد يبدو هذا البيان متطرفًا، لكنه صحيح أن البيانات يمكن التلاعب بها لدعم أي استنتاج. يمكن أن يحدث هذا التلاعب أحيانًا عن غير قصد. كبشر، لدينا جميعًا تحيزات، وغالبًا ما يكون من الصعب معرفة متى يتم إدخال التحيز في البيانات. ضمان العدالة في الذكاء الاصطناعي وتعلم الآلة يظل تحديًا معقدًا.
يبدو هذا البيان متطرفًا، لكنه صحيح أن البيانات يمكن التلاعب بها لدعم أي استنتاج. مثل هذا التلاعب يمكن أن يحدث أحيانًا دون قصد. كبشر، لدينا جميعًا تحيز، وغالبًا ما يكون من الصعب أن ندرك بوعي متى ندخل التحيز في البيانات. ضمان العدالة في الذكاء الاصطناعي وتعلم الآلة يبقى تحديًا معقدًا.
البيانات هي نقطة عمياء كبيرة لمقاييس أداء النماذج التقليدية. قد تحصل على درجات دقة عالية، لكن هذا لا يعكس دائمًا التحيز الأساسي الذي قد يكون موجودًا في مجموعة البيانات الخاصة بك. على سبيل المثال، إذا كانت مجموعة بيانات الموظفين تحتوي على 27% من النساء في المناصب التنفيذية في شركة و73% من الرجال في نفس المستوى، فإن نموذج الذكاء الاصطناعي للإعلانات الوظيفية المدرب على هذه البيانات قد يستهدف في الغالب جمهورًا ذكوريًا للمناصب العليا. هذا الخلل في البيانات أثر على توقعات النموذج لتفضيل جنس معين. يكشف هذا عن مشكلة عدالة حيث يوجد تحيز جنسي في نموذج الذكاء الاصطناعي.
البيانات هي نقطة عمياء كبيرة لمقاييس أداء النموذج التقليدية. قد تكون لديك درجات دقة عالية، لكن هذا لا يعكس دائمًا التحيز الأساسي في البيانات الذي قد يكون موجودًا في مجموعة البيانات الخاصة بك. على سبيل المثال، إذا كانت مجموعة بيانات الموظفين تحتوي على 27% من النساء في المناصب التنفيذية في شركة و73% من الرجال في نفس المستوى، فإن نموذج الإعلان عن الوظائف الذي يتم تدريبه على هذه البيانات قد يستهدف جمهورًا ذكوريًا بشكل أساسي للمناصب العليا. وجود هذا التفاوت في البيانات أدى إلى انحياز توقع النموذج لتفضيل جنس واحد. هذا يكشف عن مشكلة عدالة حيث يوجد تحيز جنسي في نموذج الذكاء الاصطناعي.
يساعد مكون تحليل البيانات في لوحة تحكم الذكاء الاصطناعي المسؤول في تحديد المناطق التي يوجد فيها تمثيل زائد أو ناقص في مجموعة البيانات. يساعد المستخدمين في تشخيص السبب الجذري للأخطاء ومشكلات العدالة الناتجة عن اختلالات البيانات أو نقص تمثيل مجموعة بيانات معينة. يوفر هذا للمستخدمين القدرة على تصور مجموعات البيانات بناءً على النتائج المتوقعة والفعلية، مجموعات الأخطاء، والميزات المحددة. أحيانًا يمكن أن يكشف اكتشاف مجموعة بيانات غير ممثلة بشكل كافٍ أن النموذج لا يتعلم بشكل جيد، وبالتالي ارتفاع الأخطاء. وجود نموذج يحتوي على تحيز في البيانات ليس فقط مشكلة عدالة ولكنه يظهر أن النموذج غير شامل أو غير موثوق.
يساعد مكون تحليل البيانات في لوحة القيادة للذكاء الاصطناعي المسؤول في تحديد المناطق التي يوجد فيها تمثيل زائد أو ناقص في مجموعة البيانات. يساعد المستخدمين في تشخيص السبب الجذري للأخطاء ومشكلات العدالة الناتجة عن التفاوتات في البيانات أو نقص تمثيل مجموعة بيانات معينة. يمنح المستخدمين القدرة على تصور مجموعات البيانات بناءً على النتائج المتوقعة والفعلية، مجموعات الأخطاء، والميزات المحددة. أحيانًا يمكن أن يكشف اكتشاف مجموعة بيانات غير ممثلة عن أن النموذج لا يتعلم بشكل جيد، مما يؤدي إلى ارتفاع الأخطاء. وجود نموذج يحتوي على تحيز في البيانات ليس فقط مشكلة عدالة ولكنه يظهر أن النموذج غير شامل أو موثوق.
![مكون تحليل البيانات في لوحة تحكم الذكاء الاصطناعي المسؤول](../../../../translated_images/dataanalysis-cover.8d6d0683a70a5c1e274e5a94b27a71137e3d0a3b707761d7170eb340dd07f11d.ar.png)
![مكون تحليل البيانات في لوحة القيادة للذكاء الاصطناعي المسؤول](../../../../9-Real-World/2-Debugging-ML-Models/images/dataanalysis-cover.png)
استخدم تحليل البيانات عندما تحتاج إلى:
* استكشاف إحصائيات مجموعة البيانات الخاصة بك عن طريق اختيار مرشحات مختلفة لتقسيم بياناتك إلى أبعاد مختلفة (تُعرف أيضًا بالمجموعات).
* استكشاف إحصائيات مجموعة البيانات الخاصة بك عن طريق اختيار عوامل تصفية مختلفة لتقسيم البيانات إلى أبعاد مختلفة (المعروفة أيضًا بالمجموعات).
* فهم توزيع مجموعة البيانات الخاصة بك عبر مجموعات مختلفة ومجموعات الميزات.
* تحديد ما إذا كانت النتائج المتعلقة بالعدالة، تحليل الأخطاء، والسببية (المستمدة من مكونات لوحة التحكم الأخرى) ناتجة عن توزيع مجموعة البيانات الخاصة بك.
* تحديد المناطق التي يجب جمع المزيد من البيانات فيها لتخفيف الأخطاء الناتجة عن مشكلات التمثيل، ضوضاء العلامات، ضوضاء الميزات، تحيز العلامات، وعوامل مشابهة.
* تحديد ما إذا كانت النتائج المتعلقة بالعدالة، تحليل الأخطاء، والسببية (المستمدة من مكونات لوحة القيادة الأخرى) هي نتيجة توزيع مجموعة البيانات الخاصة بك.
* اتخاذ قرار بشأن المناطق التي يجب جمع المزيد من البيانات فيها لتخفيف الأخطاء الناتجة عن مشكلات التمثيل، ضوضاء العلامات، ضوضاء الميزات، تحيز العلامات، وعوامل مشابهة.
## تفسير النموذج
تميل نماذج تعلم الآلة إلى أن تكون صناديق سوداء. فهم الميزات الرئيسية التي تدفع توقعات النموذج يمكن أن يكون تحديًا. من المهم توفير الشفافية حول سبب اتخاذ النموذج لتوقع معين. على سبيل المثال، إذا توقع نظام ذكاء اصطناعي أن مريضًا مصابًا بالسكري معرض لخطر العودة إلى المستشفى في أقل من 30 يومًا، فيجب أن يكون قادرًا على تقديم بيانات داعمة أدت إلى هذا التوقع. وجود مؤشرات بيانات داعمة يجلب الشفافية لمساعدة الأطباء أو المستشفيات على اتخاذ قرارات مستنيرة. بالإضافة إلى ذلك، القدرة على تفسير سبب اتخاذ النموذج لتوقع معين لمريض فردي يعزز المساءلة مع اللوائح الصحية. عندما تستخدم نماذج تعلم الآلة بطرق تؤثر على حياة الناس، من الضروري فهم وتفسير ما يؤثر على سلوك النموذج. تساعد قابلية تفسير النموذج في الإجابة على أسئلة في سيناريوهات مثل:
نماذج تعلم الآلة تميل إلى أن تكون صناديق سوداء. فهم الميزات الرئيسية للبيانات التي تؤثر على توقعات النموذج يمكن أن يكون تحديًا. من المهم توفير الشفافية حول سبب قيام النموذج بتوقع معين. على سبيل المثال، إذا توقع نظام ذكاء اصطناعي أن مريضًا مصابًا بالسكري معرض لخطر العودة إلى المستشفى في أقل من 30 يومًا، يجب أن يكون قادرًا على تقديم بيانات داعمة أدت إلى توقعه. وجود مؤشرات بيانات داعمة يجلب الشفافية لمساعدة الأطباء أو المستشفيات على اتخاذ قرارات مستنيرة. بالإضافة إلى ذلك، القدرة على تفسير سبب قيام النموذج بتوقع لفرد معين تمكن من المساءلة مع اللوائح الصحية. عندما تستخدم نماذج تعلم الآلة بطرق تؤثر على حياة الناس، من الضروري فهم وتفسير ما يؤثر على سلوك النموذج. تفسير النموذج يساعد في الإجابة على أسئلة في سيناريوهات مثل:
* تصحيح النموذج: لماذا ارتكب النموذج هذا الخطأ؟ كيف يمكنني تحسين النموذج؟
* التعاون بين الإنسان والذكاء الاصطناعي: كيف يمكنني فهم وثقة قرارات النموذج؟
* الامتثال التنظيمي: هل يلبي النموذج المتطلبات القانونية؟
* الامتثال التنظيمي: هل يلبي النموذج متطلبات قانونية؟
يساعد مكون أهمية الميزات في لوحة تحكم الذكاء الاصطناعي المسؤول في تصحيح الأخطاء والحصول على فهم شامل لكيفية اتخاذ النموذج للتوقعات. كما أنه أداة مفيدة لمتخصصي تعلم الآلة وصناع القرار لتفسير وإظهار الأدلة على الميزات التي تؤثر على سلوك النموذج للامتثال التنظيمي. بعد ذلك، يمكن للمستخدمين استكشاف التفسيرات العامة والمحلية للتحقق من الميزات التي تؤثر على توقعات النموذج. تسرد التفسيرات العامة الميزات الرئيسية التي أثرت على توقعات النموذج بشكل عام. تعرض التفسيرات المحلية الميزات التي أدت إلى توقع النموذج لحالة فردية. القدرة على تقييم التفسيرات المحلية مفيدة أيضًا في تصحيح الأخطاء أو تدقيق حالة معينة لفهم وتفسير سبب اتخاذ النموذج لتوقع دقيق أو غير دقيق.
يساعد مكون أهمية الميزات في لوحة القيادة للذكاء الاصطناعي المسؤول في تصحيح وفهم شامل لكيفية قيام النموذج بتوقعاته. كما أنه أداة مفيدة لمهنيي تعلم الآلة وصناع القرار لتفسير وإظهار الأدلة على الميزات التي تؤثر على سلوك النموذج للامتثال التنظيمي. بعد ذلك، يمكن للمستخدمين استكشاف التفسيرات العالمية والمحلية للتحقق من الميزات التي تؤثر على توقعات النموذج. التفسيرات العالمية تسرد الميزات الرئيسية التي أثرت على توقعات النموذج بشكل عام. التفسيرات المحلية تعرض الميزات التي أدت إلى توقع النموذج لحالة فردية. القدرة على تقييم التفسيرات المحلية مفيدة أيضًا في تصحيح أو تدقيق حالة معينة لفهم وتفسير سبب قيام النموذج بتوقع صحيح أو خاطئ.
![مكون أهمية الميزات في لوحة تحكم الذكاء الاصطناعي المسؤول](../../../../translated_images/9-feature-importance.cd3193b4bba3fd4bccd415f566c2437fb3298c4824a3dabbcab15270d783606e.ar.png)
![مكون أهمية الميزات في لوحة القيادة للذكاء الاصطناعي المسؤول](../../../../9-Real-World/2-Debugging-ML-Models/images/9-feature-importance.png)
* التفسيرات العامة: على سبيل المثال، ما الميزات التي تؤثر على السلوك العام لنموذج إعادة إدخال مرضى السكري إلى المستشفى؟
* التفسيرات المحلية: على سبيل المثال، لماذا تم توقع أن مريضًا مصابًا بالسكري يزيد عمره عن 60 عامًا وله تاريخ من الدخول إلى المستشفى سيتم إعادة إدخاله أو لن يتم إعادة إدخاله إلى المستشفى خلال 30 يومًا؟
* التفسيرات العالمية: على سبيل المثال، ما الميزات التي تؤثر على السلوك العام لنموذج إعادة دخول المستشفى لمرضى السكري؟
* التفسيرات المحلية: على سبيل المثال، لماذا تم توقع أن مريضًا مصابًا بالسكري يزيد عمره عن 60 عامًا وله دخول سابق إلى المستشفى سيتم إعادة دخوله أو عدم إعادة دخوله خلال 30 يومًا إلى المستشفى؟
في عملية تصحيح أداء النموذج عبر مجموعات مختلفة، تُظهر أهمية الميزات مستوى تأثير الميزة عبر المجموعات. يساعد ذلك في الكشف عن الشذوذ عند مقارنة مستوى تأثير الميزة في دفع توقعات النموذج الخاطئة. يمكن لمكون أهمية الميزات أن يُظهر القيم في ميزة معينة التي أثرت إيجابًا أو سلبًا على نتيجة النموذج. على سبيل المثال، إذا قام النموذج بتوقع غير دقيق، يتيح لك المكون القدرة على التعمق وتحديد الميزات أو قيم الميزات التي دفعت التوقع. يساعد هذا المستوى من التفاصيل ليس فقط في التصحيح ولكن يوفر الشفافية والمساءلة في حالات التدقيق. أخيرًا، يمكن للمكون أن يساعدك في تحديد مشكلات العدالة. على سبيل المثال، إذا كانت ميزة حساسة مثل العرق أو الجنس لها تأثير كبير في دفع توقعات النموذج، فقد يكون هذا مؤشرًا على وجود تحيز عرقي أو جنسي في النموذج.
في عملية تصحيح أداء النموذج عبر مجموعات مختلفة، تظهر أهمية الميزات مستوى تأثير الميزة عبر المجموعات. يساعد ذلك في الكشف عن الشذوذ عند مقارنة مستوى تأثير الميزة في قيادة توقعات النموذج الخاطئة. يمكن لمكون أهمية الميزات أن يظهر القيم في ميزة ما التي أثرت إيجابيًا أو سلبيًا على نتيجة النموذج. على سبيل المثال، إذا قام النموذج بتوقع خاطئ، يمنحك المكون القدرة على التعمق وتحديد الميزات أو قيم الميزات التي دفعت التوقع. هذا المستوى من التفاصيل يساعد ليس فقط في التصحيح ولكن يوفر الشفافية والمساءلة في حالات التدقيق. أخيرًا، يمكن للمكون أن يساعدك في تحديد مشكلات العدالة. لتوضيح ذلك، إذا كانت ميزة حساسة مثل العرق أو الجنس مؤثرة بشكل كبير في قيادة توقعات النموذج، فقد يكون هذا علامة على وجود تحيز عرقي أو جنسي في النموذج.
![أهمية الميزات](../../../../translated_images/9-features-influence.3ead3d3f68a84029f1e40d3eba82107445d3d3b6975d4682b23d8acc905da6d0.ar.png)
![أهمية الميزات](../../../../9-Real-World/2-Debugging-ML-Models/images/9-features-influence.png)
استخدم التفسيرية عندما تحتاج إلى:
استخدم التفسير عندما تحتاج إلى:
* تحديد مدى موثوقية توقعات نظام الذكاء الاصطناعي الخاص بك من خلال فهم الميزات الأكثر أهمية للتوقعات.
* الاقتراب من تصحيح النموذج من خلال فهمه أولاً وتحديد ما إذا كان النموذج يستخدم ميزات صحية أو مجرد ارتباطات خاطئة.
* الكشف عن مصادر محتملة للانحياز من خلال فهم ما إذا كان النموذج يعتمد في توقعاته على ميزات حساسة أو ميزات مرتبطة بها بشكل كبير.
* الكشف عن مصادر محتملة لعدم العدالة من خلال فهم ما إذا كان النموذج يعتمد في توقعاته على ميزات حساسة أو ميزات مرتبطة بها بشكل كبير.
* بناء ثقة المستخدم في قرارات النموذج من خلال توليد تفسيرات محلية لتوضيح نتائجها.
* إكمال تدقيق تنظيمي لنظام ذكاء اصطناعي للتحقق من النماذج ومراقبة تأثير قرارات النموذج على البشر.
* إكمال تدقيق تنظيمي لنظام الذكاء الاصطناعي للتحقق من صحة النماذج ومراقبة تأثير قرارات النموذج على البشر.
## الخاتمة
تُعد جميع مكونات لوحة تحكم الذكاء الاصطناعي المسؤول أدوات عملية لمساعدتك في بناء نماذج تعلم الآلة التي تكون أقل ضررًا وأكثر موثوقية للمجتمع. تعمل على تحسين الوقاية من التهديدات لحقوق الإنسان؛ التمييز أو استبعاد مجموعات معينة من فرص الحياة؛ وخطر الإصابة الجسدية أو النفسية. كما تساعد في بناء الثقة في قرارات النموذج من خلال توليد تفسيرات محلية لتوضيح نتائجها. يمكن تصنيف بعض الأضرار المحتملة على النحو التالي:
جميع مكونات لوحة القيادة للذكاء الاصطناعي المسؤول هي أدوات عملية تساعدك في بناء نماذج تعلم الآلة التي تكون أقل ضررًا وأكثر موثوقية للمجتمع. إنها تحسن الوقاية من التهديدات لحقوق الإنسان؛ التمييز أو استبعاد مجموعات معينة من فرص الحياة؛ وخطر الإصابة الجسدية أو النفسية. كما أنها تساعد في بناء الثقة في قرارات النموذج من خلال توليد تفسيرات محلية لتوضيح نتائجها. بعض الأضرار المحتملة يمكن تصنيفها كالتالي:
- **التخصيص**: إذا تم تفضيل جنس أو عرق معين على آخر.
- **جودة الخدمة**: إذا تم تدريب البيانات على سيناريو معين ولكن الواقع أكثر تعقيدًا، مما يؤدي إلى خدمة ضعيفة الأداء.
- **التنميط**: ربط مجموعة معينة بسمات محددة مسبقًا.
- **التقليل من القيمة**: الانتقاد غير العادل ووضع تصنيفات سلبية على شيء أو شخص معين.
- **التخصيص**، إذا تم تفضيل جنس أو عرق على آخر.
- **جودة الخدمة**. إذا قمت بتدريب البيانات على سيناريو معين ولكن الواقع أكثر تعقيدًا، يؤدي ذلك إلى خدمة ضعيفة الأداء.
- **التصنيف النمطي**. ربط مجموعة معينة بصفات محددة مسبقًا.
- **التقليل من القيمة**. النقد غير العادل ووضع علامات سلبية على شيء أو شخص معين.
- **التمثيل الزائد أو الناقص**. الفكرة هي أن مجموعة معينة لا تُرى في مهنة معينة، وأي خدمة أو وظيفة تستمر في تعزيز ذلك تساهم في الضرر.
### لوحة معلومات Azure RAI
[لوحة معلومات Azure RAI](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) مبنية على أدوات مفتوحة المصدر طورتها مؤسسات أكاديمية ومنظمات رائدة، بما في ذلك Microsoft، وهي أدوات أساسية لعلماء البيانات ومطوري الذكاء الاصطناعي لفهم سلوك النماذج بشكل أفضل، واكتشاف المشكلات غير المرغوب فيها والتخفيف منها في نماذج الذكاء الاصطناعي.
[لوحة معلومات Azure RAI](https://learn.microsoft.com/en-us/azure/machine-learning/concept-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu) مبنية على أدوات مفتوحة المصدر طورتها مؤسسات أكاديمية ومنظمات رائدة، بما في ذلك Microsoft، وهي أدوات أساسية لمساعدة علماء البيانات ومطوري الذكاء الاصطناعي على فهم سلوك النماذج بشكل أفضل، واكتشاف ومعالجة المشكلات غير المرغوب فيها في نماذج الذكاء الاصطناعي.
- تعلم كيفية استخدام المكونات المختلفة من خلال الاطلاع على [وثائق لوحة معلومات RAI.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-responsible-ai-dashboard?WT.mc_id=aiml-90525-ruyakubu)
- استعرض بعض [دفاتر الملاحظات النموذجية للوحة معلومات RAI](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) لتصحيح سيناريوهات الذكاء الاصطناعي الأكثر مسؤولية في Azure Machine Learning.
- استعرض بعض [دفاتر الملاحظات التجريبية للوحة معلومات RAI](https://github.com/Azure/RAI-vNext-Preview/tree/main/examples/notebooks) لتصحيح سيناريوهات الذكاء الاصطناعي الأكثر مسؤولية في Azure Machine Learning.
---
## 🚀 التحدي
لمنع إدخال التحيزات الإحصائية أو المتعلقة بالبيانات من البداية، يجب علينا:
لمنع إدخال التحيزات الإحصائية أو البيانات من البداية، يجب علينا:
- ضمان تنوع الخلفيات ووجهات النظر بين الأشخاص الذين يعملون على الأنظمة
- الاستثمار في مجموعات بيانات تعكس تنوع مجتمعنا
- تطوير طرق أفضل لاكتشاف التحيز وتصحيحه عند حدوثه
- ضمان تنوع الخلفيات ووجهات النظر بين الأشخاص الذين يعملون على الأنظمة
- الاستثمار في مجموعات بيانات تعكس تنوع مجتمعنا
- تطوير طرق أفضل للكشف عن التحيز وتصحيحه عند حدوثه
فكر في سيناريوهات واقعية حيث يكون الظلم واضحًا في بناء النماذج واستخدامها. ما الذي يجب أن نأخذه بعين الاعتبار أيضًا؟
## [اختبار ما بعد المحاضرة](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/6/)
## [اختبار ما بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
## المراجعة والدراسة الذاتية
في هذا الدرس، تعلمت بعض الأدوات العملية لتضمين الذكاء الاصطناعي المسؤول في تعلم الآلة.
في هذه الدرس، تعلمت بعض الأدوات العملية لتضمين الذكاء الاصطناعي المسؤول في تعلم الآلة.
شاهد هذا الورشة للتعمق أكثر في المواضيع:
شاهد هذه الورشة للتعمق أكثر في المواضيع:
- لوحة معلومات الذكاء الاصطناعي المسؤول: منصة شاملة لتطبيق RAI عمليًا بواسطة بسميرة نوشي ومهرنوش ساميكي
- لوحة معلومات الذكاء الاصطناعي المسؤول: منصة شاملة لتطبيق الذكاء الاصطناعي المسؤول عمليًا بواسطة بسميرة نوشي ومهرنوش ساميكي
[![لوحة معلومات الذكاء الاصطناعي المسؤول: منصة شاملة لتطبيق RAI عمليًا](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "لوحة معلومات الذكاء الاصطناعي المسؤول: منصة شاملة لتطبيق RAI عمليًا بواسطة بسميرة نوشي ومهرنوش ساميكي")
[![لوحة معلومات الذكاء الاصطناعي المسؤول: منصة شاملة لتطبيق الذكاء الاصطناعي المسؤول عمليًا](https://img.youtube.com/vi/f1oaDNl3djg/0.jpg)](https://www.youtube.com/watch?v=f1oaDNl3djg "لوحة معلومات الذكاء الاصطناعي المسؤول: منصة شاملة لتطبيق الذكاء الاصطناعي المسؤول عمليًا")
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: لوحة معلومات الذكاء الاصطناعي المسؤول: منصة شاملة لتطبيق RAI عمليًا بواسطة بسميرة نوشي ومهرنوش ساميكي
> 🎥 انقر على الصورة أعلاه لمشاهدة الفيديو: لوحة معلومات الذكاء الاصطناعي المسؤول: منصة شاملة لتطبيق الذكاء الاصطناعي المسؤول عمليًا بواسطة بسميرة نوشي ومهرنوش ساميكي
ارجع إلى المواد التالية لتتعلم المزيد عن الذكاء الاصطناعي المسؤول وكيفية بناء نماذج أكثر موثوقية:
راجع المواد التالية لتتعلم المزيد عن الذكاء الاصطناعي المسؤول وكيفية بناء نماذج أكثر موثوقية:
- أدوات لوحة معلومات Microsoft RAI لتصحيح نماذج تعلم الآلة: [موارد أدوات الذكاء الاصطناعي المسؤول](https://aka.ms/rai-dashboard)
@ -171,13 +171,13 @@ CO_OP_TRANSLATOR_METADATA:
- مركز موارد Microsoft RAI: [موارد الذكاء الاصطناعي المسؤول Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- مجموعة أبحاث FATE من Microsoft: [FATE: العدالة، المساءلة، الشفافية، والأخلاقيات في الذكاء الاصطناعي - أبحاث Microsoft](https://www.microsoft.com/research/theme/fate/)
- مجموعة أبحاث FATE التابعة لـ Microsoft: [FATE: العدالة، المساءلة، الشفافية، والأخلاقيات في الذكاء الاصطناعي - أبحاث Microsoft](https://www.microsoft.com/research/theme/fate/)
## الواجب
[استكشاف لوحة معلومات RAI](assignment.md)
[استكشف لوحة معلومات RAI](assignment.md)
---
**إخلاء المسؤولية**:
تمت ترجمة هذا المستند باستخدام خدمة الترجمة الآلية [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حساسة أو هامة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة تنشأ عن استخدام هذه الترجمة.
تم ترجمة هذا المستند باستخدام خدمة الترجمة بالذكاء الاصطناعي [Co-op Translator](https://github.com/Azure/co-op-translator). بينما نسعى لتحقيق الدقة، يرجى العلم أن الترجمات الآلية قد تحتوي على أخطاء أو معلومات غير دقيقة. يجب اعتبار المستند الأصلي بلغته الأصلية هو المصدر الموثوق. للحصول على معلومات حاسمة، يُوصى بالاستعانة بترجمة بشرية احترافية. نحن غير مسؤولين عن أي سوء فهم أو تفسيرات خاطئة ناتجة عن استخدام هذه الترجمة.

@ -1,8 +1,8 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b79add6cc71cc7468fa23c9cf42f2327",
"translation_date": "2025-09-04T06:13:14+00:00",
"original_hash": "612aef7a03204260e940131b09691977",
"translation_date": "2025-09-04T20:36:54+00:00",
"source_file": "README.md",
"language_code": "ar"
}
@ -19,7 +19,7 @@ CO_OP_TRANSLATOR_METADATA:
### 🌐 دعم متعدد اللغات
#### مدعوم عبر GitHub Action (تلقائي ومحدث دائمًا)
#### مدعوم عبر GitHub Action (تلقائي ودائم التحديث)
[French](../fr/README.md) | [Spanish](../es/README.md) | [German](../de/README.md) | [Russian](../ru/README.md) | [Arabic](./README.md) | [Persian (Farsi)](../fa/README.md) | [Urdu](../ur/README.md) | [Chinese (Simplified)](../zh/README.md) | [Chinese (Traditional, Macau)](../mo/README.md) | [Chinese (Traditional, Hong Kong)](../hk/README.md) | [Chinese (Traditional, Taiwan)](../tw/README.md) | [Japanese](../ja/README.md) | [Korean](../ko/README.md) | [Hindi](../hi/README.md) | [Bengali](../bn/README.md) | [Marathi](../mr/README.md) | [Nepali](../ne/README.md) | [Punjabi (Gurmukhi)](../pa/README.md) | [Portuguese (Portugal)](../pt/README.md) | [Portuguese (Brazil)](../br/README.md) | [Italian](../it/README.md) | [Polish](../pl/README.md) | [Turkish](../tr/README.md) | [Greek](../el/README.md) | [Thai](../th/README.md) | [Swedish](../sv/README.md) | [Danish](../da/README.md) | [Norwegian](../no/README.md) | [Finnish](../fi/README.md) | [Dutch](../nl/README.md) | [Hebrew](../he/README.md) | [Vietnamese](../vi/README.md) | [Indonesian](../id/README.md) | [Malay](../ms/README.md) | [Tagalog (Filipino)](../tl/README.md) | [Swahili](../sw/README.md) | [Hungarian](../hu/README.md) | [Czech](../cs/README.md) | [Slovak](../sk/README.md) | [Romanian](../ro/README.md) | [Bulgarian](../bg/README.md) | [Serbian (Cyrillic)](../sr/README.md) | [Croatian](../hr/README.md) | [Slovenian](../sl/README.md) | [Ukrainian](../uk/README.md) | [Burmese (Myanmar)](../my/README.md)
@ -31,17 +31,17 @@ CO_OP_TRANSLATOR_METADATA:
> 🌍 سافر حول العالم بينما نستكشف تعلم الآلة من خلال ثقافات العالم 🌍
يسر دعاة السحابة في Microsoft تقديم منهج دراسي لمدة 12 أسبوعًا و26 درسًا حول **تعلم الآلة**. في هذا المنهج، ستتعلم ما يُطلق عليه أحيانًا **تعلم الآلة الكلاسيكي**، باستخدام مكتبة Scikit-learn بشكل أساسي وتجنب التعلم العميق، الذي يتم تغطيته في [منهج الذكاء الاصطناعي للمبتدئين](https://aka.ms/ai4beginners). قم بدمج هذه الدروس مع [منهج علم البيانات للمبتدئين](https://aka.ms/ds4beginners) أيضًا!
يسر فريق Cloud Advocates في Microsoft أن يقدم منهجًا دراسيًا لمدة 12 أسبوعًا و26 درسًا حول **تعلم الآلة**. في هذا المنهج، ستتعلم ما يُطلق عليه أحيانًا **تعلم الآلة الكلاسيكي**، باستخدام مكتبة Scikit-learn بشكل أساسي وتجنب التعلم العميق، الذي يتم تغطيته في [منهج الذكاء الاصطناعي للمبتدئين](https://aka.ms/ai4beginners). قم بدمج هذه الدروس مع [منهج علم البيانات للمبتدئين](https://aka.ms/ds4beginners) أيضًا!
سافر معنا حول العالم بينما نطبق هذه التقنيات الكلاسيكية على بيانات من مناطق مختلفة من العالم. يتضمن كل درس اختبارات قبل وبعد الدرس، تعليمات مكتوبة لإكمال الدرس، حل، مهمة، والمزيد. تسمح لك طريقة التدريس القائمة على المشاريع بالتعلم أثناء البناء، وهي طريقة مثبتة لتثبيت المهارات الجديدة.
سافر معنا حول العالم بينما نطبق هذه التقنيات الكلاسيكية على بيانات من مناطق مختلفة من العالم. يتضمن كل درس اختبارات قبل وبعد الدرس، تعليمات مكتوبة لإكمال الدرس، حلول، مهام، والمزيد. تسمح لك طريقة التعلم القائمة على المشاريع بالتعلم أثناء البناء، وهي طريقة مثبتة لجعل المهارات الجديدة "تلتصق".
**✍️ شكر جزيل لمؤلفينا** Jen Looper, Stephen Howell, Francesca Lazzeri, Tomomi Imura, Cassie Breviu, Dmitry Soshnikov, Chris Noring, Anirban Mukherjee, Ornella Altunyan, Ruth Yakubu و Amy Boyd
**🎨 شكر أيضًا لرسامينا** Tomomi Imura, Dasani Madipalli, و Jen Looper
**🎨 شكر أيضًا لرسامينا** Tomomi Imura, Dasani Madipalli و Jen Looper
**🙏 شكر خاص 🙏 لمؤلفي ومراجعي ومساهمي المحتوى من سفراء الطلاب في Microsoft**، وخاصة Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila، و Snigdha Agarwal
**🙏 شكر خاص 🙏 لمؤلفي ومراجعي ومساهمي المحتوى من سفراء الطلاب في Microsoft**، وخاصة Rishit Dagli, Muhammad Sakib Khan Inan, Rohan Raj, Alexandru Petrescu, Abhishek Jaiswal, Nawrin Tabassum, Ioan Samuila و Snigdha Agarwal
**🤩 شكر إضافي لسفراء الطلاب في Microsoft Eric Wanjau, Jasleen Sondhi، و Vidushi Gupta لدروس R الخاصة بنا!**
**🤩 شكر إضافي لسفراء الطلاب في Microsoft Eric Wanjau, Jasleen Sondhi و Vidushi Gupta لدروس R الخاصة بنا!**
# البدء
@ -49,19 +49,19 @@ CO_OP_TRANSLATOR_METADATA:
1. **قم بعمل Fork للمستودع**: انقر على زر "Fork" في الزاوية العلوية اليمنى من هذه الصفحة.
2. **قم باستنساخ المستودع**: `git clone https://github.com/microsoft/ML-For-Beginners.git`
> [اعثر على جميع الموارد الإضافية لهذه الدورة في مجموعة Microsoft Learn الخاصة بنا](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
> [اعثر على جميع الموارد الإضافية لهذا الدورة في مجموعة Microsoft Learn الخاصة بنا](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
**[الطلاب](https://aka.ms/student-page)**، لاستخدام هذا المنهج، قم بعمل Fork للمستودع بالكامل إلى حساب GitHub الخاص بك وأكمل التمارين بمفردك أو مع مجموعة:
- ابدأ باختبار ما قبل المحاضرة.
- ابدأ باختبار قبل المحاضرة.
- اقرأ المحاضرة وأكمل الأنشطة، مع التوقف والتفكير عند كل نقطة تحقق من المعرفة.
- حاول إنشاء المشاريع من خلال فهم الدروس بدلاً من تشغيل كود الحل؛ ومع ذلك، يتوفر هذا الكود في مجلدات `/solution` في كل درس قائم على المشروع.
- قم بإجراء اختبار ما بعد المحاضرة.
- قم بإجراء اختبار بعد المحاضرة.
- أكمل التحدي.
- أكمل المهمة.
- بعد إكمال مجموعة الدروس، قم بزيارة [لوحة المناقشة](https://github.com/microsoft/ML-For-Beginners/discussions) و"تعلم بصوت عالٍ" من خلال ملء نموذج PAT المناسب. PAT هو أداة تقييم تقدم وهي نموذج تقوم بملئه لتعزيز تعلمك. يمكنك أيضًا التفاعل مع PATs الآخرين حتى نتعلم معًا.
- بعد إكمال مجموعة الدروس، قم بزيارة [لوحة المناقشة](https://github.com/microsoft/ML-For-Beginners/discussions) و"تعلم بصوت عالٍ" من خلال ملء نموذج PAT المناسب. PAT هو أداة تقييم تقدمية وهي نموذج تقوم بملئه لتعزيز تعلمك. يمكنك أيضًا التفاعل مع نماذج PAT الأخرى حتى نتعلم معًا.
> لمزيد من الدراسة، نوصي باتباع هذه [وحدات ومسارات التعلم من Microsoft](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott).
> لمزيد من الدراسة، نوصي بمتابعة هذه [وحدات ومسارات التعلم من Microsoft Learn](https://docs.microsoft.com/en-us/users/jenlooper-2911/collections/k7o7tg1gp306q4?WT.mc_id=academic-77952-leestott).
**المعلمون**، لقد قمنا [بتضمين بعض الاقتراحات](for-teachers.md) حول كيفية استخدام هذا المنهج.
@ -85,43 +85,43 @@ CO_OP_TRANSLATOR_METADATA:
---
## طريقة التدريس
## النهج التربوي
لقد اخترنا مبدأين تربويين أثناء بناء هذا المنهج: التأكد من أنه عملي **قائم على المشاريع** وأنه يتضمن **اختبارات متكررة**. بالإضافة إلى ذلك، يحتوي هذا المنهج على **موضوع مشترك** لإعطائه التماسك.
لقد اخترنا مبدأين تربويين أثناء بناء هذا المنهج: التأكد من أنه عملي **قائم على المشاريع** وأنه يتضمن **اختبارات متكررة**. بالإضافة إلى ذلك، يحتوي هذا المنهج على **موضوع مشترك** يمنحه التماسك.
من خلال ضمان أن المحتوى يتماشى مع المشاريع، تصبح العملية أكثر جاذبية للطلاب ويتم تعزيز الاحتفاظ بالمفاهيم. بالإضافة إلى ذلك، يحدد الاختبار منخفض المخاطر قبل الفصل نية الطالب نحو تعلم موضوع معين، بينما يضمن الاختبار الثاني بعد الفصل تعزيز الاحتفاظ. تم تصميم هذا المنهج ليكون مرنًا وممتعًا ويمكن أخذه بالكامل أو جزئيًا. تبدأ المشاريع صغيرة وتصبح أكثر تعقيدًا بحلول نهاية الدورة التي تستغرق 12 أسبوعًا. يتضمن هذا المنهج أيضًا ملحقًا حول التطبيقات الواقعية لتعلم الآلة، والذي يمكن استخدامه كائتمان إضافي أو كأساس للنقاش.
من خلال ضمان توافق المحتوى مع المشاريع، تصبح العملية أكثر جاذبية للطلاب ويتم تعزيز الاحتفاظ بالمفاهيم. بالإضافة إلى ذلك، يحدد الاختبار منخفض المخاطر قبل الفصل نية الطالب نحو تعلم موضوع معين، بينما يضمن الاختبار الثاني بعد الفصل تعزيز الاحتفاظ. تم تصميم هذا المنهج ليكون مرنًا وممتعًا ويمكن أخذه بالكامل أو جزئيًا. تبدأ المشاريع صغيرة وتصبح أكثر تعقيدًا بحلول نهاية الدورة التي تستمر 12 أسبوعًا. يتضمن هذا المنهج أيضًا ملحقًا حول التطبيقات الواقعية لتعلم الآلة، والذي يمكن استخدامه كائتمان إضافي أو كأساس للنقاش.
> اعثر على [مدونة قواعد السلوك](CODE_OF_CONDUCT.md)، [المساهمة](CONTRIBUTING.md)، و[إرشادات الترجمة](TRANSLATIONS.md). نرحب بملاحظاتك البناءة!
## كل درس يتضمن
- رسم تخطيطي اختياري
- فيديو تكميلي اختياري
- فيديو إضافي اختياري
- فيديو توضيحي (بعض الدروس فقط)
- اختبار تمهيدي قبل المحاضرة
- [اختبار تمهيدي قبل المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
- درس مكتوب
- بالنسبة للدروس القائمة على المشاريع، إرشادات خطوة بخطوة حول كيفية بناء المشروع
- نقاط تحقق من المعرفة
- تحدي
- قراءة إضافية
- مهمة
- اختبار بعد المحاضرة
- [اختبار بعد المحاضرة](https://ff-quizzes.netlify.app/en/ml/)
> **ملاحظة حول اللغات**: هذه الدروس مكتوبة بشكل أساسي بلغة Python، ولكن العديد منها متوفر أيضًا بلغة R. لإكمال درس بلغة R، انتقل إلى مجلد `/solution` وابحث عن دروس R. تتضمن امتداد .rmd الذي يمثل ملف **R Markdown** والذي يمكن تعريفه ببساطة على أنه تضمين لـ `كتل الكود` (بلغة R أو لغات أخرى) و`رأس YAML` (الذي يوجه كيفية تنسيق المخرجات مثل PDF) في `وثيقة Markdown`. وبالتالي، فإنه يعمل كإطار عمل تأليفي مثالي لعلم البيانات لأنه يسمح لك بدمج الكود الخاص بك، ومخرجاته، وأفكارك من خلال السماح لك بكتابتها في Markdown. علاوة على ذلك، يمكن عرض مستندات R Markdown بتنسيقات إخراج مثل PDF أو HTML أو Word.
> **ملاحظة حول الاختبارات**: جميع الاختبارات موجودة في [مجلد تطبيق الاختبار](../../quiz-app)، بإجمالي 52 اختبارًا يحتوي كل منها على ثلاثة أسئلة. يتم ربطها من داخل الدروس ولكن يمكن تشغيل تطبيق الاختبار محليًا؛ اتبع التعليمات في مجلد `quiz-app` لاستضافة التطبيق محليًا أو نشره على Azure.
> **ملاحظة حول الاختبارات**: جميع الاختبارات موجودة في [مجلد تطبيق الاختبارات](../../quiz-app)، بإجمالي 52 اختبارًا يحتوي كل منها على ثلاثة أسئلة. يتم ربطها من داخل الدروس ولكن يمكن تشغيل تطبيق الاختبارات محليًا؛ اتبع التعليمات في مجلد `quiz-app` لاستضافة التطبيق محليًا أو نشره على Azure.
| رقم الدرس | الموضوع | مجموعة الدروس | أهداف التعلم | الدرس المرتبط | المؤلف |
| :-----------: | :------------------------------------------------------------: | :-------------------------------------------------: | ------------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------: |
| 01 | مقدمة في تعلم الآلة | [المقدمة](1-Introduction/README.md) | تعلم المفاهيم الأساسية وراء تعلم الآلة | [الدرس](1-Introduction/1-intro-to-ML/README.md) | محمد |
| 02 | تاريخ تعلم الآلة | [المقدمة](1-Introduction/README.md) | تعلم التاريخ الذي يقوم عليه هذا المجال | [الدرس](1-Introduction/2-history-of-ML/README.md) | جين وأيمي |
| 03 | الإنصاف وتعلم الآلة | [المقدمة](1-Introduction/README.md) | ما هي القضايا الفلسفية المهمة حول الإنصاف التي يجب أن يأخذها الطلاب في الاعتبار عند بناء وتطبيق نماذج تعلم الآلة؟ | [الدرس](1-Introduction/3-fairness/README.md) | تومومي |
| 04 | تقنيات تعلم الآلة | [المقدمة](1-Introduction/README.md) | ما هي التقنيات التي يستخدمها الباحثون في تعلم الآلة لبناء نماذج تعلم الآلة؟ | [الدرس](1-Introduction/4-techniques-of-ML/README.md) | كريس وجين |
| 04 | تقنيات تعلم الآلة | [Introduction](1-Introduction/README.md) | ما هي التقنيات التي يستخدمها الباحثون في تعلم الآلة لبناء نماذج تعلم الآلة؟ | [Lesson](1-Introduction/4-techniques-of-ML/README.md) | كريس وجين |
| 05 | مقدمة في الانحدار | [Regression](2-Regression/README.md) | البدء باستخدام Python و Scikit-learn لنماذج الانحدار |
<ul><li>[Python](2-Regression/1-Tools/README.md)</li><li>[R](../../2-Regression/1-Tools/solution/R/lesson_1.html)</li></ul> | <ul><li>جين</li><li>إريك وانجاو</li></ul> |
| 06 | أسعار اليقطين في أمريكا الشمالية 🎃 | [Regression](2-Regression/README.md) | تصور وتنظيف البيانات استعدادًا لتعلم الآلة | <ul><li>[Python](2-Regression/2-Data/README.md)</li><li>[R](../../2-Regression/2-Data/solution/R/lesson_2.html)</li></ul> | <ul><li>جين</li><li>إريك وانجاو</li></ul> |
| 07 | أسعار اليقطين في أمريكا الشمالية 🎃 | [Regression](2-Regression/README.md) | بناء نماذج الانحدار الخطي والمتعدد | <ul><li>[Python](2-Regression/3-Linear/README.md)</li><li>[R](../../2-Regression/3-Linear/solution/R/lesson_3.html)</li></ul> | <ul><li>جين وديمتري</li><li>إريك وانجاو</li></ul> |
| 08 | أسعار اليقطين في أمريكا الشمالية 🎃 | [Regression](2-Regression/README.md) | بناء نموذج الانحدار اللوجستي | <ul><li>[Python](2-Regression/4-Logistic/README.md) </li><li>[R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)</li></ul> | <ul><li>جين</li><li>إريك وانجاو</li></ul> |
| 06 | أسعار القرع في أمريكا الشمالية 🎃 | [Regression](2-Regression/README.md) | تصور وتنظيف البيانات استعدادًا لتعلم الآلة | <ul><li>[Python](2-Regression/2-Data/README.md)</li><li>[R](../../2-Regression/2-Data/solution/R/lesson_2.html)</li></ul> | <ul><li>جين</li><li>إريك وانجاو</li></ul> |
| 07 | أسعار القرع في أمريكا الشمالية 🎃 | [Regression](2-Regression/README.md) | بناء نماذج الانحدار الخطي والمتعدد | <ul><li>[Python](2-Regression/3-Linear/README.md)</li><li>[R](../../2-Regression/3-Linear/solution/R/lesson_3.html)</li></ul> | <ul><li>جين وديمتري</li><li>إريك وانجاو</li></ul> |
| 08 | أسعار القرع في أمريكا الشمالية 🎃 | [Regression](2-Regression/README.md) | بناء نموذج انحدار لوجستي | <ul><li>[Python](2-Regression/4-Logistic/README.md) </li><li>[R](../../2-Regression/4-Logistic/solution/R/lesson_4.html)</li></ul> | <ul><li>جين</li><li>إريك وانجاو</li></ul> |
| 09 | تطبيق ويب 🔌 | [Web App](3-Web-App/README.md) | بناء تطبيق ويب لاستخدام النموذج المدرب | [Python](3-Web-App/1-Web-App/README.md) | جين |
| 10 | مقدمة في التصنيف | [Classification](4-Classification/README.md) | تنظيف البيانات وتحضيرها وتصورها؛ مقدمة في التصنيف | <ul><li> [Python](4-Classification/1-Introduction/README.md) </li><li>[R](../../4-Classification/1-Introduction/solution/R/lesson_10.html) | <ul><li>جين وكاسي</li><li>إريك وانجاو</li></ul> |
| 11 | المأكولات الآسيوية والهندية اللذيذة 🍜 | [Classification](4-Classification/README.md) | مقدمة في المصنفات | <ul><li> [Python](4-Classification/2-Classifiers-1/README.md)</li><li>[R](../../4-Classification/2-Classifiers-1/solution/R/lesson_11.html) | <ul><li>جين وكاسي</li><li>إريك وانجاو</li></ul> |
@ -134,19 +134,19 @@ CO_OP_TRANSLATOR_METADATA:
| 18 | الترجمة وتحليل المشاعر ♥️ | [Natural language processing](6-NLP/README.md) | الترجمة وتحليل المشاعر باستخدام أعمال جين أوستن | [Python](6-NLP/3-Translation-Sentiment/README.md) | ستيفن |
| 19 | الفنادق الرومانسية في أوروبا ♥️ | [Natural language processing](6-NLP/README.md) | تحليل المشاعر باستخدام مراجعات الفنادق 1 | [Python](6-NLP/4-Hotel-Reviews-1/README.md) | ستيفن |
| 20 | الفنادق الرومانسية في أوروبا ♥️ | [Natural language processing](6-NLP/README.md) | تحليل المشاعر باستخدام مراجعات الفنادق 2 | [Python](6-NLP/5-Hotel-Reviews-2/README.md) | ستيفن |
| 21 | مقدمة في التنبؤ بالسلاسل الزمنية | [Time series](7-TimeSeries/README.md) | مقدمة في التنبؤ بالسلاسل الزمنية | [Python](7-TimeSeries/1-Introduction/README.md) | فرانشيسكا |
| 22 | ⚡️ استخدام الطاقة العالمي ⚡️ - التنبؤ بالسلاسل الزمنية باستخدام ARIMA | [Time series](7-TimeSeries/README.md) | التنبؤ بالسلاسل الزمنية باستخدام ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | فرانشيسكا |
| 23 | ⚡️ استخدام الطاقة العالمي ⚡️ - التنبؤ بالسلاسل الزمنية باستخدام SVR | [Time series](7-TimeSeries/README.md) | التنبؤ بالسلاسل الزمنية باستخدام Support Vector Regressor | [Python](7-TimeSeries/3-SVR/README.md) | أنيربان |
| 21 | مقدمة في التنبؤ بالسلاسل الزمنية | [Time series](7-TimeSeries/README.md) | مقدمة في التنبؤ بالسلاسل الزمنية | [Python](7-TimeSeries/1-Introduction/README.md) | فرانسيسكا |
| 22 | ⚡️ استخدام الطاقة العالمية ⚡️ - التنبؤ بالسلاسل الزمنية باستخدام ARIMA | [Time series](7-TimeSeries/README.md) | التنبؤ بالسلاسل الزمنية باستخدام ARIMA | [Python](7-TimeSeries/2-ARIMA/README.md) | فرانسيسكا |
| 23 | ⚡️ استخدام الطاقة العالمية ⚡️ - التنبؤ بالسلاسل الزمنية باستخدام SVR | [Time series](7-TimeSeries/README.md) | التنبؤ بالسلاسل الزمنية باستخدام Support Vector Regressor | [Python](7-TimeSeries/3-SVR/README.md) | أنيربان |
| 24 | مقدمة في التعلم المعزز | [Reinforcement learning](8-Reinforcement/README.md) | مقدمة في التعلم المعزز باستخدام Q-Learning | [Python](8-Reinforcement/1-QLearning/README.md) | ديمتري |
| 25 | مساعدة بيتر لتجنب الذئب! 🐺 | [Reinforcement learning](8-Reinforcement/README.md) | التعلم المعزز باستخدام Gym | [Python](8-Reinforcement/2-Gym/README.md) | ديمتري |
| Postscript | سيناريوهات وتطبيقات تعلم الآلة في العالم الحقيقي | [ML in the Wild](9-Real-World/README.md) | تطبيقات مثيرة وكاشفة لتعلم الآلة الكلاسيكي | [Lesson](9-Real-World/1-Applications/README.md) | الفريق |
| Postscript | تصحيح نماذج تعلم الآلة باستخدام لوحة تحكم الذكاء الاصطناعي المسؤول | [ML in the Wild](9-Real-World/README.md) | تصحيح نماذج تعلم الآلة باستخدام مكونات لوحة تحكم الذكاء الاصطناعي المسؤول | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | روث ياكوب |
| Postscript | تصحيح النماذج في تعلم الآلة باستخدام لوحة تحكم RAI | [ML in the Wild](9-Real-World/README.md) | تصحيح النماذج في تعلم الآلة باستخدام مكونات لوحة تحكم الذكاء الاصطناعي المسؤول | [Lesson](9-Real-World/2-Debugging-ML-Models/README.md) | روث ياكوب |
> [ابحث عن جميع الموارد الإضافية لهذه الدورة في مجموعة Microsoft Learn الخاصة بنا](https://learn.microsoft.com/en-us/collections/qrqzamz1nn2wx3?WT.mc_id=academic-77952-bethanycheum)
## الوصول دون اتصال
يمكنك تشغيل هذا التوثيق دون اتصال باستخدام [Docsify](https://docsify.js.org/#/). قم باستنساخ هذا المستودع، [تثبيت Docsify](https://docsify.js.org/#/quickstart) على جهازك المحلي، ثم في المجلد الجذري لهذا المستودع، اكتب `docsify serve`. سيتم تشغيل الموقع على المنفذ 3000 على جهازك المحلي: `localhost:3000`.
يمكنك تشغيل هذا التوثيق دون اتصال باستخدام [Docsify](https://docsify.js.org/#/). قم باستنساخ هذا المستودع، [تثبيت Docsify](https://docsify.js.org/#/quickstart) على جهازك المحلي، ثم في المجلد الجذر لهذا المستودع، اكتب `docsify serve`. سيتم تشغيل الموقع على المنفذ 3000 على جهازك المحلي: `localhost:3000`.
## ملفات PDF

@ -0,0 +1,159 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "69389392fa6346e0dfa30f664b7b6fec",
"translation_date": "2025-09-05T00:29:44+00:00",
"source_file": "1-Introduction/1-intro-to-ML/README.md",
"language_code": "bg"
}
-->
# Въведение в машинното обучение
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
---
[![ML за начинаещи - Въведение в машинното обучение за начинаещи](https://img.youtube.com/vi/6mSx_KJxcHI/0.jpg)](https://youtu.be/6mSx_KJxcHI "ML за начинаещи - Въведение в машинното обучение за начинаещи")
> 🎥 Кликнете върху изображението по-горе за кратко видео, което разглежда този урок.
Добре дошли в този курс за класическо машинно обучение за начинаещи! Независимо дали сте напълно нови в тази тема или сте опитен специалист по машинно обучение, който иска да освежи знанията си в определена област, радваме се, че сте тук! Целта ни е да създадем приятелска отправна точка за вашето обучение по машинно обучение и ще се радваме да оценим, отговорим и включим вашата [обратна връзка](https://github.com/microsoft/ML-For-Beginners/discussions).
[![Въведение в ML](https://img.youtube.com/vi/h0e2HAPTGF4/0.jpg)](https://youtu.be/h0e2HAPTGF4 "Въведение в ML")
> 🎥 Кликнете върху изображението по-горе за видео: Джон Гуттаг от MIT представя машинното обучение
---
## Започване с машинното обучение
Преди да започнете с тази учебна програма, трябва да подготвите компютъра си, за да може да изпълнява notebooks локално.
- **Конфигурирайте вашата машина с тези видеа**. Използвайте следните линкове, за да научите [как да инсталирате Python](https://youtu.be/CXZYvNRIAKM) на вашата система и [как да настроите текстов редактор](https://youtu.be/EU8eayHWoZg) за разработка.
- **Научете Python**. Препоръчително е да имате основно разбиране за [Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), програмен език, полезен за специалисти по данни, който използваме в този курс.
- **Научете Node.js и JavaScript**. Също така използваме JavaScript няколко пъти в този курс при създаването на уеб приложения, така че ще трябва да имате [node](https://nodejs.org) и [npm](https://www.npmjs.com/) инсталирани, както и [Visual Studio Code](https://code.visualstudio.com/) за разработка както с Python, така и с JavaScript.
- **Създайте GitHub акаунт**. Тъй като ни намерихте тук на [GitHub](https://github.com), вероятно вече имате акаунт, но ако не, създайте такъв и след това направете fork на тази учебна програма, за да я използвате самостоятелно. (Може да ни дадете и звезда 😊)
- **Разгледайте Scikit-learn**. Запознайте се с [Scikit-learn](https://scikit-learn.org/stable/user_guide.html), набор от библиотеки за машинно обучение, които използваме в тези уроци.
---
## Какво е машинно обучение?
Терминът „машинно обучение“ е един от най-популярните и често използвани термини днес. Има голяма вероятност да сте го чували поне веднъж, ако имате някаква връзка с технологиите, независимо от областта, в която работите. Механиката на машинното обучение обаче остава загадка за повечето хора. За начинаещите в машинното обучение темата понякога може да изглежда сложна. Затова е важно да разберем какво всъщност представлява машинното обучение и да го изучаваме стъпка по стъпка чрез практически примери.
---
## Крива на популярността
![ml hype curve](../../../../1-Introduction/1-intro-to-ML/images/hype.png)
> Google Trends показва последната „крива на популярността“ на термина „машинно обучение“
---
## Загадъчна вселена
Живеем във вселена, пълна с очарователни загадки. Велики учени като Стивън Хокинг, Алберт Айнщайн и много други са посветили живота си на търсенето на значима информация, която разкрива тайните на света около нас. Това е човешкото състояние на учене: човешкото дете научава нови неща и разкрива структурата на своя свят година след година, докато расте.
---
## Мозъкът на детето
Мозъкът и сетивата на детето възприемат фактите от заобикалящата го среда и постепенно научават скритите модели на живота, които помагат на детето да създаде логически правила за идентифициране на научените модели. Процесът на учене на човешкия мозък прави хората най-сложните живи същества на този свят. Непрекъснатото учене чрез откриване на скрити модели и след това иновации върху тези модели ни позволява да се подобряваме през целия си живот. Тази способност за учене и еволюция е свързана с концепцията, наречена [пластичност на мозъка](https://www.simplypsychology.org/brain-plasticity.html). Повърхностно можем да направим някои мотивационни сравнения между процеса на учене на човешкия мозък и концепциите на машинното обучение.
---
## Човешкият мозък
[Човешкият мозък](https://www.livescience.com/29365-human-brain.html) възприема нещата от реалния свят, обработва възприетата информация, взема рационални решения и извършва определени действия според обстоятелствата. Това наричаме интелигентно поведение. Когато програмираме подобие на интелигентния процес на поведение в машина, това се нарича изкуствен интелект (AI).
---
## Някои термини
Въпреки че термините могат да бъдат объркващи, машинното обучение (ML) е важен подмножество на изкуствения интелект. **ML се занимава с използването на специализирани алгоритми за откриване на значима информация и намиране на скрити модели от възприетите данни, за да подкрепи процеса на рационално вземане на решения**.
---
## AI, ML, Дълбоко обучение
![AI, ML, deep learning, data science](../../../../1-Introduction/1-intro-to-ML/images/ai-ml-ds.png)
> Диаграма, показваща връзките между AI, ML, дълбоко обучение и наука за данни. Инфографика от [Jen Looper](https://twitter.com/jenlooper), вдъхновена от [тази графика](https://softwareengineering.stackexchange.com/questions/366996/distinction-between-ai-ml-neural-networks-deep-learning-and-data-mining)
---
## Концепции, които ще разгледаме
В тази учебна програма ще разгледаме само основните концепции на машинното обучение, които един начинаещ трябва да знае. Ще се фокусираме върху това, което наричаме „класическо машинно обучение“, като основно използваме Scikit-learn, отлична библиотека, която много студенти използват за изучаване на основите. За да разберете по-широки концепции на изкуствения интелект или дълбокото обучение, е необходимо силно фундаментално знание за машинното обучение, което бихме искали да предложим тук.
---
## В този курс ще научите:
- основни концепции на машинното обучение
- историята на ML
- ML и справедливост
- техники за регресия в ML
- техники за класификация в ML
- техники за клъстеризация в ML
- техники за обработка на естествен език в ML
- техники за прогнозиране на времеви серии в ML
- обучение чрез подсилване
- реални приложения на ML
---
## Какво няма да разгледаме
- дълбоко обучение
- невронни мрежи
- AI
За да осигурим по-добро учебно преживяване, ще избегнем сложностите на невронните мрежи, „дълбокото обучение“ моделиране с много слоеве, използвайки невронни мрежи и AI, които ще разгледаме в друга учебна програма. Също така ще предложим предстояща учебна програма за наука за данни, за да се фокусираме върху този аспект на по-голямото поле.
---
## Защо да изучаваме машинно обучение?
Машинното обучение, от гледна точка на системите, се определя като създаване на автоматизирани системи, които могат да научат скрити модели от данни, за да подпомогнат вземането на интелигентни решения.
Тази мотивация е свободно вдъхновена от начина, по който човешкият мозък научава определени неща въз основа на данните, които възприема от външния свят.
✅ Помислете за минута защо един бизнес би искал да използва стратегии за машинно обучение вместо да създаде система с твърдо кодирани правила.
---
## Приложения на машинното обучение
Приложенията на машинното обучение вече са почти навсякъде и са толкова разпространени, колкото и данните, които се генерират в нашите общества от нашите смартфони, свързани устройства и други системи. Като се има предвид огромният потенциал на съвременните алгоритми за машинно обучение, изследователите проучват тяхната способност да решават многомерни и многодисциплинарни реални проблеми с отлични положителни резултати.
---
## Примери за приложено ML
**Можете да използвате машинно обучение по много начини**:
- За прогнозиране на вероятността за заболяване въз основа на медицинската история или доклади на пациента.
- За използване на данни за времето за прогнозиране на метеорологични събития.
- За разбиране на настроението на текст.
- За откриване на фалшиви новини, за да се спре разпространението на пропаганда.
Финанси, икономика, земни науки, космически изследвания, биомедицинско инженерство, когнитивни науки и дори хуманитарни науки са адаптирали машинното обучение, за да решат трудните, тежки за обработка на данни проблеми в своите области.
---
## Заключение
Машинното обучение автоматизира процеса на откриване на модели, като намира значими прозрения от реални или генерирани данни. То се е доказало като изключително ценно в бизнес, здравеопазване и финансови приложения, наред с други.
В близко бъдеще разбирането на основите на машинното обучение ще бъде задължително за хора от всяка област поради широкото му приложение.
---
# 🚀 Предизвикателство
Нарисувайте, на хартия или с онлайн приложение като [Excalidraw](https://excalidraw.com/), вашето разбиране за разликите между AI, ML, дълбоко обучение и наука за данни. Добавете идеи за проблеми, които всяка от тези техники е добра за решаване.
# [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
---
# Преглед и самостоятелно обучение
За да научите повече за това как можете да работите с ML алгоритми в облака, следвайте този [учебен път](https://docs.microsoft.com/learn/paths/create-no-code-predictive-models-azure-machine-learning/?WT.mc_id=academic-77952-leestott).
Вземете [учебен път](https://docs.microsoft.com/learn/modules/introduction-to-machine-learning/?WT.mc_id=academic-77952-leestott) за основите на ML.
---
# Задание
[Започнете работа](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4c4698044bb8af52cfb6388a4ee0e53b",
"translation_date": "2025-09-05T00:32:12+00:00",
"source_file": "1-Introduction/1-intro-to-ML/assignment.md",
"language_code": "bg"
}
-->
# Започнете и работете
## Инструкции
В това незадължително за оценяване задание трябва да освежите знанията си по Python и да подготвите средата си, така че да можете да изпълнявате notebooks.
Следвайте този [път за изучаване на Python](https://docs.microsoft.com/learn/paths/python-language/?WT.mc_id=academic-77952-leestott), а след това настройте системите си, като изгледате тези въвеждащи видеа:
https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,164 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "6a05fec147e734c3e6bfa54505648e2b",
"translation_date": "2025-09-05T00:32:38+00:00",
"source_file": "1-Introduction/2-history-of-ML/README.md",
"language_code": "bg"
}
-->
# История на машинното обучение
![Обобщение на историята на машинното обучение в скица](../../../../sketchnotes/ml-history.png)
> Скица от [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
---
[![Машинно обучение за начинаещи - История на машинното обучение](https://img.youtube.com/vi/N6wxM4wZ7V0/0.jpg)](https://youtu.be/N6wxM4wZ7V0 "Машинно обучение за начинаещи - История на машинното обучение")
> 🎥 Кликнете върху изображението по-горе за кратко видео, което разглежда тази лекция.
В тази лекция ще преминем през основните етапи в историята на машинното обучение и изкуствения интелект.
Историята на изкуствения интелект (AI) като област е тясно свързана с историята на машинното обучение, тъй като алгоритмите и компютърните постижения, които стоят в основата на ML, допринасят за развитието на AI. Полезно е да се помни, че макар тези области като отделни направления да започват да се оформят през 50-те години на миналия век, важни [алгоритмични, статистически, математически, компютърни и технически открития](https://wikipedia.org/wiki/Timeline_of_machine_learning) предхождат и се припокриват с този период. Всъщност хората размишляват върху тези въпроси [стотици години](https://wikipedia.org/wiki/History_of_artificial_intelligence): тази статия разглежда историческите интелектуални основи на идеята за „мислеща машина“.
---
## Значими открития
- 1763, 1812 [Теорема на Байес](https://wikipedia.org/wiki/Bayes%27_theorem) и нейните предшественици. Тази теорема и нейните приложения са в основата на правенето на изводи, описвайки вероятността за настъпване на събитие въз основа на предварителни знания.
- 1805 [Теория на най-малките квадрати](https://wikipedia.org/wiki/Least_squares) от френския математик Адриен-Мари Лежандър. Тази теория, която ще изучавате в нашия модул за регресия, помага при напасването на данни.
- 1913 [Марковски вериги](https://wikipedia.org/wiki/Markov_chain), кръстени на руския математик Андрей Марков, се използват за описание на последователност от възможни събития въз основа на предишно състояние.
- 1957 [Перцептрон](https://wikipedia.org/wiki/Perceptron) е вид линеен класификатор, изобретен от американския психолог Франк Розенблат, който стои в основата на напредъка в дълбокото обучение.
---
- 1967 [Най-близък съсед](https://wikipedia.org/wiki/Nearest_neighbor) е алгоритъм, първоначално създаден за картографиране на маршрути. В контекста на ML се използва за откриване на модели.
- 1970 [Обратна пропагация](https://wikipedia.org/wiki/Backpropagation) се използва за обучение на [невронни мрежи с директно предаване](https://wikipedia.org/wiki/Feedforward_neural_network).
- 1982 [Рекурентни невронни мрежи](https://wikipedia.org/wiki/Recurrent_neural_network) са изкуствени невронни мрежи, произлезли от невронни мрежи с директно предаване, които създават времеви графики.
✅ Направете малко проучване. Кои други дати се открояват като ключови в историята на ML и AI?
---
## 1950: Машини, които мислят
Алън Тюринг, наистина забележителна личност, който беше избран [от обществеността през 2019 г.](https://wikipedia.org/wiki/Icons:_The_Greatest_Person_of_the_20th_Century) за най-великия учен на 20-ти век, е признат за това, че е помогнал да се положат основите на концепцията за „машина, която може да мисли“. Той се сблъсква с критиците и собствената си нужда от емпирични доказателства за тази концепция, като създава [Тюринг теста](https://www.bbc.com/news/technology-18475646), който ще разгледате в нашите уроци за обработка на естествен език.
---
## 1956: Лятна изследователска програма в Дартмут
„Лятната изследователска програма в Дартмут за изкуствен интелект беше ключово събитие за изкуствения интелект като област“, и именно тук беше въведен терминът „изкуствен интелект“ ([източник](https://250.dartmouth.edu/highlights/artificial-intelligence-ai-coined-dartmouth)).
> Всеки аспект на ученето или всяка друга характеристика на интелигентността може по принцип да бъде толкова точно описан, че да може да бъде симулиран от машина.
---
Водещият изследовател, професорът по математика Джон Маккарти, се надява „да продължи въз основа на предположението, че всеки аспект на ученето или всяка друга характеристика на интелигентността може по принцип да бъде толкова точно описан, че да може да бъде симулиран от машина“. Участниците включват още една изтъкната фигура в областта, Марвин Мински.
Уъркшопът е признат за това, че е инициирал и насърчил няколко дискусии, включително „възхода на символичните методи, системи, фокусирани върху ограничени области (ранни експертни системи) и дедуктивни системи срещу индуктивни системи.“ ([източник](https://wikipedia.org/wiki/Dartmouth_workshop)).
---
## 1956 - 1974: „Златните години“
От 50-те години до средата на 70-те години оптимизмът беше висок с надеждата, че AI може да реши много проблеми. През 1967 г. Марвин Мински уверено заявява: „В рамките на едно поколение... проблемът със създаването на „изкуствен интелект“ ще бъде съществено решен.“ (Мински, Марвин (1967), Изчисление: Крайни и безкрайни машини, Енгълуд Клифс, Ню Джърси: Прентис-Хол)
Изследванията в обработката на естествен език процъфтяват, търсенето се усъвършенства и става по-мощно, а концепцията за „микро-светове“ е създадена, където прости задачи се изпълняват с помощта на инструкции на обикновен език.
---
Изследванията са добре финансирани от правителствени агенции, постигнат е напредък в изчисленията и алгоритмите, и са създадени прототипи на интелигентни машини. Някои от тези машини включват:
* [Шейки роботът](https://wikipedia.org/wiki/Shakey_the_robot), който може да се движи и да решава как да изпълнява задачи „интелигентно“.
![Шейки, интелигентен робот](../../../../1-Introduction/2-history-of-ML/images/shakey.jpg)
> Шейки през 1972 г.
---
* Елиза, ранен „чатбот“, може да разговаря с хора и да действа като примитивен „терапевт“. Ще научите повече за Елиза в уроците за обработка на естествен език.
![Елиза, бот](../../../../1-Introduction/2-history-of-ML/images/eliza.png)
> Версия на Елиза, чатбот
---
* „Светът на блоковете“ беше пример за микро-свят, където блоковете можеха да се подреждат и сортират, а експерименти за обучение на машини да вземат решения можеха да се тестват. Напредъкът, постигнат с библиотеки като [SHRDLU](https://wikipedia.org/wiki/SHRDLU), помогна за развитието на обработката на езика.
[![Светът на блоковете с SHRDLU](https://img.youtube.com/vi/QAJz4YKUwqw/0.jpg)](https://www.youtube.com/watch?v=QAJz4YKUwqw "Светът на блоковете с SHRDLU")
> 🎥 Кликнете върху изображението по-горе за видео: Светът на блоковете с SHRDLU
---
## 1974 - 1980: „Зимата на AI“
До средата на 70-те години става ясно, че сложността на създаването на „интелигентни машини“ е била подценена и че обещанията, дадени предвид наличната изчислителна мощност, са били преувеличени. Финансирането пресъхва и доверието в областта намалява. Някои проблеми, които влияят на доверието, включват:
---
- **Ограничения**. Изчислителната мощност е твърде ограничена.
- **Комбинаторен взрив**. Броят на параметрите, които трябва да бъдат обучени, нараства експоненциално, докато се изисква повече от компютрите, без паралелна еволюция на изчислителната мощност и способности.
- **Недостиг на данни**. Имаше недостиг на данни, който възпрепятства процеса на тестване, разработване и усъвършенстване на алгоритмите.
- **Задаваме ли правилните въпроси?**. Самите въпроси, които се задаваха, започнаха да се поставят под въпрос. Изследователите започнаха да се сблъскват с критика относно своите подходи:
- Тюринг тестовете бяха поставени под въпрос чрез, наред с други идеи, „теорията за китайската стая“, която твърди, че „програмирането на цифров компютър може да го накара да изглежда, че разбира езика, но не може да произведе истинско разбиране.“ ([източник](https://plato.stanford.edu/entries/chinese-room/))
- Етиката на въвеждането на изкуствени интелекти като „терапевта“ Елиза в обществото беше оспорена.
---
В същото време започват да се формират различни школи на мисълта за AI. Установява се дихотомия между практиките на ["разхвърлян" срещу "подреден AI"](https://wikipedia.org/wiki/Neats_and_scruffies). _Разхвърляните_ лаборатории настройват програми с часове, докато постигнат желаните резултати. одредените_ лаборатории „се фокусират върху логиката и формалното решаване на проблеми“. Елиза и SHRDLU са добре известни _разхвърляни_ системи. През 80-те години, когато се появява търсенето за създаване на възпроизводими ML системи, _подреденият_ подход постепенно заема преден план, тъй като резултатите му са по-обясними.
---
## 1980-те: Експертни системи
С развитието на областта нейната полза за бизнеса става по-ясна, а през 80-те години се наблюдава и разпространението на „експертни системи“. „Експертните системи бяха сред първите наистина успешни форми на софтуер за изкуствен интелект (AI).“ ([източник](https://wikipedia.org/wiki/Expert_system)).
Този тип система всъщност е _хибридна_, състояща се частично от двигател на правила, който определя бизнес изискванията, и двигател за правене на изводи, който използва системата от правила, за да извежда нови факти.
Тази епоха също така вижда нарастващо внимание към невронните мрежи.
---
## 1987 - 1993: „Охлаждане“ на AI
Разпространението на специализирания хардуер за експертни системи има нещастния ефект да стане твърде специализирано. Възходът на персоналните компютри също конкурира тези големи, специализирани, централизирани системи. Демократизацията на изчисленията започва и в крайна сметка проправя пътя за съвременния взрив на големите данни.
---
## 1993 - 2011
Този период бележи нова ера за ML и AI, които могат да решат някои от проблемите, причинени по-рано от липсата на данни и изчислителна мощност. Количеството данни започва бързо да се увеличава и става по-достъпно, за добро и за лошо, особено с появата на смартфона около 2007 г. Изчислителната мощност се разширява експоненциално, а алгоритмите се развиват паралелно. Областта започва да придобива зрялост, тъй като свободните дни от миналото започват да се кристализират в истинска дисциплина.
---
## Сега
Днес машинното обучение и AI докосват почти всяка част от нашия живот. Тази епоха изисква внимателно разбиране на рисковете и потенциалните ефекти на тези алгоритми върху човешкия живот. Както заявява Брад Смит от Microsoft: „Информационните технологии поставят въпроси, които засягат основните защити на човешките права като поверителност и свобода на изразяване. Тези въпроси увеличават отговорността на технологичните компании, които създават тези продукти. Според нас те също така изискват внимателно правителствено регулиране и разработване на норми за приемливи употреби“ ([източник](https://www.technologyreview.com/2019/12/18/102365/the-future-of-ais-impact-on-society/)).
---
Остава да се види какво ще донесе бъдещето, но е важно да се разберат тези компютърни системи и софтуерът и алгоритмите, които те изпълняват. Надяваме се, че тази учебна програма ще ви помогне да придобиете по-добро разбиране, за да можете сами да решите.
[![Историята на дълбокото обучение](https://img.youtube.com/vi/mTtDfKgLm54/0.jpg)](https://www.youtube.com/watch?v=mTtDfKgLm54 "Историята на дълбокото обучение")
> 🎥 Кликнете върху изображението по-горе за видео: Ян Лекун обсъжда историята на дълбокото обучение в тази лекция
---
## 🚀Предизвикателство
Разгледайте един от тези исторически моменти и научете повече за хората зад тях. Има завладяващи личности, и никое научно откритие никога не е създадено в културен вакуум. Какво откривате?
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
---
## Преглед и самостоятелно обучение
Ето елементи за гледане и слушане:
[Този подкаст, в който Ейми Бойд обсъжда еволюцията на AI](http://runasradio.com/Shows/Show/739)
[![Историята на AI от Ейми Бойд](https://img.youtube.com/vi/EJt3_bFYKss/0.jpg)](https://www.youtube.com/watch?v=EJt3_bFYKss "Историята на AI от Ейми Бойд")
---
## Задание
[Създайте времева линия](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "eb6e4d5afd1b21a57d2b9e6d0aac3969",
"translation_date": "2025-09-05T00:35:42+00:00",
"source_file": "1-Introduction/2-history-of-ML/assignment.md",
"language_code": "bg"
}
-->
# Създайте хронология
## Инструкции
Използвайки [този репозиторий](https://github.com/Digital-Humanities-Toolkit/timeline-builder), създайте хронология на някой аспект от историята на алгоритмите, математиката, статистиката, AI или ML, или комбинация от тези. Можете да се фокусирате върху един човек, една идея или дълъг период от мисли. Уверете се, че добавяте мултимедийни елементи.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ------------------------------------------------ | --------------------------------------- | ---------------------------------------------------------------- |
| | Разработена хронология е представена като GitHub страница | Кодът е непълен и не е разработен | Хронологията е непълна, недостатъчно проучена и не е разработена |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,149 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9a6b702d1437c0467e3c5c28d763dac2",
"translation_date": "2025-09-05T00:20:49+00:00",
"source_file": "1-Introduction/3-fairness/README.md",
"language_code": "bg"
}
-->
# Създаване на решения за машинно обучение с отговорен AI
![Обобщение на отговорния AI в машинното обучение в скица](../../../../sketchnotes/ml-fairness.png)
> Скица от [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Въведение
В този учебен материал ще започнете да откривате как машинното обучение може да влияе и вече влияе на нашето ежедневие. Дори сега системи и модели участват в ежедневни задачи за вземане на решения, като диагностика в здравеопазването, одобрение на заеми или откриване на измами. Затова е важно тези модели да работят добре, за да предоставят резултати, които са надеждни. Както всяко софтуерно приложение, AI системите могат да не оправдаят очакванията или да доведат до нежелани резултати. Ето защо е от съществено значение да можем да разберем и обясним поведението на AI модела.
Представете си какво може да се случи, когато данните, които използвате за изграждане на тези модели, липсват определени демографски характеристики, като раса, пол, политически възгледи, религия, или непропорционално представят такива демографски характеристики. А какво става, когато изходът на модела се интерпретира така, че да фаворизира определена демографска група? Какви са последствията за приложението? Освен това, какво се случва, когато моделът има неблагоприятен резултат и вреди на хората? Кой носи отговорност за поведението на AI системите? Това са някои от въпросите, които ще разгледаме в този учебен материал.
В този урок ще:
- Повишите осведомеността си за важността на справедливостта в машинното обучение и вредите, свързани със справедливостта.
- Станете запознати с практиката за изследване на изключения и необичайни сценарии, за да гарантирате надеждност и безопасност.
- Разберете необходимостта от създаване на инклузивни системи, които дават възможност на всички.
- Изследвате колко важно е да се защитава поверителността и сигурността на данните и хората.
- Видите значението на подхода "стъклена кутия" за обяснение на поведението на AI моделите.
- Бъдете внимателни към това как отговорността е от съществено значение за изграждане на доверие в AI системите.
## Предварителни изисквания
Като предварително изискване, моля, преминете през учебния път "Принципи на отговорния AI" и гледайте видеото по-долу на тази тема:
Научете повече за отговорния AI, като следвате този [учебен път](https://docs.microsoft.com/learn/modules/responsible-ai-principles/?WT.mc_id=academic-77952-leestott)
[![Подходът на Microsoft към отговорния AI](https://img.youtube.com/vi/dnC8-uUZXSc/0.jpg)](https://youtu.be/dnC8-uUZXSc "Подходът на Microsoft към отговорния AI")
> 🎥 Кликнете върху изображението по-горе за видео: Подходът на Microsoft към отговорния AI
## Справедливост
AI системите трябва да третират всички справедливо и да избягват различно въздействие върху сходни групи хора. Например, когато AI системите предоставят насоки за медицинско лечение, заявления за заеми или заетост, те трябва да правят същите препоръки на всички със сходни симптоми, финансови обстоятелства или професионални квалификации. Всеки от нас като хора носи наследени предразсъдъци, които влияят на нашите решения и действия. Тези предразсъдъци могат да бъдат очевидни в данните, които използваме за обучение на AI системи. Такава манипулация понякога може да се случи неволно. Често е трудно съзнателно да се осъзнае кога въвеждате предразсъдъци в данните.
**„Несправедливост“** обхваща негативни въздействия или „вреди“ за група хора, като тези, дефинирани по отношение на раса, пол, възраст или статус на инвалидност. Основните вреди, свързани със справедливостта, могат да бъдат класифицирани като:
- **Разпределение**, ако например даден пол или етнос е предпочитан пред друг.
- **Качество на услугата**. Ако обучите данните за един специфичен сценарий, но реалността е много по-сложна, това води до лошо представяне на услугата. Например, дозатор за сапун, който не може да разпознае хора с тъмна кожа. [Референция](https://gizmodo.com/why-cant-this-soap-dispenser-identify-dark-skin-1797931773)
- **Омаловажаване**. Несправедливо критикуване и етикетиране на нещо или някого. Например, технология за етикетиране на изображения, която скандално етикетира изображения на хора с тъмна кожа като горили.
- **Прекомерно или недостатъчно представяне**. Идеята е, че определена група не се вижда в определена професия, и всяка услуга или функция, която продължава да насърчава това, допринася за вреда.
- **Стереотипизиране**. Свързване на дадена група с предварително зададени атрибути. Например, система за превод между английски и турски може да има неточности поради думи със стереотипни асоциации към пола.
![превод на турски](../../../../1-Introduction/3-fairness/images/gender-bias-translate-en-tr.png)
> превод на турски
![превод обратно на английски](../../../../1-Introduction/3-fairness/images/gender-bias-translate-tr-en.png)
> превод обратно на английски
Когато проектираме и тестваме AI системи, трябва да гарантираме, че AI е справедлив и не е програмиран да взема предубедени или дискриминационни решения, които също са забранени за хората. Гарантирането на справедливост в AI и машинното обучение остава сложен социотехнически предизвикателство.
### Надеждност и безопасност
За да изградим доверие, AI системите трябва да бъдат надеждни, безопасни и последователни при нормални и неочаквани условия. Важно е да знаем как AI системите ще се държат в различни ситуации, особено когато са изключения. Когато изграждаме AI решения, трябва да се съсредоточим значително върху това как да се справим с широк спектър от обстоятелства, които AI решенията биха срещнали. Например, самоуправляваща се кола трябва да постави безопасността на хората като основен приоритет. В резултат AI, който управлява колата, трябва да вземе предвид всички възможни сценарии, които колата може да срещне, като нощ, гръмотевични бури или снежни виелици, деца, които тичат по улицата, домашни любимци, пътни ремонти и др. Колко добре AI системата може да се справи с широк спектър от условия надеждно и безопасно отразява нивото на предвиждане, което специалистът по данни или AI разработчик е взел предвид по време на проектирането или тестването на системата.
> [🎥 Кликнете тук за видео: ](https://www.microsoft.com/videoplayer/embed/RE4vvIl)
### Инклузивност
AI системите трябва да бъдат проектирани така, че да ангажират и дават възможност на всички. Когато проектират и внедряват AI системи, специалистите по данни и AI разработчиците идентифицират и адресират потенциални бариери в системата, които биха могли неволно да изключат хора. Например, има 1 милиард хора с увреждания по света. С напредъка на AI те могат да получат достъп до широк спектър от информация и възможности по-лесно в ежедневния си живот. Като адресираме бариерите, създаваме възможности за иновации и разработване на AI продукти с по-добри преживявания, които са от полза за всички.
> [🎥 Кликнете тук за видео: инклузивност в AI](https://www.microsoft.com/videoplayer/embed/RE4vl9v)
### Сигурност и поверителност
AI системите трябва да бъдат безопасни и да уважават поверителността на хората. Хората имат по-малко доверие в системи, които поставят тяхната поверителност, информация или живот в риск. Когато обучаваме модели за машинно обучение, разчитаме на данни, за да постигнем най-добри резултати. В този процес трябва да се вземе предвид произходът и интегритетът на данните. Например, дали данните са предоставени от потребители или са публично достъпни? Освен това, докато работим с данните, е важно да разработим AI системи, които могат да защитят конфиденциална информация и да устоят на атаки. С разпространението на AI защитата на поверителността и сигурността на важна лична и бизнес информация става все по-критична и сложна. Въпросите за поверителност и сигурност на данните изискват особено внимание за AI, защото достъпът до данни е от съществено значение за AI системите, за да правят точни и информирани прогнози и решения за хората.
> [🎥 Кликнете тук за видео: сигурност в AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- Като индустрия постигнахме значителен напредък в поверителността и сигурността, значително подпомогнат от регулации като GDPR (Общ регламент за защита на данните).
- Въпреки това, с AI системите трябва да признаем напрежението между нуждата от повече лични данни за правене на системите по-лични и ефективни и поверителността.
- Както при раждането на свързани компютри с интернет, наблюдаваме огромен ръст в броя на проблемите със сигурността, свързани с AI.
- В същото време виждаме AI, използван за подобряване на сигурността. Например, повечето съвременни антивирусни скенери се задвижват от AI евристики.
- Трябва да гарантираме, че нашите процеси за анализ на данни хармонично се съчетават с най-новите практики за поверителност и сигурност.
### Прозрачност
AI системите трябва да бъдат разбираеми. Ключова част от прозрачността е обяснението на поведението на AI системите и техните компоненти. Подобряването на разбирането на AI системите изисква заинтересованите страни да разберат как и защо те функционират, за да могат да идентифицират потенциални проблеми с производителността, опасения за безопасността и поверителността, предразсъдъци, изключващи практики или нежелани резултати. Също така вярваме, че тези, които използват AI системи, трябва да бъдат честни и открити относно това кога, защо и как решават да ги внедрят, както и ограниченията на системите, които използват. Например, ако банка използва AI система за подпомагане на решения за потребителско кредитиране, важно е да се изследват резултатите и да се разбере кои данни влияят на препоръките на системата. Правителствата започват да регулират AI в различни индустрии, така че специалистите по данни и организациите трябва да обяснят дали AI системата отговаря на регулаторните изисквания, особено когато има нежелан резултат.
> [🎥 Кликнете тук за видео: прозрачност в AI](https://www.microsoft.com/videoplayer/embed/RE4voJF)
- Тъй като AI системите са толкова сложни, е трудно да се разбере как работят и да се интерпретират резултатите.
- Тази липса на разбиране влияе върху начина, по който тези системи се управляват, оперативизират и документират.
- Тази липса на разбиране, по-важното, влияе върху решенията, взети въз основа на резултатите, които тези системи произвеждат.
### Отговорност
Хората, които проектират и внедряват AI системи, трябва да бъдат отговорни за начина, по който техните системи функционират. Необходимостта от отговорност е особено важна при чувствителни технологии като разпознаване на лица. Напоследък има нарастващо търсене на технологии за разпознаване на лица, особено от организации за правоприлагане, които виждат потенциала на технологията в приложения като намиране на изчезнали деца. Въпреки това, тези технологии могат потенциално да бъдат използвани от правителство, за да поставят основните свободи на гражданите в риск, например чрез непрекъснато наблюдение на конкретни лица. Затова специалистите по данни и организациите трябва да бъдат отговорни за начина, по който тяхната AI система влияе на индивидите или обществото.
[![Водещ AI изследовател предупреждава за масово наблюдение чрез разпознаване на лица](../../../../1-Introduction/3-fairness/images/accountability.png)](https://www.youtube.com/watch?v=Wldt8P5V6D0 "Подходът на Microsoft към отговорния AI")
> 🎥 Кликнете върху изображението по-горе за видео: Предупреждения за масово наблюдение чрез разпознаване на лица
В крайна сметка един от най-големите въпроси за нашето поколение, като първото поколение, което въвежда AI в обществото, е как да гарантираме, че компютрите ще останат отговорни пред хората и как да гарантираме, че хората, които проектират компютри, остават отговорни пред всички останали.
## Оценка на въздействието
Преди да обучите модел за машинно обучение, е важно да проведете оценка на въздействието, за да разберете целта на AI системата; какво е предназначението ѝ; къде ще бъде внедрена; и кой ще взаимодейства със системата. Това е полезно за рецензенти или тестери, които оценяват системата, за да знаят какви фактори да вземат предвид при идентифициране на потенциални рискове и очаквани последствия.
Следните са области на фокус при провеждане на оценка на въздействието:
* **Неблагоприятно въздействие върху индивидите**. Осъзнаването на всякакви ограничения или изисквания, неподдържана употреба или известни ограничения, които възпрепятстват производителността на системата, е жизненоважно, за да се гарантира, че системата не се използва по начин, който може да причини вреда на индивидите.
* **Изисквания за данни**. Разбирането на това как и къде системата ще използва данни позволява на рецензентите да изследват всякакви изисквания за данни, които трябва да се вземат предвид (например, GDPR или HIPPA регулации за данни). Освен това, проверете дали източникът или количеството данни са достатъчни за обучение.
* **Обобщение на въздействието**. Съберете списък с потенциални вреди, които могат да възникнат от използването на системата. През целия жизнен цикъл на ML проверявайте дали идентифицираните проблеми са смекчени или адресирани.
* **Приложими цели** за всяка от шестте основни принципа. Оценете дали целите от всеки принцип са постигнати и дали има пропуски.
## Дебъгване с отговорен AI
Подобно на дебъгването на софтуерно приложение, дебъгването на AI система е необходим процес за идентифициране и разрешаване на проблеми в системата. Има много фактори, които могат да повлияят на модела да не работи според очакванията или отговорно. Повечето традиционни метрики за производителност на модела са количествени агрегати на производителността на модела, които не са достатъчни за анализиране как моделът нарушава принципите на отговорния AI. Освен това, моделът за машинно обучение е черна кутия, което затруднява разбирането на това, което движи неговия резултат или предоставянето на обяснение, когато прави греш
Гледайте този уъркшоп, за да се задълбочите в темите:
- В търсене на отговорен AI: Превръщане на принципите в практика от Бесмира Нуши, Мехрнуш Самеки и Амит Шарма
[![Responsible AI Toolbox: Отворена рамка за изграждане на отговорен AI](https://img.youtube.com/vi/tGgJCrA-MZU/0.jpg)](https://www.youtube.com/watch?v=tGgJCrA-MZU "RAI Toolbox: Отворена рамка за изграждане на отговорен AI")
> 🎥 Кликнете върху изображението по-горе за видео: RAI Toolbox: Отворена рамка за изграждане на отговорен AI от Бесмира Нуши, Мехрнуш Самеки и Амит Шарма
Също така, прочетете:
- Ресурсният център на Microsoft за отговорен AI: [Responsible AI Resources Microsoft AI](https://www.microsoft.com/ai/responsible-ai-resources?activetab=pivot1%3aprimaryr4)
- Изследователската група FATE на Microsoft: [FATE: Fairness, Accountability, Transparency, and Ethics in AI - Microsoft Research](https://www.microsoft.com/research/theme/fate/)
RAI Toolbox:
- [GitHub хранилище на Responsible AI Toolbox](https://github.com/microsoft/responsible-ai-toolbox)
Прочетете за инструментите на Azure Machine Learning за осигуряване на справедливост:
- [Azure Machine Learning](https://docs.microsoft.com/azure/machine-learning/concept-fairness-ml?WT.mc_id=academic-77952-leestott)
## Задача
[Разгледайте RAI Toolbox](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "dbda60e7b1fe5f18974e7858eff0004e",
"translation_date": "2025-09-05T00:25:31+00:00",
"source_file": "1-Introduction/3-fairness/assignment.md",
"language_code": "bg"
}
-->
# Разгледайте инструмента Responsible AI Toolbox
## Инструкции
В този урок научихте за Responsible AI Toolbox, "проект с отворен код, ръководен от общността, който помага на специалистите по данни да анализират и подобряват AI системи." За тази задача, разгледайте един от [бележниците](https://github.com/microsoft/responsible-ai-toolbox/blob/main/notebooks/responsibleaidashboard/getting-started.ipynb) на RAI Toolbox и представете своите открития в доклад или презентация.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | --------- | -------- | ----------------- |
| | Представен е доклад или презентация, обсъждаща системите на Fairlearn, бележникът, който е бил изпълнен, и изводите, направени от него | Представен е доклад без изводи | Не е представен доклад |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,132 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9d91f3af3758fdd4569fb410575995ef",
"translation_date": "2025-09-05T00:26:03+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/README.md",
"language_code": "bg"
}
-->
# Техники на машинното обучение
Процесът на създаване, използване и поддържане на модели за машинно обучение и данните, които те използват, е много различен от много други работни потоци за разработка. В този урок ще разясним процеса и ще очертаем основните техники, които трябва да знаете. Ще:
- Разберете процесите, които стоят в основата на машинното обучение на високо ниво.
- Изследвате основни концепции като „модели“, „предсказания“ и „обучаващи данни“.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
[![ML за начинаещи - Техники на машинното обучение](https://img.youtube.com/vi/4NGM0U2ZSHU/0.jpg)](https://youtu.be/4NGM0U2ZSHU "ML за начинаещи - Техники на машинното обучение")
> 🎥 Кликнете върху изображението по-горе за кратко видео, което разглежда този урок.
## Въведение
На високо ниво, изкуството на създаване на процеси за машинно обучение (ML) се състои от няколко стъпки:
1. **Определете въпроса**. Повечето процеси за ML започват с въпрос, който не може да бъде отговорен чрез проста условна програма или система, базирана на правила. Тези въпроси често се въртят около предсказания, базирани на съвкупност от данни.
2. **Съберете и подгответе данни**. За да можете да отговорите на въпроса си, ви трябват данни. Качеството и, понякога, количеството на вашите данни ще определят колко добре можете да отговорите на първоначалния си въпрос. Визуализирането на данни е важен аспект на тази фаза. Тази фаза включва и разделяне на данните на групи за обучение и тестване, за да се изгради модел.
3. **Изберете метод за обучение**. В зависимост от въпроса ви и естеството на данните, трябва да изберете как искате да обучите модел, за да отразява най-добре данните и да прави точни предсказания. Това е частта от процеса на ML, която изисква специфична експертиза и често значително количество експериментиране.
4. **Обучете модела**. Използвайки обучаващите си данни, ще използвате различни алгоритми, за да обучите модел да разпознава модели в данните. Моделът може да използва вътрешни тегла, които могат да бъдат коригирани, за да се даде предимство на определени части от данните пред други, за да се изгради по-добър модел.
5. **Оценете модела**. Използвате данни, които моделът никога не е виждал преди (вашите тестови данни), за да видите как се представя моделът.
6. **Настройка на параметри**. Въз основа на представянето на модела, можете да повторите процеса, използвайки различни параметри или променливи, които контролират поведението на алгоритмите, използвани за обучение на модела.
7. **Предсказание**. Използвайте нови входни данни, за да тествате точността на модела.
## Какъв въпрос да зададете
Компютрите са особено добри в откриването на скрити модели в данните. Тази способност е много полезна за изследователи, които имат въпроси за дадена област, които не могат лесно да бъдат отговорени чрез създаване на система, базирана на правила. Например, при актюерска задача, специалист по данни може да създаде ръчно изработени правила за смъртността на пушачи спрямо непушачи.
Когато в уравнението се включат много други променливи, обаче, модел за ML може да се окаже по-ефективен за предсказване на бъдещи нива на смъртност, базирани на предишна здравна история. По-радостен пример може да бъде правенето на прогнози за времето за месец април на дадено място, базирани на данни, които включват географска ширина, дължина, климатични промени, близост до океана, модели на струйния поток и други.
✅ Тази [презентация](https://www2.cisl.ucar.edu/sites/default/files/2021-10/0900%20June%2024%20Haupt_0.pdf) за модели на времето предлага историческа перспектива за използването на ML в анализа на времето.
## Задачи преди изграждането
Преди да започнете да изграждате модела си, има няколко задачи, които трябва да изпълните. За да тествате въпроса си и да формирате хипотеза, базирана на предсказанията на модела, трябва да идентифицирате и конфигурирате няколко елемента.
### Данни
За да можете да отговорите на въпроса си с някаква сигурност, ви е необходим достатъчен обем данни от правилния тип. На този етап трябва да направите две неща:
- **Съберете данни**. Имайки предвид предишния урок за справедливостта в анализа на данни, събирайте данните си внимателно. Бъдете наясно с източниците на тези данни, всякакви присъщи пристрастия, които може да имат, и документирайте техния произход.
- **Подгответе данни**. Има няколко стъпки в процеса на подготовка на данни. Може да се наложи да съберете данни и да ги нормализирате, ако идват от различни източници. Можете да подобрите качеството и количеството на данните чрез различни методи, като например преобразуване на текстови низове в числа (както правим в [Клъстеризация](../../5-Clustering/1-Visualize/README.md)). Може също да генерирате нови данни, базирани на оригиналните (както правим в [Класификация](../../4-Classification/1-Introduction/README.md)). Можете да почистите и редактирате данните (както ще направим преди урока за [Уеб приложение](../../3-Web-App/README.md)). Накрая, може да се наложи да ги рандомизирате и разбъркате, в зависимост от техниките за обучение.
✅ След като съберете и обработите данните си, отделете момент, за да видите дали тяхната структура ще ви позволи да адресирате въпроса си. Възможно е данните да не се представят добре в дадената задача, както откриваме в нашите уроци за [Клъстеризация](../../5-Clustering/1-Visualize/README.md)!
### Характеристики и цел
[Характеристика](https://www.datasciencecentral.com/profiles/blogs/an-introduction-to-variable-and-feature-selection) е измерима собственост на вашите данни. В много набори от данни тя е изразена като заглавие на колона, като „дата“, „размер“ или „цвят“. Вашата променлива за характеристика, обикновено представена като `X` в кода, представлява входната променлива, която ще се използва за обучение на модела.
Целта е това, което се опитвате да предскажете. Целта, обикновено представена като `y` в кода, представлява отговора на въпроса, който се опитвате да зададете на данните: през декември, какъв **цвят** тикви ще бъдат най-евтини? В Сан Франциско, кои квартали ще имат най-добри цени на недвижими имоти? Понякога целта се нарича и атрибут на етикета.
### Избор на променлива за характеристика
🎓 **Избор на характеристики и извличане на характеристики** Как да разберете коя променлива да изберете при изграждането на модел? Вероятно ще преминете през процес на избор на характеристики или извличане на характеристики, за да изберете правилните променливи за най-добре представящия се модел. Те обаче не са едно и също: „Извличането на характеристики създава нови характеристики от функции на оригиналните характеристики, докато изборът на характеристики връща подмножество от характеристиките.“ ([източник](https://wikipedia.org/wiki/Feature_selection))
### Визуализирайте данните си
Важен аспект от инструментариума на специалиста по данни е способността да визуализира данни, използвайки няколко отлични библиотеки като Seaborn или MatPlotLib. Представянето на данните визуално може да ви позволи да откриете скрити корелации, които можете да използвате. Вашите визуализации може също да ви помогнат да откриете пристрастия или небалансирани данни (както откриваме в [Класификация](../../4-Classification/2-Classifiers-1/README.md)).
### Разделете набора си от данни
Преди обучението трябва да разделите набора си от данни на две или повече части с неравни размери, които все пак добре представят данните.
- **Обучение**. Тази част от набора от данни се използва за обучение на модела. Този набор представлява по-голямата част от оригиналния набор от данни.
- **Тестване**. Тестовият набор от данни е независима група от данни, често събрана от оригиналните данни, която използвате, за да потвърдите представянето на изградения модел.
- **Валидация**. Наборът за валидация е по-малка независима група от примери, която използвате, за да настроите хиперпараметрите или архитектурата на модела, за да го подобрите. В зависимост от размера на данните и въпроса, който задавате, може да не е необходимо да изграждате този трети набор (както отбелязваме в [Прогнозиране на времеви серии](../../7-TimeSeries/1-Introduction/README.md)).
## Изграждане на модел
Използвайки обучаващите си данни, целта ви е да изградите модел, или статистическо представяне на данните, използвайки различни алгоритми за **обучение**. Обучението на модел го излага на данни и му позволява да прави предположения за възприети модели, които открива, валидира и приема или отхвърля.
### Изберете метод за обучение
В зависимост от въпроса ви и естеството на данните, ще изберете метод за обучение. Преглеждайки [документацията на Scikit-learn](https://scikit-learn.org/stable/user_guide.html) - която използваме в този курс - можете да изследвате много начини за обучение на модел. В зависимост от опита ви, може да се наложи да опитате няколко различни метода, за да изградите най-добрия модел. Вероятно ще преминете през процес, при който специалистите по данни оценяват представянето на модела, като му подават невиждани данни, проверяват за точност, пристрастия и други проблеми, които намаляват качеството, и избират най-подходящия метод за обучение за дадената задача.
### Обучете модел
С обучаващите си данни сте готови да ги „поставите“ в модела, за да го създадете. Ще забележите, че в много библиотеки за ML ще намерите кода 'model.fit' - това е моментът, когато подавате променливата за характеристика като масив от стойности (обикновено 'X') и целевата променлива (обикновено 'y').
### Оценете модела
След като процесът на обучение приключи (може да отнеме много итерации, или „епохи“, за да се обучи голям модел), ще можете да оцените качеството на модела, като използвате тестови данни, за да прецените представянето му. Тези данни са подмножество на оригиналните данни, които моделът не е анализирал преди. Можете да отпечатате таблица с метрики за качеството на модела.
🎓 **Приспособяване на модела**
В контекста на машинното обучение, приспособяването на модела се отнася до точността на основната функция на модела, докато той се опитва да анализира данни, с които не е запознат.
🎓 **Недостатъчно обучение** и **прекомерно обучение** са често срещани проблеми, които намаляват качеството на модела, тъй като моделът се приспособява или недостатъчно добре, или прекалено добре. Това води до предсказания, които са или твърде тясно свързани, или твърде свободно свързани с обучаващите данни. Прекомерно обучен модел предсказва обучаващите данни твърде добре, защото е научил детайлите и шума в данните твърде добре. Недостатъчно обучен модел не е точен, тъй като не може нито точно да анализира обучаващите данни, нито данни, които не е „виждал“.
![модел с прекомерно обучение](../../../../1-Introduction/4-techniques-of-ML/images/overfitting.png)
> Инфографика от [Jen Looper](https://twitter.com/jenlooper)
## Настройка на параметри
След като първоначалното обучение приключи, наблюдавайте качеството на модела и обмислете подобряването му чрез настройка на неговите „хиперпараметри“. Прочетете повече за процеса [в документацията](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-tune-hyperparameters?WT.mc_id=academic-77952-leestott).
## Предсказание
Това е моментът, в който можете да използвате напълно нови данни, за да тествате точността на модела. В „практическа“ среда за ML, където изграждате уеб активи за използване на модела в продукция, този процес може да включва събиране на потребителски вход (например натискане на бутон), за да зададете променлива и да я изпратите на модела за извод или оценка.
В тези уроци ще откриете как да използвате тези стъпки, за да подготвите, изградите, тествате, оцените и предскажете - всички жестове на специалист по данни и още, докато напредвате в пътуването си да станете „пълен стек“ инженер за ML.
---
## 🚀Предизвикателство
Начертайте диаграма на потока, отразяваща стъпките на специалист по ML. Къде виждате себе си в процеса в момента? Къде предвиждате, че ще срещнете трудности? Какво ви изглежда лесно?
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Търсете онлайн интервюта със специалисти по данни, които обсъждат ежедневната си работа. Ето [едно](https://www.youtube.com/watch?v=Z3IjgbbCEfs).
## Задание
[Интервюирайте специалист по данни](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматичните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия изходен език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален превод от човек. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "70d65aeddc06170bc1aed5b27805f930",
"translation_date": "2025-09-05T00:29:15+00:00",
"source_file": "1-Introduction/4-techniques-of-ML/assignment.md",
"language_code": "bg"
}
-->
# Интервю с дата учен
## Инструкции
Във вашата компания, потребителска група или сред приятели или състуденти, поговорете с някой, който работи професионално като дата учен. Напишете кратко есе (500 думи) за ежедневните му задължения. Специалист ли е, или работи като "full stack"?
## Рубрика
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------- |
| | Есе с правилната дължина, с посочени източници, представено като .doc файл | Есето е с лошо посочени източници или е по-кратко от изискваната дължина | Есе не е представено |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,37 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "cf8ecc83f28e5b98051d2179eca08e08",
"translation_date": "2025-09-05T00:20:05+00:00",
"source_file": "1-Introduction/README.md",
"language_code": "bg"
}
-->
# Въведение в машинното обучение
В тази част от учебната програма ще се запознаете с основните концепции, които стоят в основата на машинното обучение, какво представлява то, както и ще научите за неговата история и техниките, които изследователите използват, за да работят с него. Нека заедно изследваме този нов свят на машинното обучение!
![глобус](../../../1-Introduction/images/globe.jpg)
> Снимка от <a href="https://unsplash.com/@bill_oxford?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Бил Оксфорд</a> на <a href="https://unsplash.com/s/photos/globe?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
### Уроци
1. [Въведение в машинното обучение](1-intro-to-ML/README.md)
1. [История на машинното обучение и изкуствения интелект](2-history-of-ML/README.md)
1. [Справедливост и машинно обучение](3-fairness/README.md)
1. [Техники на машинното обучение](4-techniques-of-ML/README.md)
### Автори
"Въведение в машинното обучение" е написано с ♥️ от екип, включващ [Мухамад Сакиб Хан Инан](https://twitter.com/Sakibinan), [Орнела Алтунян](https://twitter.com/ornelladotcom) и [Джен Лупър](https://twitter.com/jenlooper)
"История на машинното обучение" е написана с ♥️ от [Джен Лупър](https://twitter.com/jenlooper) и [Ейми Бойд](https://twitter.com/AmyKateNicho)
"Справедливост и машинно обучение" е написано с ♥️ от [Томоми Имура](https://twitter.com/girliemac)
"Техники на машинното обучение" е написано с ♥️ от [Джен Лупър](https://twitter.com/jenlooper) и [Крис Норинг](https://twitter.com/softchris)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,238 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "fa81d226c71d5af7a2cade31c1c92b88",
"translation_date": "2025-09-04T23:34:53+00:00",
"source_file": "2-Regression/1-Tools/README.md",
"language_code": "bg"
}
-->
# Започнете с Python и Scikit-learn за регресионни модели
![Обобщение на регресиите в скица](../../../../sketchnotes/ml-regression.png)
> Скица от [Tomomi Imura](https://www.twitter.com/girlie_mac)
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
> ### [Този урок е наличен и на R!](../../../../2-Regression/1-Tools/solution/R/lesson_1.html)
## Въведение
В тези четири урока ще научите как да изграждате регресионни модели. Ще обсъдим за какво служат те след малко. Но преди да започнете, уверете се, че разполагате с правилните инструменти, за да стартирате процеса!
В този урок ще научите как да:
- Конфигурирате компютъра си за локални задачи по машинно обучение.
- Работите с Jupyter notebooks.
- Използвате Scikit-learn, включително инсталация.
- Изследвате линейна регресия чрез практическо упражнение.
## Инсталации и конфигурации
[![Машинно обучение за начинаещи - Настройте инструментите си за изграждане на модели за машинно обучение](https://img.youtube.com/vi/-DfeD2k2Kj0/0.jpg)](https://youtu.be/-DfeD2k2Kj0 "Машинно обучение за начинаещи - Настройте инструментите си за изграждане на модели за машинно обучение")
> 🎥 Кликнете върху изображението по-горе за кратко видео за конфигуриране на компютъра за машинно обучение.
1. **Инсталирайте Python**. Уверете се, че [Python](https://www.python.org/downloads/) е инсталиран на вашия компютър. Ще използвате Python за много задачи, свързани с данни и машинно обучение. Повечето компютърни системи вече включват инсталация на Python. Съществуват и полезни [Python Coding Packs](https://code.visualstudio.com/learn/educators/installers?WT.mc_id=academic-77952-leestott), които улесняват настройката за някои потребители.
Някои приложения на Python обаче изискват една версия на софтуера, докато други изискват различна версия. Поради тази причина е полезно да работите в [виртуална среда](https://docs.python.org/3/library/venv.html).
2. **Инсталирайте Visual Studio Code**. Уверете се, че Visual Studio Code е инсталиран на вашия компютър. Следвайте тези инструкции за [инсталиране на Visual Studio Code](https://code.visualstudio.com/) за основната инсталация. Ще използвате Python във Visual Studio Code в този курс, така че може да е полезно да се запознаете с [конфигурирането на Visual Studio Code](https://docs.microsoft.com/learn/modules/python-install-vscode?WT.mc_id=academic-77952-leestott) за разработка с Python.
> Запознайте се с Python, като преминете през тази колекция от [модули за обучение](https://docs.microsoft.com/users/jenlooper-2911/collections/mp1pagggd5qrq7?WT.mc_id=academic-77952-leestott)
>
> [![Настройка на Python с Visual Studio Code](https://img.youtube.com/vi/yyQM70vi7V8/0.jpg)](https://youtu.be/yyQM70vi7V8 "Настройка на Python с Visual Studio Code")
>
> 🎥 Кликнете върху изображението по-горе за видео: използване на Python във VS Code.
3. **Инсталирайте Scikit-learn**, като следвате [тези инструкции](https://scikit-learn.org/stable/install.html). Тъй като трябва да използвате Python 3, препоръчително е да използвате виртуална среда. Обърнете внимание, че ако инсталирате тази библиотека на Mac с M1, има специални инструкции на страницата, посочена по-горе.
4. **Инсталирайте Jupyter Notebook**. Ще трябва да [инсталирате пакета Jupyter](https://pypi.org/project/jupyter/).
## Вашата среда за авторство на машинно обучение
Ще използвате **notebooks**, за да разработвате своя Python код и да създавате модели за машинно обучение. Този тип файлове е често срещан инструмент за специалисти по данни и може да бъде разпознат по разширението `.ipynb`.
Notebooks са интерактивна среда, която позволява на разработчика както да кодира, така и да добавя бележки и документация около кода, което е доста полезно за експериментални или изследователски проекти.
[![Машинно обучение за начинаещи - Настройка на Jupyter Notebooks за започване на изграждане на регресионни модели](https://img.youtube.com/vi/7E-jC8FLA2E/0.jpg)](https://youtu.be/7E-jC8FLA2E "Машинно обучение за начинаещи - Настройка на Jupyter Notebooks за започване на изграждане на регресионни модели")
> 🎥 Кликнете върху изображението по-горе за кратко видео за това упражнение.
### Упражнение - работа с notebook
В тази папка ще намерите файла _notebook.ipynb_.
1. Отворете _notebook.ipynb_ във Visual Studio Code.
Ще стартира Jupyter сървър с Python 3+. Ще намерите области в notebook-а, които могат да бъдат `изпълнени`, т.е. части от код. Можете да изпълните блок с код, като изберете иконата, която изглежда като бутон за възпроизвеждане.
2. Изберете иконата `md` и добавете малко markdown с текста **# Добре дошли в своя notebook**.
След това добавете малко Python код.
3. Въведете **print('hello notebook')** в блока с код.
4. Изберете стрелката, за да изпълните кода.
Трябва да видите отпечатаното съобщение:
```output
hello notebook
```
![VS Code с отворен notebook](../../../../2-Regression/1-Tools/images/notebook.jpg)
Можете да преплитате кода си с коментари, за да документирате сами notebook-а.
✅ Помислете за момент колко различна е работната среда на уеб разработчика в сравнение с тази на специалиста по данни.
## Стартиране със Scikit-learn
Сега, когато Python е настроен във вашата локална среда и сте се запознали с Jupyter notebooks, нека се запознаем и със Scikit-learn (произнася се `сай`, както в `наука`). Scikit-learn предоставя [обширен API](https://scikit-learn.org/stable/modules/classes.html#api-ref), който ще ви помогне да изпълнявате задачи по машинно обучение.
Според техния [уебсайт](https://scikit-learn.org/stable/getting_started.html), "Scikit-learn е библиотека с отворен код за машинно обучение, която поддържа контролирано и неконтролирано обучение. Тя също така предоставя различни инструменти за напасване на модели, предварителна обработка на данни, избор и оценка на модели, както и много други полезности."
В този курс ще използвате Scikit-learn и други инструменти, за да изграждате модели за машинно обучение за изпълнение на това, което наричаме 'традиционни задачи по машинно обучение'. Умишлено сме избегнали невронни мрежи и дълбоко обучение, тъй като те са по-добре обхванати в предстоящата ни учебна програма 'AI за начинаещи'.
Scikit-learn прави изграждането и оценяването на модели лесно за използване. Тя е основно фокусирана върху използването на числови данни и съдържа няколко готови набора от данни за използване като учебни инструменти. Тя също така включва предварително изградени модели, които студентите могат да изпробват. Нека изследваме процеса на зареждане на предварително пакетирани данни и използване на вграден оценител за първия ML модел със Scikit-learn с някои основни данни.
## Упражнение - вашият първи Scikit-learn notebook
> Това ръководство е вдъхновено от [примера за линейна регресия](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py) на уебсайта на Scikit-learn.
[![Машинно обучение за начинаещи - Вашият първи проект за линейна регресия в Python](https://img.youtube.com/vi/2xkXL5EUpS0/0.jpg)](https://youtu.be/2xkXL5EUpS0 "Машинно обучение за начинаещи - Вашият първи проект за линейна регресия в Python")
> 🎥 Кликнете върху изображението по-горе за кратко видео за това упражнение.
Във файла _notebook.ipynb_, свързан с този урок, изчистете всички клетки, като натиснете иконата 'кошче'.
В този раздел ще работите с малък набор от данни за диабет, който е вграден в Scikit-learn за учебни цели. Представете си, че искате да тествате лечение за пациенти с диабет. Моделите за машинно обучение могат да ви помогнат да определите кои пациенти биха реагирали по-добре на лечението въз основа на комбинации от променливи. Дори много основен регресионен модел, когато е визуализиран, може да покаже информация за променливи, които биха ви помогнали да организирате теоретичните си клинични изпитвания.
✅ Съществуват много видове методи за регресия, и кой ще изберете зависи от въпроса, на който искате да отговорите. Ако искате да предскажете вероятната височина на човек на дадена възраст, ще използвате линейна регресия, тъй като търсите **числова стойност**. Ако се интересувате дали даден вид кухня трябва да се счита за веганска или не, търсите **категорийно присвояване**, така че ще използвате логистична регресия. Ще научите повече за логистичната регресия по-късно. Помислете малко за въпроси, които можете да зададете на данните, и кой от тези методи би бил по-подходящ.
Нека започнем с тази задача.
### Импортиране на библиотеки
За тази задача ще импортираме някои библиотеки:
- **matplotlib**. Това е полезен [инструмент за графики](https://matplotlib.org/), който ще използваме за създаване на линейна графика.
- **numpy**. [numpy](https://numpy.org/doc/stable/user/whatisnumpy.html) е полезна библиотека за работа с числови данни в Python.
- **sklearn**. Това е библиотеката [Scikit-learn](https://scikit-learn.org/stable/user_guide.html).
Импортирайте някои библиотеки, за да ви помогнат със задачите.
1. Добавете импорти, като въведете следния код:
```python
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection
```
По-горе импортирате `matplotlib`, `numpy` и импортирате `datasets`, `linear_model` и `model_selection` от `sklearn`. `model_selection` се използва за разделяне на данни на тренировъчни и тестови набори.
### Наборът от данни за диабет
Вграденият [набор от данни за диабет](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) включва 442 проби от данни за диабет с 10 характеристични променливи, някои от които включват:
- age: възраст в години
- bmi: индекс на телесна маса
- bp: средно кръвно налягане
- s1 tc: Т-клетки (вид бели кръвни клетки)
✅ Този набор от данни включва концепцията за 'пол' като характеристична променлива, важна за изследванията около диабета. Много медицински набори от данни включват този тип бинарна класификация. Помислете малко как подобни категоризации могат да изключат определени части от населението от лечения.
Сега заредете данните X и y.
> 🎓 Запомнете, това е контролирано обучение и ни трябва целева променлива 'y'.
В нова клетка с код заредете набора от данни за диабет, като извикате `load_diabetes()`. Входът `return_X_y=True` сигнализира, че `X` ще бъде матрица с данни, а `y` ще бъде целта на регресията.
1. Добавете някои команди за печат, за да покажете формата на матрицата с данни и първия ѝ елемент:
```python
X, y = datasets.load_diabetes(return_X_y=True)
print(X.shape)
print(X[0])
```
Това, което получавате като отговор, е кортеж. Това, което правите, е да присвоите първите две стойности на кортежа съответно на `X` и `y`. Научете повече [за кортежите](https://wikipedia.org/wiki/Tuple).
Можете да видите, че тези данни имат 442 елемента, оформени в масиви от 10 елемента:
```text
(442, 10)
[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
```
✅ Помислете малко за връзката между данните и целевата променлива. Линейната регресия предсказва връзките между характеристиката X и целевата променлива y. Можете ли да намерите [целта](https://scikit-learn.org/stable/datasets/toy_dataset.html#diabetes-dataset) за набора от данни за диабет в документацията? Какво демонстрира този набор от данни, като се има предвид целта?
2. След това изберете част от този набор от данни за графика, като изберете третата колона от набора от данни. Можете да направите това, като използвате оператора `:` за избор на всички редове и след това изберете третата колона, използвайки индекса (2). Можете също така да преформатирате данните в 2D масив - както се изисква за графиката - като използвате `reshape(n_rows, n_columns)`. Ако един от параметрите е -1, съответното измерение се изчислява автоматично.
```python
X = X[:, 2]
X = X.reshape((-1,1))
```
✅ По всяко време отпечатвайте данните, за да проверите формата им.
3. Сега, когато имате данни, готови за графика, можете да видите дали машината може да помогне за определяне на логическо разделение между числата в този набор от данни. За да направите това, трябва да разделите както данните (X), така и целта (y) на тестови и тренировъчни набори. Scikit-learn има лесен начин за това; можете да разделите тестовите си данни в дадена точка.
```python
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
```
4. Сега сте готови да обучите модела си! Заредете модела за линейна регресия и го обучете с тренировъчните си набори X и y, използвайки `model.fit()`:
```python
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
```
`model.fit()` е функция, която ще виждате в много библиотеки за машинно обучение, като TensorFlow.
5. След това създайте предсказание, използвайки тестовите данни, с помощта на функцията `predict()`. Това ще се използва за начертаване на линия между групите данни.
```python
y_pred = model.predict(X_test)
```
6. Сега е време да покажете данните в графика. Matplotlib е много полезен инструмент за тази задача. Създайте разпръсната графика на всички тестови данни X и y и използвайте предсказанието, за да начертаете линия на най-подходящото място между групите данни на модела.
```python
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.xlabel('Scaled BMIs')
plt.ylabel('Disease Progression')
plt.title('A Graph Plot Showing Diabetes Progression Against BMI')
plt.show()
```
![разпръсната графика, показваща точки от данни за диабет](../../../../2-Regression/1-Tools/images/scatterplot.png)
✅ Помислете малко какво се случва тук. Една права линия минава през множество малки точки от данни, но какво точно прави тя? Можете ли да видите как бихте могли да използвате тази линия, за да предскажете къде нова, невиждана точка от данни би трябвало да се намира спрямо y оста на графиката? Опитайте се да обясните с думи практическата употреба на този модел.
Поздравления, създадохте първия си модел за линейна регресия, направихте предсказание с него и го визуализирахте в графика!
---
## 🚀Предизвикателство
Начертайте графика с различна променлива от този набор от данни. Подсказка: редактирайте този ред: `X = X[:,2]`. С оглед на целта на този набор от данни, какво можете да откриете за прогресията на диабета като заболяване?
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
В този урок работихте с проста линейна регресия, а не с унивариантна или множествена линейна регресия. Прочетете малко за разликите между тези методи или разгледайте [това видео](https://www.coursera.org/lecture/quantifying-relationships-regression-models/linear-vs-nonlinear-categorical-variables-ai2Ef).
Прочетете повече за концепцията на регресията и помислете какви въпроси могат да бъдат отговорени с тази техника. Вземете този [урок](https://docs.microsoft.com/learn/modules/train-evaluate-regression-models?WT.mc_id=academic-77952-leestott), за да задълбочите разбирането си.
## Задача
[Различен набор от данни](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,27 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "74a5cf83e4ebc302afbcbc4f418afd0a",
"translation_date": "2025-09-04T23:39:34+00:00",
"source_file": "2-Regression/1-Tools/assignment.md",
"language_code": "bg"
}
-->
# Регресия със Scikit-learn
## Инструкции
Разгледайте [Linnerud dataset](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_linnerud.html#sklearn.datasets.load_linnerud) в Scikit-learn. Този набор от данни има множество [цели](https://scikit-learn.org/stable/datasets/toy_dataset.html#linnerrud-dataset): „Състои се от три упражнения (данни) и три физиологични (цели) променливи, събрани от двадесет мъже на средна възраст в фитнес клуб“.
Със свои думи опишете как да създадете модел за регресия, който да изобрази връзката между обиколката на талията и броя на направените коремни преси. Направете същото за останалите точки от данните в този набор.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| ------------------------------ | ----------------------------------- | ----------------------------- | -------------------------- |
| Подаден описателен параграф | Подаден е добре написан параграф | Подадени са няколко изречения | Не е предоставено описание |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-04T23:40:09+00:00",
"source_file": "2-Regression/1-Tools/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,226 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7c077988328ebfe33b24d07945f16eca",
"translation_date": "2025-09-04T23:40:27+00:00",
"source_file": "2-Regression/2-Data/README.md",
"language_code": "bg"
}
-->
# Създаване на регресионен модел с помощта на Scikit-learn: подготовка и визуализация на данни
![Инфографика за визуализация на данни](../../../../2-Regression/2-Data/images/data-visualization.png)
Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
> ### [Тази лекция е налична и на R!](../../../../2-Regression/2-Data/solution/R/lesson_2.html)
## Въведение
След като сте настроили инструментите, необходими за изграждане на модели за машинно обучение със Scikit-learn, сте готови да започнете да задавате въпроси към вашите данни. Докато работите с данни и прилагате ML решения, е изключително важно да знаете как да задавате правилните въпроси, за да отключите потенциала на вашия набор от данни.
В тази лекция ще научите:
- Как да подготвите данните си за изграждане на модели.
- Как да използвате Matplotlib за визуализация на данни.
## Задаване на правилния въпрос към вашите данни
Въпросът, който искате да получите отговор, ще определи какъв тип ML алгоритми ще използвате. А качеството на отговора, който ще получите, ще зависи силно от естеството на вашите данни.
Разгледайте [данните](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), предоставени за тази лекция. Можете да отворите този .csv файл в VS Code. Бърз преглед веднага показва, че има празни полета и смесица от текстови и числови данни. Има и странна колона, наречена 'Package', където данните са смесица от 'sacks', 'bins' и други стойности. Данните, всъщност, са малко хаотични.
[![ML за начинаещи - Как да анализираме и почистим набор от данни](https://img.youtube.com/vi/5qGjczWTrDQ/0.jpg)](https://youtu.be/5qGjczWTrDQ "ML за начинаещи - Как да анализираме и почистим набор от данни")
> 🎥 Кликнете върху изображението по-горе за кратко видео, което показва как да подготвите данните за тази лекция.
Всъщност, не е много често да получите набор от данни, който е напълно готов за създаване на ML модел директно. В тази лекция ще научите как да подготвите суров набор от данни, използвайки стандартни Python библиотеки. Ще научите и различни техники за визуализация на данни.
## Казус: 'пазарът на тикви'
В тази папка ще намерите .csv файл в основната папка `data`, наречен [US-pumpkins.csv](https://github.com/microsoft/ML-For-Beginners/blob/main/2-Regression/data/US-pumpkins.csv), който включва 1757 реда данни за пазара на тикви, сортирани по градове. Това са сурови данни, извлечени от [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), разпространявани от Министерството на земеделието на САЩ.
### Подготовка на данни
Тези данни са в публичното пространство. Те могат да бъдат изтеглени в много отделни файлове, за всеки град, от уебсайта на USDA. За да избегнем твърде много отделни файлове, сме обединили всички данни за градовете в една електронна таблица, така че вече сме _подготвили_ данните малко. Сега нека разгледаме данните по-отблизо.
### Данните за тиквите - първоначални заключения
Какво забелязвате за тези данни? Вече видяхте, че има смесица от текстове, числа, празни полета и странни стойности, които трябва да разберете.
Какъв въпрос можете да зададете към тези данни, използвайки регресионна техника? Например: "Предскажете цената на тиква за продажба през даден месец". Поглеждайки отново към данните, има някои промени, които трябва да направите, за да създадете необходимата структура на данните за задачата.
## Упражнение - анализирайте данните за тиквите
Нека използваме [Pandas](https://pandas.pydata.org/) (името означава `Python Data Analysis`), инструмент, много полезен за оформяне на данни, за да анализираме и подготвим тези данни за тиквите.
### Първо, проверете за липсващи дати
Първо трябва да предприемете стъпки, за да проверите за липсващи дати:
1. Конвертирайте датите във формат на месец (това са американски дати, така че форматът е `MM/DD/YYYY`).
2. Извлечете месеца в нова колона.
Отворете файла _notebook.ipynb_ във Visual Studio Code и импортирайте електронната таблица в нов Pandas dataframe.
1. Използвайте функцията `head()`, за да видите първите пет реда.
```python
import pandas as pd
pumpkins = pd.read_csv('../data/US-pumpkins.csv')
pumpkins.head()
```
✅ Каква функция бихте използвали, за да видите последните пет реда?
1. Проверете дали има липсващи данни в текущия dataframe:
```python
pumpkins.isnull().sum()
```
Има липсващи данни, но може би това няма да е от значение за задачата.
1. За да направите вашия dataframe по-лесен за работа, изберете само колоните, които ви трябват, използвайки функцията `loc`, която извлича от оригиналния dataframe група от редове (предадени като първи параметър) и колони (предадени като втори параметър). Изразът `:` в случая означава "всички редове".
```python
columns_to_select = ['Package', 'Low Price', 'High Price', 'Date']
pumpkins = pumpkins.loc[:, columns_to_select]
```
### Второ, определете средната цена на тиква
Помислете как да определите средната цена на тиква през даден месец. Кои колони бихте избрали за тази задача? Подсказка: ще ви трябват 3 колони.
Решение: вземете средната стойност на колоните `Low Price` и `High Price`, за да попълните новата колона Price, и конвертирайте колоната Date, за да показва само месеца. За щастие, според проверката по-горе, няма липсващи данни за дати или цени.
1. За да изчислите средната стойност, добавете следния код:
```python
price = (pumpkins['Low Price'] + pumpkins['High Price']) / 2
month = pd.DatetimeIndex(pumpkins['Date']).month
```
✅ Чувствайте се свободни да отпечатате всякакви данни, които искате да проверите, използвайки `print(month)`.
2. Сега копирайте конвертираните данни в нов Pandas dataframe:
```python
new_pumpkins = pd.DataFrame({'Month': month, 'Package': pumpkins['Package'], 'Low Price': pumpkins['Low Price'],'High Price': pumpkins['High Price'], 'Price': price})
```
Отпечатването на вашия dataframe ще ви покаже чист, подреден набор от данни, върху който можете да изградите новия си регресионен модел.
### Но чакайте! Има нещо странно тук
Ако погледнете колоната `Package`, тиквите се продават в много различни конфигурации. Някои се продават в мерки '1 1/9 bushel', други в '1/2 bushel', някои на тиква, някои на паунд, а някои в големи кутии с различни ширини.
> Тиквите изглежда са много трудни за консистентно претегляне
Разглеждайки оригиналните данни, е интересно, че всичко с `Unit of Sale`, равно на 'EACH' или 'PER BIN', също има тип `Package` на инч, на бин или 'each'. Тиквите изглежда са много трудни за консистентно претегляне, така че нека ги филтрираме, като изберем само тикви със стринга 'bushel' в колоната `Package`.
1. Добавете филтър в началото на файла, под първоначалния импорт на .csv:
```python
pumpkins = pumpkins[pumpkins['Package'].str.contains('bushel', case=True, regex=True)]
```
Ако отпечатате данните сега, можете да видите, че получавате само около 415 реда данни, съдържащи тикви по bushel.
### Но чакайте! Има още нещо за правене
Забелязахте ли, че количеството bushel варира за всеки ред? Трябва да нормализирате цените, така че да показват цените на bushel, затова направете малко математика, за да ги стандартизирате.
1. Добавете тези редове след блока, който създава new_pumpkins dataframe:
```python
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1 1/9'), 'Price'] = price/(1 + 1/9)
new_pumpkins.loc[new_pumpkins['Package'].str.contains('1/2'), 'Price'] = price/(1/2)
```
✅ Според [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308), теглото на bushel зависи от типа на продукта, тъй като това е измерване на обем. "Bushel домати, например, трябва да тежи 56 паунда... Листата и зелените заемат повече пространство с по-малко тегло, така че bushel спанак е само 20 паунда." Всичко това е доста сложно! Нека не се занимаваме с конвертиране на bushel в паундове и вместо това да определим цените на bushel. Цялото това изучаване на bushel тикви, обаче, показва колко важно е да разберете естеството на вашите данни!
Сега можете да анализирате цените на единица, базирани на тяхната bushel мярка. Ако отпечатате данните още веднъж, можете да видите как са стандартизирани.
✅ Забелязахте ли, че тиквите, продавани на половин bushel, са много скъпи? Можете ли да разберете защо? Подсказка: малките тикви са много по-скъпи от големите, вероятно защото има много повече от тях на bushel, като се вземе предвид неизползваното пространство, заето от една голяма куха тиква за пай.
## Стратегии за визуализация
Част от ролята на специалиста по данни е да демонстрира качеството и естеството на данните, с които работи. За да направят това, те често създават интересни визуализации, като графики, диаграми и таблици, показващи различни аспекти на данните. По този начин те могат визуално да покажат връзки и пропуски, които иначе са трудни за откриване.
[![ML за начинаещи - Как да визуализираме данни с Matplotlib](https://img.youtube.com/vi/SbUkxH6IJo0/0.jpg)](https://youtu.be/SbUkxH6IJo0 "ML за начинаещи - Как да визуализираме данни с Matplotlib")
> 🎥 Кликнете върху изображението по-горе за кратко видео, което показва как да визуализирате данните за тази лекция.
Визуализациите могат също да помогнат за определяне на най-подходящата техника за машинно обучение за данните. Например, scatterplot, който изглежда следва линия, показва, че данните са добър кандидат за упражнение с линейна регресия.
Една библиотека за визуализация на данни, която работи добре в Jupyter notebooks, е [Matplotlib](https://matplotlib.org/) (която видяхте и в предишната лекция).
> Получете повече опит с визуализацията на данни в [тези уроци](https://docs.microsoft.com/learn/modules/explore-analyze-data-with-python?WT.mc_id=academic-77952-leestott).
## Упражнение - експериментирайте с Matplotlib
Опитайте да създадете някои основни графики, за да покажете новия dataframe, който току-що създадохте. Какво би показала една основна линейна графика?
1. Импортирайте Matplotlib в началото на файла, под импорта на Pandas:
```python
import matplotlib.pyplot as plt
```
1. Презаредете целия notebook, за да го обновите.
1. В края на notebook-а добавете клетка, за да начертаете данните като кутия:
```python
price = new_pumpkins.Price
month = new_pumpkins.Month
plt.scatter(price, month)
plt.show()
```
![Scatterplot, показващ връзката между цена и месец](../../../../2-Regression/2-Data/images/scatterplot.png)
Полезна ли е тази графика? Има ли нещо, което ви изненадва?
Тя не е особено полезна, тъй като просто показва разпределението на точките в даден месец.
### Направете я полезна
За да направите графиките полезни, обикновено трябва да групирате данните по някакъв начин. Нека опитаме да създадем графика, където y оста показва месеците, а данните демонстрират разпределението.
1. Добавете клетка, за да създадете групирана бар графика:
```python
new_pumpkins.groupby(['Month'])['Price'].mean().plot(kind='bar')
plt.ylabel("Pumpkin Price")
```
![Бар графика, показваща връзката между цена и месец](../../../../2-Regression/2-Data/images/barchart.png)
Това е по-полезна визуализация на данни! Изглежда, че най-високата цена за тикви е през септември и октомври. Това отговаря ли на вашите очаквания? Защо или защо не?
---
## 🚀Предизвикателство
Разгледайте различните типове визуализации, които Matplotlib предлага. Кои типове са най-подходящи за регресионни задачи?
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Разгледайте многото начини за визуализация на данни. Направете списък с различните налични библиотеки и отбележете кои са най-добри за дадени типове задачи, например 2D визуализации срещу 3D визуализации. Какво откривате?
## Задание
[Изследване на визуализацията](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "4485a1ed4dd1b5647365e3d87456515d",
"translation_date": "2025-09-04T23:43:21+00:00",
"source_file": "2-Regression/2-Data/assignment.md",
"language_code": "bg"
}
-->
# Изследване на визуализации
Има няколко различни библиотеки, които са достъпни за визуализация на данни. Създайте някои визуализации, използвайки данните за тиквите от този урок, с помощта на matplotlib и seaborn в примерен notebook. Кои библиотеки са по-лесни за работа?
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | --------- | -------- | ----------------- |
| | Notebook е предоставен с две изследвания/визуализации | Notebook е предоставен с едно изследване/визуализация | Notebook не е предоставен |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-04T23:43:49+00:00",
"source_file": "2-Regression/2-Data/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,373 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "40e64f004f3cb50aa1d8661672d3cd92",
"translation_date": "2025-09-04T23:19:25+00:00",
"source_file": "2-Regression/3-Linear/README.md",
"language_code": "bg"
}
-->
# Създаване на регресионен модел с помощта на Scikit-learn: четири подхода към регресията
![Инфографика за линейна и полиномиална регресия](../../../../2-Regression/3-Linear/images/linear-polynomial.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
> ### [Този урок е наличен и на R!](../../../../2-Regression/3-Linear/solution/R/lesson_3.html)
### Въведение
Досега разгледахте какво представлява регресията с примерни данни, събрани от набора с данни за цените на тиквите, който ще използваме през целия урок. Също така визуализирахте данните с помощта на Matplotlib.
Сега сте готови да се задълбочите в регресията за машинно обучение. Докато визуализацията ви помага да разберете данните, истинската сила на машинното обучение идва от _обучението на модели_. Моделите се обучават върху исторически данни, за да улавят автоматично зависимостите в данните, и позволяват да се предсказват резултати за нови данни, които моделът не е виждал преди.
В този урок ще научите повече за два типа регресия: _основна линейна регресия_ и _полиномиална регресия_, заедно с част от математиката, която стои зад тези техники. Тези модели ще ни позволят да предсказваме цените на тиквите в зависимост от различни входни данни.
[![Машинно обучение за начинаещи - Разбиране на линейната регресия](https://img.youtube.com/vi/CRxFT8oTDMg/0.jpg)](https://youtu.be/CRxFT8oTDMg "Машинно обучение за начинаещи - Разбиране на линейната регресия")
> 🎥 Кликнете върху изображението по-горе за кратък видео преглед на линейната регресия.
> В този курс предполагаме минимални познания по математика и се стремим да я направим достъпна за студенти от други области, така че следете за бележки, 🧮 обяснения, диаграми и други инструменти за учене, които да подпомогнат разбирането.
### Предварителни знания
Трябва вече да сте запознати със структурата на данните за тиквите, които разглеждаме. Те са предварително заредени и почистени в _notebook.ipynb_ файла на този урок. В него цената на тиквите е показана на бушел в нова рамка с данни. Уверете се, че можете да стартирате тези тетрадки в ядра на Visual Studio Code.
### Подготовка
Като напомняне, зареждате тези данни, за да задавате въпроси към тях.
- Кога е най-доброто време за купуване на тикви?
- Каква цена мога да очаквам за кутия с миниатюрни тикви?
- Трябва ли да ги купувам в кошници от половин бушел или в кутии от 1 1/9 бушел?
Нека продължим да изследваме тези данни.
В предишния урок създадохте рамка с данни с Pandas и я запълнихте с част от оригиналния набор от данни, стандартизирайки цените на бушел. По този начин обаче успяхте да съберете само около 400 точки с данни и само за есенните месеци.
Разгледайте данните, които предварително заредихме в придружаващата тетрадка на този урок. Данните са предварително заредени и е начертан първоначален разпръснат график, за да се покаже информацията за месеците. Може би можем да получим малко повече подробности за естеството на данните, като ги почистим допълнително.
## Линия на линейна регресия
Както научихте в Урок 1, целта на упражнението по линейна регресия е да начертаете линия, която:
- **Показва връзките между променливите**. Показва връзката между променливите.
- **Прави прогнози**. Прави точни прогнози за това къде нова точка с данни би попаднала спрямо тази линия.
Типично за **регресията с най-малки квадрати** е да се начертае този тип линия. Терминът "най-малки квадрати" означава, че всички точки с данни около регресионната линия се повдигат на квадрат и след това се събират. Идеално е тази крайна сума да е възможно най-малка, защото искаме малък брой грешки или `най-малки квадрати`.
Правим това, защото искаме да моделираме линия, която има най-малкото кумулативно разстояние от всички наши точки с данни. Също така повдигаме на квадрат стойностите преди да ги съберем, защото ни интересува тяхната големина, а не посоката им.
> **🧮 Покажете ми математиката**
>
> Тази линия, наречена _линия на най-добро съответствие_, може да бъде изразена чрез [уравнение](https://en.wikipedia.org/wiki/Simple_linear_regression):
>
> ```
> Y = a + bX
> ```
>
> `X` е "обяснителната променлива". `Y` е "зависимата променлива". Наклонът на линията е `b`, а `a` е пресечната точка с оста Y, която се отнася до стойността на `Y`, когато `X = 0`.
>
> ![изчисляване на наклона](../../../../2-Regression/3-Linear/images/slope.png)
>
> Първо, изчислете наклона `b`. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
>
> С други думи, и като се позоваваме на първоначалния въпрос за данните за тиквите: "предскажете цената на тиква на бушел по месеци", `X` би се отнасяло до цената, а `Y` би се отнасяло до месеца на продажба.
>
> ![завършване на уравнението](../../../../2-Regression/3-Linear/images/calculation.png)
>
> Изчислете стойността на Y. Ако плащате около $4, значи е април! Инфографика от [Jen Looper](https://twitter.com/jenlooper)
>
> Математиката, която изчислява линията, трябва да демонстрира наклона на линията, който също зависи от пресечната точка или къде се намира `Y`, когато `X = 0`.
>
> Можете да наблюдавате метода на изчисление за тези стойности на уебсайта [Math is Fun](https://www.mathsisfun.com/data/least-squares-regression.html). Също така посетете [този калкулатор за най-малки квадрати](https://www.mathsisfun.com/data/least-squares-calculator.html), за да видите как стойностите на числата влияят на линията.
## Корелация
Още един термин, който трябва да разберете, е **коефициентът на корелация** между дадените променливи X и Y. С помощта на разпръснат график можете бързо да визуализирате този коефициент. График с точки, разположени в права линия, има висока корелация, но график с точки, разпръснати навсякъде между X и Y, има ниска корелация.
Добър модел за линейна регресия ще бъде този, който има висок (по-близо до 1, отколкото до 0) коефициент на корелация, използвайки метода на регресия с най-малки квадрати с линия на регресия.
✅ Стартирайте тетрадката, придружаваща този урок, и разгледайте разпръснатия график "Месец към Цена". Според вашата визуална интерпретация на разпръснатия график, изглежда ли, че данните за продажбите на тикви имат висока или ниска корелация? Променя ли се това, ако използвате по-прецизна мярка вместо `Месец`, например *ден от годината* (т.е. брой дни от началото на годината)?
В кода по-долу ще предположим, че сме почистили данните и сме получили рамка с данни, наречена `new_pumpkins`, подобна на следната:
ID | Месец | ДенОтГодината | Сорт | Град | Опаковка | Ниска цена | Висока цена | Цена
---|-------|---------------|------|------|----------|------------|-------------|------
70 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 бушел кашони | 15.0 | 15.0 | 13.636364
71 | 9 | 267 | PIE TYPE | BALTIMORE | 1 1/9 бушел кашони | 18.0 | 18.0 | 16.363636
72 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 бушел кашони | 18.0 | 18.0 | 16.363636
73 | 10 | 274 | PIE TYPE | BALTIMORE | 1 1/9 бушел кашони | 17.0 | 17.0 | 15.454545
74 | 10 | 281 | PIE TYPE | BALTIMORE | 1 1/9 бушел кашони | 15.0 | 15.0 | 13.636364
> Кодът за почистване на данните е наличен в [`notebook.ipynb`](../../../../2-Regression/3-Linear/notebook.ipynb). Извършихме същите стъпки за почистване, както в предишния урок, и изчислихме колоната `DayOfYear`, използвайки следния израз:
```python
day_of_year = pd.to_datetime(pumpkins['Date']).apply(lambda dt: (dt-datetime(dt.year,1,1)).days)
```
Сега, когато разбирате математиката зад линейната регресия, нека създадем регресионен модел, за да видим дали можем да предскажем коя опаковка тикви ще има най-добри цени. Някой, който купува тикви за празнична тиквена градина, може да иска тази информация, за да оптимизира покупките си на тиквени опаковки за градината.
## Търсене на корелация
[![Машинно обучение за начинаещи - Търсене на корелация: Ключът към линейната регресия](https://img.youtube.com/vi/uoRq-lW2eQo/0.jpg)](https://youtu.be/uoRq-lW2eQo "Машинно обучение за начинаещи - Търсене на корелация: Ключът към линейната регресия")
> 🎥 Кликнете върху изображението по-горе за кратък видео преглед на корелацията.
От предишния урок вероятно сте видели, че средната цена за различните месеци изглежда така:
<img alt="Средна цена по месеци" src="../2-Data/images/barchart.png" width="50%"/>
Това предполага, че трябва да има някаква корелация, и можем да опитаме да обучим модел за линейна регресия, за да предскажем връзката между `Месец` и `Цена`, или между `ДенОтГодината` и `Цена`. Ето разпръснат график, който показва последната връзка:
<img alt="Разпръснат график на Цена спрямо Ден от годината" src="images/scatter-dayofyear.png" width="50%" />
Нека видим дали има корелация, използвайки функцията `corr`:
```python
print(new_pumpkins['Month'].corr(new_pumpkins['Price']))
print(new_pumpkins['DayOfYear'].corr(new_pumpkins['Price']))
```
Изглежда, че корелацията е доста малка, -0.15 за `Месец` и -0.17 за `ДенОтГодината`, но може да има друга важна връзка. Изглежда, че има различни клъстери от цени, съответстващи на различни сортове тикви. За да потвърдим тази хипотеза, нека начертаем всяка категория тикви с различен цвят. Като подадем параметър `ax` на функцията за разпръснат график, можем да начертаем всички точки на един и същ график:
```python
ax=None
colors = ['red','blue','green','yellow']
for i,var in enumerate(new_pumpkins['Variety'].unique()):
df = new_pumpkins[new_pumpkins['Variety']==var]
ax = df.plot.scatter('DayOfYear','Price',ax=ax,c=colors[i],label=var)
```
<img alt="Разпръснат график на Цена спрямо Ден от годината" src="images/scatter-dayofyear-color.png" width="50%" />
Нашето изследване предполага, че сортът има по-голямо влияние върху общата цена, отколкото действителната дата на продажба. Можем да видим това с помощта на стълбовиден график:
```python
new_pumpkins.groupby('Variety')['Price'].mean().plot(kind='bar')
```
<img alt="Стълбовиден график на цена спрямо сорт" src="images/price-by-variety.png" width="50%" />
Нека се съсредоточим за момента само върху един сорт тикви, типа 'pie', и да видим какъв ефект има датата върху цената:
```python
pie_pumpkins = new_pumpkins[new_pumpkins['Variety']=='PIE TYPE']
pie_pumpkins.plot.scatter('DayOfYear','Price')
```
<img alt="Разпръснат график на Цена спрямо Ден от годината" src="images/pie-pumpkins-scatter.png" width="50%" />
Ако сега изчислим корелацията между `Цена` и `ДенОтГодината`, използвайки функцията `corr`, ще получим нещо като `-0.27` - което означава, че обучението на предсказателен модел има смисъл.
> Преди да обучим модел за линейна регресия, е важно да се уверим, че данните ни са чисти. Линейната регресия не работи добре с липсващи стойности, затова има смисъл да премахнем всички празни клетки:
```python
pie_pumpkins.dropna(inplace=True)
pie_pumpkins.info()
```
Друг подход би бил да запълним тези празни стойности със средни стойности от съответната колона.
## Проста линейна регресия
[![Машинно обучение за начинаещи - Линейна и полиномиална регресия с помощта на Scikit-learn](https://img.youtube.com/vi/e4c_UP2fSjg/0.jpg)](https://youtu.be/e4c_UP2fSjg "Машинно обучение за начинаещи - Линейна и полиномиална регресия с помощта на Scikit-learn")
> 🎥 Кликнете върху изображението по-горе за кратък видео преглед на линейната и полиномиалната регресия.
За да обучим нашия модел за линейна регресия, ще използваме библиотеката **Scikit-learn**.
```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
```
Започваме, като разделяме входните стойности (характеристики) и очаквания изход (етикет) в отделни numpy масиви:
```python
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1,1)
y = pie_pumpkins['Price']
```
> Обърнете внимание, че трябваше да извършим `reshape` на входните данни, за да може пакетът за линейна регресия да ги разбере правилно. Линейната регресия очаква 2D-масив като вход, където всеки ред от масива съответства на вектор от входни характеристики. В нашия случай, тъй като имаме само един вход, ни е необходим масив с форма N×1, където N е размерът на набора от данни.
След това трябва да разделим данните на тренировъчен и тестов набор, за да можем да валидираме модела си след обучението:
```python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
Накрая, обучението на действителния модел за линейна регресия отнема само два реда код. Дефинираме обект `LinearRegression` и го обучаваме с нашите данни, използвайки метода `fit`:
```python
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train)
```
Обектът `LinearRegression` след `fit` съдържа всички коефициенти на регресията, които могат да бъдат достъпени чрез свойството `.coef_`. В нашия случай има само един коефициент, който трябва да е около `-0.017`. Това означава, че цените изглежда намаляват леко с времето, но не твърде много, около 2 цента на ден. Можем също така да достъпим точката на пресичане на регресията с оста Y, използвайки `lin_reg.intercept_` - тя ще бъде около `21` в нашия случай, което показва цената в началото на годината.
За да видим колко точен е нашият модел, можем да предскажем цените върху тестовия набор от данни и след това да измерим колко близки са нашите прогнози до очакваните стойности. Това може да се направи с помощта на метриката за средна квадратична грешка (MSE), която е средната стойност на всички квадратични разлики между очак
Нашата грешка изглежда е около 2 точки, което е ~17%. Не е много добре. Друг показател за качеството на модела е **коефициентът на детерминация**, който може да бъде получен по следния начин:
```python
score = lin_reg.score(X_train,y_train)
print('Model determination: ', score)
```
Ако стойността е 0, това означава, че моделът не взема предвид входните данни и действа като *най-лошия линеен предиктор*, който е просто средната стойност на резултата. Стойност 1 означава, че можем перфектно да предвидим всички очаквани изходи. В нашия случай коефициентът е около 0.06, което е доста ниско.
Можем също да начертаем тестовите данни заедно с регресионната линия, за да видим по-добре как работи регресията в нашия случай:
```python
plt.scatter(X_test,y_test)
plt.plot(X_test,pred)
```
<img alt="Линейна регресия" src="images/linear-results.png" width="50%" />
## Полиномиална регресия
Друг вид линейна регресия е полиномиалната регресия. Докато понякога има линейна връзка между променливите - например, колкото по-голяма е тиквата по обем, толкова по-висока е цената - понякога тези връзки не могат да бъдат изобразени като равнина или права линия.
✅ Ето [някои примери](https://online.stat.psu.edu/stat501/lesson/9/9.8) за данни, които могат да използват полиномиална регресия.
Погледнете отново връзката между дата и цена. Изглежда ли този разпръснат график като нещо, което задължително трябва да бъде анализирано с права линия? Не могат ли цените да се колебаят? В този случай можете да опитате полиномиална регресия.
✅ Полиномите са математически изрази, които могат да се състоят от една или повече променливи и коефициенти.
Полиномиалната регресия създава извита линия, която по-добре пасва на нелинейни данни. В нашия случай, ако включим квадратната променлива `DayOfYear` във входните данни, трябва да можем да паснем данните с параболична крива, която ще има минимум в определен момент от годината.
Scikit-learn включва полезен [API за pipeline](https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.make_pipeline.html?highlight=pipeline#sklearn.pipeline.make_pipeline), който комбинира различни стъпки на обработка на данни. **Pipeline** е верига от **оценители**. В нашия случай ще създадем pipeline, който първо добавя полиномиални характеристики към модела, а след това обучава регресията:
```python
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
```
Използването на `PolynomialFeatures(2)` означава, че ще включим всички полиноми от втори ред от входните данни. В нашия случай това просто означава `DayOfYear`<sup>2</sup>, но при две входни променливи X и Y, това ще добави X<sup>2</sup>, XY и Y<sup>2</sup>. Можем също да използваме полиноми от по-висок ред, ако желаем.
Pipeline може да се използва по същия начин като оригиналния обект `LinearRegression`, т.е. можем да използваме `fit` за обучение на pipeline и след това `predict`, за да получим резултатите от предсказанието. Ето график, показващ тестовите данни и кривата на апроксимация:
<img alt="Полиномиална регресия" src="images/poly-results.png" width="50%" />
С използването на полиномиална регресия можем да постигнем малко по-ниско MSE и по-висок коефициент на детерминация, но не значително. Трябва да вземем предвид и други характеристики!
> Можете да видите, че минималните цени на тиквите се наблюдават някъде около Хелоуин. Как бихте обяснили това?
🎃 Поздравления, току-що създадохте модел, който може да помогне за предсказване на цената на тиквите за пай. Вероятно можете да повторите същата процедура за всички видове тикви, но това би било досадно. Нека сега научим как да вземем предвид разнообразието на тиквите в нашия модел!
## Категориални характеристики
В идеалния случай искаме да можем да предсказваме цените за различни видове тикви, използвайки един и същ модел. Въпреки това, колоната `Variety` е малко по-различна от колони като `Month`, защото съдържа нечислови стойности. Такива колони се наричат **категориални**.
[![ML за начинаещи - Предсказания с категориални характеристики и линейна регресия](https://img.youtube.com/vi/DYGliioIAE0/0.jpg)](https://youtu.be/DYGliioIAE0 "ML за начинаещи - Предсказания с категориални характеристики и линейна регресия")
> 🎥 Кликнете върху изображението по-горе за кратък видео преглед на използването на категориални характеристики.
Тук можете да видите как средната цена зависи от разнообразието:
<img alt="Средна цена по разнообразие" src="images/price-by-variety.png" width="50%" />
За да вземем предвид разнообразието, първо трябва да го преобразуваме в числова форма, или **да го кодираме**. Има няколко начина да го направим:
* Простото **числово кодиране** ще създаде таблица с различни видове тикви и след това ще замени името на вида с индекс в тази таблица. Това не е най-добрата идея за линейна регресия, защото линейната регресия взема действителната числова стойност на индекса и я добавя към резултата, умножавайки я с някакъв коефициент. В нашия случай връзката между номера на индекса и цената очевидно не е линейна, дори ако се уверим, че индексите са подредени по определен начин.
* **One-hot кодиране** ще замени колоната `Variety` с 4 различни колони, по една за всеки вид. Всяка колона ще съдържа `1`, ако съответният ред е от даден вид, и `0` в противен случай. Това означава, че ще има четири коефициента в линейната регресия, по един за всеки вид тиква, отговорен за "началната цена" (или по-скоро "допълнителната цена") за този конкретен вид.
Кодът по-долу показва как можем да направим one-hot кодиране на разнообразието:
```python
pd.get_dummies(new_pumpkins['Variety'])
```
ID | FAIRYTALE | MINIATURE | MIXED HEIRLOOM VARIETIES | PIE TYPE
----|-----------|-----------|--------------------------|----------
70 | 0 | 0 | 0 | 1
71 | 0 | 0 | 0 | 1
... | ... | ... | ... | ...
1738 | 0 | 1 | 0 | 0
1739 | 0 | 1 | 0 | 0
1740 | 0 | 1 | 0 | 0
1741 | 0 | 1 | 0 | 0
1742 | 0 | 1 | 0 | 0
За да обучим линейна регресия, използвайки one-hot кодирано разнообразие като вход, просто трябва да инициализираме данните `X` и `y` правилно:
```python
X = pd.get_dummies(new_pumpkins['Variety'])
y = new_pumpkins['Price']
```
Останалата част от кода е същата като тази, която използвахме по-горе за обучение на линейна регресия. Ако го опитате, ще видите, че средната квадратична грешка е приблизително същата, но получаваме много по-висок коефициент на детерминация (~77%). За да получим още по-точни предсказания, можем да вземем предвид повече категориални характеристики, както и числови характеристики, като `Month` или `DayOfYear`. За да получим една голяма масив от характеристики, можем да използваме `join`:
```python
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
```
Тук също вземаме предвид `City` и типа на опаковката, което ни дава MSE 2.84 (10%) и детерминация 0.94!
## Събиране на всичко заедно
За да създадем най-добрия модел, можем да използваме комбинирани (one-hot кодирани категориални + числови) данни от горния пример заедно с полиномиална регресия. Ето пълния код за ваше удобство:
```python
# set up training data
X = pd.get_dummies(new_pumpkins['Variety']) \
.join(new_pumpkins['Month']) \
.join(pd.get_dummies(new_pumpkins['City'])) \
.join(pd.get_dummies(new_pumpkins['Package']))
y = new_pumpkins['Price']
# make train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# setup and train the pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train,y_train)
# predict results for test data
pred = pipeline.predict(X_test)
# calculate MSE and determination
mse = np.sqrt(mean_squared_error(y_test,pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
score = pipeline.score(X_train,y_train)
print('Model determination: ', score)
```
Това трябва да ни даде най-добрия коефициент на детерминация от почти 97% и MSE=2.23 (~8% грешка при предсказание).
| Модел | MSE | Детерминация |
|-------|-----|---------------|
| `DayOfYear` Линейна | 2.77 (17.2%) | 0.07 |
| `DayOfYear` Полиномиална | 2.73 (17.0%) | 0.08 |
| `Variety` Линейна | 5.24 (19.7%) | 0.77 |
| Всички характеристики Линейна | 2.84 (10.5%) | 0.94 |
| Всички характеристики Полиномиална | 2.23 (8.25%) | 0.97 |
🏆 Браво! Създадохте четири модела за регресия в един урок и подобрихте качеството на модела до 97%. В последния раздел за регресия ще научите за логистичната регресия за определяне на категории.
---
## 🚀Предизвикателство
Тествайте няколко различни променливи в този notebook, за да видите как корелацията съответства на точността на модела.
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
В този урок научихме за линейната регресия. Има и други важни видове регресия. Прочетете за техниките Stepwise, Ridge, Lasso и Elasticnet. Добър курс за изучаване на повече е [Статистическият курс на Stanford](https://online.stanford.edu/courses/sohs-ystatslearning-statistical-learning).
## Задача
[Създайте модел](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "cc471fa89c293bc735dd3a9a0fb79b1b",
"translation_date": "2025-09-04T23:26:04+00:00",
"source_file": "2-Regression/3-Linear/assignment.md",
"language_code": "bg"
}
-->
# Създаване на регресионен модел
## Инструкции
В този урок беше показано как да се изгради модел, използвайки както линейна, така и полиномиална регресия. Използвайки тези знания, намерете набор от данни или използвайте един от вградените набори на Scikit-learn, за да изградите нов модел. Обяснете в своя бележник защо сте избрали техниката, която сте използвали, и демонстрирайте точността на модела си. Ако моделът не е точен, обяснете защо.
## Рубрика
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ------------------------------------------------------------ | -------------------------- | ------------------------------- |
| | представя пълен бележник с добре документирано решение | решението е непълно | решението е неправилно или с грешки |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-04T23:26:34+00:00",
"source_file": "2-Regression/3-Linear/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,410 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "abf86d845c84330bce205a46b382ec88",
"translation_date": "2025-09-04T23:26:51+00:00",
"source_file": "2-Regression/4-Logistic/README.md",
"language_code": "bg"
}
-->
# Логистична регресия за предсказване на категории
![Инфографика за логистична срещу линейна регресия](../../../../2-Regression/4-Logistic/images/linear-vs-logistic.png)
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
> ### [Този урок е наличен и на R!](../../../../2-Regression/4-Logistic/solution/R/lesson_4.html)
## Въведение
В този последен урок за регресия, една от основните _класически_ техники в машинното обучение, ще разгледаме логистичната регресия. Тази техника се използва за откриване на модели за предсказване на бинарни категории. Това бонбонче шоколад ли е или не? Тази болест заразна ли е или не? Този клиент ще избере този продукт или не?
В този урок ще научите:
- Нова библиотека за визуализация на данни
- Техники за логистична регресия
✅ Задълбочете разбирането си за работа с този тип регресия в този [модул за обучение](https://docs.microsoft.com/learn/modules/train-evaluate-classification-models?WT.mc_id=academic-77952-leestott)
## Предпоставки
След като вече работихме с данните за тиквите, сме достатъчно запознати с тях, за да осъзнаем, че има една бинарна категория, с която можем да работим: `Цвят`.
Нека изградим модел за логистична регресия, за да предскажем, въз основа на някои променливи, акъв цвят вероятно ще има дадена тиква_ (оранжева 🎃 или бяла 👻).
> Защо говорим за бинарна класификация в урок за регресия? Само за езиково удобство, тъй като логистичната регресия е [всъщност метод за класификация](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression), макар и базиран на линейни модели. Научете за други начини за класифициране на данни в следващата група уроци.
## Определяне на въпроса
За нашите цели ще изразим това като бинарно: 'Бяла' или 'Не бяла'. В нашия набор от данни има и категория 'райета', но има малко случаи на нея, така че няма да я използваме. Тя така или иначе изчезва, след като премахнем стойностите null от набора от данни.
> 🎃 Забавен факт: понякога наричаме белите тикви 'призрачни' тикви. Те не са много лесни за издълбаване, затова не са толкова популярни като оранжевите, но изглеждат страхотно! Така че можем да преформулираме въпроса си като: 'Призрачна' или 'Не призрачна'. 👻
## За логистичната регресия
Логистичната регресия се различава от линейната регресия, която разгледахме по-рано, по няколко важни начина.
[![Машинно обучение за начинаещи - Разбиране на логистичната регресия за класификация](https://img.youtube.com/vi/KpeCT6nEpBY/0.jpg)](https://youtu.be/KpeCT6nEpBY "Машинно обучение за начинаещи - Разбиране на логистичната регресия за класификация")
> 🎥 Кликнете върху изображението по-горе за кратко видео за логистичната регресия.
### Бинарна класификация
Логистичната регресия не предлага същите функции като линейната регресия. Първата предлага предсказание за бинарна категория ("бяла или не бяла"), докато втората е способна да предсказва непрекъснати стойности, например въз основа на произхода на тиквата и времето на прибиране на реколтата, олко ще се повиши цената ѝ_.
![Модел за класификация на тикви](../../../../2-Regression/4-Logistic/images/pumpkin-classifier.png)
> Инфографика от [Dasani Madipalli](https://twitter.com/dasani_decoded)
### Други класификации
Има и други видове логистична регресия, включително мултиноминална и ординална:
- **Мултиноминална**, която включва повече от една категория - "Оранжева, Бяла и Райета".
- **Ординална**, която включва подредени категории, полезна ако искаме да подредим резултатите си логично, като например тиквите, които са подредени по ограничен брой размери (мини, малък, среден, голям, XL, XXL).
![Мултиноминална срещу ординална регресия](../../../../2-Regression/4-Logistic/images/multinomial-vs-ordinal.png)
### Променливите НЕ трябва да корелират
Помните ли как линейната регресия работеше по-добре с повече корелирани променливи? Логистичната регресия е обратното - променливите не трябва да се подреждат. Това работи за тези данни, които имат сравнително слаби корелации.
### Нуждаете се от много чисти данни
Логистичната регресия ще даде по-точни резултати, ако използвате повече данни; нашият малък набор от данни не е оптимален за тази задача, така че имайте това предвид.
[![Машинно обучение за начинаещи - Анализ и подготовка на данни за логистична регресия](https://img.youtube.com/vi/B2X4H9vcXTs/0.jpg)](https://youtu.be/B2X4H9vcXTs "Машинно обучение за начинаещи - Анализ и подготовка на данни за логистична регресия")
✅ Помислете за типовете данни, които биха били подходящи за логистична регресия.
## Упражнение - подредете данните
Първо, почистете данните, като премахнете стойностите null и изберете само някои от колоните:
1. Добавете следния код:
```python
columns_to_select = ['City Name','Package','Variety', 'Origin','Item Size', 'Color']
pumpkins = full_pumpkins.loc[:, columns_to_select]
pumpkins.dropna(inplace=True)
```
Винаги можете да погледнете новия си dataframe:
```python
pumpkins.info
```
### Визуализация - категоричен график
Досега сте заредили [началния notebook](../../../../2-Regression/4-Logistic/notebook.ipynb) с данни за тикви и сте го почистили, за да запазите набор от данни, съдържащ няколко променливи, включително `Цвят`. Нека визуализираме dataframe-а в notebook-а, използвайки различна библиотека: [Seaborn](https://seaborn.pydata.org/index.html), която е изградена върху Matplotlib, която използвахме по-рано.
Seaborn предлага някои интересни начини за визуализация на данните. Например, можете да сравните разпределенията на данните за всяка `Разновидност` и `Цвят` в категоричен график.
1. Създайте такъв график, като използвате функцията `catplot`, използвайки данните за тиквите `pumpkins`, и задайте цветово картографиране за всяка категория тикви (оранжева или бяла):
```python
import seaborn as sns
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
sns.catplot(
data=pumpkins, y="Variety", hue="Color", kind="count",
palette=palette,
)
```
![Мрежа от визуализирани данни](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_1.png)
Наблюдавайки данните, можете да видите как данните за цвета се отнасят към разновидността.
✅ Въз основа на този категоричен график, какви интересни изследвания можете да си представите?
### Предварителна обработка на данни: кодиране на характеристики и етикети
Нашият набор от данни за тикви съдържа текстови стойности за всички свои колони. Работата с категорични данни е интуитивна за хората, но не и за машините. Алгоритмите за машинно обучение работят добре с числа. Затова кодирането е много важна стъпка в етапа на предварителна обработка на данни, тъй като ни позволява да превърнем категоричните данни в числови, без да губим информация. Добро кодиране води до изграждане на добър модел.
За кодиране на характеристики има два основни типа кодиращи:
1. Ординален кодиращ: подходящ за ординални променливи, които са категорични променливи, при които данните следват логическа подредба, като колоната `Размер на артикула` в нашия набор от данни. Той създава картографиране, така че всяка категория да бъде представена с число, което е редът на категорията в колоната.
```python
from sklearn.preprocessing import OrdinalEncoder
item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']]
ordinal_features = ['Item Size']
ordinal_encoder = OrdinalEncoder(categories=item_size_categories)
```
2. Категоричен кодиращ: подходящ за номинални променливи, които са категорични променливи, при които данните не следват логическа подредба, като всички характеристики, различни от `Размер на артикула` в нашия набор от данни. Това е кодиране с единичен бит, което означава, че всяка категория е представена с бинарна колона: кодираната променлива е равна на 1, ако тиквата принадлежи към тази разновидност, и 0 в противен случай.
```python
from sklearn.preprocessing import OneHotEncoder
categorical_features = ['City Name', 'Package', 'Variety', 'Origin']
categorical_encoder = OneHotEncoder(sparse_output=False)
```
След това `ColumnTransformer` се използва за комбиниране на множество кодиращи в една стъпка и прилагането им към съответните колони.
```python
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer(transformers=[
('ord', ordinal_encoder, ordinal_features),
('cat', categorical_encoder, categorical_features)
])
ct.set_output(transform='pandas')
encoded_features = ct.fit_transform(pumpkins)
```
От друга страна, за кодиране на етикета използваме класа `LabelEncoder` от scikit-learn, който е помощен клас за нормализиране на етикетите, така че те да съдържат само стойности между 0 и n_classes-1 (тук, 0 и 1).
```python
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
encoded_label = label_encoder.fit_transform(pumpkins['Color'])
```
След като сме кодирали характеристиките и етикета, можем да ги обединим в нов dataframe `encoded_pumpkins`.
```python
encoded_pumpkins = encoded_features.assign(Color=encoded_label)
```
✅ Какви са предимствата на използването на ординален кодиращ за колоната `Размер на артикула`?
### Анализ на връзките между променливите
Сега, когато сме обработили данните, можем да анализираме връзките между характеристиките и етикета, за да добием представа колко добре моделът ще може да предскаже етикета въз основа на характеристиките. Най-добрият начин за извършване на този вид анализ е чрез визуализиране на данните. Ще използваме отново функцията `catplot` от Seaborn, за да визуализираме връзките между `Размер на артикула`, `Разновидност` и `Цвят` в категоричен график. За по-добро визуализиране на данните ще използваме кодираната колона `Размер на артикула` и некодираната колона `Разновидност`.
```python
palette = {
'ORANGE': 'orange',
'WHITE': 'wheat',
}
pumpkins['Item Size'] = encoded_pumpkins['ord__Item Size']
g = sns.catplot(
data=pumpkins,
x="Item Size", y="Color", row='Variety',
kind="box", orient="h",
sharex=False, margin_titles=True,
height=1.8, aspect=4, palette=palette,
)
g.set(xlabel="Item Size", ylabel="").set(xlim=(0,6))
g.set_titles(row_template="{row_name}")
```
![Категоричен график на визуализирани данни](../../../../2-Regression/4-Logistic/images/pumpkins_catplot_2.png)
### Използване на swarm график
Тъй като `Цвят` е бинарна категория (Бяла или Не), тя изисква '[специализиран подход](https://seaborn.pydata.org/tutorial/categorical.html?highlight=bar) за визуализация'. Има други начини за визуализиране на връзката на тази категория с други променливи.
Можете да визуализирате променливите една до друга с графики от Seaborn.
1. Опитайте swarm график, за да покажете разпределението на стойностите:
```python
palette = {
0: 'orange',
1: 'wheat'
}
sns.swarmplot(x="Color", y="ord__Item Size", data=encoded_pumpkins, palette=palette)
```
![Swarm график на визуализирани данни](../../../../2-Regression/4-Logistic/images/swarm_2.png)
**Внимание**: кодът по-горе може да генерира предупреждение, тъй като Seaborn не успява да представи такова количество точки в swarm график. Възможно решение е намаляване на размера на маркера, като се използва параметърът 'size'. Въпреки това, имайте предвид, че това влияе върху четливостта на графика.
> **🧮 Покажете ми математиката**
>
> Логистичната регресия разчита на концепцията за 'максимална вероятност', използвайки [сигмоидни функции](https://wikipedia.org/wiki/Sigmoid_function). Сигмоидната функция на график изглежда като форма на 'S'. Тя взема стойност и я картографира между 0 и 1. Нейната крива се нарича още 'логистична крива'. Формулата ѝ изглежда така:
>
> ![логистична функция](../../../../2-Regression/4-Logistic/images/sigmoid.png)
>
> където средната точка на сигмоида се намира при x = 0, L е максималната стойност на кривата, а k е стръмността на кривата. Ако резултатът от функцията е повече от 0.5, етикетът ще бъде класифициран като '1' от бинарния избор. Ако не, ще бъде класифициран като '0'.
## Изградете своя модел
Изграждането на модел за намиране на тези бинарни класификации е изненадващо лесно в Scikit-learn.
[![Машинно обучение за начинаещи - Логистична регресия за класификация на данни](https://img.youtube.com/vi/MmZS2otPrQ8/0.jpg)](https://youtu.be/MmZS2otPrQ8 "Машинно обучение за начинаещи - Логистична регресия за класификация на данни")
> 🎥 Кликнете върху изображението по-горе за кратко видео за изграждане на модел за линейна регресия.
1. Изберете променливите, които искате да използвате в модела си за класификация, и разделете тренировъчния и тестовия набор, като извикате `train_test_split()`:
```python
from sklearn.model_selection import train_test_split
X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])]
y = encoded_pumpkins['Color']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
2. Сега можете да обучите модела си, като извикате `fit()` с тренировъчните данни, и да отпечатате резултата му:
```python
from sklearn.metrics import f1_score, classification_report
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print('Predicted labels: ', predictions)
print('F1-score: ', f1_score(y_test, predictions))
```
Вижте резултатите на модела си. Не е зле, като се има предвид, че имате само около 1000 реда данни:
```output
precision recall f1-score support
0 0.94 0.98 0.96 166
1 0.85 0.67 0.75 33
accuracy 0.92 199
macro avg 0.89 0.82 0.85 199
weighted avg 0.92 0.92 0.92 199
Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0
0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 1 0 0 0 0 0 0 0 0 1 1]
F1-score: 0.7457627118644068
```
## По-добро разбиране чрез матрица на объркване
Докато можете да получите отчет за резултатите [термини](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html?highlight=classification_report#sklearn.metrics.classification_report), като отпечатате горните елементи, може да разберете модела си по-лесно, като използвате [матрица на объркване](https://scikit-learn.org/stable/modules/model_evaluation.html#confusion-matrix), за да ни помогне да разберем как се представя моделът.
> 🎓 '[Матрица на объркване](https://wikipedia.org/wiki/Confusion_matrix)' (или 'матрица на грешки') е таблица, която изразява истинските срещу фалшивите положителни и отрицателни резултати на модела, като по този начин оценява точността на предсказанията.
1. За да използвате матрица на объркване, извикайте `confusion_matrix()`:
```python
from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, predictions)
```
Вижте матрицата на объркване на модела си:
```output
array([[162, 4],
[ 11, 22]])
```
В Scikit-learn, редовете (ос 0) са действителните етикети, а колоните (ос 1) са предсказаните етикети.
| | 0 | 1 |
| :---: | :---: | :---: |
| 0 | TN | FP |
| 1 | FN | TP |
Какво се случва тук? Да кажем, че моделът ни е помолен да класифицира тикви между две бинарни категории, категория 'бяла' и категория 'не бяла'.
- Ако моделът ви предскаже тиква като не бяла и тя принадлежи към категория 'не бяла' в действителност, наричаме това истински отрицателен резултат, показан от горния ляв номер.
- Ако моделът ви предскаже тиква като бяла и тя принадлежи към категория 'не бяла' в действителност, наричаме това фалшив отрицателен резултат, показан от долния ляв номер.
- Ако моделът ви предскаже тиква като не бяла и тя принадлежи към категория 'бяла' в действителност, наричаме това фалшив положителен резултат, показан от горния десен номер.
- Ако моделът ви предскаже тиква като бяла и тя принадлежи към категория 'бяла' в действителност, наричаме това истински положителен резултат, показан от долния десен номер.
Както може би сте се досетили, е за предпочитане да имате по-голям брой истински положителни и истински отрицателни резултати и по-малък брой фалшиви положителни и фалшиви
Как се свързва матрицата на объркване с прецизността и припомнянето? Запомнете, че отчетът за класификация, отпечатан по-горе, показа прецизност (0.85) и припомняне (0.67).
Прецизност = tp / (tp + fp) = 22 / (22 + 4) = 0.8461538461538461
Припомняне = tp / (tp + fn) = 22 / (22 + 11) = 0.6666666666666666
✅ Въпрос: Според матрицата на объркване, как се справи моделът? Отговор: Не е зле; има добър брой истински отрицателни, но също така и няколко фалшиви отрицателни.
Нека отново разгледаме термините, които видяхме по-рано, с помощта на картографирането на TP/TN и FP/FN в матрицата на объркване:
🎓 Прецизност: TP/(TP + FP) Делът на релевантните случаи сред извлечените случаи (например кои етикети са добре етикетирани).
🎓 Припомняне: TP/(TP + FN) Делът на релевантните случаи, които са извлечени, независимо дали са добре етикетирани или не.
🎓 f1-оценка: (2 * прецизност * припомняне)/(прецизност + припомняне) Претеглена средна стойност на прецизността и припомнянето, като най-добрата е 1, а най-лошата е 0.
🎓 Поддръжка: Броят на случаите за всяка извлечена етикетирана категория.
🎓 Точност: (TP + TN)/(TP + TN + FP + FN) Процентът на етикетите, предсказани правилно за дадена извадка.
🎓 Средна макро стойност: Изчисляване на невзетата предвид средна стойност на метриките за всяка категория, без да се отчита дисбалансът на етикетите.
🎓 Претеглена средна стойност: Изчисляване на средната стойност на метриките за всяка категория, като се отчита дисбалансът на етикетите чрез претегляне спрямо тяхната поддръжка (броя на истинските случаи за всяка категория).
✅ Можете ли да се сетите коя метрика трябва да наблюдавате, ако искате вашият модел да намали броя на фалшивите отрицателни?
## Визуализирайте ROC кривата на този модел
[![ML за начинаещи - Анализ на производителността на логистичната регресия с ROC криви](https://img.youtube.com/vi/GApO575jTA0/0.jpg)](https://youtu.be/GApO575jTA0 "ML за начинаещи - Анализ на производителността на логистичната регресия с ROC криви")
> 🎥 Кликнете върху изображението по-горе за кратък видео преглед на ROC кривите.
Нека направим още една визуализация, за да видим така наречената 'ROC' крива:
```python
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
y_scores = model.predict_proba(X_test)
fpr, tpr, thresholds = roc_curve(y_test, y_scores[:,1])
fig = plt.figure(figsize=(6, 6))
plt.plot([0, 1], [0, 1], 'k--')
plt.plot(fpr, tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
```
С помощта на Matplotlib начертайте [Receiving Operating Characteristic](https://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html?highlight=roc) или ROC на модела. ROC кривите често се използват, за да се получи представа за изхода на класификатора по отношение на неговите истински срещу фалшиви положителни. "ROC кривите обикновено показват истинския положителен процент на Y оста и фалшивия положителен процент на X оста." Следователно, стръмността на кривата и пространството между средната линия и кривата са важни: искате крива, която бързо се издига и преминава над линията. В нашия случай има фалшиви положителни в началото, след което линията се издига и преминава правилно:
![ROC](../../../../2-Regression/4-Logistic/images/ROC_2.png)
Накрая, използвайте [`roc_auc_score` API](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.roc_auc_score.html?highlight=roc_auc#sklearn.metrics.roc_auc_score) на Scikit-learn, за да изчислите действителната 'Площ под кривата' (AUC):
```python
auc = roc_auc_score(y_test,y_scores[:,1])
print(auc)
```
Резултатът е `0.9749908725812341`. Като се има предвид, че AUC варира от 0 до 1, искате висок резултат, тъй като модел, който е 100% точен в своите предсказания, ще има AUC от 1; в този случай моделът е оста добър_.
В бъдещи уроци за класификации ще научите как да подобрите резултатите на вашия модел. Но засега, поздравления! Завършихте тези уроци за регресия!
---
## 🚀Предизвикателство
Има още много за разглеждане относно логистичната регресия! Но най-добрият начин да научите е чрез експериментиране. Намерете набор от данни, който е подходящ за този тип анализ, и изградете модел с него. Какво научавате? съвет: опитайте [Kaggle](https://www.kaggle.com/search?q=logistic+regression+datasets) за интересни набори от данни.
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Прочетете първите няколко страници от [тази статия от Станфорд](https://web.stanford.edu/~jurafsky/slp3/5.pdf) за някои практически приложения на логистичната регресия. Помислете за задачи, които са по-подходящи за един или друг тип регресионни задачи, които сме изучавали досега. Какво би работило най-добре?
## Задание
[Повторно изпълнение на тази регресия](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "8af40209a41494068c1f42b14c0b450d",
"translation_date": "2025-09-04T23:34:08+00:00",
"source_file": "2-Regression/4-Logistic/assignment.md",
"language_code": "bg"
}
-->
# Повторно прилагане на регресия
## Инструкции
В урока използвахте подмножество от данните за тиквите. Сега се върнете към оригиналните данни и опитайте да използвате всички тях, почистени и стандартизирани, за да изградите модел за логистична регресия.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ---------------------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- |
| | Представен е тетрадка с добре обяснен и добре работещ модел | Представен е тетрадка с модел, който работи минимално | Представен е тетрадка с модел, който не работи добре или липсва |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-04T23:34:36+00:00",
"source_file": "2-Regression/4-Logistic/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,54 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "508582278dbb8edd2a8a80ac96ef416c",
"translation_date": "2025-09-04T23:18:18+00:00",
"source_file": "2-Regression/README.md",
"language_code": "bg"
}
-->
# Регресионни модели за машинно обучение
## Регионална тема: Регресионни модели за цените на тиквите в Северна Америка 🎃
В Северна Америка тиквите често се издълбават в страшни лица за Хелоуин. Нека открием повече за тези интересни зеленчуци!
![jack-o-lanterns](../../../2-Regression/images/jack-o-lanterns.jpg)
> Снимка от <a href="https://unsplash.com/@teutschmann?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Beth Teutschmann</a> на <a href="https://unsplash.com/s/photos/jack-o-lanterns?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Какво ще научите
[![Въведение в регресията](https://img.youtube.com/vi/5QnJtDad4iQ/0.jpg)](https://youtu.be/5QnJtDad4iQ "Въведение в регресията - Кликнете за гледане!")
> 🎥 Кликнете върху изображението по-горе за кратко видео въведение към този урок
Уроците в този раздел обхващат видовете регресия в контекста на машинното обучение. Регресионните модели могат да помогнат за определяне на ръзката_ между променливите. Този тип модел може да предсказва стойности като дължина, температура или възраст, като разкрива връзките между променливите, докато анализира данните.
В тази серия от уроци ще откриете разликите между линейна и логистична регресия и кога е подходящо да използвате едната вместо другата.
[![Машинно обучение за начинаещи - Въведение в регресионните модели за машинно обучение](https://img.youtube.com/vi/XA3OaoW86R8/0.jpg)](https://youtu.be/XA3OaoW86R8 "Машинно обучение за начинаещи - Въведение в регресионните модели за машинно обучение")
> 🎥 Кликнете върху изображението по-горе за кратко видео, представящо регресионните модели.
В тази група уроци ще се подготвите за започване на задачи по машинно обучение, включително конфигуриране на Visual Studio Code за управление на notebooks, общата среда за работа на специалистите по данни. Ще откриете Scikit-learn, библиотека за машинно обучение, и ще изградите първите си модели, като се фокусирате върху регресионните модели в тази глава.
> Съществуват полезни инструменти с нисък код, които могат да ви помогнат да научите повече за работата с регресионни модели. Опитайте [Azure ML за тази задача](https://docs.microsoft.com/learn/modules/create-regression-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
### Уроци
1. [Инструменти за работа](1-Tools/README.md)
2. [Управление на данни](2-Data/README.md)
3. [Линейна и полиномиална регресия](3-Linear/README.md)
4. [Логистична регресия](4-Logistic/README.md)
---
### Кредити
"Машинно обучение с регресия" е написано с ♥️ от [Jen Looper](https://twitter.com/jenlooper)
♥️ Създатели на тестове включват: [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan) и [Ornella Altunyan](https://twitter.com/ornelladotcom)
Датасетът за тикви е предложен от [този проект в Kaggle](https://www.kaggle.com/usda/a-year-of-pumpkin-prices), а данните му са взети от [Specialty Crops Terminal Markets Standard Reports](https://www.marketnews.usda.gov/mnp/fv-report-config-step1?type=termPrice), разпространявани от Министерството на земеделието на САЩ. Добавили сме някои точки, свързани с цвета, базирани на сорта, за да нормализираме разпределението. Тези данни са в публичното пространство.
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,359 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "e0b75f73e4a90d45181dc5581fe2ef5c",
"translation_date": "2025-09-05T00:36:52+00:00",
"source_file": "3-Web-App/1-Web-App/README.md",
"language_code": "bg"
}
-->
# Създаване на уеб приложение за използване на ML модел
В този урок ще обучите ML модел върху набор от данни, който е извън този свят: абелязвания на НЛО през последния век_, взети от базата данни на NUFORC.
Ще научите:
- Как да „pickle“-нете обучен модел
- Как да използвате този модел в Flask приложение
Ще продължим да използваме notebooks за почистване на данни и обучение на модела, но можете да направите процеса още една стъпка напред, като изследвате използването на модел „в дивата природа“, така да се каже: в уеб приложение.
За да направите това, трябва да изградите уеб приложение с Flask.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Създаване на приложение
Има няколко начина за създаване на уеб приложения, които да използват машинно обучени модели. Вашата уеб архитектура може да повлияе на начина, по който моделът ви е обучен. Представете си, че работите в бизнес, където групата за анализ на данни е обучила модел, който искат да използвате в приложение.
### Съображения
Има много въпроси, които трябва да зададете:
- **Уеб приложение или мобилно приложение?** Ако създавате мобилно приложение или трябва да използвате модела в IoT контекст, можете да използвате [TensorFlow Lite](https://www.tensorflow.org/lite/) и да използвате модела в Android или iOS приложение.
- **Къде ще се намира моделът?** В облака или локално?
- **Поддръжка офлайн.** Трябва ли приложението да работи офлайн?
- **Каква технология е използвана за обучение на модела?** Избраната технология може да повлияе на инструментите, които трябва да използвате.
- **Използване на TensorFlow.** Ако обучавате модел с TensorFlow, например, тази екосистема предоставя възможност за конвертиране на TensorFlow модел за използване в уеб приложение чрез [TensorFlow.js](https://www.tensorflow.org/js/).
- **Използване на PyTorch.** Ако изграждате модел с библиотека като [PyTorch](https://pytorch.org/), имате опция да го експортирате във формат [ONNX](https://onnx.ai/) (Open Neural Network Exchange) за използване в JavaScript уеб приложения, които могат да използват [Onnx Runtime](https://www.onnxruntime.ai/). Тази опция ще бъде разгледана в бъдещ урок за модел, обучен със Scikit-learn.
- **Използване на Lobe.ai или Azure Custom Vision.** Ако използвате ML SaaS (Software as a Service) система като [Lobe.ai](https://lobe.ai/) или [Azure Custom Vision](https://azure.microsoft.com/services/cognitive-services/custom-vision-service/?WT.mc_id=academic-77952-leestott) за обучение на модел, този тип софтуер предоставя начини за експортиране на модела за много платформи, включително изграждане на персонализиран API, който да бъде запитван в облака от вашето онлайн приложение.
Имате също така възможност да изградите цялостно Flask уеб приложение, което би могло да обучава модела директно в уеб браузър. Това може да се направи и с TensorFlow.js в JavaScript контекст.
За нашите цели, тъй като работим с notebooks, базирани на Python, нека разгледаме стъпките, които трябва да предприемете, за да експортирате обучен модел от такъв notebook във формат, четим от уеб приложение, изградено с Python.
## Инструмент
За тази задача ви трябват два инструмента: Flask и Pickle, и двата работещи на Python.
✅ Какво е [Flask](https://palletsprojects.com/p/flask/)? Определен като „микро-фреймуърк“ от своите създатели, Flask предоставя основните функции на уеб фреймуъркове, използвайки Python и шаблонен двигател за изграждане на уеб страници. Разгледайте [този модул за обучение](https://docs.microsoft.com/learn/modules/python-flask-build-ai-web-app?WT.mc_id=academic-77952-leestott), за да практикувате изграждане с Flask.
✅ Какво е [Pickle](https://docs.python.org/3/library/pickle.html)? Pickle 🥒 е Python модул, който сериализира и десериализира структурата на Python обект. Когато „pickle“-нете модел, вие сериализирате или „сплесквате“ неговата структура за използване в уеб. Бъдете внимателни: pickle не е по същество сигурен, така че бъдете внимателни, ако бъдете подканени да „un-pickle“-нете файл. Pickle файл има суфикс `.pkl`.
## Упражнение - почистете данните си
В този урок ще използвате данни от 80,000 забелязвания на НЛО, събрани от [NUFORC](https://nuforc.org) (Националния център за докладване на НЛО). Тези данни съдържат интересни описания на забелязвания на НЛО, например:
- **Дълго описание.** "Мъж излиза от лъч светлина, който осветява тревисто поле през нощта, и той тича към паркинга на Texas Instruments".
- **Кратко описание.** "светлините ни преследваха".
Електронната таблица [ufos.csv](../../../../3-Web-App/1-Web-App/data/ufos.csv) включва колони за `city`, `state` и `country`, където е настъпило забелязването, формата на обекта `shape` и неговите `latitude` и `longitude`.
В празния [notebook](../../../../3-Web-App/1-Web-App/notebook.ipynb), включен в този урок:
1. Импортирайте `pandas`, `matplotlib` и `numpy`, както направихте в предишните уроци, и импортирайте електронната таблица ufos. Можете да разгледате примерен набор от данни:
```python
import pandas as pd
import numpy as np
ufos = pd.read_csv('./data/ufos.csv')
ufos.head()
```
1. Конвертирайте данните за ufos в малък dataframe с нови заглавия. Проверете уникалните стойности в полето `Country`.
```python
ufos = pd.DataFrame({'Seconds': ufos['duration (seconds)'], 'Country': ufos['country'],'Latitude': ufos['latitude'],'Longitude': ufos['longitude']})
ufos.Country.unique()
```
1. Сега можете да намалите количеството данни, с които трябва да работите, като премахнете всички null стойности и импортирате само забелязвания между 1-60 секунди:
```python
ufos.dropna(inplace=True)
ufos = ufos[(ufos['Seconds'] >= 1) & (ufos['Seconds'] <= 60)]
ufos.info()
```
1. Импортирайте библиотеката `LabelEncoder` на Scikit-learn, за да конвертирате текстовите стойности за страните в числа:
✅ LabelEncoder кодира данни по азбучен ред
```python
from sklearn.preprocessing import LabelEncoder
ufos['Country'] = LabelEncoder().fit_transform(ufos['Country'])
ufos.head()
```
Вашите данни трябва да изглеждат така:
```output
Seconds Country Latitude Longitude
2 20.0 3 53.200000 -2.916667
3 20.0 4 28.978333 -96.645833
14 30.0 4 35.823889 -80.253611
23 60.0 4 45.582778 -122.352222
24 3.0 3 51.783333 -0.783333
```
## Упражнение - изградете модела си
Сега можете да се подготвите за обучение на модел, като разделите данните на групи за обучение и тестване.
1. Изберете трите характеристики, върху които искате да обучите модела, като ваш X вектор, а y векторът ще бъде `Country`. Искате да можете да въведете `Seconds`, `Latitude` и `Longitude` и да получите идентификатор на страна за връщане.
```python
from sklearn.model_selection import train_test_split
Selected_features = ['Seconds','Latitude','Longitude']
X = ufos[Selected_features]
y = ufos['Country']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
```
1. Обучете модела си, използвайки логистична регресия:
```python
from sklearn.metrics import accuracy_score, classification_report
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print('Predicted labels: ', predictions)
print('Accuracy: ', accuracy_score(y_test, predictions))
```
Точността не е лоша **(около 95%)**, което не е изненадващо, тъй като `Country` и `Latitude/Longitude` са свързани.
Моделът, който създадохте, не е много революционен, тъй като би трябвало да можете да заключите `Country` от неговите `Latitude` и `Longitude`, но това е добра практика за обучение от сурови данни, които сте почистили, експортирали и след това използвали този модел в уеб приложение.
## Упражнение - „pickle“-нете модела си
Сега е време да _pickle_-нете модела си! Можете да направите това с няколко реда код. След като е _pickled_, заредете вашия pickled модел и го тествайте срещу примерен масив от данни, съдържащ стойности за секунди, ширина и дължина.
```python
import pickle
model_filename = 'ufo-model.pkl'
pickle.dump(model, open(model_filename,'wb'))
model = pickle.load(open('ufo-model.pkl','rb'))
print(model.predict([[50,44,-12]]))
```
Моделът връща **'3'**, което е кодът на страната за Великобритания. Невероятно! 👽
## Упражнение - изградете Flask приложение
Сега можете да изградите Flask приложение, което да извиква вашия модел и да връща подобни резултати, но по-визуално приятен начин.
1. Започнете, като създадете папка, наречена **web-app**, до файла _notebook.ipynb_, където се намира вашият _ufo-model.pkl_ файл.
1. В тази папка създайте още три папки: **static**, с папка **css** вътре, и **templates**. Сега трябва да имате следните файлове и директории:
```output
web-app/
static/
css/
templates/
notebook.ipynb
ufo-model.pkl
```
✅ Вижте папката с решението за изглед на завършеното приложение
1. Първият файл, който трябва да създадете в папката _web-app_, е файлът **requirements.txt**. Подобно на _package.json_ в JavaScript приложение, този файл изброява зависимостите, необходими за приложението. В **requirements.txt** добавете редовете:
```text
scikit-learn
pandas
numpy
flask
```
1. Сега изпълнете този файл, като навигирате до _web-app_:
```bash
cd web-app
```
1. В терминала си напишете `pip install`, за да инсталирате библиотеките, изброени в _requirements.txt_:
```bash
pip install -r requirements.txt
```
1. Сега сте готови да създадете още три файла, за да завършите приложението:
1. Създайте **app.py** в root директорията.
2. Създайте **index.html** в директорията _templates_.
3. Създайте **styles.css** в директорията _static/css_.
1. Изградете файла _styles.css_ с няколко стила:
```css
body {
width: 100%;
height: 100%;
font-family: 'Helvetica';
background: black;
color: #fff;
text-align: center;
letter-spacing: 1.4px;
font-size: 30px;
}
input {
min-width: 150px;
}
.grid {
width: 300px;
border: 1px solid #2d2d2d;
display: grid;
justify-content: center;
margin: 20px auto;
}
.box {
color: #fff;
background: #2d2d2d;
padding: 12px;
display: inline-block;
}
```
1. След това изградете файла _index.html_:
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>🛸 UFO Appearance Prediction! 👽</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body>
<div class="grid">
<div class="box">
<p>According to the number of seconds, latitude and longitude, which country is likely to have reported seeing a UFO?</p>
<form action="{{ url_for('predict')}}" method="post">
<input type="number" name="seconds" placeholder="Seconds" required="required" min="0" max="60" />
<input type="text" name="latitude" placeholder="Latitude" required="required" />
<input type="text" name="longitude" placeholder="Longitude" required="required" />
<button type="submit" class="btn">Predict country where the UFO is seen</button>
</form>
<p>{{ prediction_text }}</p>
</div>
</div>
</body>
</html>
```
Разгледайте шаблонирането в този файл. Забележете синтаксиса „мустачки“ около променливите, които ще бъдат предоставени от приложението, като текста на предсказанието: `{{}}`. Има и форма, която изпраща предсказание към маршрута `/predict`.
Накрая сте готови да изградите Python файла, който управлява използването на модела и показването на предсказанията:
1. В `app.py` добавете:
```python
import numpy as np
from flask import Flask, request, render_template
import pickle
app = Flask(__name__)
model = pickle.load(open("./ufo-model.pkl", "rb"))
@app.route("/")
def home():
return render_template("index.html")
@app.route("/predict", methods=["POST"])
def predict():
int_features = [int(x) for x in request.form.values()]
final_features = [np.array(int_features)]
prediction = model.predict(final_features)
output = prediction[0]
countries = ["Australia", "Canada", "Germany", "UK", "US"]
return render_template(
"index.html", prediction_text="Likely country: {}".format(countries[output])
)
if __name__ == "__main__":
app.run(debug=True)
```
> 💡 Съвет: когато добавите [`debug=True`](https://www.askpython.com/python-modules/flask/flask-debug-mode), докато изпълнявате уеб приложението с Flask, всяка промяна, която направите в приложението, ще се отрази незабавно, без да е необходимо да рестартирате сървъра. Внимавайте! Не активирайте този режим в продукционно приложение.
Ако изпълните `python app.py` или `python3 app.py` - вашият уеб сървър стартира локално и можете да попълните кратка форма, за да получите отговор на вашия горещ въпрос за това къде са били забелязани НЛО!
Преди да направите това, разгледайте частите на `app.py`:
1. Първо, зависимостите се зареждат и приложението стартира.
1. След това моделът се импортира.
1. След това `index.html` се рендерира на началния маршрут.
На маршрута `/predict` се случват няколко неща, когато формата се изпрати:
1. Променливите от формата се събират и конвертират в numpy масив. След това те се изпращат към модела и се връща предсказание.
2. Страните, които искаме да се показват, се рендерират отново като четим текст от техния предсказан код на страна, и тази стойност се връща към `index.html`, за да бъде рендерирана в шаблона.
Използването на модел по този начин, с Flask и pickled модел, е сравнително лесно. Най-трудното е да разберете каква форма трябва да има данните, които трябва да бъдат изпратени към модела, за да получите предсказание. Това зависи изцяло от начина, по който моделът е обучен. Този има три точки данни, които трябва да бъдат въведени, за да се получи предсказание.
В професионална среда можете да видите колко е важно добрата комуникация между хората, които обучават модела, и тези, които го използват в уеб или мобилно приложение. В нашия случай, това е само един човек - вие!
---
## 🚀 Предизвикателство
Вместо да работите в notebook и да импортирате модела в Flask приложението, можете да обучите модела директно в Flask приложението! Опитайте да конвертирате вашия Python код в notebook, може би след като данните ви са почистени, за да обучите модела директно в приложението на маршрут, наречен `train`. Какви са плюсовете и минусите на този метод?
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Има много начини за създаване на уеб приложение, което да използва ML модели. Направете списък с начините, по които можете да използвате JavaScript или Python за изграждане на уеб приложение, което използва машинно обучение. Помислете за архитектурата: трябва ли моделът да остане в приложението или да живее в облака? Ако е второто, как бихте го достъпили? Начертайте архитектурен модел за приложено ML уеб решение.
## Задание
[Опитайте различен модел](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a8e8ae10be335cbc745b75ee552317ff",
"translation_date": "2025-09-05T00:39:38+00:00",
"source_file": "3-Web-App/1-Web-App/assignment.md",
"language_code": "bg"
}
-->
# Опитайте различен модел
## Инструкции
След като вече сте създали едно уеб приложение, използвайки обучен модел за регресия, използвайте един от моделите от предишен урок за регресия, за да създадете отново това уеб приложение. Можете да запазите стила или да го проектирате по различен начин, за да отразите данните за тиквите. Внимавайте да промените входните данни, за да съответстват на метода на обучение на вашия модел.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------------------------- | ------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------ |
| | Уеб приложението работи както се очаква и е разположено в облака | Уеб приложението съдържа недостатъци или показва неочаквани резултати | Уеб приложението не функционира правилно |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,35 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9836ff53cfef716ddfd70e06c5f43436",
"translation_date": "2025-09-05T00:36:12+00:00",
"source_file": "3-Web-App/README.md",
"language_code": "bg"
}
-->
# Създайте уеб приложение за използване на вашия ML модел
В тази част от учебната програма ще се запознаете с приложна тема в машинното обучение: как да запазите вашия Scikit-learn модел като файл, който може да се използва за правене на прогнози в рамките на уеб приложение. След като моделът бъде запазен, ще научите как да го използвате в уеб приложение, създадено с Flask. Първо ще създадете модел, използвайки данни, свързани с наблюдения на НЛО! След това ще изградите уеб приложение, което ще ви позволи да въведете брой секунди, заедно със стойности за географска ширина и дължина, за да предвидите коя държава е докладвала за наблюдение на НЛО.
![Паркинг за НЛО](../../../3-Web-App/images/ufo.jpg)
Снимка от <a href="https://unsplash.com/@mdherren?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Michael Herren</a> на <a href="https://unsplash.com/s/photos/ufo?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Уроци
1. [Създайте уеб приложение](1-Web-App/README.md)
## Кредити
"Създайте уеб приложение" е написано с ♥️ от [Jen Looper](https://twitter.com/jenlooper).
♥️ Тестовете са написани от Rohan Raj.
Данните са взети от [Kaggle](https://www.kaggle.com/NUFORC/ufo-sightings).
Архитектурата на уеб приложението е частично предложена от [тази статия](https://towardsdatascience.com/how-to-easily-deploy-machine-learning-models-using-flask-b95af8fe34d4) и [този репозиторий](https://github.com/abhinavsagar/machine-learning-deployment) от Abhinav Sagar.
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,313 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "aaf391d922bd6de5efba871d514c6d47",
"translation_date": "2025-09-05T00:51:52+00:00",
"source_file": "4-Classification/1-Introduction/README.md",
"language_code": "bg"
}
-->
# Въведение в класификацията
В тези четири урока ще разгледате основен аспект на класическото машинно обучение - _класификация_. Ще преминем през използването на различни алгоритми за класификация с набор от данни за всички невероятни кухни на Азия и Индия. Надяваме се, че сте гладни!
![само щипка!](../../../../4-Classification/1-Introduction/images/pinch.png)
> Празнувайте паназиатските кухни в тези уроци! Изображение от [Jen Looper](https://twitter.com/jenlooper)
Класификацията е форма на [контролирано обучение](https://wikipedia.org/wiki/Supervised_learning), която има много общо с техниките за регресия. Ако машинното обучение е свързано с предсказване на стойности или имена на неща чрез използване на набори от данни, тогава класификацията обикновено се разделя на две групи: _бинарна класификация_ и _многокласова класификация_.
[![Въведение в класификацията](https://img.youtube.com/vi/eg8DJYwdMyg/0.jpg)](https://youtu.be/eg8DJYwdMyg "Въведение в класификацията")
> 🎥 Кликнете върху изображението по-горе за видео: Джон Гуттаг от MIT представя класификацията
Запомнете:
- **Линейната регресия** ви помогна да предскажете връзките между променливите и да направите точни прогнози за това къде нова точка от данни би попаднала спрямо тази линия. Например, можете да предскажете аква ще бъде цената на тиква през септември спрямо декември_.
- **Логистичната регресия** ви помогна да откриете "бинарни категории": при тази ценова точка, _тиквата оранжева ли е или не е оранжева_?
Класификацията използва различни алгоритми, за да определи други начини за определяне на етикета или класа на дадена точка от данни. Нека работим с тези данни за кухни, за да видим дали, наблюдавайки група от съставки, можем да определим произхода на кухнята.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
> ### [Този урок е наличен на R!](../../../../4-Classification/1-Introduction/solution/R/lesson_10.html)
### Въведение
Класификацията е една от основните дейности на изследователя в областта на машинното обучение и на специалиста по данни. От основна класификация на бинарна стойност ("този имейл спам ли е или не?") до сложна класификация на изображения и сегментация с помощта на компютърно зрение, винаги е полезно да можете да сортирате данни в класове и да задавате въпроси за тях.
За да опишем процеса по-научно, вашият метод за класификация създава предсказателен модел, който ви позволява да картографирате връзката между входните променливи и изходните променливи.
![бинарна срещу многокласова класификация](../../../../4-Classification/1-Introduction/images/binary-multiclass.png)
> Бинарни срещу многокласови проблеми, които алгоритмите за класификация трябва да решат. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
Преди да започнем процеса на почистване на данните, визуализирането им и подготовката им за нашите задачи по машинно обучение, нека научим малко повече за различните начини, по които машинното обучение може да се използва за класифициране на данни.
Произлизаща от [статистиката](https://wikipedia.org/wiki/Statistical_classification), класификацията с помощта на класическо машинно обучение използва характеристики като `smoker`, `weight` и `age`, за да определи ероятността за развитие на дадено заболяване_. Като техника за контролирано обучение, подобна на упражненията за регресия, които извършихте по-рано, вашите данни са етикетирани, а алгоритмите за машинно обучение използват тези етикети, за да класифицират и предсказват класове (или 'характеристики') на набор от данни и да ги присвояват към група или резултат.
✅ Отделете момент, за да си представите набор от данни за кухни. Какво би могъл да отговори многокласов модел? Какво би могъл да отговори бинарен модел? Какво ако искате да определите дали дадена кухня вероятно използва сминдух? А какво ако искате да видите дали, при наличието на торба с хранителни продукти, съдържаща звезден анасон, артишок, карфиол и хрян, можете да създадете типично индийско ястие?
[![Луди мистериозни кошници](https://img.youtube.com/vi/GuTeDbaNoEU/0.jpg)](https://youtu.be/GuTeDbaNoEU "Луди мистериозни кошници")
> 🎥 Кликнете върху изображението по-горе за видео. Цялата идея на шоуто 'Chopped' е "мистериозната кошница", където готвачите трябва да направят ястие от случайно избрани съставки. Сигурно модел за машинно обучение би помогнал!
## Здравейте, 'класификатор'
Въпросът, който искаме да зададем на този набор от данни за кухни, всъщност е **многокласов въпрос**, тъй като имаме няколко потенциални национални кухни, с които да работим. Като имаме група от съставки, към кой от тези много класове ще се впишат данните?
Scikit-learn предлага няколко различни алгоритма за класифициране на данни, в зависимост от вида на проблема, който искате да решите. В следващите два урока ще научите за някои от тези алгоритми.
## Упражнение - почистете и балансирайте данните си
Първата задача, преди да започнете този проект, е да почистите и **балансирате** данните си, за да получите по-добри резултати. Започнете с празния файл _notebook.ipynb_ в корена на тази папка.
Първото нещо, което трябва да инсталирате, е [imblearn](https://imbalanced-learn.org/stable/). Това е пакет за Scikit-learn, който ще ви позволи да балансирате данните по-добре (ще научите повече за тази задача след малко).
1. За да инсталирате `imblearn`, изпълнете `pip install`, както следва:
```python
pip install imblearn
```
1. Импортирайте пакетите, които са ви необходими, за да импортирате данните си и да ги визуализирате, също така импортирайте `SMOTE` от `imblearn`.
```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from imblearn.over_sampling import SMOTE
```
Сега сте готови да импортирате данните.
1. Следващата задача е да импортирате данните:
```python
df = pd.read_csv('../data/cuisines.csv')
```
Използването на `read_csv()` ще прочете съдържанието на csv файла _cusines.csv_ и ще го постави в променливата `df`.
1. Проверете формата на данните:
```python
df.head()
```
Първите пет реда изглеждат така:
```output
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
```
1. Получете информация за тези данни, като извикате `info()`:
```python
df.info()
```
Вашият изход изглежда така:
```output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2448 entries, 0 to 2447
Columns: 385 entries, Unnamed: 0 to zucchini
dtypes: int64(384), object(1)
memory usage: 7.2+ MB
```
## Упражнение - изучаване на кухни
Сега работата започва да става по-интересна. Нека открием разпределението на данните по кухни.
1. Начертайте данните като барове, като извикате `barh()`:
```python
df.cuisine.value_counts().plot.barh()
```
![разпределение на данни за кухни](../../../../4-Classification/1-Introduction/images/cuisine-dist.png)
Има ограничен брой кухни, но разпределението на данните е неравномерно. Можете да поправите това! Преди да го направите, изследвайте малко повече.
1. Разберете колко данни са налични за всяка кухня и ги отпечатайте:
```python
thai_df = df[(df.cuisine == "thai")]
japanese_df = df[(df.cuisine == "japanese")]
chinese_df = df[(df.cuisine == "chinese")]
indian_df = df[(df.cuisine == "indian")]
korean_df = df[(df.cuisine == "korean")]
print(f'thai df: {thai_df.shape}')
print(f'japanese df: {japanese_df.shape}')
print(f'chinese df: {chinese_df.shape}')
print(f'indian df: {indian_df.shape}')
print(f'korean df: {korean_df.shape}')
```
изходът изглежда така:
```output
thai df: (289, 385)
japanese df: (320, 385)
chinese df: (442, 385)
indian df: (598, 385)
korean df: (799, 385)
```
## Откриване на съставки
Сега можете да се задълбочите в данните и да научите кои са типичните съставки за всяка кухня. Трябва да премахнете повтарящи се данни, които създават объркване между кухните, така че нека научим за този проблем.
1. Създайте функция `create_ingredient()` на Python, за да създадете dataframe за съставките. Тази функция ще започне с премахване на ненужна колона и ще сортира съставките според техния брой:
```python
def create_ingredient_df(df):
ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value')
ingredient_df = ingredient_df[(ingredient_df.T != 0).any()]
ingredient_df = ingredient_df.sort_values(by='value', ascending=False,
inplace=False)
return ingredient_df
```
Сега можете да използвате тази функция, за да получите представа за десетте най-популярни съставки по кухня.
1. Извикайте `create_ingredient()` и начертайте, като извикате `barh()`:
```python
thai_ingredient_df = create_ingredient_df(thai_df)
thai_ingredient_df.head(10).plot.barh()
```
![тайландска](../../../../4-Classification/1-Introduction/images/thai.png)
1. Направете същото за японските данни:
```python
japanese_ingredient_df = create_ingredient_df(japanese_df)
japanese_ingredient_df.head(10).plot.barh()
```
![японска](../../../../4-Classification/1-Introduction/images/japanese.png)
1. Сега за китайските съставки:
```python
chinese_ingredient_df = create_ingredient_df(chinese_df)
chinese_ingredient_df.head(10).plot.barh()
```
![китайска](../../../../4-Classification/1-Introduction/images/chinese.png)
1. Начертайте индийските съставки:
```python
indian_ingredient_df = create_ingredient_df(indian_df)
indian_ingredient_df.head(10).plot.barh()
```
![индийска](../../../../4-Classification/1-Introduction/images/indian.png)
1. Накрая начертайте корейските съставки:
```python
korean_ingredient_df = create_ingredient_df(korean_df)
korean_ingredient_df.head(10).plot.barh()
```
![корейска](../../../../4-Classification/1-Introduction/images/korean.png)
1. Сега премахнете най-често срещаните съставки, които създават объркване между различните кухни, като извикате `drop()`:
Всички обичат ориз, чесън и джинджифил!
```python
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1)
labels_df = df.cuisine #.unique()
feature_df.head()
```
## Балансиране на набора от данни
Сега, когато сте почистили данните, използвайте [SMOTE](https://imbalanced-learn.org/dev/references/generated/imblearn.over_sampling.SMOTE.html) - "Техника за синтетично надсемплиране на малцинствени класове" - за да ги балансирате.
1. Извикайте `fit_resample()`, тази стратегия генерира нови проби чрез интерполация.
```python
oversample = SMOTE()
transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
```
Чрез балансиране на данните си ще получите по-добри резултати при класифицирането им. Помислете за бинарна класификация. Ако повечето от вашите данни са от един клас, моделът за машинно обучение ще предсказва този клас по-често, просто защото има повече данни за него. Балансирането на данните премахва този дисбаланс.
1. Сега можете да проверите броя на етикетите за всяка съставка:
```python
print(f'new label count: {transformed_label_df.value_counts()}')
print(f'old label count: {df.cuisine.value_counts()}')
```
Вашият изход изглежда така:
```output
new label count: korean 799
chinese 799
indian 799
japanese 799
thai 799
Name: cuisine, dtype: int64
old label count: korean 799
indian 598
chinese 442
japanese 320
thai 289
Name: cuisine, dtype: int64
```
Данните са чисти, балансирани и много вкусни!
1. Последната стъпка е да запазите балансираните си данни, включително етикети и характеристики, в нов dataframe, който може да бъде експортиран във файл:
```python
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
```
1. Можете да погледнете данните още веднъж, като използвате `transformed_df.head()` и `transformed_df.info()`. Запазете копие от тези данни за използване в бъдещи уроци:
```python
transformed_df.head()
transformed_df.info()
transformed_df.to_csv("../data/cleaned_cuisines.csv")
```
Този нов CSV файл вече може да бъде намерен в основната папка с данни.
---
## 🚀Предизвикателство
Тази учебна програма съдържа няколко интересни набора от данни. Прегледайте папките `data` и вижте дали някои от тях съдържат набори от данни, които биха били подходящи за бинарна или многокласова класификация? Какви въпроси бихте задали на този набор от данни?
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Разгледайте API на SMOTE. За какви случаи на употреба е най-подходящ? Какви проблеми решава?
## Задание
[Изследвайте методи за класификация](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b2a01912beb24cfb0007f83594dba801",
"translation_date": "2025-09-05T00:54:35+00:00",
"source_file": "4-Classification/1-Introduction/assignment.md",
"language_code": "bg"
}
-->
# Изследване на методи за класификация
## Инструкции
В [документацията на Scikit-learn](https://scikit-learn.org/stable/supervised_learning.html) ще намерите голям списък с начини за класифициране на данни. Направете малко проучване в тези документи: вашата цел е да намерите методи за класификация и да ги съчетаете с набор от данни от тази учебна програма, въпрос, който можете да зададете за него, и техника за класификация. Създайте електронна таблица или таблица в .doc файл и обяснете как наборът от данни би работил с алгоритъма за класификация.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ----------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| | представен е документ, който обхваща 5 алгоритма заедно с техника за класификация. Прегледът е добре обяснен и подробен. | представен е документ, който обхваща 3 алгоритма заедно с техника за класификация. Прегледът е добре обяснен и подробен. | представен е документ, който обхваща по-малко от три алгоритма заедно с техника за класификация, а прегледът не е добре обяснен или подробен. |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T00:55:12+00:00",
"source_file": "4-Classification/1-Introduction/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,253 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1a6e9e46b34a2e559fbbfc1f95397c7b",
"translation_date": "2025-09-05T00:41:49+00:00",
"source_file": "4-Classification/2-Classifiers-1/README.md",
"language_code": "bg"
}
-->
# Класификатори за кухни 1
В този урок ще използвате набора от данни, който запазихте от предишния урок, пълен с балансирани и почистени данни за различни кухни.
Ще използвате този набор от данни с разнообразие от класификатори, за да _предвидите дадена национална кухня въз основа на група съставки_. Докато правите това, ще научите повече за някои от начините, по които алгоритмите могат да бъдат използвани за задачи по класификация.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
# Подготовка
При условие че сте завършили [Урок 1](../1-Introduction/README.md), уверете се, че файлът _cleaned_cuisines.csv_ съществува в основната папка `/data` за тези четири урока.
## Упражнение - предвиждане на национална кухня
1. Работейки в папката _notebook.ipynb_ на този урок, импортирайте този файл заедно с библиотеката Pandas:
```python
import pandas as pd
cuisines_df = pd.read_csv("../data/cleaned_cuisines.csv")
cuisines_df.head()
```
Данните изглеждат така:
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- |
| 0 | 0 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 2 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 3 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 4 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
1. Сега импортирайте още няколко библиотеки:
```python
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
from sklearn.svm import SVC
import numpy as np
```
1. Разделете X и y координатите в два датафрейма за обучение. `cuisine` може да бъде датафреймът с етикети:
```python
cuisines_label_df = cuisines_df['cuisine']
cuisines_label_df.head()
```
Ще изглежда така:
```output
0 indian
1 indian
2 indian
3 indian
4 indian
Name: cuisine, dtype: object
```
1. Премахнете колоната `Unnamed: 0` и колоната `cuisine`, използвайки `drop()`. Запазете останалите данни като обучаеми характеристики:
```python
cuisines_feature_df = cuisines_df.drop(['Unnamed: 0', 'cuisine'], axis=1)
cuisines_feature_df.head()
```
Вашите характеристики изглеждат така:
| | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | artemisia | artichoke | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini |
| ---: | -----: | -------: | ----: | ---------: | ----: | -----------: | ------: | -------: | --------: | --------: | ---: | ------: | ----------: | ---------: | ----------------------: | ---: | ---: | ---: | ----: | -----: | -------: |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
Сега сте готови да обучите модела си!
## Избор на класификатор
Сега, когато данните ви са почистени и готови за обучение, трябва да решите кой алгоритъм да използвате за задачата.
Scikit-learn групира класификацията под Надзорно Обучение, и в тази категория ще намерите много начини за класифициране. [Разнообразието](https://scikit-learn.org/stable/supervised_learning.html) може да изглежда объркващо на пръв поглед. Следните методи включват техники за класификация:
- Линейни модели
- Машини за опорни вектори
- Стохастичен градиентен спуск
- Най-близки съседи
- Гаусови процеси
- Дървета за решения
- Методи на ансамбъл (гласуващ класификатор)
- Мултикласови и мултиизходни алгоритми (мултикласова и мултиетикетна класификация, мултикласова-мултиизходна класификация)
> Можете също да използвате [невронни мрежи за класифициране на данни](https://scikit-learn.org/stable/modules/neural_networks_supervised.html#classification), но това е извън обхвата на този урок.
### Какъв класификатор да изберете?
И така, кой класификатор трябва да изберете? Често, преминаването през няколко и търсенето на добър резултат е начин за тестване. Scikit-learn предлага [сравнение рамо до рамо](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) на създаден набор от данни, сравнявайки KNeighbors, SVC по два начина, GaussianProcessClassifier, DecisionTreeClassifier, RandomForestClassifier, MLPClassifier, AdaBoostClassifier, GaussianNB и QuadraticDiscriminationAnalysis, показвайки резултатите визуализирани:
![сравнение на класификатори](../../../../4-Classification/2-Classifiers-1/images/comparison.png)
> Графики, генерирани от документацията на Scikit-learn
> AutoML решава този проблем лесно, като изпълнява тези сравнения в облака, позволявайки ви да изберете най-добрия алгоритъм за вашите данни. Опитайте [тук](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-77952-leestott)
### По-добър подход
По-добър начин от случайното предположение е да следвате идеите от този изтегляем [ML Cheat sheet](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-77952-leestott). Тук откриваме, че за нашия мултикласов проблем имаме някои опции:
![cheatsheet за мултикласови проблеми](../../../../4-Classification/2-Classifiers-1/images/cheatsheet.png)
> Част от Cheat Sheet на Microsoft за алгоритми, описваща опции за мултикласова класификация
✅ Изтеглете този cheat sheet, разпечатайте го и го закачете на стената си!
### Разсъждения
Нека видим дали можем да разсъждаваме върху различни подходи, като се вземат предвид ограниченията, които имаме:
- **Невронните мрежи са твърде тежки**. Като се има предвид нашият почистен, но минимален набор от данни и фактът, че изпълняваме обучението локално чрез ноутбуци, невронните мрежи са твърде тежки за тази задача.
- **Не използваме двукласов класификатор**. Не използваме двукласов класификатор, така че това изключва one-vs-all.
- **Дърво за решения или логистична регресия може да работи**. Дърво за решения може да работи, или логистична регресия за мултикласови данни.
- **Мултикласовите Boosted Decision Trees решават различен проблем**. Мултикласовото Boosted Decision Tree е най-подходящо за непараметрични задачи, например задачи, предназначени за изграждане на класации, така че не е полезно за нас.
### Използване на Scikit-learn
Ще използваме Scikit-learn за анализ на нашите данни. Въпреки това, има много начини за използване на логистична регресия в Scikit-learn. Вижте [параметрите за предаване](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
По същество има два важни параметъра - `multi_class` и `solver` - които трябва да зададем, когато поискаме от Scikit-learn да изпълни логистична регресия. Стойността на `multi_class` прилага определено поведение. Стойността на solver определя кой алгоритъм да се използва. Не всички solver могат да се комбинират с всички стойности на `multi_class`.
Според документацията, в случая на мултиклас, алгоритъмът за обучение:
- **Използва схемата one-vs-rest (OvR)**, ако опцията `multi_class` е зададена на `ovr`
- **Използва загубата на кръстосана ентропия**, ако опцията `multi_class` е зададена на `multinomial`. (В момента опцията `multinomial` се поддържа само от solver-ите lbfgs, sag, saga и newton-cg.)"
> 🎓 "Схемата" тук може да бъде 'ovr' (one-vs-rest) или 'multinomial'. Тъй като логистичната регресия е наистина предназначена да поддържа бинарна класификация, тези схеми й позволяват да се справя по-добре с задачи за мултикласова класификация. [източник](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
> 🎓 "Solver" се определя като "алгоритъмът, който да се използва в проблема за оптимизация". [източник](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
Scikit-learn предлага тази таблица, за да обясни как solver-ите се справят с различни предизвикателства, представени от различни видове структури на данни:
![solver-и](../../../../4-Classification/2-Classifiers-1/images/solvers.png)
## Упражнение - разделяне на данните
Можем да се фокусираме върху логистичната регресия за първия ни опит за обучение, тъй като наскоро научихте за нея в предишен урок.
Разделете данните си на групи за обучение и тестване, като извикате `train_test_split()`:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## Упражнение - прилагане на логистична регресия
Тъй като използвате случая на мултиклас, трябва да изберете каква _схема_ да използвате и какъв _solver_ да зададете. Използвайте LogisticRegression с настройка за мултиклас и solver **liblinear** за обучение.
1. Създайте логистична регресия с multi_class, зададено на `ovr`, и solver, зададен на `liblinear`:
```python
lr = LogisticRegression(multi_class='ovr',solver='liblinear')
model = lr.fit(X_train, np.ravel(y_train))
accuracy = model.score(X_test, y_test)
print ("Accuracy is {}".format(accuracy))
```
✅ Опитайте различен solver като `lbfgs`, който често е зададен като стандартен
> Забележка: Използвайте функцията Pandas [`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html), за да изравните данните си, когато е необходимо.
Точността е добра при над **80%**!
1. Можете да видите този модел в действие, като тествате един ред данни (#50):
```python
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
print(f'cuisine: {y_test.iloc[50]}')
```
Резултатът се отпечатва:
```output
ingredients: Index(['cilantro', 'onion', 'pea', 'potato', 'tomato', 'vegetable_oil'], dtype='object')
cuisine: indian
```
✅ Опитайте с различен номер на ред и проверете резултатите.
1. Ако искате да се задълбочите, можете да проверите точността на тази прогноза:
```python
test= X_test.iloc[50].values.reshape(-1, 1).T
proba = model.predict_proba(test)
classes = model.classes_
resultdf = pd.DataFrame(data=proba, columns=classes)
topPrediction = resultdf.T.sort_values(by=[0], ascending = [False])
topPrediction.head()
```
Резултатът се отпечатва - индийската кухня е най-доброто предположение, с добра вероятност:
| | 0 |
| -------: | -------: |
| indian | 0.715851 |
| chinese | 0.229475 |
| japanese | 0.029763 |
| korean | 0.017277 |
| thai | 0.007634 |
✅ Можете ли да обясните защо моделът е доста сигурен, че това е индийска кухня?
1. Получете повече подробности, като отпечатате отчет за класификация, както направихте в уроците за регресия:
```python
y_pred = model.predict(X_test)
print(classification_report(y_test,y_pred))
```
| | precision | recall | f1-score | support |
| ------------ | --------- | ------ | -------- | ------- |
| chinese | 0.73 | 0.71 | 0.72 | 229 |
| indian | 0.91 | 0.93 | 0.92 | 254 |
| japanese | 0.70 | 0.75 | 0.72 | 220 |
| korean | 0.86 | 0.76 | 0.81 | 242 |
| thai | 0.79 | 0.85 | 0.82 | 254 |
| accuracy | 0.80 | 1199 | | |
| macro avg | 0.80 | 0.80 | 0.80 | 1199 |
| weighted avg | 0.80 | 0.80 | 0.80 | 1199 |
## 🚀Предизвикателство
В този урок използвахте почистените си данни, за да изградите модел за машинно обучение, който може да предскаже национална кухня въз основа на серия от съставки. Отделете време да разгледате многото опции, които Scikit-learn предоставя за класифициране на данни. Задълбочете се в концепцията за 'solver', за да разберете какво се случва зад кулисите.
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Разгледайте малко повече математиката зад логистичната регресия в [този урок](https://people.eecs.berkeley.edu/~russell/classes/cs194/f11/lectures/CS194%20Fall%202011%20Lecture%2006.pdf)
## Задача
[Проучете решаващите алгоритми](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,23 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "de6025f96841498b0577e9d1aee18d1f",
"translation_date": "2025-09-05T00:45:25+00:00",
"source_file": "4-Classification/2-Classifiers-1/assignment.md",
"language_code": "bg"
}
-->
# Изучете решаващите алгоритми
## Инструкции
В този урок научихте за различните решаващи алгоритми, които съчетават алгоритми с процес на машинно обучение, за да създадат точен модел. Прегледайте решаващите алгоритми, изброени в урока, и изберете два. С ваши думи, сравнете и противопоставете тези два алгоритма. Какъв тип проблеми решават? Как работят с различни структури от данни? Защо бихте избрали единия пред другия?
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | --------------------------------------------------------------------------------------------- | ------------------------------------------------ | ---------------------------- |
| | Представен е .doc файл с два параграфа, всеки за един алгоритъм, с внимателно сравнение. | Представен е .doc файл с само един параграф | Задачата е непълна |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да било недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T00:46:01+00:00",
"source_file": "4-Classification/2-Classifiers-1/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,249 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "49047911108adc49d605cddfb455749c",
"translation_date": "2025-09-05T00:49:19+00:00",
"source_file": "4-Classification/3-Classifiers-2/README.md",
"language_code": "bg"
}
-->
# Класификатори за кухня 2
В този втори урок за класификация ще разгледате повече начини за класифициране на числови данни. Ще научите също за последиците от избора на един класификатор пред друг.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
### Предпоставки
Предполагаме, че сте завършили предишните уроци и имате почистен набор от данни в папката `data`, наречен _cleaned_cuisines.csv_, в основната директория на тази папка с 4 урока.
### Подготовка
Заредили сме вашия файл _notebook.ipynb_ с почистения набор от данни и сме го разделили на X и y датафреймове, готови за процеса на изграждане на модела.
## Карта за класификация
По-рано научихте за различните опции, които имате при класифициране на данни, използвайки помощния лист на Microsoft. Scikit-learn предлага подобен, но по-подробен помощен лист, който може допълнително да помогне за стесняване на избора на оценители (друг термин за класификатори):
![ML Карта от Scikit-learn](../../../../4-Classification/3-Classifiers-2/images/map.png)
> Съвет: [посетете тази карта онлайн](https://scikit-learn.org/stable/tutorial/machine_learning_map/) и кликнете по пътя, за да прочетете документацията.
### Планът
Тази карта е много полезна, когато имате ясна представа за вашите данни, тъй като можете да „вървите“ по нейните пътеки към решение:
- Имаме >50 проби
- Искаме да предвидим категория
- Имаме етикетирани данни
- Имаме по-малко от 100K проби
- ✨ Можем да изберем Linear SVC
- Ако това не работи, тъй като имаме числови данни
- Можем да опитаме ✨ KNeighbors Classifier
- Ако това не работи, опитайте ✨ SVC и ✨ Ensemble Classifiers
Това е много полезен път за следване.
## Упражнение - разделете данните
Следвайки този път, трябва да започнем с импортиране на някои библиотеки за използване.
1. Импортирайте необходимите библиотеки:
```python
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import accuracy_score,precision_score,confusion_matrix,classification_report, precision_recall_curve
import numpy as np
```
1. Разделете вашите тренировъчни и тестови данни:
```python
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
```
## Класификатор Linear SVC
Support-Vector clustering (SVC) е част от семейството на Support-Vector machines техники за машинно обучение (научете повече за тях по-долу). В този метод можете да изберете „ядро“, за да решите как да класифицирате етикетите. Параметърът 'C' се отнася до 'регуларизация', която регулира влиянието на параметрите. Ядрото може да бъде едно от [няколко](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC); тук го задаваме на 'linear', за да гарантираме, че използваме Linear SVC. Вероятността по подразбиране е 'false'; тук я задаваме на 'true', за да съберем оценки за вероятност. Задаваме случайното състояние на '0', за да разбъркаме данните и да получим вероятности.
### Упражнение - приложете Linear SVC
Започнете, като създадете масив от класификатори. Ще добавяте постепенно към този масив, докато тестваме.
1. Започнете с Linear SVC:
```python
C = 10
# Create different classifiers.
classifiers = {
'Linear SVC': SVC(kernel='linear', C=C, probability=True,random_state=0)
}
```
2. Обучете вашия модел, използвайки Linear SVC, и отпечатайте отчет:
```python
n_classifiers = len(classifiers)
for index, (name, classifier) in enumerate(classifiers.items()):
classifier.fit(X_train, np.ravel(y_train))
y_pred = classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy (train) for %s: %0.1f%% " % (name, accuracy * 100))
print(classification_report(y_test,y_pred))
```
Резултатът е доста добър:
```output
Accuracy (train) for Linear SVC: 78.6%
precision recall f1-score support
chinese 0.71 0.67 0.69 242
indian 0.88 0.86 0.87 234
japanese 0.79 0.74 0.76 254
korean 0.85 0.81 0.83 242
thai 0.71 0.86 0.78 227
accuracy 0.79 1199
macro avg 0.79 0.79 0.79 1199
weighted avg 0.79 0.79 0.79 1199
```
## Класификатор K-Neighbors
K-Neighbors е част от семейството "neighbors" методи за машинно обучение, които могат да се използват както за контролирано, така и за неконтролирано обучение. В този метод се създава предварително определен брой точки и данните се събират около тези точки, така че да могат да се предвидят обобщени етикети за данните.
### Упражнение - приложете класификатора K-Neighbors
Предишният класификатор беше добър и работеше добре с данните, но може би можем да постигнем по-добра точност. Опитайте класификатор K-Neighbors.
1. Добавете ред към масива с класификатори (добавете запетая след елемента Linear SVC):
```python
'KNN classifier': KNeighborsClassifier(C),
```
Резултатът е малко по-лош:
```output
Accuracy (train) for KNN classifier: 73.8%
precision recall f1-score support
chinese 0.64 0.67 0.66 242
indian 0.86 0.78 0.82 234
japanese 0.66 0.83 0.74 254
korean 0.94 0.58 0.72 242
thai 0.71 0.82 0.76 227
accuracy 0.74 1199
macro avg 0.76 0.74 0.74 1199
weighted avg 0.76 0.74 0.74 1199
```
✅ Научете повече за [K-Neighbors](https://scikit-learn.org/stable/modules/neighbors.html#neighbors)
## Класификатор Support Vector
Класификаторите Support-Vector са част от семейството [Support-Vector Machine](https://wikipedia.org/wiki/Support-vector_machine) методи за машинно обучение, които се използват за задачи по класификация и регресия. SVMs „картират тренировъчните примери към точки в пространството“, за да максимизират разстоянието между две категории. Последващите данни се картографират в това пространство, за да се предвиди тяхната категория.
### Упражнение - приложете класификатор Support Vector
Нека опитаме за малко по-добра точност с класификатор Support Vector.
1. Добавете запетая след елемента K-Neighbors и след това добавете този ред:
```python
'SVC': SVC(),
```
Резултатът е доста добър!
```output
Accuracy (train) for SVC: 83.2%
precision recall f1-score support
chinese 0.79 0.74 0.76 242
indian 0.88 0.90 0.89 234
japanese 0.87 0.81 0.84 254
korean 0.91 0.82 0.86 242
thai 0.74 0.90 0.81 227
accuracy 0.83 1199
macro avg 0.84 0.83 0.83 1199
weighted avg 0.84 0.83 0.83 1199
```
✅ Научете повече за [Support-Vectors](https://scikit-learn.org/stable/modules/svm.html#svm)
## Класификатори Ensemble
Нека следваме пътя до самия край, въпреки че предишният тест беше доста добър. Нека опитаме някои 'Ensemble Classifiers', конкретно Random Forest и AdaBoost:
```python
'RFST': RandomForestClassifier(n_estimators=100),
'ADA': AdaBoostClassifier(n_estimators=100)
```
Резултатът е много добър, особено за Random Forest:
```output
Accuracy (train) for RFST: 84.5%
precision recall f1-score support
chinese 0.80 0.77 0.78 242
indian 0.89 0.92 0.90 234
japanese 0.86 0.84 0.85 254
korean 0.88 0.83 0.85 242
thai 0.80 0.87 0.83 227
accuracy 0.84 1199
macro avg 0.85 0.85 0.84 1199
weighted avg 0.85 0.84 0.84 1199
Accuracy (train) for ADA: 72.4%
precision recall f1-score support
chinese 0.64 0.49 0.56 242
indian 0.91 0.83 0.87 234
japanese 0.68 0.69 0.69 254
korean 0.73 0.79 0.76 242
thai 0.67 0.83 0.74 227
accuracy 0.72 1199
macro avg 0.73 0.73 0.72 1199
weighted avg 0.73 0.72 0.72 1199
```
✅ Научете повече за [Ensemble Classifiers](https://scikit-learn.org/stable/modules/ensemble.html)
Този метод на машинно обучение „комбинира прогнозите на няколко базови оценители“, за да подобри качеството на модела. В нашия пример използвахме Random Trees и AdaBoost.
- [Random Forest](https://scikit-learn.org/stable/modules/ensemble.html#forest), метод за осредняване, изгражда „гора“ от „решаващи дървета“, изпълнени със случайност, за да се избегне прекомерно напасване. Параметърът n_estimators е зададен на броя на дърветата.
- [AdaBoost](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html) напасва класификатор към набор от данни и след това напасва копия на този класификатор към същия набор от данни. Той се фокусира върху теглата на неправилно класифицираните елементи и коригира напасването за следващия класификатор, за да ги поправи.
---
## 🚀Предизвикателство
Всеки от тези техники има голям брой параметри, които можете да настроите. Проучете стандартните параметри на всеки и помислете какво би означавало настройването на тези параметри за качеството на модела.
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Има много жаргон в тези уроци, така че отделете минута, за да прегледате [този списък](https://docs.microsoft.com/dotnet/machine-learning/resources/glossary?WT.mc_id=academic-77952-leestott) с полезна терминология!
## Задание
[Игра с параметри](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "58dfdaf79fb73f7d34b22bdbacf57329",
"translation_date": "2025-09-05T00:51:02+00:00",
"source_file": "4-Classification/3-Classifiers-2/assignment.md",
"language_code": "bg"
}
-->
# Игра с параметри
## Инструкции
Има много параметри, които са зададени по подразбиране при работа с тези класификатори. Intellisense в VS Code може да ви помогне да ги разгледате. Изберете една от техниките за ML класификация от този урок и претренирайте модели, като променяте различни стойности на параметрите. Създайте тетрадка, в която обяснявате защо някои промени подобряват качеството на модела, а други го влошават. Бъдете подробни в отговора си.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | ----------------------------- |
| | Представена е тетрадка с напълно изграден класификатор, чиито параметри са променени и промените са обяснени в текстови полета | Тетрадката е частично представена или слабо обяснена | Тетрадката е бъгава или с грешки |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да било недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T00:51:34+00:00",
"source_file": "4-Classification/3-Classifiers-2/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

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

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "799ed651e2af0a7cad17c6268db11578",
"translation_date": "2025-09-05T00:48:46+00:00",
"source_file": "4-Classification/4-Applied/assignment.md",
"language_code": "bg"
}
-->
# Създайте препоръчваща система
## Инструкции
След като сте преминали упражненията в този урок, вече знаете как да създадете уеб приложение на JavaScript, използвайки Onnx Runtime и конвертиран Onnx модел. Експериментирайте със създаването на нова препоръчваща система, използвайки данни от тези уроци или от други източници (моля, отдайте заслуженото признание). Можете да създадете препоръчваща система за домашни любимци, базирана на различни характеристики на личността, или препоръчваща система за музикални жанрове, базирана на настроението на човек. Бъдете креативни!
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | -------------------------------------------------------------------- | ----------------------------------------- | --------------------------------------- |
| | Представени са уеб приложение и тетрадка, добре документирани и работещи | Едно от двете липсва или има недостатъци | И двете липсват или имат недостатъци |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за каквито и да било недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,41 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "74e809ffd1e613a1058bbc3e9600859e",
"translation_date": "2025-09-05T00:41:08+00:00",
"source_file": "4-Classification/README.md",
"language_code": "bg"
}
-->
# Започване с класификация
## Регионална тема: Вкусни азиатски и индийски кухни 🍜
В Азия и Индия традициите в храната са изключително разнообразни и много вкусни! Нека разгледаме данни за регионалните кухни, за да се опитаме да разберем техните съставки.
![Продавач на тайландска храна](../../../4-Classification/images/thai-food.jpg)
> Снимка от <a href="https://unsplash.com/@changlisheng?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Lisheng Chang</a> в <a href="https://unsplash.com/s/photos/asian-food?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Какво ще научите
В този раздел ще надградите предишното си изучаване на регресия и ще научите за други класификатори, които можете да използвате, за да разберете по-добре данните.
> Съществуват полезни инструменти с нисък код, които могат да ви помогнат да научите как да работите с модели за класификация. Опитайте [Azure ML за тази задача](https://docs.microsoft.com/learn/modules/create-classification-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## Уроци
1. [Въведение в класификацията](1-Introduction/README.md)
2. [Още класификатори](2-Classifiers-1/README.md)
3. [Още други класификатори](3-Classifiers-2/README.md)
4. [Приложен ML: създаване на уеб приложение](4-Applied/README.md)
## Автори
"Започване с класификация" е написано с ♥️ от [Cassie Breviu](https://www.twitter.com/cassiebreviu) и [Jen Looper](https://www.twitter.com/jenlooper)
Данните за вкусните кухни са взети от [Kaggle](https://www.kaggle.com/hoandan/asian-and-indian-cuisines).
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

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

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "589fa015a5e7d9e67bd629f7d47b53de",
"translation_date": "2025-09-05T00:03:43+00:00",
"source_file": "5-Clustering/1-Visualize/assignment.md",
"language_code": "bg"
}
-->
# Изследване на други визуализации за клъстеризация
## Инструкции
В този урок работихте с някои техники за визуализация, за да се запознаете с начини за изобразяване на данни в подготовка за тяхната клъстеризация. Разпръснатите графики (scatterplots) са особено полезни за намиране на групи от обекти. Изследвайте различни начини и библиотеки за създаване на разпръснати графики и документирайте работата си в тетрадка. Можете да използвате данните от този урок, други уроци или данни, които сами сте намерили (моля, посочете техния източник в тетрадката си). Изобразете някои данни с помощта на разпръснати графики и обяснете какво откривате.
## Рубрика
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------- | ----------------------------------------- |
| | Представена е тетрадка с пет добре документирани разпръснати графики | Представена е тетрадка с по-малко от пет разпръснати графики и с по-малко документация | Представена е непълна тетрадка |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T00:04:23+00:00",
"source_file": "5-Clustering/1-Visualize/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,261 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "7cdd17338d9bbd7e2171c2cd462eb081",
"translation_date": "2025-09-05T00:04:39+00:00",
"source_file": "5-Clustering/2-K-Means/README.md",
"language_code": "bg"
}
-->
# K-Means клъстериране
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
В този урок ще научите как да създавате клъстери, използвайки Scikit-learn и набора от данни за нигерийска музика, който импортирахте по-рано. Ще разгледаме основите на K-Means за клъстериране. Имайте предвид, че както научихте в предишния урок, има много начини за работа с клъстери и методът, който използвате, зависи от вашите данни. Ще опитаме K-Means, тъй като това е най-често използваната техника за клъстериране. Да започваме!
Термини, които ще научите:
- Оценка на силуета
- Метод на лакътя
- Инерция
- Вариация
## Въведение
[K-Means клъстериране](https://wikipedia.org/wiki/K-means_clustering) е метод, произхождащ от областта на обработката на сигнали. Използва се за разделяне и групиране на данни в 'k' клъстери чрез серия от наблюдения. Всяко наблюдение работи за групиране на дадена точка от данни най-близо до нейния 'среден', или централната точка на клъстера.
Клъстерите могат да бъдат визуализирани като [диаграми на Вороной](https://wikipedia.org/wiki/Voronoi_diagram), които включват точка (или 'семе') и съответстващия й регион.
![диаграма на Вороной](../../../../5-Clustering/2-K-Means/images/voronoi.png)
> инфографика от [Jen Looper](https://twitter.com/jenlooper)
Процесът на K-Means клъстериране [се изпълнява в три стъпки](https://scikit-learn.org/stable/modules/clustering.html#k-means):
1. Алгоритъмът избира k-брой централни точки чрез извадка от набора от данни. След това циклира:
1. Присвоява всяка извадка към най-близкия центроид.
2. Създава нови центроиди, като взема средната стойност на всички извадки, присвоени към предишните центроиди.
3. След това изчислява разликата между новите и старите центроиди и повтаря, докато центроидите се стабилизират.
Един недостатък на използването на K-Means е, че трябва да определите 'k', тоест броя на центроидите. За щастие, методът на 'лакътя' помага да се оцени добра начална стойност за 'k'. Ще го опитате след малко.
## Предпоставки
Ще работите в [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/2-K-Means/notebook.ipynb) файла на този урок, който включва импортирането на данни и предварителното почистване, което направихте в последния урок.
## Упражнение - подготовка
Започнете, като разгледате отново данните за песните.
1. Създайте boxplot, като извикате `boxplot()` за всяка колона:
```python
plt.figure(figsize=(20,20), dpi=200)
plt.subplot(4,3,1)
sns.boxplot(x = 'popularity', data = df)
plt.subplot(4,3,2)
sns.boxplot(x = 'acousticness', data = df)
plt.subplot(4,3,3)
sns.boxplot(x = 'energy', data = df)
plt.subplot(4,3,4)
sns.boxplot(x = 'instrumentalness', data = df)
plt.subplot(4,3,5)
sns.boxplot(x = 'liveness', data = df)
plt.subplot(4,3,6)
sns.boxplot(x = 'loudness', data = df)
plt.subplot(4,3,7)
sns.boxplot(x = 'speechiness', data = df)
plt.subplot(4,3,8)
sns.boxplot(x = 'tempo', data = df)
plt.subplot(4,3,9)
sns.boxplot(x = 'time_signature', data = df)
plt.subplot(4,3,10)
sns.boxplot(x = 'danceability', data = df)
plt.subplot(4,3,11)
sns.boxplot(x = 'length', data = df)
plt.subplot(4,3,12)
sns.boxplot(x = 'release_date', data = df)
```
Тези данни са малко шумни: като наблюдавате всяка колона като boxplot, можете да видите отклонения.
![отклонения](../../../../5-Clustering/2-K-Means/images/boxplots.png)
Можете да преминете през набора от данни и да премахнете тези отклонения, но това би направило данните доста минимални.
1. Засега изберете кои колони ще използвате за упражнението по клъстериране. Изберете такива с подобни диапазони и кодирайте колоната `artist_top_genre` като числови данни:
```python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
X = df.loc[:, ('artist_top_genre','popularity','danceability','acousticness','loudness','energy')]
y = df['artist_top_genre']
X['artist_top_genre'] = le.fit_transform(X['artist_top_genre'])
y = le.transform(y)
```
1. Сега трябва да изберете колко клъстери да насочите. Знаете, че има 3 жанра песни, които извлякохме от набора от данни, така че нека опитаме с 3:
```python
from sklearn.cluster import KMeans
nclusters = 3
seed = 0
km = KMeans(n_clusters=nclusters, random_state=seed)
km.fit(X)
# Predict the cluster for each data point
y_cluster_kmeans = km.predict(X)
y_cluster_kmeans
```
Виждате отпечатан масив с предсказани клъстери (0, 1 или 2) за всеки ред от dataframe.
1. Използвайте този масив, за да изчислите 'оценка на силуета':
```python
from sklearn import metrics
score = metrics.silhouette_score(X, y_cluster_kmeans)
score
```
## Оценка на силуета
Търсете оценка на силуета, близка до 1. Тази оценка варира от -1 до 1, и ако оценката е 1, клъстерът е плътен и добре отделен от другите клъстери. Стойност близка до 0 представлява припокриващи се клъстери с извадки, много близки до границата на решение на съседните клъстери. [(Източник)](https://dzone.com/articles/kmeans-silhouette-score-explained-with-python-exam)
Нашата оценка е **.53**, така че точно в средата. Това показва, че нашите данни не са особено подходящи за този тип клъстериране, но нека продължим.
### Упражнение - изграждане на модел
1. Импортирайте `KMeans` и започнете процеса на клъстериране.
```python
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
kmeans.fit(X)
wcss.append(kmeans.inertia_)
```
Има няколко части тук, които заслужават обяснение.
> 🎓 range: Това са итерациите на процеса на клъстериране
> 🎓 random_state: "Определя генерирането на случайни числа за инициализация на центроидите." [Източник](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans)
> 🎓 WCSS: "суми на квадратите в рамките на клъстера" измерва средното квадратно разстояние на всички точки в рамките на клъстера до центроида на клъстера. [Източник](https://medium.com/@ODSC/unsupervised-learning-evaluating-clusters-bd47eed175ce).
> 🎓 Inertia: Алгоритмите на K-Means се опитват да изберат центроиди, за да минимизират 'инерцията', "мярка за това колко вътрешно координирани са клъстерите." [Източник](https://scikit-learn.org/stable/modules/clustering.html). Стойността се добавя към променливата wcss при всяка итерация.
> 🎓 k-means++: В [Scikit-learn](https://scikit-learn.org/stable/modules/clustering.html#k-means) можете да използвате оптимизацията 'k-means++', която "инициализира центроидите да бъдат (обикновено) отдалечени един от друг, водейки до вероятно по-добри резултати от случайната инициализация."
### Метод на лакътя
По-рано предположихте, че тъй като сте насочили 3 жанра песни, трябва да изберете 3 клъстери. Но дали това е така?
1. Използвайте метода на 'лакътя', за да се уверите.
```python
plt.figure(figsize=(10,5))
sns.lineplot(x=range(1, 11), y=wcss, marker='o', color='red')
plt.title('Elbow')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
```
Използвайте променливата `wcss`, която изградихте в предишната стъпка, за да създадете диаграма, показваща къде е 'огъването' в лакътя, което показва оптималния брой клъстери. Може би това **е** 3!
![метод на лакътя](../../../../5-Clustering/2-K-Means/images/elbow.png)
## Упражнение - показване на клъстерите
1. Опитайте процеса отново, този път задавайки три клъстери, и покажете клъстерите като диаграма на разсейване:
```python
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3)
kmeans.fit(X)
labels = kmeans.predict(X)
plt.scatter(df['popularity'],df['danceability'],c = labels)
plt.xlabel('popularity')
plt.ylabel('danceability')
plt.show()
```
1. Проверете точността на модела:
```python
labels = kmeans.labels_
correct_labels = sum(y == labels)
print("Result: %d out of %d samples were correctly labeled." % (correct_labels, y.size))
print('Accuracy score: {0:0.2f}'. format(correct_labels/float(y.size)))
```
Точността на този модел не е много добра, а формата на клъстерите ви дава намек защо.
![клъстери](../../../../5-Clustering/2-K-Means/images/clusters.png)
Тези данни са твърде небалансирани, твърде малко корелирани и има твърде много вариация между стойностите на колоните, за да се клъстерират добре. Всъщност клъстерите, които се формират, вероятно са силно повлияни или изкривени от трите жанрови категории, които дефинирахме по-горе. Това беше процес на учене!
В документацията на Scikit-learn можете да видите, че модел като този, с клъстери, които не са много добре разграничени, има проблем с 'вариацията':
![проблемни модели](../../../../5-Clustering/2-K-Means/images/problems.png)
> Инфографика от Scikit-learn
## Вариация
Вариацията се определя като "средната стойност на квадратните разлики от средната стойност" [(Източник)](https://www.mathsisfun.com/data/standard-deviation.html). В контекста на този проблем с клъстерирането, тя се отнася до данни, при които числата в нашия набор от данни са склонни да се отклоняват твърде много от средната стойност.
✅ Това е чудесен момент да помислите за всички начини, по които можете да коригирате този проблем. Да промените данните малко повече? Да използвате различни колони? Да използвате различен алгоритъм? Подсказка: Опитайте [мащабиране на данните](https://www.mygreatlearning.com/blog/learning-data-science-with-k-means-clustering/), за да ги нормализирате и да тествате други колони.
> Опитайте този '[калкулатор за вариация](https://www.calculatorsoup.com/calculators/statistics/variance-calculator.php)', за да разберете концепцията малко повече.
---
## 🚀Предизвикателство
Прекарайте известно време с този notebook, настройвайки параметрите. Можете ли да подобрите точността на модела, като почистите данните повече (например премахване на отклонения)? Можете да използвате тегла, за да дадете повече тежест на определени извадки от данни. Какво друго можете да направите, за да създадете по-добри клъстери?
Подсказка: Опитайте да мащабирате данните си. В notebook има коментиран код, който добавя стандартно мащабиране, за да направи колоните с данни да си приличат повече по отношение на диапазон. Ще откриете, че докато оценката на силуета намалява, 'огъването' в графиката на лакътя се изглажда. Това е така, защото оставянето на данните немащабирани позволява данни с по-малка вариация да имат по-голяма тежест. Прочетете малко повече за този проблем [тук](https://stats.stackexchange.com/questions/21222/are-mean-normalization-and-feature-scaling-needed-for-k-means-clustering/21226#21226).
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Разгледайте симулатор за K-Means [като този](https://user.ceng.metu.edu.tr/~akifakkus/courses/ceng574/k-means/). Можете да използвате този инструмент, за да визуализирате примерни точки от данни и да определите техните центроиди. Можете да редактирате случайността на данните, броя на клъстерите и броя на центроидите. Помага ли това да получите представа как данните могат да бъдат групирани?
Също така разгледайте [този материал за K-Means](https://stanford.edu/~cpiech/cs221/handouts/kmeans.html) от Станфорд.
## Задача
[Опитайте различни методи за клъстериране](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b8e17eff34ad1680eba2a5d3cf9ffc41",
"translation_date": "2025-09-05T00:07:04+00:00",
"source_file": "5-Clustering/2-K-Means/assignment.md",
"language_code": "bg"
}
-->
# Опитайте различни методи за клъстеризация
## Инструкции
В този урок научихте за клъстеризацията с K-Means. Понякога K-Means не е подходящ за вашите данни. Създайте тетрадка, използвайки данни от тези уроци или от друго място (посочете източника си) и демонстрирайте различен метод за клъстеризация, който НЕ използва K-Means. Какво научихте?
## Рубрика
| Критерии | Примерно изпълнение | Задоволително изпълнение | Нуждае се от подобрение |
| -------- | --------------------------------------------------------------- | -------------------------------------------------------------------- | ----------------------------- |
| | Представена е тетрадка с добре документиран модел за клъстеризация | Представена е тетрадка без добра документация и/или с непълно съдържание | Представена е непълна работа |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматичните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия изходен език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален превод от човек. Ние не носим отговорност за каквито и да е недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T00:07:40+00:00",
"source_file": "5-Clustering/2-K-Means/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,42 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "b28a3a4911584062772c537b653ebbc7",
"translation_date": "2025-09-04T23:57:22+00:00",
"source_file": "5-Clustering/README.md",
"language_code": "bg"
}
-->
# Модели за клъстеризация в машинното обучение
Клъстеризацията е задача в машинното обучение, която се стреми да открие обекти, които си приличат, и да ги групира в групи, наречени клъстери. Това, което отличава клъстеризацията от другите подходи в машинното обучение, е, че процесът се случва автоматично. Всъщност, може да се каже, че това е противоположността на обучението с учител.
## Регионална тема: модели за клъстеризация на музикалните вкусове на нигерийската аудитория 🎧
Разнообразната аудитория в Нигерия има разнообразни музикални вкусове. Използвайки данни, събрани от Spotify (вдъхновено от [тази статия](https://towardsdatascience.com/country-wise-visual-analysis-of-music-taste-using-spotify-api-seaborn-in-python-77f5b749b421)), нека разгледаме някои популярни песни в Нигерия. Този набор от данни включва информация за различни песни, като например техния 'danceability' рейтинг, 'acousticness', сила на звука, 'speechiness', популярност и енергия. Ще бъде интересно да открием модели в тези данни!
![Грамофон](../../../5-Clustering/images/turntable.jpg)
> Снимка от <a href="https://unsplash.com/@marcelalaskoski?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Marcela Laskoski</a> на <a href="https://unsplash.com/s/photos/nigerian-music?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
В тази серия от уроци ще откриете нови начини за анализиране на данни, използвайки техники за клъстеризация. Клъстеризацията е особено полезна, когато вашият набор от данни няма етикети. Ако има етикети, тогава техниките за класификация, които сте научили в предишните уроци, може да са по-полезни. Но в случаите, когато искате да групирате данни без етикети, клъстеризацията е отличен начин за откриване на модели.
> Съществуват полезни инструменти с нисък код, които могат да ви помогнат да научите повече за работата с модели за клъстеризация. Опитайте [Azure ML за тази задача](https://docs.microsoft.com/learn/modules/create-clustering-model-azure-machine-learning-designer/?WT.mc_id=academic-77952-leestott)
## Уроци
1. [Въведение в клъстеризацията](1-Visualize/README.md)
2. [Клъстеризация с K-Means](2-K-Means/README.md)
## Кредити
Тези уроци бяха написани с 🎶 от [Jen Looper](https://www.twitter.com/jenlooper) с полезни ревюта от [Rishit Dagli](https://rishit_dagli) и [Muhammad Sakib Khan Inan](https://twitter.com/Sakibinan).
Наборът от данни [Nigerian Songs](https://www.kaggle.com/sootersaalu/nigerian-songs-spotify) беше взет от Kaggle и събран от Spotify.
Полезни примери за K-Means, които помогнаха при създаването на този урок, включват това [изследване на ириси](https://www.kaggle.com/bburns/iris-exploration-pca-k-means-and-gmm-clustering), този [въвеждащ ноутбук](https://www.kaggle.com/prashant111/k-means-clustering-with-python) и този [хипотетичен пример за НПО](https://www.kaggle.com/ankandash/pca-k-means-clustering-hierarchical-clustering).
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,179 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1c2ec40cf55c98a028a359c27ef7e45a",
"translation_date": "2025-09-05T01:33:38+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/README.md",
"language_code": "bg"
}
-->
# Въведение в обработката на естествен език
Този урок обхваща кратка история и важни концепции на *обработката на естествен език*, подполе на *компютърната лингвистика*.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Въведение
Обработката на естествен език (NLP), както често се нарича, е една от най-известните области, в които машинното обучение е приложено и използвано в производствен софтуер.
✅ Можете ли да се сетите за софтуер, който използвате всеки ден и вероятно има вградена обработка на естествен език? А какво ще кажете за програмите за текстообработка или мобилните приложения, които използвате редовно?
Ще научите за:
- **Идеята за езиците**. Как са се развили езиците и кои са основните области на изследване.
- **Дефиниции и концепции**. Ще научите дефиниции и концепции за това как компютрите обработват текст, включително парсинг, граматика и идентифициране на съществителни и глаголи. В този урок има някои задачи за програмиране, както и няколко важни концепции, които ще научите да програмирате в следващите уроци.
## Компютърна лингвистика
Компютърната лингвистика е област на изследване и развитие през последните десетилетия, която изучава как компютрите могат да работят с, и дори да разбират, превеждат и комуникират с езици. Обработката на естествен език (NLP) е свързана област, която се фокусира върху това как компютрите могат да обработват „естествени“, или човешки, езици.
### Пример - диктовка на телефон
Ако някога сте диктували на телефона си вместо да пишете или сте задавали въпрос на виртуален асистент, вашата реч е била преобразувана в текстова форма и след това обработена или *парсирана* от езика, на който сте говорили. Откритите ключови думи след това са били обработени във формат, който телефонът или асистентът могат да разберат и да действат според него.
![разбиране](../../../../6-NLP/1-Introduction-to-NLP/images/comprehension.png)
> Истинското езиково разбиране е трудно! Изображение от [Jen Looper](https://twitter.com/jenlooper)
### Как е възможна тази технология?
Това е възможно, защото някой е написал компютърна програма, която да го направи. Преди няколко десетилетия някои писатели на научна фантастика предсказаха, че хората ще говорят предимно с компютрите си и компютрите винаги ще разбират точно какво имат предвид. За съжаление, се оказа, че това е по-труден проблем, отколкото мнозина си представяха, и въпреки че днес проблемът е много по-добре разбран, има значителни предизвикателства за постигане на „перфектна“ обработка на естествен език, когато става въпрос за разбиране на значението на изречение. Това е особено труден проблем, когато става въпрос за разбиране на хумор или откриване на емоции като сарказъм в изречение.
В този момент може би си спомняте училищни часове, в които учителят е разглеждал частите на граматиката в изречение. В някои страни учениците изучават граматика и лингвистика като отделен предмет, но в много други тези теми са включени като част от изучаването на език: или първия ви език в началното училище (учене на четене и писане), а може би и втори език в гимназията. Не се притеснявайте, ако не сте експерт в разграничаването на съществителни от глаголи или наречия от прилагателни!
Ако се затруднявате с разликата между *простото сегашно време* и *сегашно продължително време*, не сте сами. Това е предизвикателство за много хора, дори за носители на езика. Добрата новина е, че компютрите са наистина добри в прилагането на формални правила и ще научите как да пишете код, който може да *парсира* изречение толкова добре, колкото човек. По-голямото предизвикателство, което ще разгледате по-късно, е разбирането на *значението* и *настроението* на изречение.
## Предпоставки
За този урок основната предпоставка е да можете да четете и разбирате езика на този урок. Няма математически задачи или уравнения за решаване. Въпреки че оригиналният автор е написал този урок на английски, той е преведен и на други езици, така че може би четете превод. Има примери, в които се използват различни езици (за сравнение на различните граматически правила на различните езици). Те *не са* преведени, но обяснителният текст е, така че значението трябва да е ясно.
За задачите за програмиране ще използвате Python, а примерите са с Python 3.8.
В този раздел ще ви трябват и ще използвате:
- **Разбиране на Python 3**. Разбиране на програмния език Python 3, този урок използва входни данни, цикли, четене на файлове, масиви.
- **Visual Studio Code + разширение**. Ще използваме Visual Studio Code и неговото разширение за Python. Можете също да използвате Python IDE по ваш избор.
- **TextBlob**. [TextBlob](https://github.com/sloria/TextBlob) е опростена библиотека за обработка на текст за Python. Следвайте инструкциите на сайта на TextBlob, за да го инсталирате на вашата система (инсталирайте и корпусите, както е показано по-долу):
```bash
pip install -U textblob
python -m textblob.download_corpora
```
> 💡 Съвет: Можете да изпълнявате Python директно в средите на VS Code. Проверете [документацията](https://code.visualstudio.com/docs/languages/python?WT.mc_id=academic-77952-leestott) за повече информация.
## Говорене с машини
Историята на опитите да се накарат компютрите да разбират човешки език се простира десетилетия назад, а един от най-ранните учени, които разглеждат обработката на естествен език, е *Алън Тюринг*.
### Тестът на Тюринг
Когато Тюринг изследваше *изкуствения интелект* през 50-те години на миналия век, той се замисли дали може да се проведе разговорен тест между човек и компютър (чрез писмена кореспонденция), при който човекът в разговора не е сигурен дали разговаря с друг човек или с компютър.
Ако след определена дължина на разговора човекът не може да определи дали отговорите са от компютър или не, може ли да се каже, че компютърът *мисли*?
### Вдъхновението - „играта на имитация“
Идеята за това идва от парти игра, наречена *Игра на имитация*, при която разпитващият е сам в стая и има задача да определи кои от двама души (в друга стая) са съответно мъж и жена. Разпитващият може да изпраща бележки и трябва да се опита да измисли въпроси, при които писмените отговори разкриват пола на загадъчния човек. Разбира се, играчите в другата стая се опитват да заблудят разпитващия, като отговарят на въпросите по начин, който да го обърка или заблуди, като същевременно дават вид, че отговарят честно.
### Разработване на Eliza
През 60-те години учен от MIT, наречен *Джозеф Вайзенбаум*, разработва [*Eliza*](https://wikipedia.org/wiki/ELIZA), компютърен „терапевт“, който задава въпроси на човека и създава впечатление, че разбира отговорите му. Въпреки това, докато Eliza можеше да парсира изречение и да идентифицира определени граматически конструкции и ключови думи, за да даде разумен отговор, не можеше да се каже, че тя *разбира* изречението. Ако на Eliza се представи изречение във формат "**Аз съм** <u>тъжен</u>", тя може да пренареди и замени думи в изречението, за да формира отговора "От колко време **ти си** <u>тъжен</u>?".
Това създава впечатление, че Eliza разбира изказването и задава последващ въпрос, докато в действителност тя просто променя времето и добавя някои думи. Ако Eliza не може да идентифицира ключова дума, за която има отговор, тя вместо това дава случаен отговор, който може да бъде приложим за много различни изказвания. Eliza може лесно да бъде заблудена, например ако потребителят напише "**Ти си** <u>велосипед</u>", тя може да отговори с "От колко време **аз съм** <u>велосипед</u>?", вместо с по-разумен отговор.
[![Разговор с Eliza](https://img.youtube.com/vi/RMK9AphfLco/0.jpg)](https://youtu.be/RMK9AphfLco "Разговор с Eliza")
> 🎥 Кликнете върху изображението по-горе за видео за оригиналната програма ELIZA
> Забележка: Можете да прочетете оригиналното описание на [Eliza](https://cacm.acm.org/magazines/1966/1/13317-elizaa-computer-program-for-the-study-of-natural-language-communication-between-man-and-machine/abstract), публикувано през 1966 г., ако имате акаунт в ACM. Алтернативно, прочетете за Eliza в [Wikipedia](https://wikipedia.org/wiki/ELIZA).
## Упражнение - програмиране на основен разговорен бот
Разговорен бот, като Eliza, е програма, която получава вход от потребителя и създава впечатление, че разбира и отговаря интелигентно. За разлика от Eliza, нашият бот няма да има множество правила, които да му придават вид на интелигентен разговор. Вместо това, нашият бот ще има само една способност - да поддържа разговора с произволни отговори, които могат да работят в почти всяка тривиална беседа.
### Планът
Вашите стъпки при изграждането на разговорен бот:
1. Отпечатайте инструкции, които съветват потребителя как да взаимодейства с бота.
2. Започнете цикъл:
1. Приемете вход от потребителя.
2. Ако потребителят поиска да излезе, прекратете.
3. Обработете входа на потребителя и определете отговор (в този случай отговорът е произволен избор от списък с възможни общи отговори).
4. Отпечатайте отговора.
3. Върнете се към стъпка 2.
### Създаване на бота
Нека създадем бота. Ще започнем с дефиниране на някои фрази.
1. Създайте този бот сами в Python с помощта на следните произволни отговори:
```python
random_responses = ["That is quite interesting, please tell me more.",
"I see. Do go on.",
"Why do you say that?",
"Funny weather we've been having, isn't it?",
"Let's change the subject.",
"Did you catch the game last night?"]
```
Ето примерен изход, който да ви насочи (входът на потребителя е на редовете, започващи с `>`):
```output
Hello, I am Marvin, the simple robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am good thanks
That is quite interesting, please tell me more.
> today I went for a walk
Did you catch the game last night?
> I did, but my team lost
Funny weather we've been having, isn't it?
> yes but I hope next week is better
Let's change the subject.
> ok, lets talk about music
Why do you say that?
> because I like music!
Why do you say that?
> bye
It was nice talking to you, goodbye!
```
Едно възможно решение на задачата е [тук](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/1-Introduction-to-NLP/solution/bot.py).
✅ Спрете и помислете
1. Смятате ли, че произволните отговори биха „заблудили“ някого да мисли, че ботът всъщност го разбира?
2. Какви функции би трябвало да има ботът, за да бъде по-ефективен?
3. Ако ботът наистина може да „разбере“ значението на изречение, би ли трябвало да „запомни“ значението на предишни изречения в разговора?
---
## 🚀Предизвикателство
Изберете един от елементите „спрете и помислете“ по-горе и опитайте да го приложите в код или напишете решение на хартия, използвайки псевдокод.
В следващия урок ще научите за редица други подходи за парсинг на естествен език и машинно обучение.
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Разгледайте препратките по-долу като възможности за допълнително четене.
### Препратки
1. Schubert, Lenhart, "Computational Linguistics", *The Stanford Encyclopedia of Philosophy* (Spring 2020 Edition), Edward N. Zalta (ed.), URL = <https://plato.stanford.edu/archives/spr2020/entries/computational-linguistics/>.
2. Princeton University "About WordNet." [WordNet](https://wordnet.princeton.edu/). Princeton University. 2010.
## Задание
[Търсене на бот](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1d7583e8046dacbb0c056d5ba0a71b16",
"translation_date": "2025-09-05T01:36:32+00:00",
"source_file": "6-NLP/1-Introduction-to-NLP/assignment.md",
"language_code": "bg"
}
-->
# Търсене на бот
## Инструкции
Ботовете са навсякъде. Вашата задача: намерете един и го "осиновете"! Можете да ги откриете на уебсайтове, в банкови приложения и по телефона, например когато се обадите на финансови компании за съвет или информация за акаунта си. Анализирайте бота и вижте дали можете да го объркате. Ако успеете да го объркате, защо мислите, че това се случи? Напишете кратко есе за вашия опит.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ------------------------------------------------------------------------------------------------------------ | -------------------------------------------- | ----------------------- |
| | Написана е пълна страница, обясняваща предполагаемата архитектура на бота и описваща вашия опит с него | Есето е непълно или недостатъчно проучено | Не е представено есе |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,224 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "5f3cb462e3122e1afe7ab0050ccf2bd3",
"translation_date": "2025-09-05T01:20:43+00:00",
"source_file": "6-NLP/2-Tasks/README.md",
"language_code": "bg"
}
-->
# Често срещани задачи и техники в обработката на естествен език
За повечето задачи, свързани с *обработката на естествен език*, текстът, който трябва да бъде обработен, трябва да бъде разделен, анализиран и резултатите съхранени или сравнени с правила и набори от данни. Тези задачи позволяват на програмиста да извлече _значението_, амерението_ или само естотата_ на термините и думите в текста.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
Нека разгледаме често използваните техники за обработка на текст. В комбинация с машинно обучение, тези техники ви помагат да анализирате големи количества текст ефективно. Преди да приложите ML към тези задачи, обаче, нека разберем проблемите, с които се сблъсква специалистът по NLP.
## Често срещани задачи в NLP
Има различни начини за анализиране на текста, върху който работите. Има задачи, които можете да изпълните, и чрез тях можете да разберете текста и да направите изводи. Обикновено тези задачи се изпълняват в определена последователност.
### Токенизация
Вероятно първото нещо, което повечето NLP алгоритми трябва да направят, е да разделят текста на токени или думи. Макар това да звучи просто, вземането предвид на пунктуацията и различните езикови разделители за думи и изречения може да го направи сложно. Може да се наложи да използвате различни методи за определяне на границите.
![tokenization](../../../../6-NLP/2-Tasks/images/tokenization.png)
> Токенизация на изречение от **Гордост и предразсъдъци**. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
### Вграждания
[Вграждания на думи](https://wikipedia.org/wiki/Word_embedding) са начин за числено преобразуване на текстовите данни. Вгражданията се правят така, че думи с подобно значение или думи, използвани заедно, да се групират.
![word embeddings](../../../../6-NLP/2-Tasks/images/embedding.png)
> "Имам най-голямо уважение към вашите нерви, те са мои стари приятели." - Вграждания на думи за изречение от **Гордост и предразсъдъци**. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
✅ Опитайте [този интересен инструмент](https://projector.tensorflow.org/), за да експериментирате с вграждания на думи. Кликването върху една дума показва групи от подобни думи: 'toy' се групира с 'disney', 'lego', 'playstation' и 'console'.
### Парсинг и маркиране на части на речта
Всяка дума, която е токенизирана, може да бъде маркирана като част на речта - съществително, глагол или прилагателно. Изречението `бързата червена лисица скочи над мързеливото кафяво куче` може да бъде маркирано като лисица = съществително, скочи = глагол.
![parsing](../../../../6-NLP/2-Tasks/images/parse.png)
> Парсинг на изречение от **Гордост и предразсъдъци**. Инфографика от [Jen Looper](https://twitter.com/jenlooper)
Парсингът разпознава кои думи са свързани една с друга в изречението - например `бързата червена лисица скочи` е последователност от прилагателно-съществително-глагол, която е отделна от `мързеливото кафяво куче`.
### Честота на думи и фрази
Полезна процедура при анализиране на голям текстов корпус е изграждането на речник на всяка дума или фраза от интерес и колко често се появява. Фразата `бързата червена лисица скочи над мързеливото кафяво куче` има честота на думата "the" от 2.
Нека разгледаме примерен текст, в който броим честотата на думите. Стихотворението "The Winners" на Ръдиард Киплинг съдържа следния стих:
```output
What the moral? Who rides may read.
When the night is thick and the tracks are blind
A friend at a pinch is a friend, indeed,
But a fool to wait for the laggard behind.
Down to Gehenna or up to the Throne,
He travels the fastest who travels alone.
```
Тъй като честотата на фразите може да бъде чувствителна или нечувствителна към регистъра, фразата `a friend` има честота 2, `the` има честота 6, а `travels` е 2.
### N-грамове
Текстът може да бъде разделен на последователности от думи с определена дължина: една дума (униграм), две думи (биграм), три думи (триграм) или произволен брой думи (n-грам).
Например, `бързата червена лисица скочи над мързеливото кафяво куче` с n-грам стойност 2 произвежда следните n-грамове:
1. бързата червена
2. червена лисица
3. лисица скочи
4. скочи над
5. над мързеливото
6. мързеливото кафяво
7. кафяво куче
Може да е по-лесно да го визуализирате като плъзгащ прозорец върху изречението. Ето го за n-грамове от 3 думи, n-грамът е удебелен във всяко изречение:
1. <u>**бързата червена лисица**</u> скочи над мързеливото кафяво куче
2. бързата **<u>червена лисица скочи</u>** над мързеливото кафяво куче
3. бързата червена **<u>лисица скочи над</u>** мързеливото кафяво куче
4. бързата червена лисица **<u>скочи над мързеливото</u>** кафяво куче
5. бързата червена лисица скочи **<u>над мързеливото кафяво</u>** куче
6. бързата червена лисица скочи над <u>**мързеливото кафяво куче**</u>
![n-grams sliding window](../../../../6-NLP/2-Tasks/images/n-grams.gif)
> N-грам стойност 3: Инфографика от [Jen Looper](https://twitter.com/jenlooper)
### Извличане на съществителни фрази
В повечето изречения има съществително, което е подлог или допълнение на изречението. В английския език то често може да бъде идентифицирано като предшествано от 'a', 'an' или 'the'. Идентифицирането на подлога или допълнението на изречението чрез 'извличане на съществителната фраза' е често срещана задача в NLP, когато се опитвате да разберете значението на изречението.
В изречението "Не мога да определя часа, мястото, погледа или думите, които положиха основите. Това беше твърде отдавна. Бях в средата, преди да разбера, че съм започнал.", можете ли да идентифицирате съществителните фрази?
В изречението `бързата червена лисица скочи над мързеливото кафяво куче` има 2 съществителни фрази: **бързата червена лисица** и **мързеливото кафяво куче**.
### Анализ на настроението
Изречение или текст може да бъде анализирано за настроение, или колко *положително* или *отрицателно* е то. Настроението се измерва чрез *полярност* и *обективност/субективност*. Полярността се измерва от -1.0 до 1.0 (отрицателно до положително), а обективността от 0.0 до 1.0 (най-обективно до най-субективно).
✅ По-късно ще научите, че има различни начини за определяне на настроението чрез машинно обучение, но един от тях е да имате списък с думи и фрази, които са категоризирани като положителни или отрицателни от човешки експерт, и да приложите този модел към текста, за да изчислите полярност. Можете ли да видите как това би работило в някои случаи и по-малко добре в други?
### Инфлексия
Инфлексията ви позволява да вземете дума и да получите нейния единствено или множествено число.
### Лематизация
*Лема* е коренът или основната дума за набор от думи, например *летя*, *лети*, *летене* имат лема на глагола *летя*.
Съществуват и полезни бази данни за изследователите в NLP, като например:
### WordNet
[WordNet](https://wordnet.princeton.edu/) е база данни от думи, синоними, антоними и много други детайли за всяка дума на много различни езици. Тя е изключително полезна при опити за изграждане на преводи, проверка на правописа или езикови инструменти от всякакъв тип.
## Библиотеки за NLP
За щастие, не е нужно да изграждате всички тези техники сами, тъй като има отлични Python библиотеки, които правят обработката на естествен език много по-достъпна за разработчици, които не са специализирани в NLP или машинно обучение. В следващите уроци ще има повече примери за тях, но тук ще научите някои полезни примери, които ще ви помогнат със следващата задача.
### Упражнение - използване на библиотеката `TextBlob`
Нека използваме библиотека, наречена TextBlob, тъй като тя съдържа полезни API за справяне с тези типове задачи. TextBlob "стои на гигантските рамене на [NLTK](https://nltk.org) и [pattern](https://github.com/clips/pattern), и работи добре с двете." Тя има значително количество ML, вградено в своя API.
> Забележка: Полезен [Ръководство за бърз старт](https://textblob.readthedocs.io/en/dev/quickstart.html#quickstart) е налично за TextBlob и се препоръчва за опитни Python разработчици.
Когато се опитвате да идентифицирате *съществителни фрази*, TextBlob предлага няколко опции за екстрактори, които да намерят съществителни фрази.
1. Разгледайте `ConllExtractor`.
```python
from textblob import TextBlob
from textblob.np_extractors import ConllExtractor
# import and create a Conll extractor to use later
extractor = ConllExtractor()
# later when you need a noun phrase extractor:
user_input = input("> ")
user_input_blob = TextBlob(user_input, np_extractor=extractor) # note non-default extractor specified
np = user_input_blob.noun_phrases
```
> Какво се случва тук? [ConllExtractor](https://textblob.readthedocs.io/en/dev/api_reference.html?highlight=Conll#textblob.en.np_extractors.ConllExtractor) е "Екстрактор на съществителни фрази, който използва chunk парсинг, обучен с корпуса ConLL-2000." ConLL-2000 се отнася до Конференцията за компютърно обучение на естествен език през 2000 г. Всяка година конференцията провежда работилница за справяне с труден NLP проблем, а през 2000 г. това беше chunking на съществителни. Моделът беше обучен върху Wall Street Journal, с "секции 15-18 като тренировъчни данни (211727 токена) и секция 20 като тестови данни (47377 токена)". Можете да разгледате използваните процедури [тук](https://www.clips.uantwerpen.be/conll2000/chunking/) и [резултатите](https://ifarm.nl/erikt/research/np-chunking.html).
### Предизвикателство - подобряване на вашия бот с NLP
В предишния урок създадохте много прост Q&A бот. Сега ще направите Марвин малко по-съпричастен, като анализирате вашия вход за настроение и отпечатате отговор, който съответства на настроението. Също така ще трябва да идентифицирате `noun_phrase` и да зададете въпрос за нея.
Вашите стъпки при изграждането на по-добър разговорен бот:
1. Отпечатайте инструкции, които съветват потребителя как да взаимодейства с бота.
2. Започнете цикъл:
1. Приемете вход от потребителя.
2. Ако потребителят поиска изход, излезте.
3. Обработете входа на потребителя и определете подходящ отговор за настроението.
4. Ако се открие съществителна фраза в настроението, направете я множествено число и поискайте повече информация за тази тема.
5. Отпечатайте отговор.
3. Върнете се към стъпка 2.
Ето кодовият фрагмент за определяне на настроение с TextBlob. Забележете, че има само четири *градиента* на отговор за настроение (можете да добавите повече, ако желаете):
```python
if user_input_blob.polarity <= -0.5:
response = "Oh dear, that sounds bad. "
elif user_input_blob.polarity <= 0:
response = "Hmm, that's not great. "
elif user_input_blob.polarity <= 0.5:
response = "Well, that sounds positive. "
elif user_input_blob.polarity <= 1:
response = "Wow, that sounds great. "
```
Ето примерен изход, който да ви насочи (входът на потребителя е на редовете, започващи с >):
```output
Hello, I am Marvin, the friendly robot.
You can end this conversation at any time by typing 'bye'
After typing each answer, press 'enter'
How are you today?
> I am ok
Well, that sounds positive. Can you tell me more?
> I went for a walk and saw a lovely cat
Well, that sounds positive. Can you tell me more about lovely cats?
> cats are the best. But I also have a cool dog
Wow, that sounds great. Can you tell me more about cool dogs?
> I have an old hounddog but he is sick
Hmm, that's not great. Can you tell me more about old hounddogs?
> bye
It was nice talking to you, goodbye!
```
Едно възможно решение на задачата е [тук](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/2-Tasks/solution/bot.py)
✅ Проверка на знанията
1. Смятате ли, че съпричастните отговори биха "заблудили" някого да мисли, че ботът всъщност го разбира?
2. Прави ли идентифицирането на съществителната фраза бота по-убедителен?
3. Защо извличането на "съществителна фраза" от изречение е полезно?
---
Изпълнете бота от предишната проверка на знанията и го тествайте на приятел. Може ли да ги заблуди? Можете ли да направите бота си по-убедителен?
## 🚀Предизвикателство
Вземете задача от предишната проверка на знанията и опитайте да я изпълните. Тествайте бота на приятел. Може ли да ги заблуди? Можете ли да направите бота си по-убедителен?
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
В следващите няколко урока ще научите повече за анализа на настроението. Изследвайте тази интересна техника в статии като тези на [KDNuggets](https://www.kdnuggets.com/tag/nlp)
## Задание
[Накарайте бота да отговаря](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2efc4c2aba5ed06c780c05539c492ae3",
"translation_date": "2025-09-05T01:23:49+00:00",
"source_file": "6-NLP/2-Tasks/assignment.md",
"language_code": "bg"
}
-->
# Направете бота да отговаря
## Инструкции
В предишните уроци програмирахте основен бот, с който да разговаряте. Този бот дава случайни отговори, докато не кажете 'чао'. Можете ли да направите отговорите малко по-малко случайни и да задействате конкретни отговори, ако кажете определени неща, като 'защо' или 'как'? Помислете как машинното обучение може да направи този тип работа по-малко ръчна, докато разширявате функционалността на бота. Можете да използвате библиотеките NLTK или TextBlob, за да улесните задачите си.
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | -------------------------------------------- | ------------------------------------------------ | ----------------------- |
| | Представен е нов файл bot.py и е документиран | Представен е нов файл bot.py, но съдържа грешки | Файлът не е представен |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

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

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "9d2a734deb904caff310d1a999c6bd7a",
"translation_date": "2025-09-05T01:40:54+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/assignment.md",
"language_code": "bg"
}
-->
# Поетична лицензия
## Инструкции
В [този тефтер](https://www.kaggle.com/jenlooper/emily-dickinson-word-frequency) можете да намерите над 500 стихотворения на Емили Дикинсън, предварително анализирани за настроение с помощта на Azure text analytics. Използвайки този набор от данни, анализирайте го с техниките, описани в урока. Съответства ли предложеното настроение на стихотворението с решението на по-усъвършенстваната услуга на Azure? Защо или защо не, според вас? Има ли нещо, което ви изненадва?
## Рубрика
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ------------------------------------------------------------------------ | ------------------------------------------------------- | ------------------------ |
| | Представен е тефтер със солиден анализ на примерен изход на автора | Тефтерът е непълен или не извършва анализ | Не е представен тефтер |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T01:41:47+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T01:41:25+00:00",
"source_file": "6-NLP/3-Translation-Sentiment/solution/R/README.md",
"language_code": "bg"
}
-->
това е временно запълващо място
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

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

@ -0,0 +1,19 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "bf39bceb833cd628f224941dca8041df",
"translation_date": "2025-09-05T01:32:13+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/assignment.md",
"language_code": "bg"
}
-->
# NLTK
## Инструкции
NLTK е добре позната библиотека за използване в компютърната лингвистика и обработката на естествен език (NLP). Възползвайте се от тази възможност, за да прочетете '[NLTK книга](https://www.nltk.org/book/)' и да изпробвате нейните упражнения. В това незадължително задание ще се запознаете по-дълбоко с тази библиотека.
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T01:33:00+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T01:32:38+00:00",
"source_file": "6-NLP/4-Hotel-Reviews-1/solution/R/README.md",
"language_code": "bg"
}
-->
това е временно запълващо съдържание
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,389 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "2c742993fe95d5bcbb2846eda3d442a1",
"translation_date": "2025-09-05T01:42:04+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/README.md",
"language_code": "bg"
}
-->
# Анализ на настроения с хотелски ревюта
Сега, след като сте разгледали набора от данни в детайли, е време да филтрирате колоните и да използвате техники за обработка на естествен език (NLP), за да получите нови прозрения за хотелите.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
### Операции за филтриране и анализ на настроения
Както вероятно сте забелязали, наборът от данни има някои проблеми. Някои колони са запълнени с ненужна информация, други изглеждат некоректни. Дори ако са коректни, не е ясно как са били изчислени, а отговорите не могат да бъдат независимо проверени чрез ваши собствени изчисления.
## Упражнение: малко повече обработка на данни
Почистете данните още малко. Добавете колони, които ще бъдат полезни по-късно, променете стойностите в други колони и напълно премахнете определени колони.
1. Първоначална обработка на колоните
1. Премахнете `lat` и `lng`
2. Заменете стойностите в `Hotel_Address` със следните стойности (ако адресът съдържа името на града и страната, променете го само на града и страната).
Това са единствените градове и страни в набора от данни:
Амстердам, Нидерландия
Барселона, Испания
Лондон, Обединено кралство
Милано, Италия
Париж, Франция
Виена, Австрия
```python
def replace_address(row):
if "Netherlands" in row["Hotel_Address"]:
return "Amsterdam, Netherlands"
elif "Barcelona" in row["Hotel_Address"]:
return "Barcelona, Spain"
elif "United Kingdom" in row["Hotel_Address"]:
return "London, United Kingdom"
elif "Milan" in row["Hotel_Address"]:
return "Milan, Italy"
elif "France" in row["Hotel_Address"]:
return "Paris, France"
elif "Vienna" in row["Hotel_Address"]:
return "Vienna, Austria"
# Replace all the addresses with a shortened, more useful form
df["Hotel_Address"] = df.apply(replace_address, axis = 1)
# The sum of the value_counts() should add up to the total number of reviews
print(df["Hotel_Address"].value_counts())
```
Сега можете да правите заявки на ниво страна:
```python
display(df.groupby("Hotel_Address").agg({"Hotel_Name": "nunique"}))
```
| Hotel_Address | Hotel_Name |
| :--------------------- | :--------: |
| Amsterdam, Netherlands | 105 |
| Barcelona, Spain | 211 |
| London, United Kingdom | 400 |
| Milan, Italy | 162 |
| Paris, France | 458 |
| Vienna, Austria | 158 |
2. Обработка на мета-ревю колоните на хотелите
1. Премахнете `Additional_Number_of_Scoring`
1. Заменете `Total_Number_of_Reviews` с общия брой ревюта за този хотел, които всъщност са в набора от данни
1. Заменете `Average_Score` с нашия собствен изчислен резултат
```python
# Drop `Additional_Number_of_Scoring`
df.drop(["Additional_Number_of_Scoring"], axis = 1, inplace=True)
# Replace `Total_Number_of_Reviews` and `Average_Score` with our own calculated values
df.Total_Number_of_Reviews = df.groupby('Hotel_Name').transform('count')
df.Average_Score = round(df.groupby('Hotel_Name').Reviewer_Score.transform('mean'), 1)
```
3. Обработка на колоните с ревюта
1. Премахнете `Review_Total_Negative_Word_Counts`, `Review_Total_Positive_Word_Counts`, `Review_Date` и `days_since_review`
2. Запазете `Reviewer_Score`, `Negative_Review` и `Positive_Review` такива, каквито са,
3. Запазете `Tags` засега
- Ще направим допълнителни операции за филтриране на таговете в следващия раздел и след това таговете ще бъдат премахнати
4. Обработка на колоните с информация за ревюиращите
1. Премахнете `Total_Number_of_Reviews_Reviewer_Has_Given`
2. Запазете `Reviewer_Nationality`
### Колоната с тагове
Колоната `Tag` е проблематична, тъй като представлява списък (в текстов формат), съхраняван в колоната. За съжаление, редът и броят на подсекциите в тази колона не винаги са еднакви. Трудно е за човек да идентифицира правилните фрази, които са от интерес, защото има 515,000 реда и 1427 хотела, и всеки има леко различни опции, които ревюиращият може да избере. Тук NLP е полезен. Можете да сканирате текста и да намерите най-често срещаните фрази и да ги преброите.
За съжаление, не се интересуваме от единични думи, а от многословни фрази (например *Бизнес пътуване*). Изпълнението на алгоритъм за честотно разпределение на многословни фрази върху толкова много данни (6762646 думи) може да отнеме изключително много време, но без да разгледате данните, изглежда, че това е необходим разход. Тук идва полезността на изследователския анализ на данни, защото сте видели пример на таговете като `[' Business trip ', ' Solo traveler ', ' Single Room ', ' Stayed 5 nights ', ' Submitted from a mobile device ']`, можете да започнете да се питате дали е възможно значително да намалите обработката, която трябва да направите. За щастие, това е възможно - но първо трябва да следвате няколко стъпки, за да установите кои тагове са от интерес.
### Филтриране на таговете
Запомнете, че целта на набора от данни е да добавите настроения и колони, които ще ви помогнат да изберете най-добрия хотел (за себе си или може би за клиент, който ви е възложил да създадете бот за препоръка на хотели). Трябва да се запитате дали таговете са полезни или не в крайния набор от данни. Ето едно тълкуване (ако ви е нужен наборът от данни за други цели, различни тагове може да останат/да бъдат премахнати):
1. Типът на пътуването е релевантен и трябва да остане
2. Типът на групата гости е важен и трябва да остане
3. Типът на стаята, апартамента или студиото, в които гостът е отседнал, е нерелевантен (всички хотели имат основно едни и същи стаи)
4. Устройството, от което е изпратено ревюто, е нерелевантно
5. Броят на нощувките, за които ревюиращият е отседнал, *може* да бъде релевантен, ако свържете по-дългите престои с харесването на хотела, но това е малко вероятно и вероятно нерелевантно
В обобщение, **запазете 2 вида тагове и премахнете останалите**.
Първо, не искате да броите таговете, докато не са в по-добър формат, което означава премахване на квадратните скоби и кавичките. Можете да направите това по няколко начина, но искате най-бързия, тъй като обработката на много данни може да отнеме много време. За щастие, pandas има лесен начин за изпълнение на всяка от тези стъпки.
```Python
# Remove opening and closing brackets
df.Tags = df.Tags.str.strip("[']")
# remove all quotes too
df.Tags = df.Tags.str.replace(" ', '", ",", regex = False)
```
Всеки таг става нещо като: `Business trip, Solo traveler, Single Room, Stayed 5 nights, Submitted from a mobile device`.
След това откриваме проблем. Някои ревюта или редове имат 5 колони, други 3, трети 6. Това е резултат от начина, по който е създаден наборът от данни, и е трудно за поправяне. Искате да получите честотен брой на всяка фраза, но те са в различен ред във всяко ревю, така че броят може да е неточен, а хотел може да не получи таг, който заслужава.
Вместо това ще използвате различния ред в наша полза, защото всеки таг е многословен, но също така е разделен със запетая! Най-простият начин да направите това е да създадете 6 временни колони, като всеки таг се поставя в колоната, съответстваща на неговия ред в тага. След това можете да обедините 6-те колони в една голяма колона и да изпълните метода `value_counts()` върху получената колона. При отпечатване ще видите, че има 2428 уникални тага. Ето малък пример:
| Tag | Count |
| ------------------------------ | ------ |
| Leisure trip | 417778 |
| Submitted from a mobile device | 307640 |
| Couple | 252294 |
| Stayed 1 night | 193645 |
| Stayed 2 nights | 133937 |
| Solo traveler | 108545 |
| Stayed 3 nights | 95821 |
| Business trip | 82939 |
| Group | 65392 |
| Family with young children | 61015 |
| Stayed 4 nights | 47817 |
| Double Room | 35207 |
| Standard Double Room | 32248 |
| Superior Double Room | 31393 |
| Family with older children | 26349 |
| Deluxe Double Room | 24823 |
| Double or Twin Room | 22393 |
| Stayed 5 nights | 20845 |
| Standard Double or Twin Room | 17483 |
| Classic Double Room | 16989 |
| Superior Double or Twin Room | 13570 |
| 2 rooms | 12393 |
Някои от често срещаните тагове като `Submitted from a mobile device` не са полезни за нас, така че може да е умно да ги премахнете преди преброяване на честотата на фразите, но това е толкова бърза операция, че можете да ги оставите и просто да ги игнорирате.
### Премахване на таговете за продължителност на престоя
Премахването на тези тагове е стъпка 1, което леко намалява общия брой тагове, които трябва да бъдат разгледани. Обърнете внимание, че не ги премахвате от набора от данни, а просто избирате да ги премахнете от разглеждане като стойности за броене/запазване в набора от данни с ревюта.
| Length of stay | Count |
| ---------------- | ------ |
| Stayed 1 night | 193645 |
| Stayed 2 nights | 133937 |
| Stayed 3 nights | 95821 |
| Stayed 4 nights | 47817 |
| Stayed 5 nights | 20845 |
| Stayed 6 nights | 9776 |
| Stayed 7 nights | 7399 |
| Stayed 8 nights | 2502 |
| Stayed 9 nights | 1293 |
| ... | ... |
Има огромно разнообразие от стаи, апартаменти, студиа, апартаменти и т.н. Всички те означават приблизително едно и също и не са релевантни за вас, така че ги премахнете от разглеждане.
| Type of room | Count |
| ----------------------------- | ----- |
| Double Room | 35207 |
| Standard Double Room | 32248 |
| Superior Double Room | 31393 |
| Deluxe Double Room | 24823 |
| Double or Twin Room | 22393 |
| Standard Double or Twin Room | 17483 |
| Classic Double Room | 16989 |
| Superior Double or Twin Room | 13570 |
Накрая, и това е приятно (защото не отне много обработка), ще останете със следните *полезни* тагове:
| Tag | Count |
| --------------------------------------------- | ------ |
| Leisure trip | 417778 |
| Couple | 252294 |
| Solo traveler | 108545 |
| Business trip | 82939 |
| Group (combined with Travellers with friends) | 67535 |
| Family with young children | 61015 |
| Family with older children | 26349 |
| With a pet | 1405 |
Може да се твърди, че `Travellers with friends` е същото като `Group` повече или по-малко, и би било справедливо да комбинирате двете, както е показано по-горе. Кодът за идентифициране на правилните тагове е [в notebook-а за тагове](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb).
Последната стъпка е да създадете нови колони за всеки от тези тагове. След това, за всеки ред с ревю, ако колоната `Tag` съвпада с една от новите колони, добавете 1, ако не, добавете 0. Крайният резултат ще бъде броят на ревюиращите, които са избрали този хотел (в агрегат) за, например, бизнес срещу свободно време, или за да доведат домашен любимец, и това е полезна информация при препоръчване на хотел.
```python
# Process the Tags into new columns
# The file Hotel_Reviews_Tags.py, identifies the most important tags
# Leisure trip, Couple, Solo traveler, Business trip, Group combined with Travelers with friends,
# Family with young children, Family with older children, With a pet
df["Leisure_trip"] = df.Tags.apply(lambda tag: 1 if "Leisure trip" in tag else 0)
df["Couple"] = df.Tags.apply(lambda tag: 1 if "Couple" in tag else 0)
df["Solo_traveler"] = df.Tags.apply(lambda tag: 1 if "Solo traveler" in tag else 0)
df["Business_trip"] = df.Tags.apply(lambda tag: 1 if "Business trip" in tag else 0)
df["Group"] = df.Tags.apply(lambda tag: 1 if "Group" in tag or "Travelers with friends" in tag else 0)
df["Family_with_young_children"] = df.Tags.apply(lambda tag: 1 if "Family with young children" in tag else 0)
df["Family_with_older_children"] = df.Tags.apply(lambda tag: 1 if "Family with older children" in tag else 0)
df["With_a_pet"] = df.Tags.apply(lambda tag: 1 if "With a pet" in tag else 0)
```
### Запазете файла си
Накрая, запазете набора от данни в сегашния му вид с ново име.
```python
df.drop(["Review_Total_Negative_Word_Counts", "Review_Total_Positive_Word_Counts", "days_since_review", "Total_Number_of_Reviews_Reviewer_Has_Given"], axis = 1, inplace=True)
# Saving new data file with calculated columns
print("Saving results to Hotel_Reviews_Filtered.csv")
df.to_csv(r'../data/Hotel_Reviews_Filtered.csv', index = False)
```
## Операции за анализ на настроения
В този последен раздел ще приложите анализ на настроения към колоните с ревюта и ще запазите резултатите в набора от данни.
## Упражнение: заредете и запазете филтрираните данни
Обърнете внимание, че сега зареждате филтрирания набор от данни, който беше запазен в предишния раздел, **а не** оригиналния набор от данни.
```python
import time
import pandas as pd
import nltk as nltk
from nltk.corpus import stopwords
from nltk.sentiment.vader import SentimentIntensityAnalyzer
nltk.download('vader_lexicon')
# Load the filtered hotel reviews from CSV
df = pd.read_csv('../../data/Hotel_Reviews_Filtered.csv')
# You code will be added here
# Finally remember to save the hotel reviews with new NLP data added
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r'../data/Hotel_Reviews_NLP.csv', index = False)
```
### Премахване на стоп думи
Ако изпълните анализ на настроения върху колоните с негативни и позитивни ревюта, това може да отнеме много време. Тествано на мощен лаптоп с бърз процесор, отнема 12 - 14 минути в зависимост от използваната библиотека за анализ на настроения. Това е (относително) дълго време, така че си струва да се изследва дали това може да бъде ускорено.
Премахването на стоп думи, или често срещани английски думи, които не променят настроението на изречението, е първата стъпка. Чрез премахването им, анализът на настроения трябва да се изпълнява по-бързо, но не и по-малко точно (тъй като стоп думите не влияят на настроението, но забавят анализа).
Най-дългото негативно ревю беше 395 думи, но след премахването на стоп думите, то е 195 думи.
Премахването на стоп думите също е бърза операция, премахването на стоп думите от 2 колони с ревюта върху 515,000 реда отне 3.3 секунди на тестовото устройство. Това може да отнеме малко повече или по-малко време за вас в зависимост от скоростта на процесора, RAM, дали имате SSD или не, и някои други фактори. Относителната краткост на операцията означава, че ако подобрява времето за анализ на настроения, тогава си струва да се направи.
```python
from nltk.corpus import stopwords
# Load the hotel reviews from CSV
df = pd.read_csv("../../data/Hotel_Reviews_Filtered.csv")
# Remove stop words - can be slow for a lot of text!
# Ryan Han (ryanxjhan on Kaggle) has a great post measuring performance of different stop words removal approaches
# https://www.kaggle.com/ryanxjhan/fast-stop-words-removal # using the approach that Ryan recommends
start = time.time()
cache = set(stopwords.words("english"))
def remove_stopwords(review):
text = " ".join([word for word in review.split() if word not in cache])
return text
# Remove the stop words from both columns
df.Negative_Review = df.Negative_Review.apply(remove_stopwords)
df.Positive_Review = df.Positive_Review.apply(remove_stopwords)
```
### Изпълнение на анализ на настроения
Сега трябва да изчислите анализа на настроения както за колоните с негативни, така и за позитивни ревюта, и да запазите резултата в 2 нови колони. Тестът на настроението ще бъде да го сравните с оценката на ревюиращия за същото ревю. Например, ако анализът на настроения смята, че негативното ревю има настроение 1 (изключително позитивно настроение) и позитивното ревю има настроение 1, но ревюиращият е дал на хотела най-ниската възможна оценка, тогава или текстът на ревюто не съответства на оценката, или анализаторът на настроения не е успял да разпознае настроението правилно. Трябва да очаквате някои оценки на настроенията да бъдат напълно грешни, и често това ще бъде обяснимо, например ревюто може да бъде изключително саркастично "Разбира се, ОБОЖАВАХ да спя в стая без отопление" и анализаторът на настроения смята, че това е позитивно настроение, въпреки че човек, който го чете, би разбрал, че това е сарказъм.
NLTK предоставя различни анализатори на настроения, с които можете да експериментирате, като ги замените и проверите дали анализът на настроенията е по-точен или не. Тук се използва анализът на настроенията VADER.
> Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, юни 2014.
```python
from nltk.sentiment.vader import SentimentIntensityAnalyzer
# Create the vader sentiment analyser (there are others in NLTK you can try too)
vader_sentiment = SentimentIntensityAnalyzer()
# Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for Sentiment Analysis of Social Media Text. Eighth International Conference on Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
# There are 3 possibilities of input for a review:
# It could be "No Negative", in which case, return 0
# It could be "No Positive", in which case, return 0
# It could be a review, in which case calculate the sentiment
def calc_sentiment(review):
if review == "No Negative" or review == "No Positive":
return 0
return vader_sentiment.polarity_scores(review)["compound"]
```
По-късно във вашата програма, когато сте готови да изчислите настроението, можете да го приложите към всяко ревю, както следва:
```python
# Add a negative sentiment and positive sentiment column
print("Calculating sentiment columns for both positive and negative reviews")
start = time.time()
df["Negative_Sentiment"] = df.Negative_Review.apply(calc_sentiment)
df["Positive_Sentiment"] = df.Positive_Review.apply(calc_sentiment)
end = time.time()
print("Calculating sentiment took " + str(round(end - start, 2)) + " seconds")
```
Това отнема приблизително 120 секунди на моя компютър, но времето може да варира в зависимост от компютъра. Ако искате да отпечатате резултатите и да проверите дали настроението съответства на ревюто:
```python
df = df.sort_values(by=["Negative_Sentiment"], ascending=True)
print(df[["Negative_Review", "Negative_Sentiment"]])
df = df.sort_values(by=["Positive_Sentiment"], ascending=True)
print(df[["Positive_Review", "Positive_Sentiment"]])
```
Последното нещо, което трябва да направите с файла, преди да го използвате в предизвикателството, е да го запазите! Също така трябва да обмислите пренареждането на всички нови колони, за да бъдат по-удобни за работа (за човек това е козметична промяна).
```python
# Reorder the columns (This is cosmetic, but to make it easier to explore the data later)
df = df.reindex(["Hotel_Name", "Hotel_Address", "Total_Number_of_Reviews", "Average_Score", "Reviewer_Score", "Negative_Sentiment", "Positive_Sentiment", "Reviewer_Nationality", "Leisure_trip", "Couple", "Solo_traveler", "Business_trip", "Group", "Family_with_young_children", "Family_with_older_children", "With_a_pet", "Negative_Review", "Positive_Review"], axis=1)
print("Saving results to Hotel_Reviews_NLP.csv")
df.to_csv(r"../data/Hotel_Reviews_NLP.csv", index = False)
```
Трябва да изпълните целия код от [анализиращия ноутбук](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb) (след като сте изпълнили [филтриращия ноутбук](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), за да генерирате файла Hotel_Reviews_Filtered.csv).
За преглед, стъпките са:
1. Оригиналният файл с данни **Hotel_Reviews.csv** е разгледан в предишния урок с [ноутбука за изследване](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/4-Hotel-Reviews-1/solution/notebook.ipynb)
2. Hotel_Reviews.csv е филтриран чрез [филтриращия ноутбук](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/1-notebook.ipynb), което води до **Hotel_Reviews_Filtered.csv**
3. Hotel_Reviews_Filtered.csv е обработен чрез [ноутбука за анализ на настроения](https://github.com/microsoft/ML-For-Beginners/blob/main/6-NLP/5-Hotel-Reviews-2/solution/3-notebook.ipynb), което води до **Hotel_Reviews_NLP.csv**
4. Използвайте Hotel_Reviews_NLP.csv в предизвикателството за NLP по-долу
### Заключение
Когато започнахте, имахте набор от данни с колони и информация, но не всичко можеше да бъде проверено или използвано. Разгледахте данните, филтрирахте ненужното, преобразувахте таговете в нещо полезно, изчислихте свои собствени средни стойности, добавихте колони за настроения и, надявам се, научихте интересни неща за обработката на естествен текст.
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Предизвикателство
Сега, когато вашият набор от данни е анализиран за настроения, опитайте да използвате стратегии, които сте научили в този курс (например клъстериране), за да определите модели, свързани с настроенията.
## Преглед и самостоятелно обучение
Вземете [този модул в Learn](https://docs.microsoft.com/en-us/learn/modules/classify-user-feedback-with-the-text-analytics-api/?WT.mc_id=academic-77952-leestott), за да научите повече и да използвате различни инструменти за изследване на настроения в текст.
## Задача
[Опитайте с различен набор от данни](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "daf144daa552da6a7d442aff6f3e77d8",
"translation_date": "2025-09-05T01:47:08+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/assignment.md",
"language_code": "bg"
}
-->
# Опитайте с различен набор от данни
## Инструкции
След като научихте как да използвате NLTK за определяне на настроението на текст, опитайте с различен набор от данни. Вероятно ще трябва да обработите данните, така че създайте тетрадка и документирайте процеса си на мислене. Какво откривате?
## Критерии за оценка
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ----------------------- |
| | Представени са пълна тетрадка и набор от данни с добре документирани клетки, обясняващи как се определя настроението | Тетрадката липсва добри обяснения | Тетрадката е с недостатъци |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-05T01:47:56+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-05T01:47:35+00:00",
"source_file": "6-NLP/5-Hotel-Reviews-2/solution/R/README.md",
"language_code": "bg"
}
-->
това е временно запълващо място
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,38 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1eb379dc2d0c9940b320732d16083778",
"translation_date": "2025-09-05T01:19:51+00:00",
"source_file": "6-NLP/README.md",
"language_code": "bg"
}
-->
# Започване с обработка на естествен език
Обработката на естествен език (NLP) е способността на компютърна програма да разбира човешкия език, както се говори и пише наричан естествен език. Това е компонент на изкуствения интелект (AI). NLP съществува повече от 50 години и има корени в областта на лингвистиката. Цялата област е насочена към това да помогне на машините да разбират и обработват човешкия език. Това може да се използва за изпълнение на задачи като проверка на правописа или машинен превод. NLP има разнообразни приложения в реалния свят в редица области, включително медицински изследвания, търсачки и бизнес анализи.
## Регионална тема: Европейски езици и литература и романтични хотели в Европа ❤️
В този раздел от учебната програма ще се запознаете с едно от най-разпространените приложения на машинното обучение: обработката на естествен език (NLP). Произлизаща от компютърната лингвистика, тази категория на изкуствения интелект е мостът между хората и машините чрез гласова или текстова комуникация.
В тези уроци ще научим основите на NLP, като изградим малки разговорни ботове, за да разберем как машинното обучение помага тези разговори да стават все по-'умни'. Ще се върнете назад във времето, разговаряйки с Елизабет Бенет и г-н Дарси от класическия роман на Джейн Остин, **Гордост и предразсъдъци**, публикуван през 1813 г. След това ще задълбочите знанията си, като научите за анализ на настроения чрез ревюта на хотели в Европа.
![Книга "Гордост и предразсъдъци" и чай](../../../6-NLP/images/p&p.jpg)
> Снимка от <a href="https://unsplash.com/@elaineh?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Elaine Howlin</a> на <a href="https://unsplash.com/s/photos/pride-and-prejudice?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a>
## Уроци
1. [Въведение в обработката на естествен език](1-Introduction-to-NLP/README.md)
2. [Често срещани задачи и техники в NLP](2-Tasks/README.md)
3. [Превод и анализ на настроения с машинно обучение](3-Translation-Sentiment/README.md)
4. [Подготовка на вашите данни](4-Hotel-Reviews-1/README.md)
5. [NLTK за анализ на настроения](5-Hotel-Reviews-2/README.md)
## Кредити
Тези уроци за обработка на естествен език са написани с ☕ от [Stephen Howell](https://twitter.com/Howell_MSFT)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "ee0670655c89e4719319764afb113624",
"translation_date": "2025-09-05T01:33:17+00:00",
"source_file": "6-NLP/data/README.md",
"language_code": "bg"
}
-->
Изтеглете данните за отзивите за хотела в тази папка.
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,199 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "662b509c39eee205687726636d0a8455",
"translation_date": "2025-09-04T23:49:41+00:00",
"source_file": "7-TimeSeries/1-Introduction/README.md",
"language_code": "bg"
}
-->
# Въведение в прогнозиране на времеви серии
![Обобщение на времеви серии в скица](../../../../sketchnotes/ml-timeseries.png)
> Скица от [Tomomi Imura](https://www.twitter.com/girlie_mac)
В този урок и следващия ще научите малко за прогнозиране на времеви серии, интересна и ценна част от репертоара на ML учените, която е малко по-малко известна от други теми. Прогнозирането на времеви серии е като „кристално кълбо“: въз основа на миналото представяне на променлива, като например цена, можете да предвидите нейната бъдеща потенциална стойност.
[![Въведение в прогнозиране на времеви серии](https://img.youtube.com/vi/cBojo1hsHiI/0.jpg)](https://youtu.be/cBojo1hsHiI "Въведение в прогнозиране на времеви серии")
> 🎥 Кликнете върху изображението по-горе за видео за прогнозиране на времеви серии
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
Това е полезна и интересна област с реална стойност за бизнеса, предвид директното ѝ приложение към проблеми като ценообразуване, инвентаризация и въпроси, свързани с веригата на доставки. Въпреки че техниките за дълбоко обучение започнаха да се използват за получаване на повече прозрения за по-добро прогнозиране на бъдещото представяне, прогнозиране на времеви серии остава област, която е силно информирана от класическите ML техники.
> Полезната учебна програма за времеви серии на Penn State може да бъде намерена [тук](https://online.stat.psu.edu/stat510/lesson/1)
## Въведение
Да предположим, че управлявате масив от интелигентни паркинг метри, които предоставят данни за това колко често се използват и за колко време през определен период.
> Какво ако можете да предвидите, въз основа на миналото представяне на метъра, неговата бъдеща стойност според законите на търсенето и предлагането?
Точното прогнозиране кога да действате, за да постигнете целта си, е предизвикателство, което може да бъде решено чрез прогнозиране на времеви серии. Това може да не направи хората щастливи, ако бъдат таксувани повече в натоварени времена, когато търсят паркинг място, но със сигурност би било начин за генериране на приходи за почистване на улиците!
Нека разгледаме някои от типовете алгоритми за времеви серии и започнем с тетрадка, за да почистим и подготвим данни. Данните, които ще анализирате, са взети от състезанието за прогнозиране GEFCom2014. Те се състоят от 3 години почасови стойности за електрическо натоварване и температура между 2012 и 2014. Въз основа на историческите модели на електрическо натоварване и температура, можете да предвидите бъдещи стойности на електрическо натоварване.
В този пример ще научите как да прогнозирате една стъпка напред, използвайки само исторически данни за натоварване. Преди да започнете обаче, е полезно да разберете какво се случва зад кулисите.
## Някои дефиниции
Когато срещнете термина „времеви серии“, трябва да разберете неговото използване в няколко различни контекста.
🎓 **Времеви серии**
В математиката „времеви серии са поредица от точки с данни, индексирани (или изброени, или графично представени) в хронологичен ред. Най-често времеви серии са последователност, взета в последователни равномерно разпределени точки във времето.“ Пример за времеви серии е дневната затваряща стойност на [Dow Jones Industrial Average](https://wikipedia.org/wiki/Time_series). Използването на графики на времеви серии и статистическо моделиране често се среща в обработка на сигнали, прогнозиране на времето, предсказване на земетресения и други области, където събитията се случват и точките с данни могат да бъдат графично представени във времето.
🎓 **Анализ на времеви серии**
Анализът на времеви серии е анализът на гореспоменатите данни за времеви серии. Данните за времеви серии могат да приемат различни форми, включително „прекъснати времеви серии“, които откриват модели в еволюцията на времеви серии преди и след прекъсващо събитие. Видът анализ, необходим за времевите серии, зависи от естеството на данните. Самите данни за времеви серии могат да приемат формата на поредица от числа или символи.
Анализът, който трябва да се извърши, използва разнообразие от методи, включително честотен домейн и времеви домейн, линейни и нелинейни, и други. [Научете повече](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) за многото начини за анализиране на този тип данни.
🎓 **Прогнозиране на времеви серии**
Прогнозирането на времеви серии е използването на модел за предсказване на бъдещи стойности въз основа на модели, показани от предварително събрани данни, както са се случили в миналото. Въпреки че е възможно да се използват регресионни модели за изследване на данни за времеви серии, с времеви индекси като x променливи на графика, такива данни най-добре се анализират с помощта на специални типове модели.
Данните за времеви серии са списък от подредени наблюдения, за разлика от данни, които могат да бъдат анализирани чрез линейна регресия. Най-често срещаният модел е ARIMA, акроним, който означава „Автокорелативен Интегриран Движещ Среден“.
[ARIMA модели](https://online.stat.psu.edu/stat510/lesson/1/1.1) „свързват настоящата стойност на серията с минали стойности и минали грешки в прогнозите.“ Те са най-подходящи за анализиране на данни във времеви домейн, където данните са подредени във времето.
> Съществуват няколко типа ARIMA модели, за които можете да научите [тук](https://people.duke.edu/~rnau/411arim.htm) и които ще разгледате в следващия урок.
В следващия урок ще изградите ARIMA модел, използвайки [Унивариантни времеви серии](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), които се фокусират върху една променлива, която променя стойността си във времето. Пример за този тип данни е [този набор от данни](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm), който записва месечната концентрация на CO2 в обсерваторията Mauna Loa:
| CO2 | YearMonth | Year | Month |
| :----: | :-------: | :---: | :---: |
| 330.62 | 1975.04 | 1975 | 1 |
| 331.40 | 1975.13 | 1975 | 2 |
| 331.87 | 1975.21 | 1975 | 3 |
| 333.18 | 1975.29 | 1975 | 4 |
| 333.92 | 1975.38 | 1975 | 5 |
| 333.43 | 1975.46 | 1975 | 6 |
| 331.85 | 1975.54 | 1975 | 7 |
| 330.01 | 1975.63 | 1975 | 8 |
| 328.51 | 1975.71 | 1975 | 9 |
| 328.41 | 1975.79 | 1975 | 10 |
| 329.25 | 1975.88 | 1975 | 11 |
| 330.97 | 1975.96 | 1975 | 12 |
✅ Идентифицирайте променливата, която се променя във времето в този набор от данни.
## Характеристики на данните за времеви серии, които трябва да се вземат предвид
Когато разглеждате данни за времеви серии, може да забележите, че те имат [определени характеристики](https://online.stat.psu.edu/stat510/lesson/1/1.1), които трябва да вземете предвид и да смекчите, за да разберете по-добре техните модели. Ако разглеждате данните за времеви серии като потенциално предоставящи „сигнал“, който искате да анализирате, тези характеристики могат да се разглеждат като „шум“. Често ще трябва да намалите този „шум“, като компенсирате някои от тези характеристики с помощта на статистически техники.
Ето някои концепции, които трябва да знаете, за да работите с времеви серии:
🎓 **Тенденции**
Тенденциите се определят като измерими увеличения и намаления във времето. [Прочетете повече](https://machinelearningmastery.com/time-series-trends-in-python). В контекста на времеви серии става въпрос за това как да използвате и, ако е необходимо, да премахнете тенденциите от вашите времеви серии.
🎓 **[Сезонност](https://machinelearningmastery.com/time-series-seasonality-with-python/)**
Сезонността се определя като периодични колебания, като например празнични пикове, които могат да повлияят на продажбите. [Разгледайте](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) как различни типове графики показват сезонността в данните.
🎓 **Аномалии**
Аномалиите са далеч от стандартната вариация на данните.
🎓 **Дългосрочен цикъл**
Независимо от сезонността, данните могат да показват дългосрочен цикъл, като например икономически спад, който продължава повече от година.
🎓 **Постоянна вариация**
С течение на времето някои данни показват постоянни колебания, като например енергийно потребление през деня и нощта.
🎓 **Резки промени**
Данните могат да показват резка промяна, която може да изисква допълнителен анализ. Например, резкото затваряне на бизнеси поради COVID предизвика промени в данните.
✅ Ето [примерен график на времеви серии](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python), показващ дневните разходи за валута в играта през няколко години. Можете ли да идентифицирате някоя от изброените характеристики в тези данни?
![Разходи за валута в играта](../../../../7-TimeSeries/1-Introduction/images/currency.png)
## Упражнение - започване с данни за потребление на енергия
Нека започнем с изграждането на модел за времеви серии, за да прогнозираме бъдещо потребление на енергия въз основа на миналото потребление.
> Данните в този пример са взети от състезанието за прогнозиране GEFCom2014. Те се състоят от 3 години почасови стойности за електрическо натоварване и температура между 2012 и 2014.
>
> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli и Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016.
1. В папката `working` на този урок, отворете файла _notebook.ipynb_. Започнете с добавяне на библиотеки, които ще ви помогнат да заредите и визуализирате данни:
```python
import os
import matplotlib.pyplot as plt
from common.utils import load_data
%matplotlib inline
```
Забележете, че използвате файловете от включената папка `common`, която настройва вашата среда и обработва изтеглянето на данните.
2. След това, разгледайте данните като dataframe, като извикате `load_data()` и `head()`:
```python
data_dir = './data'
energy = load_data(data_dir)[['load']]
energy.head()
```
Можете да видите, че има две колони, представляващи дата и натоварване:
| | load |
| :-----------------: | :----: |
| 2012-01-01 00:00:00 | 2698.0 |
| 2012-01-01 01:00:00 | 2558.0 |
| 2012-01-01 02:00:00 | 2444.0 |
| 2012-01-01 03:00:00 | 2402.0 |
| 2012-01-01 04:00:00 | 2403.0 |
3. Сега, начертайте данните, като извикате `plot()`:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![графика на енергия](../../../../7-TimeSeries/1-Introduction/images/energy-plot.png)
4. Сега, начертайте първата седмица на юли 2014, като я предоставите като вход към `energy` в шаблона `[от дата]: [до дата]`:
```python
energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![юли](../../../../7-TimeSeries/1-Introduction/images/july-2014.png)
Прекрасна графика! Разгледайте тези графики и вижте дали можете да определите някоя от изброените характеристики. Какво можем да заключим, като визуализираме данните?
В следващия урок ще създадете ARIMA модел, за да направите прогнози.
---
## 🚀Предизвикателство
Направете списък на всички индустрии и области на изследване, които можете да си представите, че биха се възползвали от прогнозиране на времеви серии. Можете ли да си представите приложение на тези техники в изкуствата? В иконометрията? Екологията? Търговията на дребно? Индустрията? Финансите? Къде още?
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Въпреки че няма да ги разгледаме тук, невронните мрежи понякога се използват за подобряване на класическите методи за прогнозиране на времеви серии. Прочетете повече за тях [в тази статия](https://medium.com/microsoftazure/neural-networks-for-forecasting-financial-and-economic-time-series-6aca370ff412)
## Задание
[Визуализирайте още времеви серии](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "d1781b0b92568ea1d119d0a198b576b4",
"translation_date": "2025-09-04T23:52:37+00:00",
"source_file": "7-TimeSeries/1-Introduction/assignment.md",
"language_code": "bg"
}
-->
# Визуализирайте още времеви серии
## Инструкции
Започнахте да се запознавате с прогнозирането на времеви серии, като разгледахте типа данни, които изискват този специален модел. Визуализирахте някои данни, свързани с енергията. Сега потърсете други данни, които биха се възползвали от прогнозирането на времеви серии. Намерете три примера (опитайте [Kaggle](https://kaggle.com) и [Azure Open Datasets](https://azure.microsoft.com/en-us/services/open-datasets/catalog/?WT.mc_id=academic-77952-leestott)) и създайте тетрадка, за да ги визуализирате. Отбележете всякакви специални характеристики, които имат (сезонност, резки промени или други тенденции) в тетрадката.
## Рубрика
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ----------------------------------------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------------- |
| | Три набора от данни са визуализирани и обяснени в тетрадка | Два набора от данни са визуализирани и обяснени в тетрадка | Малко набори от данни са визуализирани или обяснени в тетрадка, или представените данни са недостатъчни |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-04T23:53:32+00:00",
"source_file": "7-TimeSeries/1-Introduction/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-04T23:53:11+00:00",
"source_file": "7-TimeSeries/1-Introduction/solution/R/README.md",
"language_code": "bg"
}
-->
това е временно запълващо място
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,407 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "917dbf890db71a322f306050cb284749",
"translation_date": "2025-09-04T23:44:51+00:00",
"source_file": "7-TimeSeries/2-ARIMA/README.md",
"language_code": "bg"
}
-->
# Прогнозиране на времеви редове с ARIMA
В предишния урок научихте малко за прогнозиране на времеви редове и заредихте набор от данни, показващ колебанията на електрическото натоварване за определен период от време.
[![Въведение в ARIMA](https://img.youtube.com/vi/IUSk-YDau10/0.jpg)](https://youtu.be/IUSk-YDau10 "Въведение в ARIMA")
> 🎥 Кликнете върху изображението по-горе за видео: Кратко въведение в моделите ARIMA. Примерът е направен в R, но концепциите са универсални.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Въведение
В този урок ще откриете специфичен начин за изграждане на модели с [ARIMA: *A*uto*R*egressive *I*ntegrated *M*oving *A*verage](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average). Моделите ARIMA са особено подходящи за данни, които показват [нестационарност](https://wikipedia.org/wiki/Stationary_process).
## Общи концепции
За да работите с ARIMA, трябва да знаете някои основни концепции:
- 🎓 **Стационарност**. В статистически контекст стационарността се отнася до данни, чието разпределение не се променя при изместване във времето. Нестационарните данни показват колебания, дължащи се на тенденции, които трябва да бъдат трансформирани, за да бъдат анализирани. Например сезонността може да въведе колебания в данните и може да бъде премахната чрез процес на "сезонно диференциране".
- 🎓 **[Диференциране](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average#Differencing)**. Диференцирането на данни, отново в статистически контекст, се отнася до процеса на трансформиране на нестационарни данни, за да станат стационарни чрез премахване на тяхната неконстантна тенденция. "Диференцирането премахва промените в нивото на времевия ред, елиминирайки тенденцията и сезонността и съответно стабилизирайки средната стойност на времевия ред." [Статия от Shixiong et al](https://arxiv.org/abs/1904.07632)
## ARIMA в контекста на времеви редове
Нека разгледаме частите на ARIMA, за да разберем по-добре как помага за моделиране на времеви редове и за правене на прогнози.
- **AR - Авторегресивен**. Авторегресивните модели, както подсказва името, гледат "назад" във времето, за да анализират предишни стойности в данните и да правят предположения за тях. Тези предишни стойности се наричат "лагове". Пример би бил данни, показващи месечни продажби на моливи. Общата стойност на продажбите за всеки месец би се считала за "еволюираща променлива" в набора от данни. Този модел се изгражда като "еволюиращата променлива от интерес се регресира върху собствените си лагови (т.е. предишни) стойности." [wikipedia](https://wikipedia.org/wiki/Autoregressive_integrated_moving_average)
- **I - Интегриран**. За разлика от подобните модели 'ARMA', 'I' в ARIMA се отнася до неговия *[интегриран](https://wikipedia.org/wiki/Order_of_integration)* аспект. Данните се "интегрират", когато се прилагат стъпки на диференциране, за да се елиминира нестационарността.
- **MA - Подвижна средна**. Аспектът на [подвижната средна](https://wikipedia.org/wiki/Moving-average_model) в този модел се отнася до изходната променлива, която се определя чрез наблюдение на текущите и миналите стойности на лаговете.
В крайна сметка: ARIMA се използва за създаване на модел, който да пасне възможно най-точно на специалната форма на данни от времеви редове.
## Упражнение - изграждане на ARIMA модел
Отворете папката [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/working) в този урок и намерете файла [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/2-ARIMA/working/notebook.ipynb).
1. Стартирайте notebook-а, за да заредите библиотеката `statsmodels` за Python; ще ви е необходима за ARIMA модели.
1. Заредете необходимите библиотеки.
1. Сега заредете още няколко библиотеки, полезни за визуализация на данни:
```python
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from pandas.plotting import autocorrelation_plot
from statsmodels.tsa.statespace.sarimax import SARIMAX
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
from IPython.display import Image
%matplotlib inline
pd.options.display.float_format = '{:,.2f}'.format
np.set_printoptions(precision=2)
warnings.filterwarnings("ignore") # specify to ignore warning messages
```
1. Заредете данните от файла `/data/energy.csv` в Pandas dataframe и ги разгледайте:
```python
energy = load_data('./data')[['load']]
energy.head(10)
```
1. Начертайте всички налични данни за енергия от януари 2012 до декември 2014. Не би трябвало да има изненади, тъй като видяхме тези данни в предишния урок:
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
Сега, нека изградим модел!
### Създаване на тренировъчни и тестови набори от данни
Сега данните ви са заредени, така че можете да ги разделите на тренировъчен и тестов набор. Ще обучите модела си върху тренировъчния набор. Както обикновено, след като моделът приключи обучението, ще оцените неговата точност, използвайки тестовия набор. Трябва да се уверите, че тестовият набор обхваща по-късен период от време спрямо тренировъчния набор, за да гарантирате, че моделът не получава информация от бъдещи времеви периоди.
1. Отделете двумесечен период от 1 септември до 31 октомври 2014 за тренировъчния набор. Тестовият набор ще включва двумесечния период от 1 ноември до 31 декември 2014:
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
Тъй като тези данни отразяват дневната консумация на енергия, има силен сезонен модел, но консумацията е най-сходна с консумацията през по-скорошни дни.
1. Визуализирайте разликите:
```python
energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
.join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
.plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![тренировъчни и тестови данни](../../../../7-TimeSeries/2-ARIMA/images/train-test.png)
Следователно, използването на сравнително малък времеви прозорец за обучение на данните би трябвало да е достатъчно.
> Забележка: Тъй като функцията, която използваме за настройка на ARIMA модела, използва вътрешна валидация по време на настройката, ще пропуснем валидационните данни.
### Подготовка на данните за обучение
Сега трябва да подготвите данните за обучение, като извършите филтриране и скалиране на данните. Филтрирайте набора от данни, за да включва само необходимите времеви периоди и колони, и скалирайте, за да гарантирате, че данните са проектирани в интервала 0,1.
1. Филтрирайте оригиналния набор от данни, за да включва само споменатите времеви периоди за всеки набор и само необходимата колона 'load' плюс датата:
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
test = energy.copy()[energy.index >= test_start_dt][['load']]
print('Training data shape: ', train.shape)
print('Test data shape: ', test.shape)
```
Можете да видите формата на данните:
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
1. Скалирайте данните, за да бъдат в диапазона (0, 1).
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
train.head(10)
```
1. Визуализирайте оригиналните спрямо скалираните данни:
```python
energy[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12)
train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12)
plt.show()
```
![оригинални](../../../../7-TimeSeries/2-ARIMA/images/original.png)
> Оригиналните данни
![скалирани](../../../../7-TimeSeries/2-ARIMA/images/scaled.png)
> Скалираните данни
1. Сега, след като сте калибрирали скалираните данни, можете да скалирате тестовите данни:
```python
test['load'] = scaler.transform(test)
test.head()
```
### Имплементиране на ARIMA
Време е да имплементирате ARIMA! Сега ще използвате библиотеката `statsmodels`, която инсталирахте по-рано.
Сега трябва да следвате няколко стъпки:
1. Дефинирайте модела, като извикате `SARIMAX()` и подадете параметрите на модела: параметрите p, d и q, както и параметрите P, D и Q.
2. Подгответе модела за тренировъчните данни, като извикате функцията fit().
3. Направете прогнози, като извикате функцията `forecast()` и зададете броя на стъпките (хоризонта), които да прогнозирате.
> 🎓 Какво означават всички тези параметри? В ARIMA модел има 3 параметъра, които се използват за моделиране на основните аспекти на времеви редове: сезонност, тенденция и шум. Тези параметри са:
`p`: параметър, свързан с авторегресивния аспект на модела, който включва *минали* стойности.
`d`: параметър, свързан с интегрирания аспект на модела, който влияе върху количеството *диференциране* (🎓 помните ли диференцирането 👆?) за прилагане към времевия ред.
`q`: параметър, свързан с аспекта на подвижната средна в модела.
> Забележка: Ако вашите данни имат сезонен аспект - какъвто е случаят тук - използваме сезонен ARIMA модел (SARIMA). В този случай трябва да използвате друг набор от параметри: `P`, `D` и `Q`, които описват същите асоциации като `p`, `d` и `q`, но съответстват на сезонните компоненти на модела.
1. Започнете, като зададете предпочитаната стойност за хоризонта. Нека опитаме 3 часа:
```python
# Specify the number of steps to forecast ahead
HORIZON = 3
print('Forecasting horizon:', HORIZON, 'hours')
```
Изборът на най-добрите стойности за параметрите на ARIMA модела може да бъде предизвикателство, тъй като е донякъде субективен и отнема време. Може да обмислите използването на функцията `auto_arima()` от библиотеката [`pyramid`](https://alkaline-ml.com/pmdarima/0.9.0/modules/generated/pyramid.arima.auto_arima.html).
1. Засега опитайте някои ръчни селекции, за да намерите добър модел.
```python
order = (4, 1, 0)
seasonal_order = (1, 1, 0, 24)
model = SARIMAX(endog=train, order=order, seasonal_order=seasonal_order)
results = model.fit()
print(results.summary())
```
Таблица с резултати се отпечатва.
Създадохте първия си модел! Сега трябва да намерим начин да го оценим.
### Оценка на модела
За да оцените модела си, можете да извършите така наречената `walk forward` валидация. На практика, моделите за времеви редове се преобучават всеки път, когато се появят нови данни. Това позволява на модела да направи най-добрата прогноза на всяка стъпка.
Започвайки от началото на времевия ред, използвайки тази техника, обучете модела върху тренировъчния набор от данни. След това направете прогноза за следващата времева стъпка. Прогнозата се оценява спрямо известната стойност. Тренировъчният набор след това се разширява, за да включва известната стойност, и процесът се повтаря.
> Забележка: Трябва да запазите прозореца на тренировъчния набор фиксиран за по-ефективно обучение, така че всеки път, когато добавите ново наблюдение към тренировъчния набор, да премахнете наблюдението от началото на набора.
Този процес предоставя по-устойчива оценка за това как моделът ще се представи на практика. Въпреки това, той идва с изчислителната цена на създаването на толкова много модели. Това е приемливо, ако данните са малки или ако моделът е прост, но може да бъде проблем при мащаб.
Walk-forward валидацията е златният стандарт за оценка на модели за времеви редове и се препоръчва за вашите собствени проекти.
1. Първо, създайте тестова точка за данни за всяка стъпка на HORIZON.
```python
test_shifted = test.copy()
for t in range(1, HORIZON+1):
test_shifted['load+'+str(t)] = test_shifted['load'].shift(-t, freq='H')
test_shifted = test_shifted.dropna(how='any')
test_shifted.head(5)
```
| | | load | load+1 | load+2 |
| ---------- | -------- | ---- | ------ | ------ |
| 2014-12-30 | 00:00:00 | 0.33 | 0.29 | 0.27 |
| 2014-12-30 | 01:00:00 | 0.29 | 0.27 | 0.27 |
| 2014-12-30 | 02:00:00 | 0.27 | 0.27 | 0.30 |
| 2014-12-30 | 03:00:00 | 0.27 | 0.30 | 0.41 |
| 2014-12-30 | 04:00:00 | 0.30 | 0.41 | 0.57 |
Данните се изместват хоризонтално според точката на хоризонта.
1. Направете прогнози за тестовите данни, използвайки този подход с плъзгащ прозорец в цикъл с дължина на тестовите данни:
```python
%%time
training_window = 720 # dedicate 30 days (720 hours) for training
train_ts = train['load']
test_ts = test_shifted
history = [x for x in train_ts]
history = history[(-training_window):]
predictions = list()
order = (2, 1, 0)
seasonal_order = (1, 1, 0, 24)
for t in range(test_ts.shape[0]):
model = SARIMAX(endog=history, order=order, seasonal_order=seasonal_order)
model_fit = model.fit()
yhat = model_fit.forecast(steps = HORIZON)
predictions.append(yhat)
obs = list(test_ts.iloc[t])
# move the training window
history.append(obs[0])
history.pop(0)
print(test_ts.index[t])
print(t+1, ': predicted =', yhat, 'expected =', obs)
```
Можете да наблюдавате как се извършва обучението:
```output
2014-12-30 00:00:00
1 : predicted = [0.32 0.29 0.28] expected = [0.32945389435989236, 0.2900626678603402, 0.2739480752014323]
2014-12-30 01:00:00
2 : predicted = [0.3 0.29 0.3 ] expected = [0.2900626678603402, 0.2739480752014323, 0.26812891674127126]
2014-12-30 02:00:00
3 : predicted = [0.27 0.28 0.32] expected = [0.2739480752014323, 0.26812891674127126, 0.3025962399283795]
```
1. Сравнете прогнозите с действителното натоварване:
```python
eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)])
eval_df['timestamp'] = test.index[0:len(test.index)-HORIZON+1]
eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h')
eval_df['actual'] = np.array(np.transpose(test_ts)).ravel()
eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']])
eval_df.head()
```
Резултат
| | | timestamp | h | prediction | actual |
| --- | ---------- | --------- | --- | ---------- | -------- |
| 0 | 2014-12-30 | 00:00:00 | t+1 | 3,008.74 | 3,023.00 |
| 1 | 2014-12-30 | 01:00:00 | t+1 | 2,955.53 | 2,935.00 |
| 2 | 2014-12-30 | 02:00:00 | t+1 | 2,900.17 | 2,899.00 |
| 3 | 2014-12-30 | 03:00:00 | t+1 | 2,917.69 | 2,886.00 |
| 4 | 2014-12-30 | 04:00:00 | t+1 | 2,946.99 | 2,963.00 |
Наблюдавайте прогнозата за почасовите данни, сравнена с действителното натоварване. Колко точна е тя?
### Проверка на точността на модела
Проверете точността на модела си, като тествате неговата средна абсолютна процентна грешка (MAPE) за всички прогнози.
> **🧮 Покажи ми математиката**
>
> ![MAPE](../../../../7-TimeSeries/2-ARIMA/images/mape.png)
>
> [MAPE](https://www.linkedin.com/pulse/what-mape-mad-msd-time-series-allameh-statistics/) се използва за показване на точността на прогнозата като съотношение, дефинирано от горната формула. Разликата между действителната и прогнозната стойност се дели на действителната.
>
> "Абсолютната стойност в това изчисление се сумира за всяка прогнозирана точка във времето и се дели на броя на точките n." [wikipedia](https://wikipedia.org/wiki/Mean_absolute_percentage_error)
1. Изразете уравнението в код:
```python
if(HORIZON > 1):
eval_df['APE'] = (eval_df['prediction'] - eval_df['actual']).abs() / eval_df['actual']
print(eval_df.groupby('h')['APE'].mean())
```
1. Изчислете MAPE за една стъпка:
```python
print('One step forecast MAPE: ', (mape(eval_df[eval_df['h'] == 't+1']['prediction'], eval_df[eval_df['h'] == 't+1']['actual']))*100, '%')
```
MAPE за прогнозата на една стъпка: 0.5570581332313952 %
1. Отпечатайте MAPE за многократна прогноза:
```python
print('Multi-step forecast MAPE: ', mape(eval_df['prediction'], eval_df['actual'])*100, '%')
```
```output
Multi-step forecast MAPE: 1.1460048657704118 %
```
Най-добре е да имате ниска стойност: имайте предвид, че прогноза с MAPE от 10 е с отклонение от 10%.
1. Но както винаги, е по-лесно да видите този вид измерване на точността визуално, затова нека го начертаем:
```python
if(HORIZON == 1):
## Plotting single step forecast
eval_df.plot(x='timestamp', y=['actual', 'prediction'], style=['r', 'b'], figsize=(15, 8))
else:
## Plotting multi step forecast
plot_df = eval_df[(eval_df.h=='t+1')][['timestamp', 'actual']]
for t in range(1, HORIZON+1):
plot_df['t+'+str(t)] = eval_df[(eval_df.h=='t+'+str(t))]['prediction'].values
fig = plt.figure(figsize=(15, 8))
ax = plt.plot(plot_df['timestamp'], plot_df['actual'], color='red', linewidth=4.0)
ax = fig.add_subplot(111)
for t in range(1, HORIZON+1):
x = plot_df['timestamp'][(t-1):]
y = plot_df['t+'+str(t)][0:len(x)]
ax.plot(x, y, color='blue', linewidth=4*math.pow(.9,t), alpha=math.pow(0.8,t))
ax.legend(loc='best')
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![модел за времеви серии](../../../../7-TimeSeries/2-ARIMA/images/accuracy.png)
🏆 Много хубав график, показващ модел с добра точност. Браво!
---
## 🚀Предизвикателство
Разгледайте начините за тестване на точността на модел за времеви серии. В този урок разглеждаме MAPE, но има ли други методи, които можете да използвате? Проучете ги и ги опишете. Полезен документ може да бъде намерен [тук](https://otexts.com/fpp2/accuracy.html)
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Този урок обхваща само основите на прогнозиране на времеви серии с ARIMA. Отделете време да задълбочите знанията си, като разгледате [този репозиторий](https://microsoft.github.io/forecasting/) и различните му типове модели, за да научите други начини за изграждане на модели за времеви серии.
## Задача
[Нов ARIMA модел](assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,25 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "1c814013e10866dfd92cdb32caaae3ac",
"translation_date": "2025-09-04T23:48:30+00:00",
"source_file": "7-TimeSeries/2-ARIMA/assignment.md",
"language_code": "bg"
}
-->
# Нов ARIMA модел
## Инструкции
След като сте създали ARIMA модел, създайте нов с нови данни (опитайте един от [тези набори от данни от Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html). Аннотирайте работата си в тетрадка, визуализирайте данните и модела си и тествайте точността му, използвайки MAPE.
## Рубрика
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ---------------------------------- |
| | Представена е тетрадка с нов ARIMA модел, тестван и обяснен с визуализации и посочена точност. | Представената тетрадка не е аннотирана или съдържа грешки | Представена е непълна тетрадка |
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "a39c15d63f3b2795ee2284a82b986b93",
"translation_date": "2025-09-04T23:49:25+00:00",
"source_file": "7-TimeSeries/2-ARIMA/solution/Julia/README.md",
"language_code": "bg"
}
-->
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,15 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "81db6ff2cf6e62fbe2340b094bb9509e",
"translation_date": "2025-09-04T23:48:59+00:00",
"source_file": "7-TimeSeries/2-ARIMA/solution/R/README.md",
"language_code": "bg"
}
-->
това е временно запълващо място
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,393 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "482bccabe1df958496ea71a3667995cd",
"translation_date": "2025-09-04T23:53:49+00:00",
"source_file": "7-TimeSeries/3-SVR/README.md",
"language_code": "bg"
}
-->
# Прогнозиране на времеви серии със Support Vector Regressor
В предишния урок научихте как да използвате модела ARIMA за прогнозиране на времеви серии. Сега ще разгледате модела Support Vector Regressor, който е регресионен модел, използван за прогнозиране на непрекъснати данни.
## [Тест преди лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Въведение
В този урок ще откриете специфичен начин за изграждане на модели с [**SVM**: **S**upport **V**ector **M**achine](https://en.wikipedia.org/wiki/Support-vector_machine) за регресия, или **SVR: Support Vector Regressor**.
### SVR в контекста на времеви серии [^1]
Преди да разберете значението на SVR за прогнозиране на времеви серии, ето някои важни концепции, които трябва да знаете:
- **Регресия:** Техника за обучение с надзор, която предсказва непрекъснати стойности от даден набор от входни данни. Идеята е да се намери крива (или линия) в пространството на характеристиките, която има максимален брой точки от данни. [Кликнете тук](https://en.wikipedia.org/wiki/Regression_analysis) за повече информация.
- **Support Vector Machine (SVM):** Вид модел за машинно обучение с надзор, използван за класификация, регресия и откриване на аномалии. Моделът представлява хиперплоскост в пространството на характеристиките, която в случай на класификация действа като граница, а в случай на регресия - като линия на най-добро съответствие. В SVM обикновено се използва Kernel функция за трансформиране на набора от данни в пространство с по-голям брой измерения, така че те да бъдат лесно разделими. [Кликнете тук](https://en.wikipedia.org/wiki/Support-vector_machine) за повече информация за SVM.
- **Support Vector Regressor (SVR):** Вид SVM, който намира линия на най-добро съответствие (която в случая на SVM е хиперплоскост), която има максимален брой точки от данни.
### Защо SVR? [^1]
В последния урок научихте за ARIMA, който е много успешен статистически линеен метод за прогнозиране на времеви серии. Въпреки това, в много случаи времевите серии имат *нелинейност*, която не може да бъде моделирана от линейни модели. В такива случаи способността на SVM да отчита нелинейността в данните за задачи по регресия прави SVR успешен в прогнозиране на времеви серии.
## Упражнение - изграждане на SVR модел
Първите няколко стъпки за подготовка на данните са същите като тези от предишния урок за [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA).
Отворете папката [_/working_](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/3-SVR/working) в този урок и намерете файла [_notebook.ipynb_](https://github.com/microsoft/ML-For-Beginners/blob/main/7-TimeSeries/3-SVR/working/notebook.ipynb). [^2]
1. Стартирайте notebook-а и импортирайте необходимите библиотеки: [^2]
```python
import sys
sys.path.append('../../')
```
```python
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime as dt
import math
from sklearn.svm import SVR
from sklearn.preprocessing import MinMaxScaler
from common.utils import load_data, mape
```
2. Заредете данните от файла `/data/energy.csv` в Pandas dataframe и разгледайте ги: [^2]
```python
energy = load_data('../../data')[['load']]
```
3. Начертайте всички налични данни за енергия от януари 2012 до декември 2014: [^2]
```python
energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![пълни данни](../../../../7-TimeSeries/3-SVR/images/full-data.png)
Сега нека изградим нашия SVR модел.
### Създаване на тренировъчни и тестови набори от данни
Сега данните ви са заредени, така че можете да ги разделите на тренировъчен и тестов набор. След това ще преформатирате данните, за да създадете набор от данни, базиран на времеви стъпки, който ще бъде необходим за SVR. Ще обучите модела си върху тренировъчния набор. След като моделът приключи обучението, ще оцените неговата точност върху тренировъчния набор, тестовия набор и след това върху целия набор от данни, за да видите цялостното представяне. Трябва да се уверите, че тестовият набор обхваща по-късен период от време спрямо тренировъчния набор, за да гарантирате, че моделът не получава информация от бъдещи времеви периоди [^2] (ситуация, известна като *Overfitting*).
1. Отделете двумесечен период от 1 септември до 31 октомври 2014 за тренировъчния набор. Тестовият набор ще включва двумесечния период от 1 ноември до 31 декември 2014: [^2]
```python
train_start_dt = '2014-11-01 00:00:00'
test_start_dt = '2014-12-30 00:00:00'
```
2. Визуализирайте разликите: [^2]
```python
energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)][['load']].rename(columns={'load':'train'}) \
.join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \
.plot(y=['train', 'test'], figsize=(15, 8), fontsize=12)
plt.xlabel('timestamp', fontsize=12)
plt.ylabel('load', fontsize=12)
plt.show()
```
![тренировъчни и тестови данни](../../../../7-TimeSeries/3-SVR/images/train-test.png)
### Подготовка на данните за обучение
Сега трябва да подготвите данните за обучение, като извършите филтриране и скалиране на данните. Филтрирайте набора от данни, за да включите само необходимите времеви периоди и колони, и скалирайте, за да гарантирате, че данните са проектирани в интервала 0,1.
1. Филтрирайте оригиналния набор от данни, за да включите само споменатите времеви периоди за всеки набор и само необходимата колона 'load' плюс датата: [^2]
```python
train = energy.copy()[(energy.index >= train_start_dt) & (energy.index < test_start_dt)][['load']]
test = energy.copy()[energy.index >= test_start_dt][['load']]
print('Training data shape: ', train.shape)
print('Test data shape: ', test.shape)
```
```output
Training data shape: (1416, 1)
Test data shape: (48, 1)
```
2. Скалирайте тренировъчните данни, за да бъдат в диапазона (0, 1): [^2]
```python
scaler = MinMaxScaler()
train['load'] = scaler.fit_transform(train)
```
4. Сега скалирайте тестовите данни: [^2]
```python
test['load'] = scaler.transform(test)
```
### Създаване на данни с времеви стъпки [^1]
За SVR трансформирате входните данни, за да бъдат във формата `[batch, timesteps]`. Така преформатирате съществуващите `train_data` и `test_data`, така че да има ново измерение, което се отнася до времевите стъпки.
```python
# Converting to numpy arrays
train_data = train.values
test_data = test.values
```
За този пример вземаме `timesteps = 5`. Така входовете към модела са данните за първите 4 времеви стъпки, а изходът ще бъде данните за 5-тата времева стъпка.
```python
timesteps=5
```
Преобразуване на тренировъчните данни в 2D тензор с помощта на вложени списъчни разбирания:
```python
train_data_timesteps=np.array([[j for j in train_data[i:i+timesteps]] for i in range(0,len(train_data)-timesteps+1)])[:,:,0]
train_data_timesteps.shape
```
```output
(1412, 5)
```
Преобразуване на тестовите данни в 2D тензор:
```python
test_data_timesteps=np.array([[j for j in test_data[i:i+timesteps]] for i in range(0,len(test_data)-timesteps+1)])[:,:,0]
test_data_timesteps.shape
```
```output
(44, 5)
```
Избор на входове и изходи от тренировъчните и тестовите данни:
```python
x_train, y_train = train_data_timesteps[:,:timesteps-1],train_data_timesteps[:,[timesteps-1]]
x_test, y_test = test_data_timesteps[:,:timesteps-1],test_data_timesteps[:,[timesteps-1]]
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
```
```output
(1412, 4) (1412, 1)
(44, 4) (44, 1)
```
### Имплементиране на SVR [^1]
Сега е време да имплементирате SVR. За повече информация относно тази имплементация можете да се обърнете към [тази документация](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVR.html). За нашата имплементация следваме тези стъпки:
1. Дефинирайте модела, като извикате `SVR()` и зададете хиперпараметрите на модела: kernel, gamma, c и epsilon
2. Подгответе модела за тренировъчните данни, като извикате функцията `fit()`
3. Направете прогнози, като извикате функцията `predict()`
Сега създаваме SVR модел. Тук използваме [RBF kernel](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel) и задаваме хиперпараметрите gamma, C и epsilon като 0.5, 10 и 0.05 съответно.
```python
model = SVR(kernel='rbf',gamma=0.5, C=10, epsilon = 0.05)
```
#### Обучение на модела върху тренировъчни данни [^1]
```python
model.fit(x_train, y_train[:,0])
```
```output
SVR(C=10, cache_size=200, coef0=0.0, degree=3, epsilon=0.05, gamma=0.5,
kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
```
#### Направете прогнози с модела [^1]
```python
y_train_pred = model.predict(x_train).reshape(-1,1)
y_test_pred = model.predict(x_test).reshape(-1,1)
print(y_train_pred.shape, y_test_pred.shape)
```
```output
(1412, 1) (44, 1)
```
Създадохте SVR! Сега трябва да го оцените.
### Оценка на модела [^1]
За оценка първо ще скалираме обратно данните към оригиналната скала. След това, за да проверим представянето, ще начертаем графика на оригиналните и прогнозирани времеви серии и ще отпечатаме резултата от MAPE.
Скалирайте обратно прогнозните и оригиналните изходи:
```python
# Scaling the predictions
y_train_pred = scaler.inverse_transform(y_train_pred)
y_test_pred = scaler.inverse_transform(y_test_pred)
print(len(y_train_pred), len(y_test_pred))
```
```python
# Scaling the original values
y_train = scaler.inverse_transform(y_train)
y_test = scaler.inverse_transform(y_test)
print(len(y_train), len(y_test))
```
#### Проверка на представянето на модела върху тренировъчни и тестови данни [^1]
Извличаме времевите марки от набора от данни, за да ги покажем на x-оста на графиката. Забележете, че използваме първите ```timesteps-1``` стойности като вход за първия изход, така че времевите марки за изхода ще започнат след това.
```python
train_timestamps = energy[(energy.index < test_start_dt) & (energy.index >= train_start_dt)].index[timesteps-1:]
test_timestamps = energy[test_start_dt:].index[timesteps-1:]
print(len(train_timestamps), len(test_timestamps))
```
```output
1412 44
```
Начертайте прогнозите за тренировъчни данни:
```python
plt.figure(figsize=(25,6))
plt.plot(train_timestamps, y_train, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(train_timestamps, y_train_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.title("Training data prediction")
plt.show()
```
![прогноза за тренировъчни данни](../../../../7-TimeSeries/3-SVR/images/train-data-predict.png)
Отпечатайте MAPE за тренировъчни данни
```python
print('MAPE for training data: ', mape(y_train_pred, y_train)*100, '%')
```
```output
MAPE for training data: 1.7195710200875551 %
```
Начертайте прогнозите за тестови данни
```python
plt.figure(figsize=(10,3))
plt.plot(test_timestamps, y_test, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(test_timestamps, y_test_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![прогноза за тестови данни](../../../../7-TimeSeries/3-SVR/images/test-data-predict.png)
Отпечатайте MAPE за тестови данни
```python
print('MAPE for testing data: ', mape(y_test_pred, y_test)*100, '%')
```
```output
MAPE for testing data: 1.2623790187854018 %
```
🏆 Имате много добър резултат върху тестовия набор от данни!
### Проверка на представянето на модела върху целия набор от данни [^1]
```python
# Extracting load values as numpy array
data = energy.copy().values
# Scaling
data = scaler.transform(data)
# Transforming to 2D tensor as per model input requirement
data_timesteps=np.array([[j for j in data[i:i+timesteps]] for i in range(0,len(data)-timesteps+1)])[:,:,0]
print("Tensor shape: ", data_timesteps.shape)
# Selecting inputs and outputs from data
X, Y = data_timesteps[:,:timesteps-1],data_timesteps[:,[timesteps-1]]
print("X shape: ", X.shape,"\nY shape: ", Y.shape)
```
```output
Tensor shape: (26300, 5)
X shape: (26300, 4)
Y shape: (26300, 1)
```
```python
# Make model predictions
Y_pred = model.predict(X).reshape(-1,1)
# Inverse scale and reshape
Y_pred = scaler.inverse_transform(Y_pred)
Y = scaler.inverse_transform(Y)
```
```python
plt.figure(figsize=(30,8))
plt.plot(Y, color = 'red', linewidth=2.0, alpha = 0.6)
plt.plot(Y_pred, color = 'blue', linewidth=0.8)
plt.legend(['Actual','Predicted'])
plt.xlabel('Timestamp')
plt.show()
```
![прогноза за целия набор от данни](../../../../7-TimeSeries/3-SVR/images/full-data-predict.png)
```python
print('MAPE: ', mape(Y_pred, Y)*100, '%')
```
```output
MAPE: 2.0572089029888656 %
```
🏆 Много хубави графики, показващи модел с добра точност. Браво!
---
## 🚀Предизвикателство
- Опитайте да промените хиперпараметрите (gamma, C, epsilon) при създаването на модела и оценете данните, за да видите кой набор от хиперпараметри дава най-добри резултати върху тестовия набор от данни. За повече информация относно тези хиперпараметри можете да се обърнете към документа [тук](https://scikit-learn.org/stable/modules/svm.html#parameters-of-the-rbf-kernel).
- Опитайте да използвате различни функции на kernel за модела и анализирайте тяхното представяне върху набора от данни. Полезен документ можете да намерите [тук](https://scikit-learn.org/stable/modules/svm.html#kernel-functions).
- Опитайте да използвате различни стойности за `timesteps`, за да накарате модела да се върне назад и да направи прогноза.
## [Тест след лекцията](https://ff-quizzes.netlify.app/en/ml/)
## Преглед и самостоятелно обучение
Този урок беше за въвеждане на приложението на SVR за прогнозиране на времеви серии. За повече информация относно SVR можете да се обърнете към [този блог](https://www.analyticsvidhya.com/blog/2020/03/support-vector-regression-tutorial-for-machine-learning/). Тази [документация за scikit-learn](https://scikit-learn.org/stable/modules/svm.html) предоставя по-изчерпателно обяснение за SVM като цяло, [SVRs](https://scikit-learn.org/stable/modules/svm.html#regression) и също така други детайли за имплементация, като различните [функции на kernel](https://scikit-learn.org/stable/modules/svm.html#kernel-functions), които могат да бъдат използвани, и техните параметри.
## Задача
[Нов SVR модел](assignment.md)
## Благодарности
[^1]: Текстът, кодът и резултатите в този раздел са предоставени от [@AnirbanMukherjeeXD](https://github.com/AnirbanMukherjeeXD)
[^2]: Текстът, кодът и резултатите в този раздел са взети от [ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

@ -0,0 +1,29 @@
<!--
CO_OP_TRANSLATOR_METADATA:
{
"original_hash": "94aa2fc6154252ae30a3f3740299707a",
"translation_date": "2025-09-04T23:56:46+00:00",
"source_file": "7-TimeSeries/3-SVR/assignment.md",
"language_code": "bg"
}
-->
# Нов модел SVR
## Инструкции [^1]
След като сте създали модел SVR, създайте нов с нови данни (опитайте един от [тези набори от данни от Duke](http://www2.stat.duke.edu/~mw/ts_data_sets.html)). Аннотирайте работата си в тетрадка, визуализирайте данните и модела си и тествайте точността му, използвайки подходящи графики и MAPE. Също така опитайте да промените различните хиперпараметри и да използвате различни стойности за времевите стъпки.
## Рубрика [^1]
| Критерии | Отлично | Задоволително | Нуждае се от подобрение |
| -------- | ----------------------------------------------------------- | ------------------------------------------------------- | ---------------------------------- |
| | Представена е тетрадка с изграден, тестван и обяснен модел SVR, с визуализации и посочена точност. | Представената тетрадка не е аннотирана или съдържа грешки. | Представена е непълна тетрадка. |
[^1]:Текстът в този раздел е базиран на [задачата от ARIMA](https://github.com/microsoft/ML-For-Beginners/tree/main/7-TimeSeries/2-ARIMA/assignment.md)
---
**Отказ от отговорност**:
Този документ е преведен с помощта на AI услуга за превод [Co-op Translator](https://github.com/Azure/co-op-translator). Въпреки че се стремим към точност, моля, имайте предвид, че автоматизираните преводи може да съдържат грешки или неточности. Оригиналният документ на неговия роден език трябва да се счита за авторитетен източник. За критична информация се препоръчва професионален човешки превод. Ние не носим отговорност за недоразумения или погрешни интерпретации, произтичащи от използването на този превод.

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

Loading…
Cancel
Save