طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 244 · علم البيانات للويب
الدرس 24 · الوحدة 12: تقديم توقعات دقيقة بتعلم الآلة

تحسين النموذج واختيار المتغيرات

ليست كثرة المتغيّرات قوّة؛ كيف نختار الأنفع ونتجنّب الحفظ؟ ⏱ نحو 50 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تختار المتغيّرات بالارتباط بالهدف.
  • توحّد المقاييس بـ StandardScaler.
  • تتعرّف فرط التخصيص من فجوة التدريب والاختبار.
  • توحّد بعد التقسيم لا قبله.

١ليست كل المتغيّرات مفيدة

بنيت نموذجًا؛ كيف تحسّنه؟ ليس بإضافة كل عمودٍ متاح. بعض المتغيّرات تضرّ: ثابتةٌ بلا معلومة، أو ضجيجٌ يشوّش. أولى خطوات التحسين: اختيار المتغيّرات المفيدة فعلًا.

main.py
import pandas as pddf = pd.DataFrame({    "seconds": [8, 120, 5, 240, 40, 180, 60, 300],    "pages":   [1, 4, 1, 6, 2, 5, 3, 9],    "hour":    [3, 14, 2, 20, 11, 19, 9, 21],    "noise":   [7, 7, 7, 7, 7, 7, 7, 7],     # لا يتغيّر — بلا فائدة    "bought":  [0, 1, 0, 1, 0, 1, 0, 1],})# ارتباط كل متغيّر بالهدف: الأعلى (مطلقًا) أنفعcorr = df.corr(numeric_only=True)["bought"].drop("bought")print(corr.round(3))print("الأقوى ارتباطًا:", corr.abs().idxmax())
Shell×
>>> %Run main.py
seconds 0.876
pages 0.827
hour 0.880
noise NaN
Name: bought, dtype: float64
الأقوى ارتباطًا: hour
>>>

عمود noise الثابت ارتباطه صفر (بلا معلومة). seconds وpages الأقوى — هذه نُبقيها، والضعيفة نحذفها.

٢توحيد المقاييس: scaling

حين تختلف وحدات المتغيّرات (ثوانٍ بالمئات، صفحاتٌ بالآحاد)، تطغى الكبيرة على بعض النماذج. التوحيد StandardScaler يجعلها على مقياسٍ واحد:

main.py
from sklearn.preprocessing import StandardScalerimport numpy as np X = np.array([[8, 1], [240, 6], [40, 2], [300, 9]], dtype=float)scaled = StandardScaler().fit_transform(X)print("قبل: مدى العمود الأول", X[:,0].min(), "إلى", X[:,0].max())print("بعد (متوسط≈0, انحراف≈1):")print(np.round(scaled, 2))
Shell×
>>> %Run main.py
قبل: مدى العمود الأول 8.0 إلى 300.0
بعد (متوسط≈0, انحراف≈1):
[[-1.11 -1.09]
[ 0.74 0.47]
[-0.85 -0.78]
[ 1.22 1.41]]
>>>

٣فرط التخصيص Overfitting

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

الحالةتدريباختبارالتشخيص
متوازنعالٍعالٍجيّد ✓
فرط تخصيصعالٍ جدًّامنخفضحفظ لا تعلّم
قصور تعلّممنخفضمنخفضالنموذج أبسط من اللازم

هنا تثمر قاعدة الدرس 20: التقييم على بياناتٍ لم يرها النموذج هو ما يكشف فرط التخصيص.

توقّع وتحقّق

متغيّر ثابت لا يتغيّر ارتباطه بالهدف:

لتوحيد مقاييس المتغيّرات:

دقّة عالية على التدريب ومنخفضة على الاختبار:

نوحّد المقياس:

الخلاصة

تحدٍّ برمجي: اختر الأنفع

متقدم

احسب ارتباط كل متغيّر بالهدف، واطبع اسم المتغيّر الأقوى ارتباطًا، وعدد المتغيّرات التي ارتباطها المطلق أقل من 0.1 (مرشّحة للحذف).

المطلوب:
  • احسب ارتباط الأعمدة بـ bought (عدا الهدف).
  • اطبع الأقوى ارتباطًا، ثم عدد ذوات الارتباط المطلق < 0.1.

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

main.py
import pandas as pddf = pd.DataFrame({    "seconds": [8, 120, 5, 240, 40, 180, 60, 300],    "pages":   [1, 4, 1, 6, 2, 5, 3, 9],    "hour":    [3, 14, 2, 20, 11, 19, 9, 21],    "noise":   [7, 7, 7, 7, 7, 7, 7, 7],     # لا يتغيّر — بلا فائدة    "bought":  [0, 1, 0, 1, 0, 1, 0, 1],})# اطبع المتغيّر الأقوى ارتباطًا، وعدد ذوات الارتباط المطلق < 0.1
المطلوب×
hour
0
💡 تلميح 1
الارتباط: df.corr(numeric_only=True)["bought"].drop("bought").
💡 تلميح 2
الأقوى: corr.abs().idxmax()؛ والضعيفة: (corr.abs() < 0.1).sum().

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

main.py
import pandas as pddf = pd.DataFrame({    "seconds": [8, 120, 5, 240, 40, 180, 60, 300],    "pages":   [1, 4, 1, 6, 2, 5, 3, 9],    "hour":    [3, 14, 2, 20, 11, 19, 9, 21],    "noise":   [7, 7, 7, 7, 7, 7, 7, 7],     # لا يتغيّر — بلا فائدة    "bought":  [0, 1, 0, 1, 0, 1, 0, 1],})corr = df.corr(numeric_only=True)["bought"].drop("bought")print(corr.abs().idxmax())print(int((corr.abs() < 0.1).sum()))
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

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