21/02/2024
În era digitală, capacitatea de a prezice rezultate și de a clasifica datele este esențială pentru luarea deciziilor informate, fie că vorbim despre prognozarea riscului de neplată, diagnosticarea medicală sau înțelegerea comportamentului clienților. Dintre numeroasele instrumente de învățare automată, Regresia Logistică se distinge ca o metodă fundamentală și extrem de eficientă pentru problemele de clasificare binară. Deși numele său include termenul „regresie”, scopul său principal este de a prezice probabilitatea ca o instanță să aparțină unei anumite clase, transformând această probabilitate într-un rezultat binar (0 sau 1).

Acest ghid detaliat îți va arăta nu doar ce este regresia logistică, ci și cum să o implementezi pas cu pas în Python, de la încărcarea datelor și pregătirea lor, până la antrenarea modelului, evaluarea performanței și vizualizarea rezultatelor cheie. Indiferent dacă ești un începător curios sau un analist de date experimentat, vei găsi informații prețioase care te vor ajuta să stăpânești această tehnică puternică.
- Ce Este Regresia Logistică și De Ce Este Importantă?
- Cum Funcționează Algoritmul de Regresie Logistică?
- Concepte Cheie în Regresia Logistică
- Construirea și Vizualizarea Curbei de Regresie Logistică în Python
- Implementarea Completă a Regresiei Logistice în Python (Pas cu Pas)
- Vizualizarea Limitei de Decizie a Modelului de Regresie Logistică
- Plotarea Curbei ROC (Receiver Operating Characteristic)
- Tabel Comparativ: Regresia Liniară vs. Regresia Logistică
- Întrebări Frecvente (FAQ)
Ce Este Regresia Logistică și De Ce Este Importantă?
Regresia Logistică este un algoritm statistic utilizat pentru sarcini de clasificare binară, adică pentru situațiile în care variabila dependentă poate lua doar două valori (de exemplu, "da" sau "nu", "adevărat" sau "fals", "0" sau "1"). Spre deosebire de regresia liniară, care prezice o variabilă dependentă continuă, regresia logistică modelează probabilitatea unui eveniment. Această probabilitate este apoi convertită într-o clasificare binară folosind un prag (de obicei 0.5).
Importanța sa rezidă în:
- Simplicitate și Eficiență: Este relativ ușor de înțeles și de implementat, iar calculul său este eficient, făcând-o potrivită pentru seturi de date mari.
- Interpretare: Coeficienții modelului pot fi interpretați ca măsuri ale influenței fiecărei caracteristici asupra probabilității evenimentului, oferind o bună interpretare a relațiilor.
- Versatilitate: Este aplicabilă într-o multitudine de domenii, de la medicină (diagnosticarea bolilor) și finanțe (evaluarea riscului de credit) până la marketing (predicția răspunsului la campanii).
Cum Funcționează Algoritmul de Regresie Logistică?
Mecanismul de bază al regresiei logistice implică trei pași principali:
- Combinația Liniară: Similar regresiei liniare, se calculează o combinație liniară a caracteristicilor de intrare (variabilele independente) și a coeficienților (ponderilor) asociați acestora. Rezultatul este o valoare reală, ‘z’.
- Transformarea Sigmoid: Valoarea ‘z’ este apoi trecută printr-o funcție sigmoid (cunoscută și sub numele de funcția logistică). Această funcție transformă orice valoare reală într-o probabilitate între 0 și 1. Formula funcției sigmoid este:
σ(z) = 1 / (1 + e^(-z))Unde σ(z) este probabilitatea, iar ‘e’ este baza logaritmului natural.
- Optimizare și Log Loss: Modelul învață coeficienții (ponderile) optimi prin minimizarea unei funcții de cost, cel mai adesea Log Loss (sau entropia încrucișată binară). Această funcție măsoară cât de mult diferă probabilitățile prezise de etichetele reale. Prin metode de optimizare precum descendentul de gradient, modelul ajustează coeficienții pentru a minimiza această eroare, stabilind astfel o limita de decizie care separă cel mai bine cele două clase.
Concepte Cheie în Regresia Logistică
Pentru a înțelege pe deplin regresia logistică, este important să cunoaștem câteva concepte fundamentale:
- Funcția Sigmoid (Logistică): Așa cum am menționat, este inima regresiei logistice, convertind ieșirea liniară în probabilități între 0 și 1. Graficul său are o formă de 'S'.
- Funcția Ipoteză: Aceasta este formularea matematică a predicției modelului, combinând caracteristicile de intrare cu coeficienții (ponderile) și aplicând funcția sigmoid:
h_theta(x) = σ(θ^T x). Aici, h_theta(x) este probabilitatea prezisă ca y=1, θ este vectorul de coeficienți, iar x este vectorul de caracteristici de intrare. - Log Loss (Funcția de Cost): Măsoară performanța modelului. O valoare mai mică a Log Loss indică o performanță mai bună. Pentru o singură instanță, este definită ca:
J(θ) = -(y log(h_theta(x)) + (1 - y) log(1-h_theta(x))). - Limita de Decizie: Este suprafața sau linia care separă instanțele în diferite clase, bazându-se pe probabilitatea determinată. De exemplu, dacă probabilitatea prezisă este >= 0.5, se clasifică ca 1; altfel, ca 0.
- Pragul de Probabilitate: Un număr (de obicei 0.5) folosit pentru a converti probabilitățile prezise în asignări de clasă binare.
- Rata Cotelor (Odds Ratio): Reprezintă raportul dintre probabilitatea ca un eveniment să se întâmple și probabilitatea ca acesta să nu se întâmple. Este utilă pentru a înțelege relația dintre caracteristici și variabila țintă.
Construirea și Vizualizarea Curbei de Regresie Logistică în Python
Una dintre cele mai intuitive modalități de a înțelege regresia logistică este prin vizualizarea curbei sale. Vom folosi setul de date 'Default' din cartea 'Introduction to Statistical Learning', care conține informații despre 10.000 de persoane, inclusiv dacă au înregistrat o neplată ('default'), dacă sunt studenți ('student'), soldul mediu ('balance') și venitul ('income').
Să presupunem că dorim să construim un model de regresie logistică care utilizează 'balance' (soldul) pentru a prezice probabilitatea de neplată ('default').
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # Importăm setul de date dintr-un fișier CSV de pe Github url = "https://raw.githubusercontent.com/Statology/Python-Guides/main/default.csv" data = pd.read_csv(url) # Vizualizăm primele rânduri ale setului de date print("Primele 6 rânduri ale setului de date:") print(data[0:6]) # Definim variabila predictivă și variabila răspuns x = data['balance'] y = data['default'] # Plotăm curba de regresie logistică plt.figure(figsize=(10, 6)) sns.regplot(x=x, y=y, data=data, logistic=True, ci=None) plt.title('Curba de Regresie Logistică: Probabilitatea de Neplată în funcție de Sold') plt.xlabel('Sold (Balance)') plt.ylabel('Probabilitatea prezisă de Neplată (Default)') plt.grid(True) plt.show()Pe axa X, veți vedea valorile variabilei predictive 'balance', iar pe axa Y, probabilitatea prezisă de neplată. Se observă clar că valori mai mari ale soldului sunt asociate cu probabilități mai mari ca o persoană să înregistreze o neplată.
Puteți personaliza, de asemenea, culorile punctelor și ale curbei folosind argumentele scatter_kws și line_kws:
# Plotăm curba de regresie logistică cu puncte negre și linie roșie plt.figure(figsize=(10, 6)) sns.regplot(x=x, y=y, data=data, logistic=True, ci=None, scatter_kws={'color': 'black'}, line_kws={'color': 'red'}) plt.title('Curba de Regresie Logistică Personalizată') plt.xlabel('Sold (Balance)') plt.ylabel('Probabilitatea prezisă de Neplată (Default)') plt.grid(True) plt.show()Alegeți culorile care se potrivesc cel mai bine nevoilor dumneavoastră de vizualizare.

