Logo
تعلم الآلة (2026-2027) - الانحدار اللوجستي

في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.

تعلم الآلة، الأسبوع 4

الانحدار اللوجستي

التنبؤ بنجاة راكب من ركاب تيتانيك (Titanic)، ومعرفة مدى ثقة النموذج في تنبؤه.

الأهداف

  • شرح كيف يحول الانحدار اللوجستي (logistic regression) الراكب إلى مجموع خطي (linear score) z، ثم احتمال (probability) p، ثم صنف (class)
  • حساب الدالة السينية (sigmoid) والاحتمال والتنبؤ يدويا من أوزان (weights) مدربة
  • تجهيز بيانات تيتانيك: الخصائص (features)، والهدف (target)، والترميز الأحادي (one-hot encoding)، والأعمار المفقودة
  • تدريب LogisticRegression وقراءة الدقة (accuracy) ومصفوفة الالتباس (confusion matrix) والضبط (precision) والاستدعاء (recall) ومقياس F1 (F1-score)
  • تحريك العتبة (threshold) وشرح المبادلة بين الضبط والاستدعاء
  • اختيار الخصائص والهدف لمشروعك

الأسبوع 4 من الخطة

موقع الدرس من المقرر

  • دفتران (notebooks): Titanic (Logistic Regression)، وهو نموذج مختصر على أربعة أعمدة، وLogistic_Regression_Classification، الذي يستكشف البيانات ويملأ القيم المفقودة (missing values) ويحسن الإعدادات
  • سيناريو من الواقع: نموذج تصنيف ثنائي (binary classification) يتنبأ هل سينجو الراكب أم لا، باستخدام مجموعة بيانات تيتانيك
  • مرحلة المشروع (project milestone) هذا الأسبوع: استخراج خصائص بيانات المشروع وتحديد المتغير الهدف (Project Data Features Extraction and Target Variable Identification)

خطة الساعتين

الجزءما نفعلهالزمن
1الفكرة، وراكب يدويا25 دقيقة
2الدفتر 1: التجهيز، والتدريب، وحساب النتيجة25 دقيقة
3التقييم: المصفوفة، والضبط، والاستدعاء، والعتبة20 دقيقة
4الدفتر 2: الاستكشاف، والملء، وتحسين الإعدادات؛ ومشروعك20 دقيقة
5الخلاصة، ثم تمارين مع الإجابات30 دقيقة

الجزء 1

فكرة الانحدار اللوجستي

مجموع، ثم ضغط، ثم قرار

ما الانحدار اللوجستي؟

الانحدار اللوجستي
خوارزمية تعلم غرضها التصنيف الثنائي: تتنبأ بأحد صنفين، 0 أو 1، وتعطي أيضا احتمال الصنف 1.
  1. المجموع: زن الخصائص وأضف الحد الثابت (bias)، فينتج عدد واحد هو z
  2. الضغط: تحول الدالة السينية z إلى احتمال p بين 0 و1
  3. القرار: قارن p بالعتبة؛ وتستخدم predict القيمة 0.5

المصطلحات على بيانات تيتانيك

المصطلحفي بيانات تيتانيك
الخصائص xأعمدة الإدخال: العمر، والجنس، ودرجة الراكب (passenger class)
الهدف ySurvived: 1 نجا، و0 لم ينج
الصنف الموجب (positive class)الصنف 1، الذي يعرض النموذج احتماله
الاحتمال pتقدير النموذج لاحتمال أن يكون y = 1
العتبة tالحد الفاصل على p: عند p ≥ t يكون التنبؤ 1، وإلا فهو 0

الخطوة 1: المجموع الخطي

z = b + w1 x1 + w2 x2 + ... + wn xn
  • من x_1 إلى x_n هي خصائص الراكب الواحد، وعددها n
  • من w_1 إلى w_n هي الأوزان التي تعلمها النموذج، في model.coef_
  • b هو الحد الثابت، في model.intercept_

الخطوة 2: الدالة السينية

