Logistic Regression: Classification Problems

Lesson 21 of 26

Naam me 'regression' hai, par Logistic Regression ek classification model hai. Ye Yes/No wale sawaalon ke liye hai: email spam hai ya nahi? customer churn karega ya nahi? tumor malignant hai ya benign?

Sigmoid function

Linear Regression koi bhi number de sakta hai (−∞ se +∞). Par probability 0 aur 1 ke beech honi chahiye. Sigmoid function kisi bhi number ko 0-1 ke beech daba deta hai:

Example

Python
import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

z = np.array([-5, -2, 0, 2, 5])
print(sigmoid(z).round(3))

Output

Plain Text
[0.007 0.119 0.5   0.881 0.993]

Model pehle features ka weighted sum nikaalta hai, phir sigmoid se probability banata hai. Default rule: probability ≥ 0.5 to class 1, warna class 0.

Breast cancer dataset

scikit-learn ka breast cancer dataset — 569 tumors, 30 measurements. Target: 0 = malignant (cancer), 1 = benign (cancer nahi).

Example

Python
import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

cancer = load_breast_cancer(as_frame=True)
X, y = cancer.data, cancer.target        # 0 = malignant, 1 = benign

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

print(X.shape)
print(y.value_counts())
print("Classes:", cancer.target_names.tolist())

Output

Plain Text
(569, 30)
target
1    357
0    212
Name: count, dtype: int64
Classes: ['malignant', 'benign']

Pipeline: scaling + model ek saath

Pipeline preprocessing aur model ko ek object me jod deta hai. Isse data leakage ka khatra khatam ho jaata hai aur code saaf rehta hai:

Example

Python
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

clf = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)
print("Accuracy:", round(accuracy_score(y_test, y_pred), 4))

Output

Plain Text
Accuracy: 0.9825

Probabilities dekhna: predict_proba

Sirf class nahi, model ye bhi batata hai ki use kitna bharosa hai:

Example

Python
proba = clf.predict_proba(X_test)[:5]
print(pd.DataFrame(proba, columns=["P(malignant)", "P(benign)"]).round(3))
print("Predictions:", y_pred[:5])

Output

Plain Text
   P(malignant)  P(benign)
0         1.000      0.000
1         0.000      1.000
2         0.994      0.006
3         0.466      0.534
4         1.000      0.000
Predictions: [0 1 0 1 0]

Threshold badalna

Medical case me cancer miss karna (malignant ko benign bolna) bahut khatarnak hai. To hum tabhi 'benign' bolenge jab model ko kaafi bharosa ho — threshold 0.5 se badha ke dekhte hain:

Example

Python
p_benign = clf.predict_proba(X_test)[:, 1]
is_malignant = y_test.values == 0

results = {}
for threshold in [0.5, 0.9, 0.99]:
    pred = (p_benign >= threshold).astype(int)
    missed = int(((pred == 1) & is_malignant).sum())        # cancer ko benign bola
    false_alarms = int(((pred == 0) & ~is_malignant).sum())  # benign ko cancer bola
    results[threshold] = (missed, false_alarms)
    print(f"Threshold {threshold}: accuracy={accuracy_score(y_test, pred):.3f}, "
          f"cancer miss={missed}, false alarms={false_alarms}")

Output

Plain Text
Threshold 0.5: accuracy=0.982, cancer miss=1, false alarms=1
Threshold 0.9: accuracy=0.895, cancer miss=1, false alarms=11
Threshold 0.99: accuracy=0.737, cancer miss=0, false alarms=30

Threshold 0.5 pe 1 cancer miss hua aur 1 false alarm aaya; 0.99 pe 0 miss aur 30 false alarms. Ye hi trade-off hai: threshold badhane se misses kabhi badhte nahi (sirf ghat-te ya same rehte hain), par false alarms badhte hain — yaani zyada healthy logon ko aage ki jaanch ke liye bhejna padega. Medical case me ye mehenga zaroor hai, par cancer miss karne se kahin behtar. Iske metrics (precision, recall) hum model evaluation wale lesson me detail me dekhenge.

Coefficients ka matlab

Example

Python
model = clf.named_steps["logisticregression"]
coefs = pd.Series(model.coef_[0], index=X.columns).sort_values()
print("Malignant ki taraf sabse zyada dhakelne wale features:")
print(coefs.head(3).round(2))

Output

Plain Text
Malignant ki taraf sabse zyada dhakelne wale features:
worst texture          -1.26
radius error           -1.08
worst concave points   -0.95
dtype: float64

Negative coefficient ka matlab — ye feature badhe to benign (class 1) ki probability ghat-ti hai, yaani malignant ki badhti hai.

Logistic Regression kab use karein?

  • Binary classification (2 classes) — multiclass bhi support karta hai
  • Jab samajhna ho ki kaunsa feature result ko kis taraf dhakelta hai
  • Ek fast, strong baseline model ke taur pe — complex model se pehle hamesha ise try kariye

Aur detail me: Logistic Regression — The Superhero of Classification.