Implementarea Completă a Regresiei Logistice în Python (Pas cu Pas)
Vom demonstra acum un flux de lucru complet pentru construirea și evaluarea unui model de regresie logistică, utilizând un set de date de diabet pentru a prezice dacă un pacient are diabet sau nu.
Importarea Librăriilor Necesare
Primul pas este să importăm toate librăriile de care vom avea nevoie. Acestea includ instrumente pentru manipularea datelor, vizualizare și algoritmi de învățare automată din scikit-learn.
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_diabetes 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, classification_report, confusion_matrix, roc_curve, aucÎncărcarea și Explorarea Setului de Date
Vom folosi setul de date load_diabetes din scikit-learn. Acesta conține 10 caracteristici fiziologice și o măsură cantitativă a progresiei bolii un an mai târziu. Pentru regresia logistică, avem nevoie de o variabilă țintă binară, așa că vom converti măsura progresiei bolii într-o variabilă binară (1 pentru diabet, 0 pentru non-diabet) pe baza medianei.
# Încărcăm setul de date diabetes diabetes = load_diabetes() X, y = diabetes.data, diabetes.target # Convertim variabila țintă în binară (1 pentru diabet, 0 pentru non-diabet) y_binary = (y > np.median(y)).astype(int) print("Dimensiunile setului de date (X):", X.shape) print("Dimensiunile variabilei țintă (y_binary):", y_binary.shape) print("Număr de cazuri de diabet (1):", np.sum(y_binary == 1)) print("Număr de cazuri fără diabet (0):", np.sum(y_binary == 0))Divizarea Setului de Date (Antrenare și Testare)
Este crucial să împărțim setul de date în seturi de antrenare și testare. Setul de antrenare este folosit pentru a ‘învăța’ modelul, iar setul de testare este folosit pentru a evalua performanța modelului pe date nevăzute, asigurându-ne că modelul generalizează bine și nu este supra-antrenat (overfit). O diviziune comună este 80% pentru antrenare și 20% pentru testare.
# Divizăm datele în seturi de antrenare și testare X_train, X_test, y_train, y_test = train_test_split(X, y_binary, test_size=0.2, random_state=42) print("Dimensiuni X_train:", X_train.shape) print("Dimensiuni X_test:", X_test.shape) print("Dimensiuni y_train:", y_train.shape) print("Dimensiuni y_test:", y_test.shape)Scalarea Caracteristicilor
Scalarea caracteristicilor este un pas important în preprocesarea datelor, mai ales pentru algoritmi sensibili la scara datelor, cum ar fi regresia logistică (care utilizează gradient descent pentru optimizare). StandardScaler normalizează datele astfel încât să aibă o medie de 0 și o deviație standard de 1. Acest lucru ajută la convergența mai rapidă a algoritmului și la îmbunătățirea performanței.
# Standardizăm caracteristicile scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) print("Caracteristici scalate cu succes.")Antrenarea Modelului
Acum, suntem gata să antrenăm modelul de regresie logistică folosind datele noastre de antrenare scalate. Instanțiem un obiect LogisticRegression și apoi apelăm metoda fit().
# Antrenăm modelul de Regresie Logistică model = LogisticRegression() model.fit(X_train, y_train) print("Model antrenat cu succes.")Evaluarea Performanței Modelului
După antrenare, este esențial să evaluăm cât de bine funcționează modelul nostru pe setul de date de testare. Vom folosi mai multe metrici comune:
- Acuratețea (Accuracy): Proporția predicțiilor corecte din totalul predicțiilor.
- Matricea de Confuzie (Confusion Matrix): Un tabel care arată numărul de predicții corecte și incorecte pentru fiecare clasă (Adevărat Pozitive, Adevărat Negative, Fals Pozitive, Fals Negative).
- Raportul de Clasificare (Classification Report): Oferă metrici precum Precizia (Precision), Rechemarea (Recall) și Scor F1 (F1-score) pentru fiecare clasă, oferind o imagine mai detaliată a performanței.
# Evaluăm modelul y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"Acuratețe: {accuracy * 100:.2f} %\n") print("Matrice de Confuzie:\n", confusion_matrix(y_test, y_pred)) print("\nRaport de Clasificare:\n", classification_report(y_test, y_pred))Output: Acuratețe: 73.03 % Matrice de Confuzie: [[36 13] [11 29]] Raport de Clasificare: precision recall f1-score support 0 0.77 0.73 0.75 49 1 0.69 0.72 0.71 40 accuracy 0.73 89 macro avg 0.73 0.73 0.73 89 weighted avg 0.73 0.73 0.73 89Vizualizarea Limitei de Decizie a Modelului de Regresie Logistică
Vizualizarea limitei de decizie ne ajută să înțelegem cum modelul nostru separă diferitele clase în spațiul caracteristicilor. Pentru setul de date de diabet, vom folosi două caracteristici (de exemplu, BMI și Vârsta) pentru a crea o reprezentare 2D a limitei de decizie.
# Vizualizăm limita de decizie cu informații despre acuratețe # Rețineți că X_test[:, 2] este caracteristica BMI și X_test[:, 8] este caracteristica Age plt.figure(figsize=(10, 7)) sns.scatterplot(x=X_test[:, 2], y=X_test[:, 8], hue=y_test, palette={0: 'blue', 1: 'red'}, marker='o', s=70, edgecolor='k') plt.xlabel("BMI (indicele de masă corporală)") plt.ylabel("Vârsta") plt.title(f"Limita de Decizie a Regresiei Logistice\nAcuratețe: {accuracy * 100:.2f} %") plt.legend(title="Diabet", loc="upper right") plt.grid(True) plt.show()Această diagramă de dispersie arată indivizii din setul de testare, cu BMI pe axa X și Vârsta pe axa Y. Punctele sunt codificate prin culori în funcție de starea reală a diabetului (albastru pentru non-diabet, roșu pentru diabet). Deși nu desenăm explicit linia de decizie (care ar fi o hiperplană în spațiul original cu 10 dimensiuni, proiectată 2D ar fi o linie), putem observa vizual cum modelul încearcă să grupeze punctele de aceeași culoare. Titlul include acuratețea modelului, oferind un context vizual imediat al performanței.

