بعد أن فهمت الانحدار والتصنيف وتقسيم البيانات، تبدأ بأبسط خوارزمية انحدار وأكثرها قابلية للتفسير. هذه الصفحة تبني الحدس أولًا، ثم الكود.
الهدف
توقّع رقمًا مستمرًا من ميزات أخرى. مثال: توقّع سعر المنزل من مساحته وعدد الغرف.
المدخلات: X = [المساحة، عدد الغرف]
المخرَج: y = سعر المنزل
الحدس
لو رسمنا نقاط بيانات (المساحة، السعر) على ورق:
السعر
↑
│ • • • •
│ • • •
│ • • •
│ • •
│ • •
└─────────────────────→ المساحة
نريد خطًا واحدًا يمرّ عبر هذه النقاط بحيث يكون "أقرب ما يمكن" لها جميعًا. هذا الخط هو الانحدار الخطي.
السعر
↑ /
│ /
│ • / • ← الخطّ المستقيم الذي يمرّ عبر السحابة
│ / • • • •
│ / • • •
│/ • •
└─────────────────────→ المساحة
لو كان عندنا أكثر من ميزة (مثلًا المساحة + عدد الغرف)، يصبح المستوى مستويًا أو فائق المستوى (hyperplane) — لكن المبدأ نفسه.
المعادلة
الانحدار الخطي بميزة واحدة:
y = w * x + b
y= المخرَج المتوقع (السعر مثلًا)x= الميزة (المساحة مثلًا)w= المعامل (الوزن): كم يؤثّر x على yb= التقاطع (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 يساعدك ترى ما فات النموذج.
الخطوات التالية
- الانحدار والتصنيف — الأساس.
- scikit-learn: أول نموذج — الكود أعلاه بالتفصيل.
- Pipelines و preprocessing — تطبيع البيانات، ترميز الفئات.
- مشروع: توقع أسعار المنازل — تطبيق عملي كامل.
- Model selection و tuning — ضبط hyperparameters.