p = σ(z) = 11 + e-z
  • e هو الثابت 2.71828
  • لأي قيمة z، تقع σ(z) بين 0 و1: أي أنها احتمال
  • σ(0) = 0.5: المجموع الخطي الذي يساوي صفرا يعني عدم التفضيل
  • القيمة z الموجبة الكبيرة تعطي p قريبا من 1؛ والقيمة z السالبة الكبيرة تعطي p قريبا من 0

مثال محلول: ثلاث قيم للدالة السينية

σ(2) = 11 + e-2 = 11 + 0.1353 = 0.8808
σ(-2) = 11 + e2 = 11 + 7.3891 = 0.1192

الخطوة 3: العتبة

p ≥ t ⇒ ŷ = 1
p < t ⇒ ŷ = 0
  • ŷ هو الصنف المتنبأ به وt هي العتبة
  • تستخدم predict القيمة t = 0.5، وσ(0) = 0.5، فهذا يساوي السؤال: هل z ≥ 0؟
  • تحققنا على نموذج الدفتر: تتفق predict وpredict_proba ≥ 0.5 على ركاب الاختبار الـ143 جميعا

جرب بنفسك: من راكب إلى احتمال

يدويا

مثال محلول: الأوزان المدربة

LogisticRegression(random_state=0) على ست خصائص، والأوزان مقربة إلى 3 منازل عشرية

الخاصيةالوزن
الحد الثابت b1.212
Age-0.039
Sex_female1.149
Sex_male-1.150
الخاصيةالوزن
Pclass_11.200
Pclass_20.007
Pclass_3-1.207

الخطوة 1: متجه الخصائص (feature vector)

أنثى عمرها 30 عاما تسافر في الدرجة الأولى

python
female = [[30, 1, 0, 1, 0, 0]]

الخطوة 2: المجموع الخطي

z = 1.212 + (-0.039)(30) + 1.149 + 1.200
z = 1.212 - 1.170 + 1.149 + 1.200 = 2.391

الخطوة 3: الاحتمال

p = 11 + e-2.391 = 11 + 0.0915 = 0.916

الخطوة 4: الصنف

p = 0.916 ≥ 0.5 ⇒ ŷ = 1

مثال محلول: رجل عمره 60 عاما في الدرجة الثالثة

male = [[60, 0, 1, 0, 0, 1]]

z = 1.212 + (-0.039)(60) + (-1.150) + (-1.207) = -3.485
p = 11 + e3.485 = 11 + 32.622 = 0.030 ⇒ ŷ = 0

الجزء 2

الدفتر 1: نموذج تيتانيك مختصر

أربعة أعمدة، ونموذج واحد، واحتمالات حقيقية

افتح الدفتر 1 في Colab

text
https://colab.research.google.com/github/
jeffprosise/Machine-Learning/blob/master/
Titanic%20(Logistic%20Regression).ipynb
اجمع الأسطر الثلاثة في عنوان واحد، أو استخدم رابط Colab في صفحة الدرس.
python
import pandas as pd

url = ("https://raw.githubusercontent.com/"
       "jeffprosise/Machine-Learning/master/Data/titanic.csv")
df = pd.read_csv(url)      # 891 rows, 12 columns

اختيار الخصائص والترميز

python
df = df[['Survived', 'Age', 'Sex', 'Pclass']]
df = pd.get_dummies(df, columns=['Sex', 'Pclass'])
df.dropna(inplace=True)      # 714 rows remain
  • احتفظ بالهدف Survived وثلاث خصائص: Age وSex وPclass
  • تقوم get_dummies بالترميز الأحادي: عمود جديد من 0/1 لكل قيمة، لأن النموذج يحتاج إلى أعداد
  • تحذف dropna 177 صفا بلا عمر: فيبقى 714 صفا، منها 424 راكبا لم ينجوا و290 راكبا نجوا

مثال محلول: ترميز راكبين

SexSex_femaleSex_male
male (الصف 0)01
female (الصف 1)10
PclassPclass_1Pclass_2Pclass_3
3 (الصف 0)001
1 (الصف 1)100

التقسيم والتدريب وحساب النتيجة

python
x = df.drop('Survived', axis=1)
y = df['Survived']
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.2, stratify=y, random_state=0)

