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 -
|
11 | selection - str, padrão = 'cíclico'
|
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.