Logistic Regression: 'হ্যাঁ/না' prediction (Customer Churn দিয়ে)

প্রথম classifier (Series 05, Episode 04)

🟢 BEGINNER Series 05 — Classical Machine Learning Episode 04 / 11

📑 এই পর্বে যা যা আছে

🧩 ১. গল্প: Rahim-এর সেই আসল সমস্যা ফিরে এলো

মনে আছে E01-এর সেই সমস্যা? "কোন customer পরের মাসে চলে যাবে (churn করবে)?" — এটা তো সংখ্যা নয়, উত্তর হ্যাঁ/না। এটাই Classification। GP/Robi-র মতো টেলকোতে এটা সবচেয়ে দামি সমস্যা: কারণ একজন পুরনো customer ধরে রাখা নতুন একজন আনার চেয়ে ৫ গুণ সস্তা।

Rahim: "আমি তো Linear Regression শিখলাম। এটাই লাগিয়ে দিই — churn=1, no-churn=0 predict করব?"

Arif: "থাম! Linear Regression সংখ্যা দেয় — সেটা ১.৮ বা −০.৩ও হতে পারে। কিন্তু 'churn করবে কিনা' তো probability, ০ থেকে ১-এর মধ্যে থাকা উচিত। এখানেই Logistic Regression — নাম regression হলেও কাজ classification।"

২. সমস্যা: "হ্যাঁ/না" কীভাবে predict করি?

Classification-এ output একটা category। সবচেয়ে সাধারণ — binary classification (দুইটা class): churn/no-churn, spam/not-spam, fraud/legit, রোগ আছে/নেই। আমরা চাই model শুধু "হ্যাঁ" না বলে বলুক "৮৭% সম্ভাবনায় হ্যাঁ" — কারণ probability দিলে আমরা সিদ্ধান্তের threshold নিজেরা ঠিক করতে পারি।

দুই ধরনের supervised সমস্যা মনে রাখুন: Regression → সংখ্যা (E02–E03); Classification → class/probability (এই episode থেকে)। Logistic Regression হলো classification-এর সবচেয়ে সহজ, ভিত্তিমূলক model।

🚫 ৩. কেন Linear Regression এখানে ফেল করে

Logistic Regression এই সমস্যাগুলো সমাধান করে — একটা sigmoid function দিয়ে যেকোনো সংখ্যাকে ০–১ probability-তে চেপে দেয়।

🧠 ৪. Logistic Regression কী? (৩ স্তরে)

Level 1 — intuition: Linear Regression একটা সংখ্যা বের করে (score)। Logistic Regression সেই score-টাকে একটা "চাপ দেওয়া" function দিয়ে ০ থেকে ১-এর মধ্যে probability-তে রূপান্তর করে। ৮৭% হলে বলি "খুব সম্ভবত churn করবে"।
Level 2 — technical: প্রথমে linear score z = w1·x1 + ... + b বের করে, তারপর probability = sigmoid(z) = 1 / (1 + e^(-z))। Training-এ log-loss (cross-entropy) minimize করা হয়, যাতে model সঠিক class-কে বেশি probability দেয়।
Level 3 — Engineer perspective: Logistic Regression দ্রুত, interpretable, আর অসাধারণ baseline classifier। বাস্তব fraud/churn system-এ প্রায়ই প্রথম model এটাই। সবচেয়ে বড় সুবিধা — এটা probability দেয়, তাই business ঠিক করতে পারে "কত% ঝুঁকির উপরে action নেব"। আর coefficient দেখে বলা যায় কোন feature ঝুঁকি বাড়ায়।

〰️ ৫. Sigmoid — সংখ্যাকে probability-তে চাপা

sigmoid(z) = 1 / (1 + e^(-z)) z = -5 → 0.007 (প্রায় "না") z = 0 → 0.500 (ঠিক মাঝখানে) z = +5 → 0.993 (প্রায় "হ্যাঁ") যত বড় positive z, তত ১-এর কাছে; যত বড় negative, তত ০-এর কাছে।

এই function-ই জাদু: linear score যত বড়/ছোট-ই হোক, output সবসময় ০ আর ১-এর মধ্যে — একটা বৈধ probability।

🖼️ ৬. Visual: line নয়, S-curve

probability 1.0 | _____••••••• | __/ 0.5 |- - - - - - - - -•- - - - - - - - - ← threshold | __/ 0.0 |••••••_____/ +----------------------------------- feature (z) "না" এলাকা | "হ্যাঁ" এলাকা

Linear Regression-এর সোজা লাইনের বদলে Logistic-এর এই মসৃণ S-curve (sigmoid)। মাঝখানে (0.5) দ্রুত বদলায়, দুই প্রান্তে সমতল।

