Pré-calcular Matriz Gram para ElasticNet

Beginner

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

Introdução

Este laboratório demonstra como pré-calcular a matriz de Gram ao usar amostras ponderadas com um ElasticNet. É importante notar que, se amostras ponderadas forem usadas, a matriz de projeto deve ser centralizada e, em seguida, redimensionada pela raiz quadrada do vetor de pesos antes que a matriz de Gram seja calculada.

Dicas da Máquina Virtual

Após o início da VM, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você encontrar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos o problema rapidamente para você.

Carregando o Conjunto de Dados e Criando Pesos de Amostra

Começamos carregando o conjunto de dados e criando alguns pesos de amostra. Usamos a função make_regression do scikit-learn para gerar um conjunto de dados de regressão aleatório com 100.000 amostras. Em seguida, geramos um vetor de pesos log-normal e o normalizamos para que a soma seja igual ao número total de amostras.

import numpy as np
from sklearn.datasets import make_regression

rng = np.random.RandomState(0)

n_samples = int(1e5)
X, y = make_regression(n_samples=n_samples, noise=0.5, random_state=rng)

sample_weight = rng.lognormal(size=n_samples)
## normalizar os pesos de amostra
normalized_weights = sample_weight * (n_samples / (sample_weight.sum()))

Pré-calculando a Matriz Gram com Amostras Ponderadas

Para ajustar a rede elástica usando a opção precompute juntamente com os pesos de amostra, primeiro devemos centralizar a matriz de projeto e redimensioná-la pelos pesos normalizados antes de calcular a matriz Gram. Centralizamos a matriz de projeto subtraindo a média ponderada de cada coluna de característica de cada linha. Em seguida, redimensionamos a matriz de projeto centralizada multiplicando cada linha pela raiz quadrada do peso normalizado correspondente. Finalmente, calculamos a matriz Gram tomando o produto escalar da matriz de projeto redimensionada com sua transposta.

X_offset = np.average(X, axis=0, weights=normalized_weights)
X_centered = X - np.average(X, axis=0, weights=normalized_weights)
X_scaled = X_centered * np.sqrt(normalized_weights)[:, np.newaxis]
gram = np.dot(X_scaled.T, X_scaled)

Ajustando a Rede Elástica

Agora podemos prosseguir com o ajuste. Devemos passar a matriz de projeto centralizada para o método fit para evitar que o estimador de rede elástica detecte que ela está não-centralizada e descarte a matriz Gram que passamos. No entanto, se passarmos a matriz de projeto escalonada, o código de pré-processamento a redimensionará incorretamente uma segunda vez. Também passamos os pesos normalizados para o parâmetro sample_weight da função fit.

from sklearn.linear_model import ElasticNet

lm = ElasticNet(alpha=0.01, precompute=gram)
lm.fit(X_centered, y, sample_weight=normalized_weights)

Resumo

Este laboratório demonstrou como pré-calcular a matriz Gram ao usar amostras ponderadas com um modelo ElasticNet. Primeiro, carregamos um conjunto de dados de regressão e criamos um vetor de pesos log-normal, que foi normalizado para somar ao número total de amostras. Em seguida, centralizamos a matriz de projeto, redimensionamos-a pelos pesos normalizados e calculamos a matriz Gram. Finalmente, ajustamos a rede elástica usando a matriz Gram pré-calculada e os pesos normalizados.