Regressão Lasso

Visão geral

Regressão lasso (lasso regression) (“Operador de Encolhimento e Seleção pelo Menor Valor Absoluto” — “Least Absolute Shrinkage and Selection Operator”) é uma forma de regressão linear (linear regression) que adiciona uma penalidade de regularização L1 (L1 regularization) ao objetivo usual de erro quadrático. Em comparação com os mínimos quadrados ordinários (ordinary least squares, OLS) Regressão Linear, o lasso foi projetado para:

  • Reduzir o sobreajuste (overfitting) ao encolher coeficientes em direção a zero
  • Incentivar a esparsidade (sparsity): muitos coeficientes tornam-se exatamente zero
  • Realizar seleção implícita de atributos (implicit feature selection), uma forma de seleção de atributos (feature selection), o que pode melhorar a interpretabilidade e, às vezes, a generalização (generalization) — especialmente quando você tem muitos atributos (features)

O lasso é amplamente usado para modelagem preditiva (predictive modeling) em cenários de alta dimensionalidade (high-dimensional) (muitos atributos de entrada), bem como para construir modelos lineares mais simples e interpretáveis.

Função objetivo (mínimos quadrados com regularização L1)

Assuma um modelo linear padrão:

[ \hat{y} = \beta_0 + X\beta ]

onde:

  • (X \in \mathbb{R}^{n \times p}) é a matriz de atributos,
  • (\beta \in \mathbb{R}^{p}) são os coeficientes,
  • (\beta_0) é o intercepto.

Forma penalizada (Lagrangiana)

A estimativa do lasso resolve:

[ \min_{\beta_0,\beta}; \frac{1}{2n}\sum_{i=1}^{n}\left(y_i - \beta_0 - x_i^\top\beta\right)^2 ;+; \lambda |\beta|_1 ]

onde:

  • (|\beta|1 = \sum{j=1}^{p}|\beta_j|) é a norma L1,
  • (\lambda \ge 0) controla a força da regularização (às vezes escrita como (\alpha) em bibliotecas).

Detalhes importantes:

  • O intercepto (\beta_0) normalmente não é penalizado.
  • Quando (\lambda = 0), o lasso se reduz a mínimos quadrados ordinários.
  • À medida que (\lambda) aumenta, os coeficientes encolhem de forma mais agressiva; muitos se tornam exatamente zero.

Forma com restrição (visão equivalente)

O lasso também pode ser escrito como:

[ \min_{\beta_0,\beta}; \frac{1}{2n}\sum_{i=1}^{n}\left(y_i - \beta_0 - x_i^\top\beta\right)^2 \quad\text{s.t.}\quad |\beta|_1 \le t ]

para algum orçamento (t \ge 0). Isso torna explícita a interpretação de “magnitude total absoluta limitada dos coeficientes”.

Por que L1 incentiva a esparsidade (e a seleção de atributos)

A propriedade definidora do lasso é que ele frequentemente define muitos coeficientes como exatamente zero. Isso não é apenas “coeficientes pequenos” — é esparsidade verdadeira.

Intuição geométrica

A regularização pode ser entendida como minimizar a perda (loss) enquanto se permanece dentro de uma região de restrição:

  • A regressão ridge (ridge regression) usa uma restrição L2 ((|\beta|_2 \le t)), que é uma “bola” suave.
  • O lasso usa uma restrição L1 ((|\beta|_1 \le t)), que tem quinas (em 2D, parece um losango).

O ótimo frequentemente ocorre onde as curvas de nível da perda tocam pela primeira vez a região viável. Com uma restrição L1, as quinas se alinham com os eixos, então as soluções frequentemente caem sobre os eixos — significando que alguns (\beta_j = 0).

Limiarização suave em 1D (um exemplo concreto)

Considere o caso mais simples com um coeficiente. O objetivo do lasso se torna:

[ \min_{\beta}; \frac{1}{2}(\beta - z)^2 + \lambda|\beta| ]

A solução é:

[ \beta^* = \text{sign}(z)\cdot\max(|z|-\lambda, 0) ]

Este é o operador de limiarização suave (soft-thresholding):

  • Se (|z|\le\lambda), a solução é exatamente 0
  • Caso contrário, ela é encolhida em direção a 0 em (\lambda)

Em dimensões mais altas, um comportamento de limiarização semelhante emerge durante a otimização, levando a modelos esparsos.

Nuance importante: a seleção de atributos nem sempre é “estável”

Embora o lasso realize seleção implícita, o conjunto exato de atributos selecionados pode ser instável quando:

  • Os atributos são fortemente correlacionados
  • O conjunto de dados é pequeno em relação ao número de atributos
  • Muitos atributos têm poder preditivo semelhante

Este é um ponto prático discutido mais adiante.

Otimização: por que não há solução em forma fechada

Diferentemente de mínimos quadrados ordinários e regressão ridge, o lasso não tem uma solução em forma fechada (closed-form solution) simples porque a penalidade L1 não é diferenciável (not differentiable) em zero.

Solucionadores (solvers) comuns incluem:

  • Descida por coordenadas (coordinate descent): atualiza um coeficiente por vez (muito comum na prática)
  • LARS / algoritmos de trajetória do lasso (Lasso path algorithms): calculam soluções de forma eficiente para muitos valores de (\lambda)
  • Métodos de gradiente proximal (proximal gradient methods) (ISTA/FISTA): combinam passos de gradiente na parte suave com um passo proximal (proximal step) de limiarização suave (relacionado a Descida de Gradiente)

A maioria dos profissionais depende de implementações bem testadas em bibliotecas.

Ajustando a força de regularização (\(\lambda\)) com validação cruzada

Escolher (\lambda) é central: pequeno demais e você sobreajusta; grande demais e você tem subajuste (underfitting) (alto viés). Isto é um caso do Trade-off Viés-Variância.

Validação cruzada (CV)

A abordagem padrão é a validação cruzada (cross-validation, CV) do tipo K-fold Validação Cruzada:

  1. Escolha uma grade (grid) de valores candidatos de (\lambda) (frequentemente espaçados de forma logarítmica).
  2. Para cada (\lambda), ajuste o lasso em (K-1) dobras (folds) e avalie o erro de predição na dobra reservada.
  3. Faça a média do erro entre as dobras.
  4. Escolha o (\lambda) que minimiza o erro de CV.

Duas regras de seleção comuns:

  • Regra do erro mínimo: escolha (\lambda) com o menor erro médio de CV.
  • Regra de 1 erro padrão (1SE) (1-standard-error, 1SE): escolha o modelo mais simples cujo erro esteja dentro de um erro padrão do mínimo. Isso normalmente produz um modelo mais regularizado e mais esparso.

Dicas práticas de ajuste

  • Use uma grade log-espaciada (por exemplo, (10^{-4}) a (10^{2})), porque valores úteis de (\lambda) podem abranger ordens de magnitude.
  • Use validação cruzada aninhada (nested CV) se você quiser uma estimativa não viesada do erro de generalização (generalization error) após o ajuste.
  • Garanta que todo o pré-processamento (preprocessing) (especialmente o escalonamento) aconteça dentro do loop de CV para evitar vazamento de dados (leakage) (use pipelines (pipelines)).

Considerações práticas

Escalonamento de atributos é (geralmente) essencial

Como o lasso penaliza (\sum_j |\beta_j|), a escala de cada atributo afeta diretamente a penalidade:

  • Se o atributo (x_1) é medido em milhares e (x_2) é medido em frações, a mesma mudança em (\beta) não corresponde à mesma mudança nas previsões.
  • Sem escalonamento, o lasso pode penalizar injustamente coeficientes de atributos em pequena escala (ou penalizar pouco os de grande escala), levando a uma seleção enganosa.

Prática padrão: centralizar e escalar cada atributo (por exemplo, padronização z-score (z-score standardization)). Veja também Escalonamento de Atributos.

Casos especiais:

  • Variáveis categóricas codificadas em one-hot (one-hot encoded): o escalonamento nem sempre é necessário, mas ainda pode ser benéfico dependendo de como os atributos são codificados e misturados com variáveis contínuas.
  • Atributos de texto esparsos e de alta dimensionalidade (TF-IDF): muitos pipelines ainda padronizam ou normalizam as entradas, mas você deve preservar a esparsidade (use escaladores compatíveis com esparsidade (sparse-aware scalers) ou confie em representações já normalizadas).

Atributos correlacionados: o lasso pode escolher um e descartar os outros

Quando dois (ou mais) atributos são altamente correlacionados, o lasso frequentemente:

  • Escolhe um atributo e define os outros como zero, às vezes de modo um tanto arbitrário
  • Produz conjuntos de atributos instáveis sob pequenas perturbações nos dados

Isso não é necessariamente errado para previsão, mas pode ser problemático se você se importa com interpretabilidade ou conclusões científicas.

Soluções comuns:

  • Use Regressão Ridge se você quiser manter preditores correlacionados, mas encolhê-los.
  • Use Elastic Net para combinar penalidades L1 e L2; o elastic net tende a selecionar grupos de variáveis correlacionadas em conjunto.
  • Considere engenharia de atributos orientada pelo domínio (combinar variáveis correlacionadas, usar PCA (PCA), etc.) quando apropriado.

Lasso em alta dimensionalidade (p >> n)

O lasso é popular quando (p) é grande, até maior que (n), porque ele ainda consegue ajustar um modelo e impor esparsidade. No entanto:

  • A solução pode não ser única se os atributos forem altamente colineares.
  • Em muitos cenários, a solução do lasso contém no máximo (n) coeficientes não nulos (sob condições típicas), o que pode ser uma limitação se o verdadeiro sinal for denso.
  • Propriedades estatísticas dependem de suposições como “esparsidade” da relação verdadeira e condições sobre a matriz de projeto (design matrix) (frequentemente discutidas em tratamentos teóricos).

Viés dos coeficientes e reajuste “pós-lasso”

O lasso encolhe coeficientes, o que introduz viés (bias). Um fluxo de trabalho prático comum é:

  1. Ajustar o lasso para selecionar um subconjunto de atributos.
  2. Reajustar uma regressão linear sem regularização apenas nesses atributos (às vezes chamado de OLS pós-lasso (post-lasso OLS)).

Isso pode reduzir o viés nas estimativas dos coeficientes, mas complica a inferência (os intervalos de confiança (confidence intervals) e valores p (p-values) não são diretos após a seleção).

Interações, polinômios e explosão de atributos

O lasso se torna particularmente útil quando você cria muitos atributos derivados (interações (interactions), termos polinomiais (polynomial terms)), porque ele pode zerar termos irrelevantes. Ainda assim, termos derivados correlacionados podem aumentar a instabilidade; o elastic net frequentemente funciona melhor nessas expansões.

Como o lasso se compara ao ridge e ao elastic net

O lasso é um membro de uma família de modelos lineares regularizados. A escolha frequentemente depende dos seus objetivos e da estrutura dos seus dados.

Lasso vs ridge

  • Lasso (L1):

    • Incentiva esparsidade (seleção de atributos)
    • Pode ser instável com atributos correlacionados
    • Funciona bem quando você acredita que apenas um pequeno subconjunto de atributos realmente importa
  • Ridge (L2) Regressão Ridge:

    • Encolhe coeficientes, mas raramente os torna exatamente zero
    • Muitas vezes tem melhor desempenho quando muitos atributos têm efeitos pequenos/médios
    • Lida bem com multicolinearidade (multicollinearity); tende a distribuir o peso entre preditores correlacionados

Lasso vs elastic net

O elastic net (elastic net) Elastic Net combina penalidades L1 e L2:

[ \min_{\beta_0,\beta}; \frac{1}{2n}|y - \beta_0\mathbf{1} - X\beta|_2^2 + \lambda\left(\alpha|\beta|_1 + \frac{1-\alpha}{2}|\beta|_2^2\right) ]

  • (\alpha=1) gera lasso; (\alpha=0) gera ridge.
  • O elastic net tende a ser um forte padrão quando:
    • Você espera preditores correlacionados
    • Você quer alguma esparsidade, mas também estabilidade