🎚️ ৭. Decision threshold — probability থেকে সিদ্ধান্ত

Model probability দেয় (যেমন 0.72)। কিন্তু শেষ সিদ্ধান্ত "churn / no-churn" — এর জন্য একটা threshold লাগে। default 0.5: probability ≥ 0.5 হলে "হ্যাঁ"। কিন্তু এটা business সিদ্ধান্ত!

Churn-এ retention offer সস্তা হলে threshold কমিয়ে 0.3 করুন — বেশি মানুষকে "ঝুঁকিপূর্ণ" ধরে অফার দিন (recall বাড়ে)। fraud-এ ভুল ব্লক করলে গ্রাহক রাগে — threshold বাড়ান (precision বাড়ে)। এই trade-off পরের episode (E05)-এর মূল বিষয়।

💻 ৮. কোড: Customer Churn model (Project P3)

কেন এখানে scikit-learn? LogisticRegression একই fit/predict API, তার সাথে predict_proba দিয়ে probability — production-এ ঠিক যা লাগে:

# pip install scikit-learn pandas import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, confusion_matrix # ১. Telco churn-এর মতো ছোট ডেটা (1 = churn, 0 = stayed) df = pd.DataFrame({ "tenure_months": [1, 24, 3, 40, 2, 30, 5, 60, 1, 18], "monthly_bill": [70, 45, 90, 40, 85, 42, 88, 38, 95, 50], "support_calls": [4, 0, 5, 0, 6, 1, 4, 0, 7, 1], "churn": [1, 0, 1, 0, 1, 0, 1, 0, 1, 0], }) X = df[["tenure_months", "monthly_bill", "support_calls"]] y = df["churn"] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) # ২. Scaling — Logistic Regression scale-sensitive; feature-দের সমান করি scaler = StandardScaler() X_train_s = scaler.fit_transform(X_train) # fit শুধু train-এ (leakage এড়াতে) X_test_s = scaler.transform(X_test) # test শুধু transform # ৩. Training clf = LogisticRegression() clf.fit(X_train_s, y_train) # ৪. Prediction ও probability preds = clf.predict(X_test_s) probas = clf.predict_proba(X_test_s)[:, 1] # class=1 (churn)-এর probability print("Accuracy:", accuracy_score(y_test, preds)) print("Churn probabilities:", probas.round(2)) print("Confusion matrix:\n", confusion_matrix(y_test, preds))
খেয়াল করুন stratify=y — train/test দুই ভাগেই churn-এর অনুপাত একই রাখে। আর scaler.fit শুধু train-এ (test-এ শুধু transform) — এটা data leakage এড়ানোর গুরুত্বপূর্ণ অভ্যাস (Series 03-এ শেখা, E08-এ আবার আসবে)।

🔍 ৯. probability পড়া ও threshold টিউন

import numpy as np # default threshold 0.5-এর বদলে custom threshold threshold = 0.3 # churn ধরার ব্যাপারে বেশি সতর্ক custom_preds = (probas >= threshold).astype(int) print("threshold 0.3-এ prediction:", custom_preds) # কোন feature ঝুঁকি বাড়ায়? coefficient দেখুন for name, coef in zip(X.columns, clf.coef_[0]): print(f"{name}: {coef:.2f}") # support_calls positive হলে: বেশি support call = বেশি churn ঝুঁকি
একই model, ভিন্ন threshold, ভিন্ন business আচরণ — model retrain না করেই। এটাই probability output-এর শক্তি। কোন threshold ভালো, সেটা E05-এর precision/recall দিয়ে বেছে নেব।

🇧🇩 ১০. বাংলাদেশের বাস্তব উদাহরণ

💼 ১১. Boss Question

Boss: "churn 'হ্যাঁ/না' জেনে আমি কী করব?"

উত্তর: শুধু হ্যাঁ/না নয় — model প্রতিটা customer-কে একটা churn probability দেয়। আপনি top 5% ঝুঁকিপূর্ণ customer-কে retention offer পাঠাবেন, বাকিদের নয়। ফলে marketing budget সঠিক জায়গায় খরচ হয়, retention বাড়ে, revenue বাঁচে। ১ লাখ subscriber-এর মধ্যে ২% churn ঠেকাতে পারলেও মাসে বড় অঙ্কের টাকা — এটাই business value।

🔎 ১২. Job Requirement Decoder

JD: "Build classification models (Logistic Regression, etc.) for problems like churn/fraud prediction."

