EduFlow

الوحدة 2 · الانحدار

الانحدار الخطي ومقاييسه

22 دقراءة 3 دتمرين Python

الدرس في لمحة

درّب نموذج انحدار خطي باستخدام scikit-learn، واقرأ الـ intercept والمعاملات، واحكم عليه بمقاييس MAE وRMSE وR² مقارنةً بخط أساس يتنبأ بالمتوسط.

  1. 1feature واحد، وخط واحد
  2. 2البواقي ودالة الخسارة
  3. 3الـ features العشرة كلها
  4. 4قياس نموذج الانحدار

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

انقطاع العملاء سؤال إجابته نعم أو لا، وستعود إليه في القسم 3. الانحدار يأتي أولًا لأن أبسط نماذجه، الخط المستقيم، يتيح لك أن ترى بالضبط ما يعنيه “التعلّم”: اختيار أرقام تجعل التنبؤات تخطئ بأقل قدر ممكن.

البيانات هي مجموعة بيانات السكري في scikit-learn: 442 مريضًا، لكلٍّ منهم عشرة قياسات أولية (العمر والجنس ومؤشر كتلة الجسم وضغط الدم وست قراءات لمصل الدم s1–s6)، وهدف يقيس مدى تقدّم المرض بعد عام. الـ features ممركزة ومُعايَرة مسبقًا، ولهذا تبدو ككسور عشرية صغيرة.

feature واحد، وخط واحد

ابدأ بمؤشر كتلة الجسم وحده. يتنبأ الانحدار الخطي بـ progression = intercept + coef * bmi، ويختار fit الرقمين.