Plotarea Curbei ROC (Receiver Operating Characteristic)
Curba ROC este un instrument grafic esențial pentru evaluarea performanței clasificatorilor binari. Aceasta trasează rata de adevărat pozitive (True Positive Rate - TPR, sau sensibilitatea) împotriva ratei de fals pozitive (False Positive Rate - FPR, sau 1-specificitatea) la diferite praguri de clasificare. Zona de sub Curbă (AUC - Area Under the Curve) este o măsură agregată a performanței modelului pe toate pragurile posibile. Un AUC mai aproape de 1.0 indică un model mai bun.
# Plotăm Curba ROC y_prob = model.predict_proba(X_test)[:, 1] # Probabilități pentru clasa pozitivă (1) fpr, tpr, thresholds = roc_curve(y_test, y_prob) roc_auc = auc(fpr, tpr) plt.figure(figsize=(10, 7)) plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'Curba ROC (AUC = {roc_auc:.2f})') plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label='Clasificator Aleatoriu') plt.xlabel('Rata de Fals Pozitive (FPR)') plt.ylabel('Rata de Adevărat Pozitive (TPR)') plt.title(f'Curba de Operare Caracteristică a Receptorului (ROC)\nAcuratețe: {accuracy * 100:.2f} %') plt.legend(loc="lower right") plt.grid(True) plt.show()Curba ROC arată capacitatea modelului de a distinge între clase. O curbă care se apropie de colțul din stânga sus al graficului (TPR mare și FPR mic) indică o performanță excelentă. Linia punctată diagonală reprezintă un clasificator aleatoriu (AUC = 0.5), un model care nu face nicio distincție reală între clase.
Tabel Comparativ: Regresia Liniară vs. Regresia Logistică
| Caracteristică | Regresia Liniară | Regresia Logistică |
|---|---|---|
| Tipul Rezultatului | Continuu (ex: preț, temperatură) | Binar (ex: da/nu, 0/1, adevărat/fals) |
| Scop Principal | Predicție de valori | Clasificare și predicție de probabilități |
| Funcția Utilizată | Ecuație liniară | Funcția Sigmoid (Logistică) |
| Intervalul Ieșirii | (-∞, +∞) | [0, 1] (probabilități) |
| Metrica de Evaluare | RMSE, MAE, R-squared | Acuratețe, Precizie, Rechemare, F1-score, Curba ROC/AUC, Matrice de Confuzie |
Întrebări Frecvente (FAQ)
Q1. Ce este Regresia Logistică?
Regresia Logistică este o tehnică statistică utilizată pentru probleme de clasificare binară. Modelează probabilitatea ca un rezultat binar să apară folosind o funcție logistică.
Q2. Cum diferă Regresia Logistică de Regresia Liniară?
Regresia Logistică prezice probabilitatea unui eveniment binar, în timp ce regresia liniară prezice un rezultat continuu. Regresia logistică utilizează funcția logistică (sigmoid) pentru a limita ieșirea între 0 și 1.
Q3. Cum se gestionează variabilele categorice în Regresia Logistică?
Variabilele categorice trebuie transformate în reprezentări numerice, de exemplu, prin codificare one-hot (one-hot encoding). Asigurați-vă că datele sunt preprocesate corespunzător pentru a le pregăti pentru regresia logistică.
Q4. Poate Regresia Logistică gestiona clasificarea multi-clasă?
Da, este posibil să extindeți regresia logistică pentru clasificarea multi-clasă utilizând metode precum One-vs-Rest (OvR) sau Softmax Regression.
Q5. Care este rolul funcției sigmoid în Regresia Logistică?
Funcția sigmoid mapează orice număr real la intervalul [0, 1]. Aceasta convertește ieșirea ecuației liniare în probabilități, care sunt esențiale pentru clasificarea binară.
Dacă vrei să descoperi și alte articole similare cu Regresia Logistică în Python: Ghid Complet, poți vizita categoria Fitness.
