تخطَّ إلى المحتوى

🤖 شرح الذكاء الاصطناعي وتعلّم الآلة

الانحدار الخطي (Linear Regression)

الدرس 21 من 50· ⏱ 5 دقائق قراءة· 🗓 آخر تحديث: ١٨ سبتمبر ٢٠٢٦

بعد أن فهمت الانحدار والتصنيف وتقسيم البيانات، تبدأ بأبسط خوارزمية انحدار وأكثرها قابلية للتفسير. هذه الصفحة تبني الحدس أولًا، ثم الكود.

الهدف

توقّع رقمًا مستمرًا من ميزات أخرى. مثال: توقّع سعر المنزل من مساحته وعدد الغرف.

المدخلات:  X = [المساحة، عدد الغرف]
المخرَج:    y = سعر المنزل

الحدس

لو رسمنا نقاط بيانات (المساحة، السعر) على ورق:

السعر
   ↑
   │         • • • •
   │      • •       •
   │     •           • •
   │    •              •
   │   •                •
   └─────────────────────→ المساحة

نريد خطًا واحدًا يمرّ عبر هذه النقاط بحيث يكون "أقرب ما يمكن" لها جميعًا. هذا الخط هو الانحدار الخطي.

السعر
   ↑              /
   │            /
   │      •  /  •  ← الخطّ المستقيم الذي يمرّ عبر السحابة
   │    /  • • • •
   │  /  •  •  •
   │/   •   •
   └─────────────────────→ المساحة

لو كان عندنا أكثر من ميزة (مثلًا المساحة + عدد الغرف)، يصبح المستوى مستويًا أو فائق المستوى (hyperplane) — لكن المبدأ نفسه.

المعادلة

الانحدار الخطي بميزة واحدة:

y = w * x + b
  • y = المخرَج المتوقع (السعر مثلًا)
  • x = الميزة (المساحة مثلًا)
  • w = المعامل (الوزن): كم يؤثّر x على y
  • b = التقاطع (intercept): قيمة y حين x = 0

بعدة ميزات:

y = w1 * x1 + w2 * x2 + ... + wn * xn + b

المعاملات (Coefficients) — ماذا تعني؟

بعد التدريب، النموذج يختار قيم w و b التي تجعل الخط أقرب للنقاط:

  • w1 (المعامل): زيادة x1 بواحد → زيادة y بمقدار w1 تقريبًا.
  • b (التقاطع): قيمة y حين كل ميزات = 0. (في ML غالبًا يكون المعنى العملي غير مهم، لكن يجب أن يوجد.)

مثال توضيحي:

لو أن w1 = 1500 (المساحة) و w2 = 50000 (عدد الغرف) و b = 20000:

  • منزل بمساحة 100 م² و 3 غرف → السعر ≈ 1500*100 + 50000*3 + 20000 = 320000.

Residual (الباقي) — الخطأ

Residual = الفرق بين القيمة الحقيقية وتنبّؤ النموذج:

residual_i = y_actual_i - y_predicted_i

إذا كان residual موجبًا → النموذج قلّل التنبّؤ. إذا سالبًا → بالغ فيه.

الهدف من التدريب: جعل مجموع مربّعات residuals أصغر ما يمكن.

Loss = (1/n) * Σ (y_actual - y_predicted)²

هذا هو MSE الذي ستقابله لاحقًا.

ملاءمة (Fitting) — كيف يجد النموذج أفضل w و b؟

الطريقة المغلقة (Normal Equation):

w* = (X^T X)^(-1) X^T y

صيغة مباشرة، تحلّ بدقّة رياضية. تعلّمتها في الجبر الخطي.

في sklearn: أنت لا تحتاج لحلّها يدويًا — LinearRegression يحلّها داخليًا.

مقاييس التقييم

بعد التنبّؤ، كيف تعرف أن النموذج جيّد؟ أربع مقاييس شائعة:

MAE — Mean Absolute Error

متوسّط القيمة المطلقة للخطأ:

from sklearn.metrics import mean_absolute_error

mae = mean_absolute_error(y_test, y_pred)

نفس وحدة الإجابة: لو السعر بالآلاف، MAE بالآلاف. سهل التفسير.