Python
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X, y = load_diabetes(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

line = LinearRegression().fit(X_train[["bmi"]], y_train)
print("intercept:", round(line.intercept_, 1))
print("coef for bmi:", round(line.coef_[0], 1))
print("first predictions:", line.predict(X_test[["bmi"]])[:3].round(1))

الـ intercept (الجزء المقطوع، 152) هو التنبؤ عند مؤشر كتلة جسم متوسط، لأن الـ feature ممركز عند 0. والمعامل (975) هو الميل: وحدة واحدة من مؤشر كتلة الجسم المُعايَر هذا تضيف 975 إلى التنبؤ. لاحظ الأقواس المزدوجة في X_train[["bmi"]]: يريد scikit-learn جدولًا ثنائي الأبعاد حتى مع feature واحد.

البواقي ودالة الخسارة

كيف اختار fit هذين الرقمين؟ لكل مريض، الباقي (residual) هو القيمة الفعلية ناقص القيمة المتنبأ بها: أي الفجوة العمودية بين النقطة والخط. وتختار طريقة المربعات الصغرى العادية (ordinary least squares) الـ intercept والميل اللذين يجعلان مجموع مربعات البواقي أصغر ما يمكن. هذا المجموع، أي الشيء الذي نسعى إلى تصغيره، هو دالة الخسارة (loss).

نقاط مبعثرة حول خط صاعد. قطع عمودية متقطعة تصل كل نقطة بالخط؛ تُربَّع هذه البواقي وتُجمع، وتختار المربعات الصغرى الخطَّ الذي يجعل هذا المجموع أصغر ما يمكن. bmi تقدّم المرض باقٍ
البواقي هي الفجوات العمودية بين النقاط والخط

التربيع يؤدي مهمتين: يجعل كل خطأ يُحسب موجبًا، ويجعل الأخطاء الكبيرة تُحسب أكثر بكثير من الصغيرة. خطأ مقداره 20 يكلّف 400؛ وخطأ مقداره 40 يكلّف 1,600. تذكّر هذا، لأنه يفسّر الفرق بين مقياسين من المقاييس أدناه.

الـ features العشرة كلها

الانحدار المتعدد هو الفكرة نفسها مع حدود أكثر: معامل لكل feature، إضافة إلى الـ intercept.

Python
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X, y = load_diabetes(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

model = LinearRegression().fit(X_train, y_train)
for name, coef in zip(X.columns, model.coef_):
    print(f"{name:>4} {coef:8.1f}")

قياس نموذج الانحدار

تعطيك score قيمة R²، لكن عليك أن تعرف ثلاثة مقاييس ومتى يناسب كلٌّ منها.

Python
from sklearn.datasets import load_diabetes
from sklearn.dummy import DummyRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, root_mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

X, y = load_diabetes(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

models = {
    "mean (dummy)": (DummyRegressor(), X.columns),
    "bmi only": (LinearRegression(), ["bmi"]),
    "all features": (LinearRegression(), X.columns),
}
for name, (model, cols) in models.items():
    pred = model.fit(X_train[cols], y_train).predict(X_test[cols])
    print(f"{name:13} MAE {mean_absolute_error(y_test, pred):5.1f}  "
          f"RMSE {root_mean_squared_error(y_test, pred):5.1f}  R2 {r2_score(y_test, pred):6.3f}")
  • MAE (متوسط الخطأ المطلق) هو متوسط حجم الخطأ، بوحدات الهدف. “نخطئ في المتوسط بـ 42 نقطة” جملة يفهمها الطبيب أو المدير. استخدمه للتواصل.
  • RMSE (الجذر التربيعي لمتوسط مربعات الأخطاء) هو الجذر التربيعي لمتوسط الخطأ المربّع، وهو أيضًا بوحدات الهدف. وبسبب التربيع، فهو دائمًا لا يقل عن MAE، ويكون أكبر منه بكثير حين تكون بعض التنبؤات خاطئة بشدة. استخدمه حين تكون كلفة الأخطاء الكبيرة غير متناسبة.
  • R² يقارن الخطأ المربّع للنموذج بخطأ التنبؤ الدائم بالمتوسط: 1 يعني الكمال، و0 يعني أنه ليس أفضل من التنبؤ بالمتوسط، والقيمة السالبة تعني أنه أسوأ من المتوسط. لا وحدة له، فهو مفيد لمقارنة النماذج على البيانات نفسها، لكنه يُخفي حجم الأخطاء الحقيقي.

يخفض النموذج الكامل MAE من 65.5 (خط أساس المتوسط) إلى 41.5 ويفسّر نحو نصف التباين. هذا تقدّم صادق، وتذكير أيضًا بأن نصف ما يحرّك هذا المرض ليس موجودًا في هذه الأعمدة العشرة.

استخدمت fit كصندوق أسود يُعيد أفضل خط. الدرس القادم يفتح الصندوق: ستكتب بنفسك عملية البحث عن أفضل خط باستخدام الـ gradient descent، وهي الفكرة نفسها التي تُدرَّب بها الشبكات العصبية.

أهم النقاط

  • يتنبأ الانحدار الخطي بـ intercept + coef1 * x1 + coef2 * x2 + … ويختار الأرقام التي تجعل مجموع مربعات البواقي أصغر ما يمكن.
  • الباقي (residual) هو القيمة الفعلية ناقص القيمة المتنبأ بها؛ وكل مقياس انحدار هو تلخيص مختلف للبواقي.
  • MAE هو الخطأ المعتاد بوحدات الهدف نفسها؛ وRMSE بالوحدات نفسها لكنه يعاقب الأخطاء الكبيرة أكثر.
  • R² هو نسبة التباين المفسَّرة مقارنةً بالتنبؤ الدائم بالمتوسط: 0 يعني أنه ليس أفضل من المتوسط، ويمكن أن يصبح سالبًا.
  • معاملات الـ features المترابطة قد تكون كبيرة ومتعاكسة الإشارة، فلا تقرأها على أنها أهمية أو سببية.

قراءات إضافية

تحقّق من فهمك

3 أسئلة

السؤال 1 من 3

نموذج يتنبأ بإنفاق العام القادم قيمة MAE فيه 40 دولارًا وRMSE فيه 150 دولارًا. ماذا توحي هذه الفجوة؟

السؤال 2 من 3

يحقق نموذج قيمة R² = -0.2 على بيانات الاختبار. ماذا يعني ذلك؟

السؤال 3 من 3

في نموذج السكري، معامل s1 هو -918 ومعامل s2 هو +508. وكلاهما قياس دم متعلّق بالكوليسترول. ما القراءة الأكثر أمانًا؟

تدريب

تمرين Python

انحدار بثلاثة features، مقيس بثلاث طرق

درّب LinearRegression على مؤشر كتلة الجسم وضغط الدم وs5 (الأعمدة الموجودة في cols) وقِسه على بيانات الاختبار.

  • model: نموذج الانحدار المدرَّب.
  • pred: تنبؤاته لـ X_test[cols].
  • mae وrmse وr2: المقاييس الثلاثة من هذا الدرس، محسوبة على بيانات الاختبار.
from sklearn.datasets import load_diabetes
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, root_mean_squared_error, r2_score
from sklearn.model_selection import train_test_split

X, y = load_diabetes(return_X_y=True, as_frame=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
cols = ["bmi", "bp", "s5"]

# 1. Fit a LinearRegression on the three columns in `cols`
model = LinearRegression()

# 2. Predict on the test rows and compute the three metrics
pred = None
mae = None
rmse = None
r2 = None
جارٍ تحميل المحرّر…

Ctrl/⌘ + Enter للتشغيل · يعمل في بيئة معزولة داخل متصفّحك. لا شيء يغادر جهازك.

(لا مخرجات)

الفحوص

  • model نموذج انحدار مدرَّب على ثلاثة features
  • pred يحتوي تنبؤات بيانات الاختبار
  • mae هو متوسط الخطأ المطلق
  • rmse هو الجذر التربيعي لمتوسط مربعات الأخطاء
  • r2 هو قيمة R² على بيانات الاختبار (وRMSE ≥ MAE)