Orientação prática (regra de bolso)

  • Escolha lasso quando:
    • Interpretabilidade importa e você quer um modelo menor
    • Você acredita que o verdadeiro sinal é esparso
  • Escolha ridge quando:
    • Muitos preditores contribuem modestamente
    • Preditores são altamente correlacionados e você não quer seleção arbitrária
  • Escolha elastic net quando:
    • Você quer esparsidade e robustez a atributos correlacionados (comum na prática)

Exemplo prático: regressão lasso no scikit-learn (com CV)

Este exemplo mostra um fluxo de trabalho padrão:

  • Separar os dados
  • Construir um pipeline que escala os atributos e ajusta o lasso
  • Usar validação cruzada para escolher o melhor (\lambda)
import numpy as np
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LassoCV
from sklearn.metrics import mean_squared_error

# Synthetic data: only a few features are truly informative
X, y = make_regression(
    n_samples=500,
    n_features=50,
    n_informative=5,
    noise=15.0,
    random_state=0
)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=0
)

model = Pipeline([
    ("scaler", StandardScaler()),
    ("lasso_cv", LassoCV(
        alphas=np.logspace(-3, 1, 60),  # candidate lambdas
        cv=5,
        max_iter=5000,
        random_state=0
    ))
])

model.fit(X_train, y_train)

y_pred = model.predict(X_test)
test_mse = mean_squared_error(y_test, y_pred)

lasso = model.named_steps["lasso_cv"]
print("Chosen alpha (lambda):", lasso.alpha_)
print("Test MSE:", test_mse)
print("Non-zero coefficients:", np.sum(lasso.coef_ != 0), "out of", X.shape[1])

O que observar:

  • O alpha_ escolhido reflete a força de regularização selecionada por CV.
  • O número de coeficientes não nulos indica quão agressivamente o lasso realizou seleção de atributos.
  • Use o mesmo padrão de pipeline em dados reais para evitar vazamento de escalonamento durante a CV.

Interpretando coeficientes

Após o ajuste:

  • Coeficientes iguais a 0 correspondem a atributos excluídos do modelo.
  • Coeficientes não nulos indicam atributos selecionados, mas lembre-se:
    • Com preditores correlacionados, a seleção pode ser instável.
    • Coeficientes são encolhidos (enviesados em direção a zero).

Aplicações e quando o lasso é uma boa escolha

Casos de uso comuns:

  • Dados tabulares de alta dimensionalidade (muitos atributos engineered)
  • Genômica / bioinformática (muitos preditores candidatos, suposições de sinal esparso)
  • Econometria e ciências sociais (modelos esparsos para interpretabilidade; embora seja necessária cautela na inferência)
  • Modelos de baseline (baseline models) em fluxos de trabalho de ML: um comparador rápido e interpretável a modelos mais complexos

O lasso frequentemente é um baseline forte no regime de “modelo linear + bons atributos”, e também pode servir como uma etapa de seleção de atributos antes de modelagens mais complexas (com a ressalva anterior sobre estabilidade).

Resumo

  • Regressão lasso adiciona uma penalidade L1 à regressão linear, resolvendo:

    [ \min_{\beta_0,\beta}; \frac{1}{2n}|y - \beta_0\mathbf{1} - X\beta|_2^2 + \lambda|\beta|_1 ]

  • A penalidade L1 incentiva soluções esparsas, definindo muitos coeficientes como exatamente zero, permitindo seleção implícita de atributos.

  • (\lambda) deve ser ajustado usando validação cruzada; a regra 1SE pode produzir um modelo mais esparso com erro semelhante.

  • O escalonamento de atributos normalmente é essencial; caso contrário, a penalidade trata atributos de forma injusta.

  • Com atributos correlacionados, o lasso pode ser instável; considere Regressão Ridge ou Elastic Net para um comportamento mais robusto.

  • O lasso é valioso para modelos interpretáveis e problemas de alta dimensionalidade, mas o encolhimento dos coeficientes introduz viés e a seleção de atributos pode ser sensível a perturbações nos dados.