في نافذة الطباعة اختر «حفظ كملف 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) |
الهدف y | Survived: 1 نجا، و0 لم ينج |
| الصنف الموجب (positive class) | الصنف 1، الذي يعرض النموذج احتماله |
الاحتمال p | تقدير النموذج لاحتمال أن يكون y = 1 |
العتبة t | الحد الفاصل على p: عند p ≥ t يكون التنبؤ 1، وإلا فهو 0 |
الخطوة 1: المجموع الخطي
- ▸من
x_1إلىx_nهي خصائص الراكب الواحد، وعددهاn - ▸من
w_1إلىw_nهي الأوزان التي تعلمها النموذج، فيmodel.coef_ - ▸
bهو الحد الثابت، فيmodel.intercept_
الخطوة 2: الدالة السينية
- ▸
eهو الثابت 2.71828 - ▸لأي قيمة
z، تقعσ(z)بين 0 و1: أي أنها احتمال - ▸
σ(0) = 0.5: المجموع الخطي الذي يساوي صفرا يعني عدم التفضيل - ▸القيمة
zالموجبة الكبيرة تعطيpقريبا من 1؛ والقيمةzالسالبة الكبيرة تعطيpقريبا من 0
مثال محلول: ثلاث قيم للدالة السينية
الخطوة 3: العتبة
- ▸
ŷهو الصنف المتنبأ به وtهي العتبة - ▸تستخدم
predictالقيمةt = 0.5، وσ(0) = 0.5، فهذا يساوي السؤال: هلz ≥ 0؟ - ▸تحققنا على نموذج الدفتر: تتفق
predictوpredict_proba ≥ 0.5على ركاب الاختبار الـ143 جميعا
جرب بنفسك: من راكب إلى احتمال
يدويا
مثال محلول: الأوزان المدربة
LogisticRegression(random_state=0) على ست خصائص، والأوزان مقربة إلى 3 منازل عشرية
| الخاصية | الوزن |
|---|---|
الحد الثابت 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: متجه الخصائص (feature vector)
أنثى عمرها 30 عاما تسافر في الدرجة الأولى
female = [[30, 1, 0, 1, 0, 0]]الخطوة 2: المجموع الخطي
الخطوة 3: الاحتمال
الخطوة 4: الصنف
مثال محلول: رجل عمره 60 عاما في الدرجة الثالثة
male = [[60, 0, 1, 0, 0, 1]]
الجزء 2
الدفتر 1: نموذج تيتانيك مختصر
أربعة أعمدة، ونموذج واحد، واحتمالات حقيقية
افتح الدفتر 1 في Colab
https://colab.research.google.com/github/
jeffprosise/Machine-Learning/blob/master/
Titanic%20(Logistic%20Regression).ipynbimport pandas as pd
url = ("https://raw.githubusercontent.com/"
"jeffprosise/Machine-Learning/master/Data/titanic.csv")
df = pd.read_csv(url) # 891 rows, 12 columnsاختيار الخصائص والترميز
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 لكل قيمة، لأن النموذج يحتاج إلى أعداد - ▸تحذف
dropna177 صفا بلا عمر: فيبقى 714 صفا، منها 424 راكبا لم ينجوا و290 راكبا نجوا
مثال محلول: ترميز راكبين
| Sex | Sex_female | Sex_male |
|---|---|---|
| male (الصف 0) | 0 | 1 |
| female (الصف 1) | 1 | 0 |
| Pclass | Pclass_1 | Pclass_2 | Pclass_3 |
|---|---|---|---|
| 3 (الصف 0) | 0 | 0 | 1 |
| 1 (الصف 1) | 1 | 0 | 0 |
التقسيم والتدريب وحساب النتيجة
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
تقييم المصنف
أي الأخطاء، وكم عددها
مصفوفة الالتباس

- ▸الصفوف: الصنف الحقيقي. الأعمدة: التنبؤ
- ▸القطر، 78 و41، هو التنبؤات الصحيحة
- ▸7 لم ينجوا لكن النموذج وصفهم بأنهم ناجون (FP)
- ▸17 نجوا لكن النموذج وصفهم بأنهم لم ينجوا (FN)
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 | |
|---|---|---|
| الفعلي 0 | 78 (TN) | 7 (FP) |
| الفعلي 1 | 17 (FN) | 41 (TP) |
مثال محلول: الضبط للصنف 1
| التنبؤ 0 | التنبؤ 1 | |
|---|---|---|
| الفعلي 0 | 78 (TN) | 7 (FP) |
| الفعلي 1 | 17 (FN) | 41 (TP) |
مثال محلول: الاستدعاء للصنف 1
| التنبؤ 0 | التنبؤ 1 | |
|---|---|---|
| الفعلي 0 | 78 (TN) | 7 (FP) |
| الفعلي 1 | 17 (FN) | 41 (TP) |
مثال محلول: مقياس F1
- ▸
P = 0.854وR = 0.707من الشريحتين السابقتين - ▸يجمع مقياس F1 بينهما: فلا يرتفع إلا إذا ارتفع كلاهما
تقرير التصنيف
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- ▸يحمل الصف
1قيمنا الثلاث، مقربة إلى منزلتين عشريتين - ▸في الصف
0يكون عدم النجاة هو الصنف الموجب: الضبط78/95 = 0.821، والاستدعاء78/85 = 0.918 - ▸يعد
supportركاب الاختبار في كل صنف؛ ويقرأ الدفتر 2 قيمة F1 في الصف weighted avg
منحنى ROC

