الوحدة 2 · الانحدار
الانحدار الخطي ومقاييسه
22 دقراءة 3 دتمرين Python
الدرس في لمحة
درّب نموذج انحدار خطي باستخدام scikit-learn، واقرأ الـ intercept والمعاملات، واحكم عليه بمقاييس MAE وRMSE وR² مقارنةً بخط أساس يتنبأ بالمتوسط.
لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.
انقطاع العملاء سؤال إجابته نعم أو لا، وستعود إليه في القسم 3. الانحدار يأتي أولًا لأن أبسط نماذجه، الخط المستقيم، يتيح لك أن ترى بالضبط ما يعنيه “التعلّم”: اختيار أرقام تجعل التنبؤات تخطئ بأقل قدر ممكن.
البيانات هي مجموعة بيانات السكري في scikit-learn: 442 مريضًا، لكلٍّ منهم عشرة قياسات أولية (العمر والجنس ومؤشر كتلة الجسم وضغط الدم وست قراءات لمصل الدم s1–s6)، وهدف يقيس مدى تقدّم المرض بعد عام. الـ features ممركزة ومُعايَرة مسبقًا، ولهذا تبدو ككسور عشرية صغيرة.
feature واحد، وخط واحد
ابدأ بمؤشر كتلة الجسم وحده. يتنبأ الانحدار الخطي بـ progression = intercept + coef * bmi، ويختار fit الرقمين.
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).
التربيع يؤدي مهمتين: يجعل كل خطأ يُحسب موجبًا، ويجعل الأخطاء الكبيرة تُحسب أكثر بكثير من الصغيرة. خطأ مقداره 20 يكلّف 400؛ وخطأ مقداره 40 يكلّف 1,600. تذكّر هذا، لأنه يفسّر الفرق بين مقياسين من المقاييس أدناه.
الـ features العشرة كلها
الانحدار المتعدد هو الفكرة نفسها مع حدود أكثر: معامل لكل feature، إضافة إلى الـ intercept.
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²، لكن عليك أن تعرف ثلاثة مقاييس ومتى يناسب كلٌّ منها.
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 المترابطة قد تكون كبيرة ومتعاكسة الإشارة، فلا تقرأها على أنها أهمية أو سببية.