model = LogisticRegression(random_state=0)
model.fit(x_train, y_train)
model.score(x_test, y_test)          # 0.8322
  • 571 صفا للتدريب و143 للاختبار؛ ويبقي stratify=y، أي التقسيم الطبقي (stratification)، نسبة الناجين عند 0.406 في الجزأين
  • الدقة 0.8322: صنف النموذج 119 راكبا من 143 من ركاب الاختبار تصنيفا صحيحا

الجزء 3

تقييم المصنف

أي الأخطاء، وكم عددها

مصفوفة الالتباس

مصفوفة الالتباس لنموذج الدفتر على 143 راكبا من ركاب الاختبار: 78 و7 في صف من لم ينجوا، و17 و41 في صف الناجين
  • الصفوف: الصنف الحقيقي. الأعمدة: التنبؤ
  • القطر، 78 و41، هو التنبؤات الصحيحة
  • 7 لم ينجوا لكن النموذج وصفهم بأنهم ناجون (FP)
  • 17 نجوا لكن النموذج وصفهم بأنهم لم ينجوا (FN)
python
from sklearn.metrics import ConfusionMatrixDisplay
ConfusionMatrixDisplay.from_estimator(
    model, x_test, y_test,
    display_labels=['Perished', 'Survived'],
    cmap='Blues')

مثال محلول: الدقة

A: الدقة، وN: كل ركاب الاختبار، وTN وTP: الخليتان الصحيحتان

التنبؤ 0التنبؤ 1
الفعلي 078 (TN)7 (FP)
الفعلي 117 (FN)41 (TP)
A = TN + TPN = 78 + 41143 = 0.832

مثال محلول: الضبط للصنف 1

التنبؤ 0التنبؤ 1
الفعلي 078 (TN)7 (FP)
الفعلي 117 (FN)41 (TP)
P = TPTP + FP = 4141 + 7 = 0.854

مثال محلول: الاستدعاء للصنف 1

التنبؤ 0التنبؤ 1
الفعلي 078 (TN)7 (FP)
الفعلي 117 (FN)41 (TP)
R = TPTP + FN = 4141 + 17 = 0.707

مثال محلول: مقياس F1

  • P = 0.854 وR = 0.707 من الشريحتين السابقتين
  • يجمع مقياس F1 بينهما: فلا يرتفع إلا إذا ارتفع كلاهما
F1 = 2 · P · RP + R = 2 · 0.854 · 0.7070.854 + 0.707 = 0.774

تقرير التصنيف

text
              precision    recall  f1-score   support

           0       0.82      0.92      0.87        85
           1       0.85      0.71      0.77        58

    accuracy                           0.83       143
   macro avg       0.84      0.81      0.82       143
weighted avg       0.83      0.83      0.83       143
print(classification_report(y_test, y_predicted))
  • يحمل الصف 1 قيمنا الثلاث، مقربة إلى منزلتين عشريتين
  • في الصف 0 يكون عدم النجاة هو الصنف الموجب: الضبط 78/95 = 0.821، والاستدعاء 78/85 = 0.918
  • يعد support ركاب الاختبار في كل صنف؛ ويقرأ الدفتر 2 قيمة F1 في الصف weighted avg

منحنى ROC

منحنى ROC لنموذج الدفتر على مجموعة الاختبار، والمساحة تحت المنحنى 0.88، وهو فوق القطر المتقطع
  • نقطة لكل عتبة ممكنة
  • المحور الرأسي: نسبة الناجين الذين وجدهم النموذج (الاستدعاء)
  • المحور الأفقي: نسبة غير الناجين الذين وصفوا خطأ بأنهم ناجون
  • القطر المتقطع: التخمين. المساحة تحت المنحنى 0.88؛ والقيمة 1.0 تعني نموذجا مثاليا
python
from sklearn.metrics import RocCurveDisplay
RocCurveDisplay.from_estimator(
    model, x_test, y_test)

تحريك العتبة

العتبةTN, FP, FN, TPالضبطالاستدعاء
0.368, 17, 7, 510.7500.879
0.578, 7, 17, 410.8540.707
0.783, 2, 30, 280.9330.483

جرب بنفسك: حرك العتبة

الجزء 4

الدفتر 2: الاستكشاف والملء وتحسين الإعدادات

