regressione logistica con scikit-learn

Regressione logistica con scikit-learn e la regolarizzazione

Abbiamo già visto e analizzato la libreria scikit-learn negli articoli precedenti e abbiamo chiarito il concetto di Perceptron e Adaline. In questo nuovo articolo vediamo come implementare un modello di regressione logistica con scikit-learn utilizzando la classe sklearn.linear_model.LogisticRegression e anche il metodo fit per addestrare il modello su dataset Iris.

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression(C=1000.0, random_state=0)
lr.fit(X_train_std, y_train)

plot_decision_regions(X_combined_std, y_combined,
                      classifier=lr, test_idx=range(105, 150))
plt.xlabel('petal length [standardized]')
plt.ylabel('petal width [standardized]')
plt.legend(loc='upper left')
plt.tight_layout()
# plt.savefig('./figures/logistic_regression.png', dpi=300)
plt.show()

Questo è il risultato dopo aver adattato il modello sui dati di addestramento, tracciato le regioni decisionali, i campioni di addestramento e i campioni di test. Per quanto riguarda il parametro C all’interno della funzione LogisticRegression ne parliamo fra poco dopo aver spiegato il concetto di overfitting e regolarizzazione.

regressione logistica con scikit-learn

Inoltre, tramite il metodo predict_proba, possiamo prevedere la probabilità di appartenenza alla classe dei campioni. Per fare un esempio e capirci di più, pensiamo di prevedere la probabilità del primo campione Iris-Setosa :

if Version(sklearn_version) < '0.17':
    lr.predict_proba(X_test_std[0, :])
else:
    lr.predict_proba(X_test_std[0, :].reshape(1, -1))

Eseguendo il codice otteniamo un array di questo tipo:

array([[  0.000,  0.063,  0.937)]]

il quale ci dice che il modello prevede con una probabilità del 93.7 % che il campione appartenga alla classe Iris-Virginica e con il 6,3% di probabilità che il campione sia un fiore Iris-Versicolor.

La regolarizzazione per risolvere l'overfitting

Dopo aver visto come implementare un modello di regressione logistica con scikit-learn passiamo a trattare il concetto di overfitting. Esso infatti è un problema comune nelle attività di machine learning:

Leggi articolo   Socket Python 3.9 - Client e Server

un modello si comporta bene su dati di addestramento, ma non è in grado di generalizzarsi bene su i nuovi dati di test.

Tutto ciò perchè il modello soffre di un’elevata varianza, e la causa di essa è derivata da un elevato numero di paramentri, i quali producono un modello troppo complesso per i dati sottostanti.

Underfitting - high bias

Ovviamento, il nostro modello può soffrire del problema opposto, ovvero l’elevata discrepanza, chiamata bias o underfitting. La limitata complessità del modello non è in grado di catturare lo schema presente nei dati di addestramento e pertanto soffre di scarse prestazioni anche su nuovi dati.

Graficamente ...

regressione logistica con scikit-learn

La varianza misura la coerenza della previsione del modello per una determinata istanza del campione se ripetiamo l'addestramento del modello più volta su insiemi differenti del dataset di addestramento. Per questo motivo il modello è sensibile alla casualità dei dati di addestramento. Il bias invece, la discrepanza, misura quanto sono distanti le previsioni rispetto ai valori corretti in generale, se ricostruiamo il modello più volte su dataset di addestramento differenti;

Un modo per trovare un compromesso tra varianza e bias sta nell’ottimizzare la complessità del modello tramite la regolarizzazione. Quest’ultima è molto utile per gestire la colinearità (elevata correlazione tra caratteristiche), per eliminare i dati rumore e prevenire l’overfitting. La regolarizzazione, tecnicamente, consiste nell’introdurre delle informazioni aggiuntive (bias) per penalizzare i pesi estremi del parametro.

La formula di regolarizzazione più comune è detta regolarizzazione L2 e può essere definita con la seguente formula:

regressione logistica con scikit-learn

λ è il parametro di regolarizzazione. Tramite esso possiamo quindi controllare l’adattamento ai dati di addestramento contenendo l’intensità dei pesi. Incrementando il valore di λ, incrementiamo l’intensità della regolarizzazione.

Leggi articolo   Il Perceptron in Machine Learning

A questo punto possiamo definire C, il parametro presente all’intero della funzione del modello a regressione logistica con scikit-learn. C è proprio l’inverso del parametro di regolarizzazione.

Di conseguenza, decrementando il valore del parametro di regolarizzazione inversa C incrementiamo l’intensità della regolarizzazione, che andremo a rappresentare tramite scikit-learn tracciando il percorso di regolarizzazione L2 per i due coefficineti di peso:

weights, params = [], []
for c in np.arange(-5., 5.):
    lr = LogisticRegression(C=10.**c, random_state=0)
    lr.fit(X_train_std, y_train)
    weights.append(lr.coef_[1])
    params.append(10**c)

weights = np.array(weights)
plt.plot(params, weights[:, 0],
         label='petal length')
plt.plot(params, weights[:, 1], linestyle='--',
         label='petal width')
plt.ylabel('weight coefficient')
plt.xlabel('C')
plt.legend(loc='upper left')
plt.xscale('log')

plt.show()

Tramite il codice, abbiamo previsto 10 modelli a regressione logistica con scikit-learn, con valori diversi del parametro di regolarizzazione inversa C. Come possiamo vedere dal grafico i coefficienti di peso si riducono se riduciamo il parametro C, ovvero se incrementiamo l’intensità della regolarizzazione.

Condividi il post

Condividi su facebook
Condividi su google
Condividi su twitter
Condividi su email
Condividi su whatsapp