- ▸نقطة لكل عتبة ممكنة
- ▸المحور الرأسي: نسبة الناجين الذين وجدهم النموذج (الاستدعاء)
- ▸المحور الأفقي: نسبة غير الناجين الذين وصفوا خطأ بأنهم ناجون
- ▸القطر المتقطع: التخمين. المساحة تحت المنحنى 0.88؛ والقيمة 1.0 تعني نموذجا مثاليا
from sklearn.metrics import RocCurveDisplay
RocCurveDisplay.from_estimator(
model, x_test, y_test)تحريك العتبة
| العتبة | TN, FP, FN, TP | الضبط | الاستدعاء |
|---|---|---|---|
| 0.3 | 68, 17, 7, 51 | 0.750 | 0.879 |
| 0.5 | 78, 7, 17, 41 | 0.854 | 0.707 |
| 0.7 | 83, 2, 30, 28 | 0.933 | 0.483 |
جرب بنفسك: حرك العتبة
الجزء 4
الدفتر 2: الاستكشاف والملء وتحسين الإعدادات
الركاب الـ891 أنفسهم، بتنظيف أدق
افتح الدفتر 2 في Colab
https://colab.research.google.com/github/
tirthajyoti/Machine-Learning-with-Python/blob/master/
Classification/Logistic_Regression_Classification.ipynburl = ("https://raw.githubusercontent.com/tirthajyoti/"
"Machine-Learning-with-Python/master/Datasets/titanic_train.csv")
train = pd.read_csv(url) # the same 891 rowsاستكشف قبل أن تبني النموذج


- ▸النساء: نجت 233 من 314 (0.742). الرجال: 109 من 577 (0.189)
- ▸تنخفض النجاة مع الدرجة: 0.630، و0.473، و0.242
- ▸وهذه هي الأعمدة التي حصلت على أكبر الأوزان في النموذج
ملء الأعمار المفقودة حسب الدرجة
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 | متوسط العمر | الأعمار المفقودة التي ملئت |
|---|---|---|
| 1 | 38.23 | 30 |
| 2 | 29.88 | 11 |
| 3 | 25.14 | 136 |
الحذف ثم الترميز
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 على الإعدادات
فرق بضعة أجزاء من مئة بين نموذجين قد يأتي من التقسيم وحده


- ▸الرسم الأول: قيمة
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: 0 | cols['Age'] |
n_jobs=4 | FutureWarning: بلا أثر | احذفه |
max_iter=100 | ConvergenceWarning في 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_female1.149، وSex_male-1.150، وPclass_11.200، وPclass_20.007، وPclass_3-1.207 - ▸الراكب 1: صبي عمره 8 سنوات في الدرجة الثانية
- ▸الراكب 2: رجل عمره 30 عاما في الدرجة الأولى
- ▸لكل منهما: متجه الخصائص، ثم
zوpوالصنف عند العتبة 0.5
الإجابات
التمرين 1: الإجابات
| الراكب | المتجه x | المجموع z | p والصنف |
|---|---|---|---|
| صبي، 8، الدرجة 2 | [8, 0, 1, 0, 1, 0] | 1.212 - 0.312 - 1.150 + 0.007 = -0.243 | 1 / (1 + 1.2751) = 0.440، الصنف 0 |
| رجل، 30، الدرجة 1 | [30, 0, 1, 1, 0, 0] | 1.212 - 1.170 - 1.150 + 1.200 = 0.092 | 1 / (1 + 0.9121) = 0.523، الصنف 1 |
نحو 5 دقائق
التمرين 2: المصفوفة عند العتبة 0.3
| التنبؤ 0 | التنبؤ 1 | |
|---|---|---|
| الفعلي 0 | 68 | 17 |
| الفعلي 1 | 7 | 51 |
نحو 5 دقائق
التمرين 3: الملء والترميز يدويا
| الراكب | Pclass | Age | Embarked |
|---|---|---|---|
| A | 1 | 40 | C |
| B | 1 | مفقود | S |
| C | 1 | 50 | S |
| D | 2 | 30 | S |
| الراكب | Pclass | Age | Embarked |
|---|---|---|---|
| E | 2 | مفقود | Q |
| F | 3 | 20 | S |
| G | 3 | مفقود | S |
| H | 3 | 28 | Q |
نحو 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|الانحدار اللوجستي