১. কী বোঝায়? category/probability predict করার model বানানো ও ব্যাখ্যা করা।
২. কেন চায়? churn, fraud, risk — প্রায় সব company-র core সমস্যা classification।
৩. কোন সমস্যা সমাধান করে? "কে/কোনটা এই class-এ পড়বে" — সিদ্ধান্তের ভিত্তি।
৪. junior-এর কী জানা লাগে? Logistic Regression, sigmoid, probability vs class, threshold, predict_proba, scaling ও leakage সতর্কতা।
৫. এখনই master লাগবে না: log-loss-এর derivation, multinomial/softmax-এর গভীর গণিত।
৬. GitHub-এ কীভাবে দেখাবে? Churn notebook: preprocessing → logistic model → confusion matrix → threshold-এর প্রভাব।
৭. Interview: "Classification-এ Linear Regression কেন নয়?", "Sigmoid কী করে?", "Threshold কীভাবে বাছবেন?"

⚠️ ১৩. সাধারণ ভুল

ভুল ১: "Logistic Regression একটা regression algorithm" → ঠিক: নাম regression, কাজ classification।

ভুল ২: scaling না করা → Logistic Regression feature scale-sensitive; বড় স্কেলের feature অন্যায় প্রাধান্য পায়।

ভুল ৩: সবসময় threshold 0.5 ধরে নেওয়া → business-এ optimal threshold ভিন্ন হতে পারে।

ভুল ৪: imbalanced churn data-তে শুধু accuracy দেখা → ৯৫% "no-churn" হলে সব "no" বলেও ৯৫% accuracy! (E05-এ সমাধান)।

ভুল ৫: scaler.fit পুরো data-তে (test সহ) → data leakage; শুধু train-এ fit করুন।

🎤 ১৪. Interview Prep

প্র: Classification-এ Linear Regression কেন ব্যবহার করি না?
উ: output সীমাহীন (০–১ নয়), outlier-এ boundary হেলে যায়, ভুল loss; probability দরকার।

প্র: Sigmoid কী করে?
উ: যেকোনো real সংখ্যাকে ০–১ probability-তে map করে (S-curve)।

প্র: predict আর predict_proba-র পার্থক্য?
উ: predict চূড়ান্ত class দেয় (threshold প্রয়োগ করে); predict_proba কাঁচা probability দেয়।

প্র: Logistic Regression কি non-linear সম্পর্ক ধরতে পারে?
উ: মূলত linear decision boundary; feature engineering (polynomial) ছাড়া strongly non-linear ধরতে পারে না।

প্র: Threshold কীভাবে বাছেন?
উ: precision/recall trade-off ও business cost দেখে (E05); default 0.5 বাধ্যতামূলক নয়।

✍️ ১৫. হাতে-কলমে

১. উপরের churn কোড চালান। predict_proba দিয়ে প্রতিটা test customer-এর churn probability ছাপান।
২. threshold 0.5 → 0.3 → 0.7 বদলে দেখুন কতজন "churn" ধরা পড়ে — এটাই recall/precision trade-off-এর হাতেকলমে অনুভব।
৩. clf.coef_ দেখে বলুন কোন feature churn ঝুঁকি সবচেয়ে বাড়ায়। এটা Boss-কে বোঝানোর মতো insight।

🚀 ১৬. Project Connection ও সারসংক্ষেপ

এটা আমাদের Project P3 (Customer Churn Prediction)-এর শুরু — portfolio-র প্রথম classification project। পরের episode-গুলোতে এটাকেই আমরা সঠিকভাবে evaluate (E05), তারপর Random Forest (E06) ও XGBoost (E07) দিয়ে improve করব। flagship Career Assistant-এও classification লাগবে — "এই job description junior না senior role?" ঠিক এই ধরনের binary/multi-class সমস্যা।

এই Episode-এ শিখলাম:

✓ Classification = category/probability predict; churn হলো ক্লাসিক binary সমস্যা
✓ Linear Regression classification-এ কেন ফেল করে
✓ Logistic Regression: linear score → sigmoid → probability (নাম regression, কাজ classification)
✓ Sigmoid S-curve যেকোনো সংখ্যাকে ০–১-এ চাপে; threshold দিয়ে সিদ্ধান্ত
✓ scikit-learn-এ predict_proba, scaling, stratify, leakage সতর্কতা — Project P3 শুরু
✓ coefficient পড়ে কোন feature ঝুঁকি বাড়ায় বোঝা যায়
পরবর্তী Episode: "Accuracy কেন মিথ্যা বলে?" — Classification Evaluation। Precision, Recall, F1, ROC-AUC, Confusion Matrix আর imbalanced data-র ভয়ংকর ফাঁদ।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.