Site icon Meccanismo Complesso

La Regressione Logistica con Python

Logistic Regression
Logistic Regression header

La regressione logistica è un tipo di modello di regressione utilizzato per problemi di classificazione binaria, dove l’obiettivo è prevedere a quale delle due classi appartiene un’istanza. A differenza della regressione lineare, che prevede valori continui, la regressione logistica prevede probabilità che variano tra 0 e 1. Questo è ottenuto tramite l’utilizzo di una funzione logistica (o sigmoide) per trasformare l’output lineare in probabilità.

[wpda_org_chart tree_id=18 theme_id=50]

La Regressione Logistica

La regressione logistica ha una storia interessante ed è stata sviluppata principalmente per affrontare problemi di classificazione binaria. Il concetto di utilizzare la funzione logistica per modellare la probabilità di appartenenza a una classe è stato proposto da Joseph Berkson nel 1944. Durante gli anni ’50 e ’60, l’approccio della regressione logistica è stato ampiamente utilizzato in epidemiologia per modellare l’incidenza di malattie in base a variabili di rischio. Il metodo è stato ulteriormente sviluppato e popolarizzato nel contesto delle analisi statistiche, specialmente nelle applicazioni mediche e biologiche.

La Funzione Logistica (Sigmoide):

La funzione logistica è definita come:

dove è la combinazione lineare dei pesi e delle variabili indipendenti (ovvero ).

La funzione logistica trasforma valori in un intervallo compreso tra 0 e 1, risultando in una forma a “S” caratteristica. Questa funzione è fondamentale nella regressione logistica perché converte l’output del modello in probabilità.

Il Modello di Regressione Logistica:

La regressione logistica modella la probabilità di appartenenza a una classe utilizzando la funzione logistica. La relazione tra le variabili indipendenti e la probabilità di appartenenza a una classe è espressa come:

dove:

La probabilità di appartenenza alla classe 0 è semplicemente .

L’addestramento del Modello:

L’addestramento del modello comporta la stima dei pesi ( e del termine bias in modo che il modello si adatti ai dati di addestramento. Questo può essere fatto massimizzando la verosimiglianza logaritmica dei dati di addestramento o minimizzando una funzione di costo come la deviazione logaritmica. La regressione logistica determina un decision boundary che separa le classi nello spazio delle variabili indipendenti. Questo decision boundary è determinato dai pesi del modello. La regressione logistica offre un’interpretazione intuitiva dei risultati. I pesi del modello indicano il contributo relativo di ciascuna variabile indipendente nel determinare la probabilità di appartenenza a una classe.

Validazione e Test

Dopo l’addestramento, il modello viene validato e testato su dati non visti per valutare le sue prestazioni su nuovi dati.

Estensioni

La regressione logistica può essere estesa per problemi di classificazione multiclasse utilizzando tecniche come la regressione logistica multinomiale.

In sintesi, la regressione logistica è un modello efficace e interpretabile per la classificazione binaria, utilizzato in una varietà di domini come medicina, finanza e analisi dei sentimenti.

Esempio di Regressione Logistica con Python

Facciamo un esempio di regressione logistica utilizzando Python e il modulo scikit-learn. In questo esempio, useremo un set di dati di esempio fornito da scikit-learn chiamato iris, che è un dataset di classificazione con tre classi di fiori.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
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

# Carica il dataset iris
iris = datasets.load_iris()
X = iris.data[:, :2]  # Prendi solo le prime due feature per la visualizzazione
y = (iris.target != 0).astype(int)  # Considera solo due classi (0 o non-0)

# Dividi il dataset in set di addestramento e test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Standardizza le feature (importante per la regressione logistica)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Crea e addestra il modello di regressione logistica
model = LogisticRegression()
model.fit(X_train, y_train)

# Fai previsioni sul set di test
y_pred = model.predict(X_test)

# Valuta le prestazioni del modello
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
classification_rep = classification_report(y_test, y_pred)

# Visualizza la decision boundary
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# Visualizza il risultato
plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu, alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.RdYlBu)
plt.xlabel('Sepal Length (standardized)')
plt.ylabel('Sepal Width (standardized)')
plt.title('Logistic Regression Decision Boundary')
plt.show()

Se vuoi approfondire l’argomento e scoprire di più sul mondo della Data Science con Python, ti consiglio di leggere il mio libro:

Python Data Analytics 3rd Ed

Fabio Nelli

In questo esempio, la regressione logistica è addestrata su due delle classi del dataset iris (setosa e versicolor) e viene visualizzata la decision boundary sulle prime due feature (lunghezza e larghezza del sepalo). L’accuratezza del modello e altre metriche di valutazione delle prestazioni vengono stampate. Eseguendo il codice si ottiene infatti il Decision Boundary:

Mentre per visualizzare le misure di valutazione del modello:

import seaborn as sns

# Visualizza le prestazioni del modello
print(f'Accuracy: {accuracy:.2f}')
print('Confusion Matrix:')
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Non-0', '0'], yticklabels=['Non-0', '0'])
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.title('Confusion Matrix')
plt.show()
print('Classification Report:')
print(classification_rep)

Eseguendo si ottiene il seguente risultato:

Exit mobile version