الانحدار الخطي واللوجستي
درس 2 من 8
2الانحدار الخطي واللوجستي
الصورة الكبيرةالانحدار الخطي واللوجستي أبسط نموذجين يتعلّمان من البيانات، وكل ما يأتي بعدهما في هذا المسار، حتى المحوّلات، هو تنويع على نفس الفكرة: أوزان تُضبط لتقليل خسارة. اكتبهما بيدك مرة، ثم بثلاثة أسطر من scikit-learn.
ماذا تشاهد في الرسم: الخط يتأرجح ثم يستقر في الموضع الذي يجعل متوسط مربّع الخطأ أصغر ما يمكن. هذا هو التدريب كله: وزن وانحياز يُضبطان خطوة بخطوة حتى يقترب الخط من النقاط، ثم نقرأ منه سعر شقة 130 م².
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
الانحدار الخطي مثل أن ترسم أفضل خط مستقيم يمر وسط نقاط مبعثرة، فتعرف من الخط سعر بيت لم تره من مساحته. والانحدار اللوجستي يأخذ الفكرة نفسها ويحوّل الناتج إلى احتمال بين صفر وواحد، فيجيب عن سؤال نعم أو لا.
الانحدار الخطي y = w·x + b يقلّل متوسط مربع الخطأ MSE. واللوجستي يمرر الناتج في دالة sigmoid ويقلّل خسارة الإنتروبيا المتقاطعة. تكتبه بيدك بالنزول بالميل ثم بـsklearn.linear_model في ثلاثة أسطر، وتقرأ الأوزان كأثر كل سمة.
قبل أن تبدأ
📉النزول بالميل
كتبت حلقة النزول بيدك في درس المشتقة، وهنا تتكرّر بوزنين بدل وزن واحد.
🎯تأطير المسألة
تميّز الانحدار من التصنيف بنوع المخرج، كما في الدرس الأول من هذه المرحلة.
الفكرة الجوهرية
تبني هنا أبسط نموذجين يتعلّمان من البيانات. تبدأ بخط، ثم رقم يقيس بعده عن النقاط، ثم خطوات تقرّبه، ثم تحوّل الخط إلى احتمال فتصير عندك أداة تصنيف.
1النموذج معادلة خط
الانحدار الخطي يتعلّم وزنًا لكل مدخل وانحيازًا واحدًا. مع مدخل واحد هو المساحة، يصير النموذج خطًّا.
السعر ≈ w × المساحة + b. الوزن w هو كم يرتفع السعر لكل متر إضافي، والانحياز b هو نقطة البداية. «التدريب» يعني إيجاد قيمتي w وb اللتين تجعلان الخط أقرب ما يكون للنقاط.
انظر إلى الرسم: هذه هي القيم التي يتعلّمها النموذج من الشقق الست. الوزن 4.291 والانحياز 49.82، والشقة ذات 130 مترًا تخرج بسعر 607.7 ألف.
2الخسارة: متوسط مربّع الخطأ
نحتاج رقمًا واحدًا يقول كم الخط بعيد عن النقاط. هذا الرقم اسمه الخسارة.
لكل شقة، الخطأ هو الفرق بين السعر الحقيقي وما يقوله الخط. نربّع الأخطاء ونأخذ متوسطها، فنحصل على رقم واحد اسمه متوسط مربّع الخطأ MSE. التربيع يجعل الخطأ الكبير أغلى بكثير من الصغير، ويجعل الحساب سهل الاشتقاق.
انظر إلى الرسم: خطأ أكبر بأربع مرات يكلّف 16 مرة. والتربيع يمنع أيضًا أن يلغي خطأ موجب خطأً سالبًا.
3النزول بالميل
التدريب حلقة من أربع خطوات تتكرّر. انظر إلى الرسم: تنبّأ، ثم احسب الخطأ، ثم الميل، ثم حرّك الوزنين خطوة صغيرة، وعد.
هذا بالضبط ما فعلته في درس المشتقة، لكن الآن بوزنين بدل واحد. نوحّد المساحة أولًا (نطرح المتوسط ونقسم على الانحراف) حتى لا يكون الميل ضخمًا.
import numpy as np
area = np.array([60, 80, 100, 120, 150, 180], dtype=float)
price = np.array([310, 390, 480, 560, 700, 820], dtype=float)
x = (area - area.mean()) / area.std()
w, b = 0.0, 0.0
for step in range(200):
pred = w * x + b
error = pred - price
w -= 0.1 * 2 * (error * x).mean()
b -= 0.1 * 2 * error.mean()
mse = ((w * x + b - price) ** 2).mean()
print(f"w={w:.2f} b={b:.2f} mse={mse:.2f}")
print("predict 130 m2:", round(w * (130 - area.mean()) / area.std() + b, 1))
مئتا خطوة صغيرة أوصلتنا إلى خط يخطئ بأقل من 4 آلاف في المتوسط (جذر 14.68). والشقة ذات 130 مترًا سعرها المتوقّع 607.7 ألفًا. لاحظ أن b يساوي متوسط الأسعار تمامًا، لأن المساحة الموحّدة متوسطها صفر.
4السيغمويد وخسارة اللوغاريتم
الانحدار اللوجستي يأخذ نفس المجموع الموزون ويمرّره عبر السيغمويد. انظر إلى الرسم: أي رقم يخرج بين 0 و1، والصفر يصير 0.5 بالضبط.
السيغمويد تحوّل أي رقم إلى احتمال. وخسارة اللوغاريتم تقيس كم كان الاحتمال الذي أعطيته للجواب الصحيح منخفضًا.
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def log_loss(y, p):
return -(y * np.log(p) + (1 - y) * np.log(1 - p))
print([round(float(sigmoid(z)), 3) for z in [-4, -1, 0, 1, 4]])
for p in [0.9, 0.6, 0.1]:
print(f"true=1 predicted={p} loss={log_loss(1, p):.3f}")
الصفر يصير 0.5 بالضبط، والأرقام الكبيرة تقترب من 1 بلا أن تصلها. والأهم في السطور الثلاثة الأخيرة: احتمال 0.9 للجواب الصحيح خسارته 0.105، و0.6 خسارته 0.511، أما 0.1، أي ثقة عالية في الجواب الخطأ، فخسارته 2.303، أي اثنان وعشرون ضعف الأولى. خسارة اللوغاريتم تعاقب الثقة الخاطئة أكثر بكثير مما تكافئ الصواب.
لهذا لا نستخدم المربّع هنا. خسارة اللوغاريتم تعاقب الثقة في الجواب الخطأ عقابًا شديدًا.
5من احتمال إلى قرار
رغم اسمه، الانحدار اللوجستي أداة تصنيف. يعطيك احتمالًا، والقرار يأتي من مقارنته بعتبة.
import numpy as np
from sklearn.linear_model import LogisticRegression
hours = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=float).reshape(-1, 1)
passed = np.array([0, 0, 0, 0, 1, 0, 1, 1, 1, 1])
model = LogisticRegression().fit(hours, passed)
for h in [2, 5, 8]:
p = model.predict_proba([[h]])[0, 1]
print(f"{h} hours -> P(pass)={p:.2f} -> {model.predict([[h]])[0]}")
predict_proba يعطي الاحتمال، وpredict يقارنه بعتبة 0.5 ثابتة. الطالب الذي ذاكر خمس ساعات احتماله 0.39 فيُصنَّف راسبًا، رغم أن أحد الطلاب في البيانات نجح بخمس ساعات. العتبة 0.5 ليست مقدّسة، وفي درس المقاييس ستختارها بنفسك حسب تكلفة كل خطأ.
كيف يعمل، خطوة بخطوة: كيف يتعلّم الانحدار الخطي خطّه
ابدأ بوزن وانحياز صفريين، ووحّد المساحة حتى لا يكون الميل ضخمًا.
تنبّأ بسعر كل شقة بـ w * x + b، واحسب الفرق عن السعر الحقيقي.
ربّع الأخطاء وخذ متوسطها لتحصل على MSE، واحسب ميلها بالنسبة إلى w وb.
حرّك w وb عكس الميل بمعدّل 0.1، وكرّر مئتي مرة حتى تصير MSE نحو 14.68.
مثال محلول
عندك ست شقق بمساحاتها وأسعارها، وتريد سعر شقة سابعة. الانحدار الخطي يرسم أفضل خط مستقيم يمر بين النقاط، ثم يقرأ السعر من الخط.
مثال: نفس الخط بثلاثة أسطر
scikit-learn يتوقّع المدخلات كجدول ثنائي الأبعاد، صف لكل عيّنة وعمود لكل مدخل، لهذا نستخدم reshape(-1, 1) حتى مع مدخل واحد.
import numpy as np
from sklearn.linear_model import LinearRegression
area = np.array([60, 80, 100, 120, 150, 180], dtype=float).reshape(-1, 1)
price = np.array([310, 390, 480, 560, 700, 820], dtype=float)
model = LinearRegression().fit(area, price)
print(f"slope={model.coef_[0]:.3f} intercept={model.intercept_:.2f}")
print("predict 130 m2:", round(model.predict([[130]])[0], 1))
نفس التنبّؤ تمامًا: 607.7. والميل 4.291 يعني أن كل متر إضافي يرفع السعر بنحو 4.3 آلاف. هذه قابلية التفسير هي ما يجعل الانحدار الخطي مفضّلًا عندما يسأل أحد «لماذا هذا السعر؟».
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| الانحدار اللوجستي نموذج انحدار. | رغم اسمه فهو مصنّف: يعطي احتمال فئة بين 0 و1، والقرار يأتي من مقارنته بعتبة تختارها. |
| الوزن الأكبر يعني السمة الأهم. | بدون توحيد المدخلات يعكس الوزن الوحدة لا الأهمية: وزن «المساحة بالمتر» يبدو أصغر من وزن «عدد الغرف» لأن أرقام المساحة أكبر فقط. |
| النماذج البسيطة لا مكان لها في الإنتاج. | إذا تفوّق عليها نموذج معقّد بفارق صغير، فالبسيط غالبًا الخيار الأفضل: أسرع وأوضح ومفاجآته أقل. |
جرّب بنفسك
درّبت انحدارًا خطيًا بالنزول بالميل على مدخل بقيم بين 0 و100000 دون توحيد، فصارت الخسارة inf بعد خطوات. ما السبب الأرجح؟
الميل يتضمّن ضرب الخطأ في قيمة المدخل، فمدخل بمئة ألف يعطي ميلًا بمئات الآلاف، ومعدّل تعلّم معقول لمدخل صغير يصير قفزة هائلة هنا. التوحيد أو تصغير معدّل التعلّم كثيرًا يحلّ المشكلة. هذا نفس الانفجار الذي رأيته بمعدّل 1.1 في درس المشتقة.
نموذج لوجستي أعطى احتمال 0.02 لحالة كانت فعلًا إيجابية. ماذا تفعل خسارة اللوغاريتم؟
الخسارة هي -log(0.02) أي نحو 3.9، وهي أكبر بكثير من خسارة حالة صُنّفت بثقة صحيحة. لهذا تكون الأخطاء الواثقة هي ما يحرّك الأوزان أكثر أثناء التدريب. وهذا أيضًا سبب حساسية النموذج للبيانات الموسومة خطأً.
بطاقات مراجعة سريعة
تحقق من فهمك
لماذا لا نستخدم الانحدار الخطي مباشرة للتصنيف، فنتنبّأ بـ0 أو 1 ونقرّب؟
لأن الخط المستقيم يعطي قيمًا خارج المدى، مثل 1.7 أو -0.4، لا تعني احتمالًا، ولأن نقطة واحدة بعيدة جدًّا، مثل طالب ذاكر مئة ساعة، تسحب الخط كله وتغيّر الحدّ بين الفئتين. السيغمويد تحصر المخرج بين 0 و1، وخسارة اللوغاريتم تهتم بالنقاط القريبة من الحدّ أكثر من البعيدة الواضحة.
عند أي قيمة لـ z يعطي السيغمويد 0.5 بالضبط، وماذا يعني ذلك للقرار؟
عند z = 0. فمع العتبة الافتراضية 0.5 يقع الحدّ بين الفئتين حيث يساوي المجموع الموزون صفرًا.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
توثيق رسمي1
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.