الركاب الـ891 أنفسهم، بتنظيف أدق

افتح الدفتر 2 في Colab

text
https://colab.research.google.com/github/
tirthajyoti/Machine-Learning-with-Python/blob/master/
Classification/Logistic_Regression_Classification.ipynb
اجمع الأسطر الثلاثة في عنوان واحد، أو استخدم الرابط في صفحة الدرس.
python
url = ("https://raw.githubusercontent.com/tirthajyoti/"
       "Machine-Learning-with-Python/master/Datasets/titanic_train.csv")
train = pd.read_csv(url)      # the same 891 rows

استكشف قبل أن تبني النموذج

مخطط عد للعمود Survived حسب الجنس: لم ينج 468 رجلا و81 امرأة، ونجا 109 رجال و233 امرأة
نسبة الركاب الناجين حسب الدرجة: 0.630 في الأولى، و0.473 في الثانية، و0.242 في الثالثة
  • النساء: نجت 233 من 314 (0.742). الرجال: 109 من 577 (0.189)
  • تنخفض النجاة مع الدرجة: 0.630، و0.473، و0.242
  • وهذه هي الأعمدة التي حصلت على أكبر الأوزان في النموذج

ملء الأعمار المفقودة حسب الدرجة

python
a = list(train.groupby('Pclass')['Age'].mean())
def impute_age(cols):
    Age = cols['Age']
    Pclass = cols['Pclass']
    if pd.isnull(Age):
        if Pclass == 1:
            return a[0]
        elif Pclass == 2:
            return a[1]
        else:
            return a[2]
    else:
        return Age
train['Age'] = train[['Age', 'Pclass']].apply(impute_age, axis=1)

مثال محلول: عمر واحد بعد الملء

Pclassمتوسط العمرالأعمار المفقودة التي ملئت
138.2330
229.8811
325.14136

الحذف ثم الترميز

python
train.drop('Cabin', axis=1, inplace=True)
train.dropna(inplace=True)                 # 889 rows
train.drop(['PassengerId', 'Name', 'Ticket'], axis=1, inplace=True)

sex = pd.get_dummies(train['Sex'], drop_first=True)
embark = pd.get_dummies(train['Embarked'], drop_first=True)
train.drop(['Sex', 'Embarked'], axis=1, inplace=True)
train = pd.concat([train, sex, embark], axis=1)
  • العمود Cabin مفقود في 687 صفا: احذف العمود
  • المعرفات (identifiers) لا تقول شيئا عاما عن النجاة: ليست خصائص
  • drop_first=True: لا يبقى من Sex إلا male؛ ولا يبقى من Embarked إلا Q وS، والميناء C هو Q = 0, S = 0
  • النتيجة: الهدف Survived و8 خصائص

كيف يعتمد F1 على الإعدادات

فرق بضعة أجزاء من مئة بين نموذجين قد يأتي من التقسيم وحده

مقياس F1 مقابل العقوبة 1/C على محور لوغاريتمي: 0.63 عند عقوبة 1000، ثم يصعد إلى ما بين 0.83 و0.85 قرب عقوبة 5
مقياس F1 مقابل البذرة العشوائية للتقسيم، من 101 إلى 198: تقفز القيم بين 0.76 و0.86
  • الرسم الأول: قيمة C الصغيرة عقوبة (penalty) قوية على الأوزان؛ وعند 1/C = 1000 يهبط F1 إلى 0.63
  • الرسم الثاني: لا تتغير إلا البذرة العشوائية (random seed) للتقسيم، فيتحرك F1 بين 0.76 و0.86

تشغيل الدفتر 2 اليوم

pandas 3.0.6 وscikit-learn 1.9.1

في الدفترما يحدث الآنالإصلاح
cols[0]KeyError: 0cols['Age']
n_jobs=4FutureWarning: بلا أثراحذفه
max_iter=100ConvergenceWarning في 183 من 200 عملية ملاءمةmax_iter=1000
l[len(l)-2]قيم F1 نصية: فيختلط ترتيب المحورfloat(...)

قبل التمارين

