الدرس 3 من 9

التصنيف: Logistic Regression

لما الإجابة مش رقم، لكن اختيار من اتنين.

المشكلة

شركة اتصالات عايزة تعرف مين من عملائها ناوي يمشي (churn) قبل ما يمشي، عشان تكلمه وتديله عرض. الإجابة هنا ١ (هيمشي) أو ٠ (هيفضل)، فده Classification.

الـ Logistic Regression رغم اسمها بتعمل تصنيف. بتحسب score زي الـ linear regression، وبعدين تدخله في دالة اسمها sigmoid بتحوله لاحتمال بين صفر وواحد. قريبة جداً من الـ softmax اللي شفناه.

logistic.py
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

df = pd.read_csv("churn.csv")
df["yearly"] = (df["contract"] == "yearly").astype(int)   # text -> 0/1

features = ["tenure", "bill", "complaints", "data_gb", "yearly"]
X_train, X_test, y_train, y_test = train_test_split(
    df[features], df["churned"], test_size=0.2,
    random_state=42, stratify=df["churned"])   # keep churn ratio equal

model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

print("Accuracy:", round(model.score(X_test, y_test), 3))
💡 stratifyلو ٢٤٪ بس من العملاء بيمشوا، ممكن بالصدفة الـ test ياخد نسبة مختلفة. stratify بتضمن إن النسبة تبقى هي هي في الجزئين.

الاحتمال أهم من الإجابة

predict بتقولك ٠ أو ١، لكن predict_proba بتقولك متأكد قد إيه. وده أهم بكتير في الشغل: الشركة تكلم الأعلى احتمالاً الأول.

proba.py
import pandas as pd
from sklearn.linear_model import LogisticRegression

df = pd.read_csv("churn.csv")
df["yearly"] = (df["contract"] == "yearly").astype(int)
features = ["tenure", "bill", "complaints", "data_gb", "yearly"]
model = LogisticRegression(max_iter=1000).fit(df[features], df["churned"])

customers = pd.DataFrame([
    {"tenure": 60, "bill": 250, "complaints": 0, "data_gb": 10, "yearly": 1},
    {"tenure": 4,  "bill": 800, "complaints": 3, "data_gb": 65, "yearly": 0},
])
for i, p in enumerate(model.predict_proba(customers)[:, 1]):
    print(f"Customer {i + 1}: {p:.1%} chance to churn")

العميل الأول قديم وعنده عقد سنوي ومبيشتكيش، فاحتماله ضعيف جداً. التاني جديد، وفاتورته عالية، واشتكى ٣ مرات: لازم حد يكلمه النهارده.

الـ Threshold

predict بتعتبر أي احتمال فوق ٥٠٪ يبقى «هيمشي». بس انت تقدر تغير الحد ده حسب المصلحة. لو تكلفة إنك تكلم عميل قليلة وخسارته غالية، نزّل الحد لـ ٣٠٪ مثلاً عشان تمسك ناس أكتر. هنشوف الموازنة دي بالأرقام في الدرس الجاي.

الدرس اللي فات