Scikit Learn - Elastic-Net

O Elastic-Net é um método de regressão regularizado que combina linearmente ambas as penalidades, ou seja, L1 e L2 dos métodos de regressão Lasso e Ridge. É útil quando há vários recursos correlacionados. A diferença entre Lass e Elastic-Net reside no fato de que Lasso provavelmente escolherá uma dessas características aleatoriamente, enquanto elástica-net provavelmente escolherá ambas ao mesmo tempo.

Sklearn fornece um modelo linear denominado ElasticNetque é treinado com a norma L1 e L2 para regularização dos coeficientes. A vantagem de tal combinação é que ela permite aprender um modelo esparso onde poucos dos pesos são diferentes de zero como o método de regularização Lasso, enquanto ainda mantém as propriedades de regularização do método de regularização Ridge.

A seguir está a função objetivo para minimizar -

$$ \ displaystyle \ min \ limits_ {w} \ frac {1} {2n_ {amostras}} \ 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

A tabela a seguir consiste nos parâmetros usados ​​por ElasticNet módulo -

Sr. Não Parâmetro e Descrição
1

alpha - flutuante, opcional, padrão = 1,0

Alpha, a constante que multiplica o termo L1 / L2, é o parâmetro de ajuste que decide o quanto queremos penalizar o modelo. O valor padrão é 1.0.

2

l1_ratio - flutuar

Isso é chamado de parâmetro de mistura ElasticNet. Seu intervalo é 0 <= l1_ratio <= 1. Se l1_ratio = 1, a penalidade seria a penalidade de L1. Se l1_ratio = 0, a penalidade seria uma penalidade L2. Se o valor da razão l1 estiver entre 0 e 1, a penalidade seria a combinação de L1 e L2.

3

fit_intercept- Booleano, opcional. Padrão = Verdadeiro

Este parâmetro especifica que uma constante (polarização ou interceptação) deve ser adicionada à função de decisão. Nenhuma interceptação será usada no cálculo, se for definida como falsa.

4

tol - float, opcional

Este parâmetro representa a tolerância para a otimização. O valor tol e as atualizações seriam comparados e, se fossem encontradas atualizações menores que tol, a otimização verifica a lacuna dupla quanto à otimização e continua até que seja menor que tol.

5

normalise - Booleano, opcional, padrão = False

Se este parâmetro for definido como True, o regressor X será normalizado antes da regressão. A normalização será feita subtraindo a média e dividindo pela norma L2. E sefit_intercept = False, este parâmetro será ignorado.

6

precompute - Verdadeiro | Falso | semelhante a uma matriz, padrão = Falso

Com este parâmetro, podemos decidir se devemos usar uma matriz de Gram pré-computada para acelerar o cálculo ou não. Para preservar a dispersão, sempre seria verdadeiro para a entrada esparsa.

7

copy_X - Booleano, opcional, padrão = Verdadeiro

Por padrão, é verdade, o que significa que X será copiado. Mas se for definido como falso, X pode ser substituído.

8

max_iter - int, opcional

Como o nome sugere, ele representa o número máximo de iterações tomadas para solvers de gradiente conjugado.

9

warm_start - bool, opcional, padrão = falso

Com este parâmetro definido como True, podemos reutilizar a solução da chamada anterior para caber como inicialização. Se escolhermos o padrão, ou seja, falso, ele apagará a solução anterior.

10

random_state - int, instância RandomState ou Nenhum, opcional, padrão = nenhum

Este parâmetro representa a semente do número pseudoaleatório gerado que é usado ao embaralhar os dados. A seguir estão as opções -

  • int - Neste caso, random_state é a semente usada pelo gerador de números aleatórios.

  • RandomState instance- Nesse caso, random_state é o gerador de números aleatórios.

  • None - Nesse caso, o gerador de número aleatório é a instância RandonState usada por np.random.

11

selection - str, padrão = 'cíclico'

  • Cyclic - O valor padrão é cíclico, o que significa que os recursos serão repetidos sequencialmente por padrão.

  • Random - Se definirmos a seleção como aleatória, um coeficiente aleatório será atualizado a cada iteração.

Atributos

A tabela a seguir consiste nos atributos usados ​​por ElasticNet módulo -

Sr. Não Atributos e descrição
1

coef_ - matriz, forma (n_tasks, n_features)

Este atributo fornece os vetores de peso.

2

Intercept_ - matriz, forma (n_tasks)

Ele representa o termo independente na função de decisão.

3

n_iter_ - int

Fornece o número de iterações executadas pelo solucionador de descida por coordenadas para atingir a tolerância especificada.

Exemplo de Implementação

O seguinte script Python usa ElasticNet modelo linear que ainda usa a descida coordenada como o algoritmo para ajustar os 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])

Resultado

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)

Exemplo

Agora, uma vez ajustado, o modelo pode prever novos valores da seguinte forma -

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

Resultado

array([0.73686077])

Exemplo

Para o exemplo acima, podemos obter o vetor de peso com a ajuda do seguinte script python -

ENreg.coef_

Resultado

array([0.26318357, 0.26313923])

Exemplo

Da mesma forma, podemos obter o valor de interceptar com a ajuda do seguinte script python -

ENreg.intercept_

Resultado

0.47367720941913904

Exemplo

Podemos obter o número total de iterações para obter a tolerância especificada com a ajuda do seguinte script python -

ENreg.n_iter_

Resultado

15

Podemos alterar os valores de alfa (em direção a 1) para obter melhores resultados do modelo.

Exemplo

Vejamos o mesmo exemplo com alfa = 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

Nos exemplos acima, podemos ver a diferença nas saídas.