Linear Regression — تعلم الآلة
الانحدار الخطي (Linear Regression)
أبسط نموذج للتنبؤ بقيمة رقمية: السعر، الدرجة، المبيعات. ومع بساطته، هو خط الأساس الذي يجب أن تتفوق عليه أي خوارزمية أعقد.
الفكرة
نبحث عن خط يمر "بأقرب ما يمكن" من النقاط:
ŷ = w·x + b
ŷ : التنبؤ
w : الميل (كم يزيد ŷ عندما يزيد x بواحد)
b : القاطع (قيمة ŷ عندما x = 0)ومع عدة ميزات (المساحة، عدد الغرف، العمر): ŷ = w₁x₁ + w₂x₂ + w₃x₃ + b. كل وزن يقول تأثير ميزته مع ثبات الأخرى.
كيف يجد أفضل خط؟
لكل نقطة خطأ = الفعلي − التنبؤ. نريد خطاً يجعل مجموع مربعات الأخطاء أصغر ما يمكن (طريقة المربعات الصغرى). التربيع يجعل الأخطاء الكبيرة مكلفة جداً ويمنع الموجب والسالب من إلغاء بعضهما.
import numpy as np
x = np.array([50, 80, 100, 120, 150], dtype=float) # المساحة
y = np.array([155, 236, 305, 352, 458], dtype=float) # السعر بالألف
# الحل المباشر للميل والقاطع
w = ((x - x.mean()) * (y - y.mean())).sum() / ((x - x.mean()) ** 2).sum()
b = y.mean() - w * x.mean()
print(f"ŷ = {w:.2f}·x + {b:.2f}")
print("تنبؤ لمساحة 130:", round(w * 130 + b, 1))هذا ما تفعله LinearRegression داخلياً (بشكل عام لأي عدد ميزات).
مقاييس التقييم
| المقياس | المعنى | ملاحظة |
|---|---|---|
| MAE | متوسط الخطأ المطلق | بنفس وحدة الهدف: "نخطئ بـ 12 ألفاً في المتوسط" — سهل الشرح |
| RMSE | جذر متوسط مربع الخطأ | بنفس الوحدة، ويعاقب الأخطاء الكبيرة أكثر |
| R² | نسبة التباين الذي يفسره النموذج | 1 مثالي، 0 = ليس أفضل من التنبؤ بالمتوسط دائماً، وقد يكون سالباً |
⚠️ R² يحتاج عدة عينات اختبار؛ على عينة واحدة غير معرّف. ولا تقيّم على بيانات التدريب: النموذج رآها.
افتراضات يجب أن تعرفها
- العلاقة خطية تقريباً. إن كانت منحنية، أضف ميزات (x²) أو استخدم نموذجاً آخر.
- حساس للقيم الشاذة: منزل واحد بسعر خاطئ (صفر زائد) يميل الخط كله.
- لا يستقرئ بأمان خارج مدى بيانات التدريب: تنبؤ لمساحة 1000م² وقد تدربت على 50–150 مجرد تخمين.
تمرين
شغّل المثال الكامل، ثم أضف منزلاً شاذاً (مساحة 90 وسعر 900) لبيانات التدريب ولاحظ كيف يتغير الميل و MAE. جرّب بعدها HuberRegressor (أقل حساسية للشواذ).
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
rng = np.random.default_rng(42)
# بيانات مصطنعة واقعية: السعر (بالألف) ≈ 3 × المساحة + 20 + ضوضاء
area = rng.uniform(50, 200, size=60)
price = 3 * area + 20 + rng.normal(0, 25, size=60)
X = area.reshape(-1, 1) # X يجب أن يكون ثنائي الأبعاد
X_train, X_test, y_train, y_test = train_test_split(X, price, test_size=0.25, random_state=42)
model = LinearRegression()
model.fit(X_train, y_train)
print(f"الميل: {model.coef_[0]:.2f} ألف لكل م²، القاطع: {model.intercept_:.1f}")
y_pred = model.predict(X_test) # التقييم على بيانات لم يرها النموذج
print(f"MAE : {mean_absolute_error(y_test, y_pred):.1f} ألف")
print(f"RMSE: {np.sqrt(mean_squared_error(y_test, y_pred)):.1f} ألف")
print(f"R² : {r2_score(y_test, y_pred):.3f} (على {len(y_test)} عينة اختبار)")
for a in [80, 130]:
print(f"منزل {a}م² ← {model.predict([[a]])[0]:.0f} ألف")اختبر فهمك