Regressão Lasso com Scikit-Learn

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório demonstra o uso do algoritmo de regressão Lasso do Scikit-learn em dados densos e esparsos. O algoritmo Lasso é um método de regressão linear que adiciona uma penalidade aos coeficientes de regressão. Esta penalidade incentiva o modelo a produzir coeficientes esparsos. O algoritmo Lasso é útil em situações onde o número de características é grande em comparação com o número de amostras.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importar Bibliotecas

Começamos importando as bibliotecas necessárias. Precisamos do Scikit-learn, NumPy e SciPy.

from time import time
from scipy import sparse
from scipy import linalg
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso

Gerar Dados Densos

Em seguida, geramos alguns dados densos que usaremos para a regressão Lasso. Usamos a função make_regression do Scikit-learn para gerar 200 amostras com 5000 características.

X, y = make_regression(n_samples=200, n_features=5000, random_state=0)

Treinar Lasso em Dados Densos

Agora, treinamos dois modelos de regressão Lasso, um nos dados densos e outro nos dados esparsos. Definimos o parâmetro alpha para 1 e o número máximo de iterações para 1000.

alpha = 1
sparse_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=1000)
dense_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=1000)

Ajustar Lasso a Dados Densos

Ajustamos os modelos de regressão Lasso aos dados densos usando a função fit do Scikit-learn. Também medimos o tempo do processo de ajuste e imprimimos o tempo para cada modelo Lasso.

t0 = time()
sparse_lasso.fit(X_sp, y)
print(f"Sparse Lasso concluído em {(time() - t0):.3f}s")

t0 = time()
dense_lasso.fit(X, y)
print(f"Dense Lasso concluído em {(time() - t0):.3f}s")

Comparar Coeficientes de Lasso Denso e Lasso Esparso

Comparamos os coeficientes do modelo Lasso denso e do modelo Lasso esparso para garantir que estejam produzindo os mesmos resultados. Calculamos a norma euclidiana da diferença entre os coeficientes.

coeff_diff = linalg.norm(sparse_lasso.coef_ - dense_lasso.coef_)
print(f"Distância entre coeficientes: {coeff_diff:.2e}")

Gerar Dados Esparsos

Em seguida, geramos alguns dados esparsos que usaremos para a regressão Lasso. Copiamos os dados densos da etapa anterior e substituímos todos os valores menores que 2,5 por 0. Também convertemos os dados esparsos para o formato Compressed Sparse Column do Scipy.

Xs = X.copy()
Xs[Xs < 2.5] = 0.0
Xs_sp = sparse.coo_matrix(Xs)
Xs_sp = Xs_sp.tocsc()

Treinar Lasso em Dados Esparsos

Agora, treinamos dois modelos de regressão Lasso, um nos dados densos e outro nos dados esparsos. Definimos o parâmetro alpha para 0,1 e o número máximo de iterações para 10000.

alpha = 0.1
sparse_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=10000)
dense_lasso = Lasso(alpha=alpha, fit_intercept=False, max_iter=10000)

Ajustar Lasso a Dados Esparsos

Ajustamos os modelos de regressão Lasso aos dados esparsos usando a função fit do Scikit-learn. Também medimos o tempo do processo de ajuste e imprimimos o tempo para cada modelo Lasso.

t0 = time()
sparse_lasso.fit(Xs_sp, y)
print(f"Sparse Lasso concluído em {(time() - t0):.3f}s")

t0 = time()
dense_lasso.fit(Xs, y)
print(f"Dense Lasso concluído em  {(time() - t0):.3f}s")

Comparar Coeficientes de Lasso Denso e Lasso Esparso

Comparamos os coeficientes do modelo Lasso denso e do modelo Lasso esparso para garantir que estão produzindo os mesmos resultados. Calculamos a norma euclidiana da diferença entre os coeficientes.

coeff_diff = linalg.norm(sparse_lasso.coef_ - dense_lasso.coef_)
print(f"Distância entre coeficientes : {coeff_diff:.2e}")

Resumo

Neste laboratório, demonstramos o uso do algoritmo de regressão Lasso do Scikit-learn em dados densos e esparsos. Mostramos que o algoritmo Lasso fornece os mesmos resultados para dados densos e esparsos e que, no caso de dados esparsos, o algoritmo é mais rápido.