طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 303 · من الفكرة إلى المنتج (٣): بيانات وتنبّؤ
الدرس 4 · الوحدة 2: التحليل والنمذجة

المحطّة ٤: نموذج تنبّؤٍ بسيط

نموذجٌ شفّاف: قاعدةٌ تحوّل درجات الطالب وحضوره إلى تنبّؤ. ⏱ نحو 26 دقيقة.

القاعدةمتعثّرسليم
بعد هذا الدرس ستستطيع أن:
  • تفهم النموذج كدالّةٍ من سماتٍ إلى تنبّؤ.
  • تترجم تعريفًا إجرائيًّا إلى قاعدةٍ برمجيّة.
  • تطبّق النموذج على مجموعة بيانات.
  • تدرك أثر اختيار السمات وتتجنّب النظر إلى الحقيقة.

١ما «النموذج»؟ قاعدةٌ تحوّل السمات إلى تنبّؤ

«النموذج» (Model) في جوهره شيءٌ بسيط: دالّةٌ تأخذ سمات المثال (درجات، حضور) وتعيد تنبّؤًا (متعثّر؟ نعم/لا). لا حاجة لتعلّم آلةٍ معقّد لنبدأ؛ نموذجٌ قائمٌ على قاعدةٍ (Rule-based) خطوةٌ أولى ممتازةٌ ومفهومة.

نترجم التعريف الإجرائيّ من المحطّة الأولى إلى قاعدة: الطالب متعثّر إذا كان متوسّطه أقلّ من 60 أو حضوره أقلّ من 0.70:

main.py
def predict(avg, attendance):    return avg < 60 or attendance < 0.70 print(predict(51.7, 0.6))     # نورة → Trueprint(predict(87.7, 0.95))    # خالد → Falseprint(predict(60.7, 0.8))     # فهد  → False (قاعدتنا لا تلتقطه)
Shell×
>>> %Run main.py
True
False
False
>>>

النموذج القائم على قاعدةٍ شفّاف: نفهم لماذا تنبّأ بما تنبّأ. وهذا ثمينٌ في القرارات التي تمسّ أشخاصًا — نستطيع تبريرها والدفاع عنها.

٢طبّق النموذج على كل الطلاب

main.py
students = [    {"name": "سعود", "grades": [70, 65, 80], "attendance": 0.9,  "at_risk": False},    {"name": "نورة", "grades": [55, 40, 60], "attendance": 0.6,  "at_risk": True},    {"name": "خالد", "grades": [90, 85, 88], "attendance": 0.95, "at_risk": False},    {"name": "ريم",  "grades": [50, 45],     "attendance": 0.5,  "at_risk": True},    {"name": "فهد",  "grades": [60, 62],     "attendance": 0.8,  "at_risk": True},] def predict(avg, attendance):    return avg < 60 or attendance < 0.70 for s in students:    avg = round(sum(s["grades"]) / len(s["grades"]), 1)    s["pred"] = predict(avg, s["attendance"])    print(f'{s["name"]}: {"متعثّر" if s["pred"] else "سليم"}')
Shell×
>>> %Run main.py
سعود: سليم
نورة: متعثّر
خالد: سليم
ريم: متعثّر
فهد: سليم
>>>

٣السمات مفتاح النموذج

جودة التنبّؤ تعتمد على السمات التي نغذّيها: اخترنا المتوسّط والحضور لأنهما — بحسب خبرتنا — أقوى المؤشّرات المبكّرة. سماتٌ أضعف (طول الاسم مثلًا) تنتج نموذجًا بلا معنى.

توقّع وتحقّق

ما النموذج في جوهره؟

قاعدتنا: متعثّرٌ إذا avg<60 __ attendance<0.70

يكفي تحقّق أحد الشرطين.

ميزة النموذج القائم على قاعدة؟

ماذا يرى النموذج عند التنبّؤ؟

النظر للحقيقة غشّ.

الخلاصة

تحدٍّ برمجي: نموذج التنبّؤ بالمتعثّرين

متوسّط

ابنِ نموذجًا قائمًا على قاعدةٍ يتنبّأ بالتعثّر من السمات، وطبّقه على كل الطلاب، واطبع تنبّؤ كلٍّ ثمّ عدد المتعثّرين المتوقَّع.

المطلوب:
  • دالّة predict(avg, attendance) تعيد True إذا avg < 60 أو attendance < 0.70.
  • طبّقها على كل طالبٍ (احسب المتوسّط أوّلًا) واطبع الاسم: متعثّر/سليم.
  • اطبع المتوقَّع متعثّرون: N.
  • لا تنظر إلى at_risk الحقيقيّ — النموذج يرى السمات فقط.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
students = [    {"name": "سعود", "grades": [70, 65, 80], "attendance": 0.9,  "at_risk": False},    {"name": "نورة", "grades": [55, 40, 60], "attendance": 0.6,  "at_risk": True},    {"name": "خالد", "grades": [90, 85, 88], "attendance": 0.95, "at_risk": False},    {"name": "ريم",  "grades": [50, 45],     "attendance": 0.5,  "at_risk": True},    {"name": "فهد",  "grades": [60, 62],     "attendance": 0.8,  "at_risk": True},] # أكمل: عرّف predict، طبّقها، واطبع التنبّؤات والعدد
المطلوب×
سعود: سليم
نورة: متعثّر
خالد: سليم
ريم: متعثّر
فهد: سليم
المتوقَّع متعثّرون: 2
💡 تلميح 1
القاعدة سطرٌ واحد: return avg < 60 or attendance < 0.70.
💡 تلميح 2
عدّ المتعثّرين بزيادة عدّادٍ كلّما كان pred صحيحًا.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
students = [    {"name": "سعود", "grades": [70, 65, 80], "attendance": 0.9,  "at_risk": False},    {"name": "نورة", "grades": [55, 40, 60], "attendance": 0.6,  "at_risk": True},    {"name": "خالد", "grades": [90, 85, 88], "attendance": 0.95, "at_risk": False},    {"name": "ريم",  "grades": [50, 45],     "attendance": 0.5,  "at_risk": True},    {"name": "فهد",  "grades": [60, 62],     "attendance": 0.8,  "at_risk": True},] def predict(avg, attendance):    return avg < 60 or attendance < 0.70 count = 0for s in students:    avg = round(sum(s["grades"]) / len(s["grades"]), 1)    s["pred"] = predict(avg, s["attendance"])    if s["pred"]:        count += 1    print(f'{s["name"]}: {"متعثّر" if s["pred"] else "سليم"}') print("المتوقَّع متعثّرون:", count)

🐞 لاحظت خطأً في هذا الدرس؟ أبلغني بالبريد

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس