Introdução ao Método Lasso
O Lasso, acrônimo para Least Absolute Shrinkage and Selection Operator, constitui uma técnica de regressão linear que combina regularização com seleção de features. Primordialmente, diferencia-se da regressão Ridge por empregar penalidade L1, o que promove esparsidade nos coeficientes estimados.
Formulação Matemática
A função objetivo do Lasso minimiza a soma dos quadrados dos resíduos com uma penalidade baseada na norma L1 dos coeficientes:
\(\min_{w} \frac{1}{2n_{\text{samples}}} ||X w – y||_2^2 + \alpha ||w||_1\)Onde:
- \(X\) representa a matriz de features
- \(y\) denota o vetor target
- \(w\) simboliza os coeficientes a serem estimados
- \(\alpha\) corresponde ao parâmetro de regularização
- \(||w||_1\) indica a norma L1 (soma dos valores absolutos)
Característica da Penalidade L1
Surpreendentemente, a penalidade L1 possui a propriedade de produzir coeficientes exatamente iguais a zero para valores suficientemente altos de \(\alpha\). Esta característica permite que o Lasso execute seleção automática de features, eliminando variáveis irrelevantes do modelo.
Vantagens da Abordagem Lasso
- Seleção automática de features através de coeficientes nulos
- Redução da complexidade do modelo
- Melhor interpretabilidade devido à eliminação de variáveis
- Eficácia em problemas de alta dimensionalidade
Implementação no scikit-learn
No scikit-learn, a classe Lasso implementa esta técnica. Ademais, estão disponíveis variações como LassoCV para seleção automática do parâmetro alpha via validação cruzada.
Parâmetros Principais
alpha: Parâmetro de regularização (controle da força da penalidade)max_iter: Número máximo de iterações para convergênciatol: Tolerância para critério de paradaselection: Estratégia de seleção de variáveis
Exemplo Prático de Aplicação
O exemplo a seguir demonstra o uso do Lasso em um problema de regressão com features redundantes:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import Lasso, LassoCV from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score print("=" * 60) print("EXEMPLO PRÁTICO: REGRESSÃO LASSO") print("=" * 60) # Gerar dados com apenas 5 features informativas dentre 15 X, y = make_regression(n_samples=200, n_features=15, n_informative=5, noise=0.5, random_state=42) # Dividir em conjuntos de treino e teste X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) print(f"Dimensões do dataset: {X.shape}") print(f"Features verdadeiramente informativas: 5") # 1. Lasso com alpha fixo print("\n1. LASSO COM ALPHA FIXO (0.1)") lasso_fixo = Lasso(alpha=0.1, max_iter=10000, random_state=42) lasso_fixo.fit(X_train, y_train) y_pred_fixo = lasso_fixo.predict(X_test) coef_nao_nulos = np.sum(lasso_fixo.coef_ != 0) print(f"Coeficientes não nulos: {coef_nao_nulos}/15") print(f"MSE: {mean_squared_error(y_test, y_pred_fixo):.4f}") print(f"R²: {r2_score(y_test, y_pred_fixo):.4f}") # 2. Lasso com validação cruzada para seleção de alpha print("\n2. LASSO COM VALIDAÇÃO CRUZADA (LassoCV)") lasso_cv = LassoCV(cv=5, max_iter=10000, random_state=42) lasso_cv.fit(X_train, y_train) y_pred_cv = lasso_cv.predict(X_test) coef_nao_nulos_cv = np.sum(lasso_cv.coef_ != 0) print(f"Melhor alpha: {lasso_cv.alpha_:.6f}") print(f"Coeficientes não nulos: {coef_nao_nulos_cv}/15") print(f"MSE: {mean_squared_error(y_test, y_pred_cv):.4f}") print(f"R²: {r2_score(y_test, y_pred_cv):.4f}") # Visualização dos coeficientes plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) plt.bar(range(15), lasso_fixo.coef_, color='red', alpha=0.7) plt.axhline(y=0, color='black', linestyle='-', alpha=0.3) plt.xlabel('Features') plt.ylabel('Valor do Coeficiente') plt.title(f'Lasso Alpha Fixo - {coef_nao_nulos} features selecionadas') plt.grid(True, alpha=0.3) plt.subplot(1, 2, 2) plt.bar(range(15), lasso_cv.coef_, color='blue', alpha=0.7) plt.axhline(y=0, color='black', linestyle='-', alpha=0.3) plt.xlabel('Features') plt.ylabel('Valor do Coeficiente') plt.title(f'Lasso CV - {coef_nao_nulos_cv} features selecionadas') plt.grid(True, alpha=0.3) plt.tight_layout() plt.show() # Análise dos coeficientes zerados print("\n3. ANÁLISE DE ESPARSIDADE") coeficientes_zerados = lasso_cv.coef_ == 0 print(f"Features eliminadas (coeficiente zero): {np.sum(coeficientes_zerados)}") print(f"Features mantidas no modelo: {np.sum(~coeficientes_zerados)}") |
Considerações sobre Convergência
Embora o Lasso seja uma ferramenta poderosa, ocasionalmente pode apresentar desafios de convergência. Principalmente em problemas com alta correlação entre features, o algoritmo pode necessitar de mais iterações para convergir. Portanto, é recomendável ajustar os parâmetros max_iter e tol conforme necessário.
Estratégias de Seleção
O scikit-learn oferece duas estratégias através do parâmetro selection:
cyclic: Atualização cíclica de coeficientes (padrão)random: Atualização aleatória, podendo ser mais eficiente em alguns casos
Cenários de Aplicação Recomendados
- Problemas com muitas features potencialmente irrelevantes
- Seleção de variáveis para interpretabilidade do modelo
- Datasets onde a esparsidade é uma propriedade desejável
- Prevenção de overfitting em alta dimensionalidade
Considerações Finais
Inegavelmente, o Lasso representa uma evolução significativa na regressão linear, combinando estimação com seleção de features. Entretanto, a escolha do parâmetro alpha é crucial e tipicamente requer validação cruzada. Analogamente, em problemas onde se deseja manter features correlacionadas, a regressão Ridge ou Elastic Net podem ser mais apropriadas.
Decerto, o domínio desta técnica expande consideravelmente o arsenal do cientista de dados, permitindo a construção de modelos mais parcimoniosos e interpretáveis. Ademais, serve como fundamento para métodos mais avançados de aprendizado estatístico.