الأخطاء الشائعة

  • قراءة ملف البيانات من مجلد غير موجود في Colab
  • إدخال عمود نصي مثل Sex إلى النموذج دون ترميزه
  • إبقاء المعرفات مثل PassengerId أو Name ضمن الخصائص
  • نسيان أن predict_proba تعيد عمودين: [:, 1] هو الصنف 1
  • الحكم على المصنف بالدقة وحدها
  • تتويج نموذج بسبب فرق قد يمحوه تقسيم آخر

مشروع فريقك

مرحلة المشروع: الخصائص والهدف

  1. سم المتغير الهدف (target variable): صنف، مثل Survived، أو عدد، مثل السعر
  2. اكتب الخصائص المرشحة؛ واحذف أعمدة المعرفات
  3. احسب القيم المفقودة باستخدام df.info(): احذف العمود، أو احذف الصفوف، أو املأ القيم
  4. رمز كل عمود نصي ترميزا أحاديا باستخدام pd.get_dummies
  5. اكتب قائمة الخصائص النهائية وأبعاد (shape) جدولك

الخلاصة

  1. الانحدار اللوجستي: مجموع خطي z، ثم الدالة السينية، ثم عتبة
  2. σ(0) = 0.5، لذا عند العتبة 0.5 يكون الصنف 1 عندما تكون z ≥ 0، وعندها فقط
  3. تحتاج النماذج إلى أعداد: رمز الأعمدة النصية، واحذف القيم المفقودة أو املأها
  4. قيم على بيانات الاختبار: مصفوفة الالتباس، والدقة، والضبط، والاستدعاء، وF1
  5. تحريك العتبة يبادل الضبط بالاستدعاء
  6. قد يضلل تقسيم واحد: استخدم التحقق المتقاطع

الجزء 5

التمارين: دورك

نحو 30 دقيقة، والإجابات تلي كل مهمة

نحو 10 دقائق

التمرين 1: راكبان يدويا

  • الأوزان: b = 1.212، وAge -0.039، وSex_female 1.149، وSex_male -1.150، وPclass_1 1.200، وPclass_2 0.007، وPclass_3 -1.207
  • الراكب 1: صبي عمره 8 سنوات في الدرجة الثانية
  • الراكب 2: رجل عمره 30 عاما في الدرجة الأولى
  • لكل منهما: متجه الخصائص، ثم z وp والصنف عند العتبة 0.5

الإجابات

التمرين 1: الإجابات

الراكبالمتجه xالمجموع zp والصنف
صبي، 8، الدرجة 2[8, 0, 1, 0, 1, 0]1.212 - 0.312 - 1.150 + 0.007 = -0.2431 / (1 + 1.2751) = 0.440، الصنف 0
رجل، 30، الدرجة 1[30, 0, 1, 1, 0, 0]1.212 - 1.170 - 1.150 + 1.200 = 0.0921 / (1 + 0.9121) = 0.523، الصنف 1

نحو 5 دقائق

التمرين 2: المصفوفة عند العتبة 0.3

التنبؤ 0التنبؤ 1
الفعلي 06817
الفعلي 1751
A = 119143 = 0.832
P = 5168 = 0.750
R = 5158 = 0.879

نحو 5 دقائق

التمرين 3: الملء والترميز يدويا

الراكبPclassAgeEmbarked
A140C
B1مفقودS
C150S
D230S
الراكبPclassAgeEmbarked
E2مفقودQ
F320S
G3مفقودS
H328Q

نحو 10 دقائق

التمرين 4: في Colab

  1. شغل الدفتر 1 حتى model.score، مع قراءة البيانات من الرابط
  2. اطبع احتمال النجاة للمتجه [[8, 0, 1, 0, 1, 0]]
  3. تنبأ بمجموعة الاختبار عند العتبة 0.4 واطبع مصفوفة الالتباس والتقرير
  4. أي من الضبط والاستدعاء للصنف 1 ارتفع؟
السؤالالإجابة
احتمال الصبي43.9%، الصنف 0
المصفوفة عند 0.4[[75, 10], [10, 48]]
الاستدعاء للصنف 1ارتفع، من 0.71 إلى 0.83
الضبط للصنف 1انخفض، من 0.85 إلى 0.83

افتح هذا الدرس

Mahmoud Abasالانحدار اللوجستي