Scikit Learn - Elastic-Net

Elastic-Net è un metodo di regressione regolarizzato che combina linearmente entrambe le penalità, ovvero L1 e L2 dei metodi di regressione Lazo e Ridge. È utile quando sono presenti più funzionalità correlate. La differenza tra Lass e Elastic-Net sta nel fatto che è probabile che Lasso scelga una di queste caratteristiche a caso mentre è probabile che Elastic-Net scelga entrambe contemporaneamente.

Sklearn fornisce un modello lineare denominato ElasticNetche viene allenato con entrambe le norme L1, L2 per la regolarizzazione dei coefficienti. Il vantaggio di tale combinazione è che consente di apprendere un modello sparso in cui pochi pesi sono diversi da zero come il metodo di regolarizzazione del lazo, pur mantenendo le proprietà di regolarizzazione del metodo di regolarizzazione della cresta.

Di seguito è riportata la funzione obiettivo per ridurre al minimo:

$$ \ displaystyle \ min \ limits_ {w} \ frac {1} {2n_ {samples}} \ lVert X_ {w} -Y \ rVert_2 ^ 2 + \ alpha \ rho \ lVert W \ rVert_1 + \ frac {\ alpha \ lgroup 1- \ rho \ rgroup} {2} \ \ lVert W \ rVert_2 ^ 2 $$

Parametri

La tabella seguente è composta dai parametri utilizzati da ElasticNet modulo -

Suor n Parametro e descrizione
1

alpha - float, opzionale, default = 1.0

Alpha, la costante che moltiplica il termine L1 / L2, è il parametro di tuning che decide quanto si vuole penalizzare il modello. Il valore predefinito è 1.0.

2

l1_ratio - galleggiante

Questo è chiamato parametro di miscelazione ElasticNet. Il suo range è 0 <= l1_ratio <= 1. Se l1_ratio = 1, la penalità sarebbe L1. Se l1_ratio = 0, la penalità sarebbe una penalità L2. Se il valore del rapporto l1 è compreso tra 0 e 1, la penalità sarebbe la combinazione di L1 e L2.

3

fit_intercept- Booleano, facoltativo. Impostazione predefinita = vero

Questo parametro specifica che una costante (bias o intercetta) deve essere aggiunta alla funzione di decisione. Nessuna intercetta verrà utilizzata nel calcolo, se verrà impostata su false.

4

tol - galleggiante, opzionale

Questo parametro rappresenta la tolleranza per l'ottimizzazione. Il valore tol e gli aggiornamenti vengono confrontati e se vengono trovati aggiornamenti inferiori a tol, l'ottimizzazione controlla il doppio gap per l'ottimalità e continua fino a quando non è inferiore a tol.

5

normalise - Booleano, opzionale, predefinito = False

Se questo parametro è impostato su True, il regressore X verrà normalizzato prima della regressione. La normalizzazione verrà effettuata sottraendo la media e dividendola per la norma L2. Sefit_intercept = False, questo parametro verrà ignorato.

6

precompute - True | False | array-like, default = False

Con questo parametro possiamo decidere se utilizzare una matrice di Gram precalcolata per velocizzare o meno il calcolo. Per preservare la scarsità, sarebbe sempre vero per l'input scarso.

7

copy_X - Booleano, opzionale, predefinito = True

Per impostazione predefinita, è vero, il che significa che X verrà copiato. Ma se è impostato su false, X potrebbe essere sovrascritto.

8

max_iter - int, opzionale

Come suggerisce il nome, rappresenta il numero massimo di iterazioni prese per risolutori di gradiente coniugato.

9

warm_start - bool, opzionale, predefinito = false

Con questo parametro impostato su True, possiamo riutilizzare la soluzione della chiamata precedente per adattarla come inizializzazione. Se scegliamo default cioè false, cancellerà la soluzione precedente.

10

random_state - int, istanza RandomState o None, opzionale, default = nessuno

Questo parametro rappresenta il seme del numero pseudo casuale generato che viene utilizzato durante la mescolanza dei dati. Di seguito sono riportate le opzioni:

  • int - In questo caso, random_state è il seme utilizzato dal generatore di numeri casuali.

  • RandomState instance- In questo caso, random_state è il generatore di numeri casuali.

  • None - In questo caso, il generatore di numeri casuali è l'istanza RandonState utilizzata da np.random.

11

selection - str, default = 'ciclico'

  • Cyclic - Il valore predefinito è ciclico, il che significa che le funzioni verranno ripetute sequenzialmente per impostazione predefinita.

  • Random - Se impostiamo la selezione su casuale, un coefficiente casuale verrà aggiornato ad ogni iterazione.

Attributi

La tabella seguente è costituita dagli attributi utilizzati da ElasticNet modulo -

Suor n Attributi e descrizione
1

coef_ - array, forma (n_tasks, n_features)

Questo attributo fornisce i vettori del peso.

2

Intercept_ - array, forma (n_tasks)

Rappresenta il termine indipendente nella funzione decisionale.

3

n_iter_ - int

Fornisce il numero di iterazioni eseguite dal risolutore della discesa delle coordinate per raggiungere la tolleranza specificata.

Esempio di implementazione

Seguendo gli usi dello script Python ElasticNet modello lineare che utilizza ulteriormente la discesa delle coordinate come algoritmo per adattare i coefficienti -

from sklearn import linear_model
ENreg = linear_model.ElasticNet(alpha = 0.5,random_state = 0)
ENreg.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])

Produzione

ElasticNet(alpha = 0.5, copy_X = True, fit_intercept = True, l1_ratio = 0.5,
   max_iter = 1000, normalize = False, positive = False, precompute=False,
   random_state = 0, selection = 'cyclic', tol = 0.0001, warm_start = False)

Esempio

Ora, una volta adattato, il modello può prevedere nuovi valori come segue:

ENregReg.predict([[0,1]])

Produzione

array([0.73686077])

Esempio

Per l'esempio sopra, possiamo ottenere il vettore di peso con l'aiuto del seguente script python:

ENreg.coef_

Produzione

array([0.26318357, 0.26313923])

Esempio

Allo stesso modo, possiamo ottenere il valore di intercettazione con l'aiuto del seguente script python -

ENreg.intercept_

Produzione

0.47367720941913904

Esempio

Possiamo ottenere il numero totale di iterazioni per ottenere la tolleranza specificata con l'aiuto del seguente script python -

ENreg.n_iter_

Produzione

15

Possiamo modificare i valori di alfa (verso 1) per ottenere risultati migliori dal modello.

Esempio

Vediamo lo stesso esempio con alpha = 1.

from sklearn import linear_model
ENreg = linear_model.ElasticNet(alpha = 1,random_state = 0)
ENreg.fit([[0,0], [1, 1], [2, 2]], [0, 1, 2])

Output
ElasticNet(alpha = 1, copy_X = True, fit_intercept = True, l1_ratio = 0.5,
   max_iter = 1000, normalize = False, positive = False, precompute = False,
   random_state = 0, selection = 'cyclic', tol = 0.0001, warm_start = False)

#Predicting new values
ENreg.predict([[1,0]])

Output
array([0.90909216])

#weight vectors
ENreg.coef_

Output
array([0.09091128, 0.09090784])

#Calculating intercept
ENreg.intercept_

Output
0.818180878658411

#Calculating number of iterations
ENreg.n_iter_

Output
10

Dagli esempi precedenti, possiamo vedere la differenza nelle uscite.