المحطّة ٤: نموذج تنبّؤٍ بسيط
نموذجٌ شفّاف: قاعدةٌ تحوّل درجات الطالب وحضوره إلى تنبّؤ. ⏱ نحو 26 دقيقة.
- تفهم النموذج كدالّةٍ من سماتٍ إلى تنبّؤ.
- تترجم تعريفًا إجرائيًّا إلى قاعدةٍ برمجيّة.
- تطبّق النموذج على مجموعة بيانات.
- تدرك أثر اختيار السمات وتتجنّب النظر إلى الحقيقة.
١ما «النموذج»؟ قاعدةٌ تحوّل السمات إلى تنبّؤ
«النموذج» (Model) في جوهره شيءٌ بسيط: دالّةٌ تأخذ سمات المثال (درجات، حضور) وتعيد تنبّؤًا (متعثّر؟ نعم/لا). لا حاجة لتعلّم آلةٍ معقّد لنبدأ؛ نموذجٌ قائمٌ على قاعدةٍ (Rule-based) خطوةٌ أولى ممتازةٌ ومفهومة.
نترجم التعريف الإجرائيّ من المحطّة الأولى إلى قاعدة: الطالب متعثّر إذا كان متوسّطه أقلّ من 60 أو حضوره أقلّ من 0.70:
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 (قاعدتنا لا تلتقطه)
النموذج القائم على قاعدةٍ شفّاف: نفهم لماذا تنبّأ بما تنبّأ. وهذا ثمينٌ في القرارات التي تمسّ أشخاصًا — نستطيع تبريرها والدفاع عنها.
٢طبّق النموذج على كل الطلاب
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 "سليم"}')
٣السمات مفتاح النموذج
جودة التنبّؤ تعتمد على السمات التي نغذّيها: اخترنا المتوسّط والحضور لأنهما — بحسب خبرتنا — أقوى المؤشّرات المبكّرة. سماتٌ أضعف (طول الاسم مثلًا) تنتج نموذجًا بلا معنى.
توقّع وتحقّق
ما النموذج في جوهره؟
قاعدتنا: متعثّرٌ إذا avg<60 __ attendance<0.70
ميزة النموذج القائم على قاعدة؟
ماذا يرى النموذج عند التنبّؤ؟
الخلاصة
- النموذج دالّةٌ تحوّل السمات (درجات، حضور) إلى تنبّؤ.
- النموذج القائم على قاعدةٍ شفّافٌ ومفهومٌ وأساسٌ جيّدٌ للبداية.
- القاعدة ترجمةٌ مباشرةٌ للتعريف الإجرائيّ:
avg<60 or attendance<0.70. - جودة التنبّؤ من جودة السمات المختارة.
- النموذج يرى السمات فقط؛ النظر إلى الحقيقة أثناء التنبّؤ غشّ.
تحدٍّ برمجي: نموذج التنبّؤ بالمتعثّرين
متوسّطابنِ نموذجًا قائمًا على قاعدةٍ يتنبّأ بالتعثّر من السمات، وطبّقه على كل الطلاب، واطبع تنبّؤ كلٍّ ثمّ عدد المتعثّرين المتوقَّع.
- دالّة
predict(avg, attendance)تعيد True إذاavg < 60أوattendance < 0.70. - طبّقها على كل طالبٍ (احسب المتوسّط أوّلًا) واطبع
الاسم: متعثّر/سليم. - اطبع
المتوقَّع متعثّرون: N. - لا تنظر إلى
at_riskالحقيقيّ — النموذج يرى السمات فقط.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
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، طبّقها، واطبع التنبّؤات والعدد
💡 تلميح 1
return avg < 60 or attendance < 0.70.💡 تلميح 2
pred صحيحًا.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
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)