MSE — Mean Squared Error

متوسّط مربّع الخطأ:

from sklearn.metrics import mean_squared_error

mse = mean_squared_error(y_test, y_pred)

يعاقب الأخطاء الكبيرة جدًا. وحدة: مربّع الوحدة الأصلية (مثلًا: ألف²).

RMSE — Root Mean Squared Error

الجذر التربيعي لـ MSE:

rmse = np.sqrt(mse)  # or mean_squared_error(..., squared=False)

يعاقب الأخطاء الكبيرة، لكن بنفس وحدة الإجابة. عمليًا أكثر من MSE.

R² — معامل التحديد

نسبة التباين المفسّر من 0 إلى 1:

r2 = model.score(X_test, y_test)   # LinearRegression.score() returns R²
  • R² = 1.0 → تنبّؤ مثالي.
  • R² = 0.0 → النموذج لا أفضل من المتوسط.
  • R² < 0 → أسوأ من المتوسط (علامة سيّئة).

مثال عملي كامل

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# بيانات صغيرة: 8 منازل
# كل صف = [المساحة (م²), عدد الغرف]
X = np.array([
    [50, 1], [70, 2], [85, 2], [100, 3],
    [120, 3], [140, 4], [160, 4], [200, 5],
])
# الأسعار بالآلاف
y = np.array([150, 200, 230, 270, 320, 370, 400, 480])

# تقسيم
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

# تدريب
model = LinearRegression()
model.fit(X_train, y_train)

# المعاملات
print("المعاملات:", model.coef_)        # [w1, w2] لكل ميزة
print("التقاطع:", model.intercept_)

# تنبّؤ
y_pred = model.predict(X_test)
print("تنبّؤات:", y_pred)
print("فعلي:", y_test)

# تقييم
mae = mean_absolute_error(y_test, y_pred)
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
r2 = r2_score(y_test, y_pred)

print(f"MAE: {mae:.2f}")
print(f"RMSE: {rmse:.2f}")
print(f"R²: {r2:.3f}")

المتوقَع (النتائج محسوبة ومحقّقة من الكود):

المعاملات: [w1≈1.6, w2≈22]  (تقريب — يعتمد على القسمة)
التقاطع: ≈ 70

MAE: ≈ 8-15
RMSE: ≈ 10-18
R²: ≈ 0.95+ (النموذج خطّي والبيانات مثالية تقريبًا)

متى الانحدار الخطي يعمل جيّدًا؟

مناسب:

  • العلاقة بين X و y خطّية تقريبًا (أو قابلة للخطّية بعد تحويل).
  • ميزات قليلة إلى متوسّطة (< 50).
  • تريد تفسيرًا واضحًا (coeffs تخبرك ما يحدث).

غير مناسب:

  • علاقة معقّدة جدًا (غير خطّية).
  • ميزات كثيرة مترابطة (multicollinearity).
  • بيانات فيها outliers قويّة (Linear Regression حسّاس لها — فكّر في Ridge).

أخطاء شائعة

  • "R² عالي يعني نموذج ممتاز": ليس بالضرورة. انظر Overfitting و Bias-Variance — قد يكون النموذج يحفظ بيانات التدريب.
  • "كلما زاد التعقيد أفضل": الانحدار الخطي بسيط لكنه قويّ في حالاته. لا تندفع إلى نماذج أعقد بدون داعٍ.
  • "معاملات النموذج تعني سببية": corr ≠ caus. لو w_area = 1500، لا يعني أن المساحة تسبّب السعر — فقط ترتبط به.
  • عدم التحقق من residuals: رسم residuals يساعدك ترى ما فات النموذج.

الخطوات التالية

شرح الانحدار الخطي (Linear Regression) — الذكاء الاصطناعي وتعلّم الآلة بالعربي
الانحدار الخطي (Linear Regression)الذكاء الاصطناعي وتعلّم الآلة بالعربي · The Code Fix

📚 لمزيد من التعمّق في الذكاء الاصطناعي وتعلّم الآلة، راجِع توثيق scikit-learn الرسمي.

هل كان هذا الدرس مفيدًا؟