Aprender Scikit - Elastic-Net

Elastic-Net es un método de regresión regularizado que combina linealmente ambas penalizaciones, es decir, L1 y L2 de los métodos de regresión Lasso y Ridge. Es útil cuando hay varias funciones correlacionadas. La diferencia entre Lass y Elastic-Net radica en el hecho de que es probable que Lasso elija una de estas características al azar, mientras que es probable que elastic-net elija ambas a la vez.

Sklearn proporciona un modelo lineal llamado ElasticNetque se entrena con las normas L1, L2 para la regularización de los coeficientes. La ventaja de tal combinación es que permite aprender un modelo disperso donde algunos de los pesos son distintos de cero como el método de regularización de Lasso, mientras se mantienen las propiedades de regularización del método de regularización de Ridge.

A continuación se muestra la función objetivo para minimizar:

$$ \ Displaystyle \ min \ limits_ {w} \ frac {1} {2n_ {samples}} \ lVert X_ {w} -Y \ rVert_2 ^ 2 + \ alpha \ rho \ lVert W \ rVert_1 + \ frac {\ alpha \ lgrupo 1- \ rho \ rgrupo} {2} \ \ lVert W \ rVert_2 ^ 2 $$

Parámetros

La siguiente tabla consta de los parámetros utilizados por ElasticNet módulo -

No Señor Descripción de parámetros
1

alpha - flotante, opcional, predeterminado = 1.0

Alpha, la constante que multiplica el término L1 / L2, es el parámetro de ajuste que decide cuánto queremos penalizar al modelo. El valor predeterminado es 1.0.

2

l1_ratio - flotar

Esto se denomina parámetro de mezcla de ElasticNet. Su rango es 0 <= l1_ratio <= 1. Si l1_ratio = 1, la penalización sería L1. Si l1_ratio = 0, la penalización sería una penalización L2. Si el valor de la relación l1 está entre 0 y 1, la penalización sería la combinación de L1 y L2.

3

fit_intercept- Booleano, opcional. Predeterminado = Verdadero

Este parámetro especifica que se debe agregar una constante (sesgo o intersección) a la función de decisión. No se utilizará ninguna intersección en el cálculo, si se establece en falso.

4

tol - flotador, opcional

Este parámetro representa la tolerancia para la optimización. El valor de tol y las actualizaciones se compararían y, si se encuentran actualizaciones más pequeñas que tol, la optimización comprueba la optimización de la brecha dual y continúa hasta que sea más pequeña que tol.

5

normalise - Booleano, opcional, predeterminado = Falso

Si este parámetro se establece en Verdadero, el regresor X se normalizará antes de la regresión. La normalización se realizará restando la media y dividiéndola por la norma L2. Sifit_intercept = False, este parámetro será ignorado.

6

precompute - Verdadero | Falso | similar a una matriz, predeterminado = Falso

Con este parámetro podemos decidir si usar una matriz de Gram precalculada para acelerar el cálculo o no. Para preservar la escasez, siempre sería cierto para la entrada escasa.

7

copy_X - Booleano, opcional, predeterminado = Verdadero

De forma predeterminada, es verdadero, lo que significa que se copiará X. Pero si se establece en falso, X puede sobrescribirse.

8

max_iter - int, opcional

Como sugiere el nombre, representa el número máximo de iteraciones tomadas para los solucionadores de gradientes conjugados.

9

warm_start - bool, opcional, predeterminado = falso

Con este parámetro establecido en True, podemos reutilizar la solución de la llamada anterior para que encaje como inicialización. Si elegimos default, es decir, falso, borrará la solución anterior.

10

random_state - int, instancia de RandomState o None, opcional, predeterminado = ninguno

Este parámetro representa la semilla del número pseudoaleatorio generado que se usa mientras se barajan los datos. Las siguientes son las opciones:

  • int - En este caso, random_state es la semilla utilizada por el generador de números aleatorios.

  • RandomState instance- En este caso, random_state es el generador de números aleatorios.

  • None - En este caso, el generador de números aleatorios es la instancia de RandonState utilizada por np.random.

11

selection - str, predeterminado = 'cíclico'

  • Cyclic - El valor predeterminado es cíclico, lo que significa que las funciones se repetirán secuencialmente de forma predeterminada.

  • Random - Si configuramos la selección como aleatoria, se actualizará un coeficiente aleatorio en cada iteración.

Atributos

La siguiente tabla consta de los atributos utilizados por ElasticNet módulo -

No Señor Atributos y descripción
1

coef_ - matriz, forma (n_tareas, n_features)

Este atributo proporciona los vectores de peso.

2

Intercept_ - matriz, forma (n_tareas)

Representa el término independiente en función de decisión.

3

n_iter_ - int

Proporciona el número de iteraciones ejecutadas por el solucionador de descenso de coordenadas para alcanzar la tolerancia especificada.

Ejemplo de implementación

Siguiendo los usos del script de Python ElasticNet modelo lineal que utiliza además el descenso de coordenadas como algoritmo para ajustar los coeficientes -

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])

Salida

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)

Ejemplo

Ahora, una vez ajustado, el modelo puede predecir nuevos valores de la siguiente manera:

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

Salida

array([0.73686077])

Ejemplo

Para el ejemplo anterior, podemos obtener el vector de peso con la ayuda del siguiente script de Python:

ENreg.coef_

Salida

array([0.26318357, 0.26313923])

Ejemplo

Del mismo modo, podemos obtener el valor de la intercepción con la ayuda de la siguiente secuencia de comandos de Python:

ENreg.intercept_

Salida

0.47367720941913904

Ejemplo

Podemos obtener el número total de iteraciones para obtener la tolerancia especificada con la ayuda del siguiente script de Python:

ENreg.n_iter_

Salida

15

Podemos cambiar los valores de alfa (hacia 1) para obtener mejores resultados del modelo.

Ejemplo

Veamos el mismo ejemplo 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

De los ejemplos anteriores, podemos ver la diferencia en las salidas.