في نافذة الطباعة اختر «حفظ كملف PDF» كوجهة.
تعلم الآلة، الأسبوع 4
التنبؤ بنجاة راكب من ركاب تيتانيك (Titanic)، ومعرفة مدى ثقة النموذج في تنبؤه.
z، ثم احتمال (probability) p، ثم صنف (class)LogisticRegression وقراءة الدقة (accuracy) ومصفوفة الالتباس (confusion matrix) والضبط (precision) والاستدعاء (recall) ومقياس F1 (F1-score)الأسبوع 4 من الخطة
| الجزء | ما نفعله | الزمن |
|---|---|---|
| 1 | الفكرة، وراكب يدويا | 25 دقيقة |
| 2 | الدفتر 1: التجهيز، والتدريب، وحساب النتيجة | 25 دقيقة |
| 3 | التقييم: المصفوفة، والضبط، والاستدعاء، والعتبة | 20 دقيقة |
| 4 | الدفتر 2: الاستكشاف، والملء، وتحسين الإعدادات؛ ومشروعك | 20 دقيقة |
| 5 | الخلاصة، ثم تمارين مع الإجابات | 30 دقيقة |
الجزء 1
مجموع، ثم ضغط، ثم قرار
0 أو 1، وتعطي أيضا احتمال الصنف 1.zz إلى احتمال p بين 0 و1p بالعتبة؛ وتستخدم predict القيمة 0.5| المصطلح | في بيانات تيتانيك |
|---|---|
الخصائص x | أعمدة الإدخال: العمر، والجنس، ودرجة الراكب (passenger class) |
الهدف y | Survived: 1 نجا، و0 لم ينج |
| الصنف الموجب (positive class) | الصنف 1، الذي يعرض النموذج احتماله |
الاحتمال p | تقدير النموذج لاحتمال أن يكون y = 1 |
العتبة t | الحد الفاصل على p: عند p ≥ t يكون التنبؤ 1، وإلا فهو 0 |
x_1 إلى x_n هي خصائص الراكب الواحد، وعددها nw_1 إلى w_n هي الأوزان التي تعلمها النموذج، في model.coef_b هو الحد الثابت، في model.intercept_e هو الثابت 2.71828z، تقع σ(z) بين 0 و1: أي أنها احتمالσ(0) = 0.5: المجموع الخطي الذي يساوي صفرا يعني عدم التفضيلz الموجبة الكبيرة تعطي p قريبا من 1؛ والقيمة z السالبة الكبيرة تعطي p قريبا من 0ŷ هو الصنف المتنبأ به و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 |
أنثى عمرها 30 عاما تسافر في الدرجة الأولى
female = [[30, 1, 0, 1, 0, 0]]male = [[60, 0, 1, 0, 0, 1]]
الجزء 2
أربعة أعمدة، ونموذج واحد، واحتمالات حقيقية
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 columnsdf = df[['Survived', 'Age', 'Sex', 'Pclass']]
df = pd.get_dummies(df, columns=['Sex', 'Pclass'])
df.dropna(inplace=True) # 714 rows remainSurvived وثلاث خصائص: Age وSex وPclassget_dummies بالترميز الأحادي: عمود جديد من 0/1 لكل قيمة، لأن النموذج يحتاج إلى أعدادdropna 177 صفا بلا عمر: فيبقى 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.8322stratify=y، أي التقسيم الطبقي (stratification)، نسبة الناجين عند 0.406 في الجزأينالجزء 3
أي الأخطاء، وكم عددها

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

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 صفا: احذف العمودdrop_first=True: لا يبقى من Sex إلا male؛ ولا يبقى من Embarked إلا Q وS، والميناء C هو Q = 0, S = 0Survived و8 خصائصفرق بضعة أجزاء من مئة بين نموذجين قد يأتي من التقسيم وحده


C الصغيرة عقوبة (penalty) قوية على الأوزان؛ وعند 1/C = 1000 يهبط F1 إلى 0.63pandas 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(...) |
قبل التمارين
Sex إلى النموذج دون ترميزهPassengerId أو Name ضمن الخصائصpredict_proba تعيد عمودين: [:, 1] هو الصنف 1مشروع فريقك
Survived، أو عدد، مثل السعرdf.info(): احذف العمود، أو احذف الصفوف، أو املأ القيمpd.get_dummiesz، ثم الدالة السينية، ثم عتبةσ(0) = 0.5، لذا عند العتبة 0.5 يكون الصنف 1 عندما تكون z ≥ 0، وعندها فقطالجزء 5
نحو 30 دقيقة، والإجابات تلي كل مهمة
نحو 10 دقائق
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.207z وp والصنف عند العتبة 0.5الإجابات
| الراكب | المتجه 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 دقائق
| التنبؤ 0 | التنبؤ 1 | |
|---|---|---|
| الفعلي 0 | 68 | 17 |
| الفعلي 1 | 7 | 51 |
الإجابات
نحو 5 دقائق
| الراكب | 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 دقائق
model.score، مع قراءة البيانات من الرابط[[8, 0, 1, 0, 1, 0]]1 ارتفع؟| السؤال | الإجابة |
|---|---|
| احتمال الصبي | 43.9%، الصنف 0 |
| المصفوفة عند 0.4 | [[75, 10], [10, 48]] |
الاستدعاء للصنف 1 | ارتفع، من 0.71 إلى 0.83 |
الضبط للصنف 1 | انخفض، من 0.85 إلى 0.83 |
Mahmoud Abas|الانحدار اللوجستي