Modelo de Regressão Elastic-Net com Scikit-Learn

Beginner

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

Introdução

Neste laboratório, utilizaremos o modelo de regressão Elastic-Net do Scikit-learn para ilustrar como o desempenho de um estimador em dados não vistos (dados de teste) não é o mesmo que o desempenho em dados de treino. Geraremos dados de amostra, calculamos os erros de treino e teste e plotaremos as funções de resultados.

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 o carregamento. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

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

Gerar Dados de Amostra

Vamos gerar dados de amostra utilizando a função make_regression() do Scikit-learn. Definiremos o número de amostras de treino para 75, o número de amostras de teste para 150 e o número de características para 500. Também definiremos n_informative para 50 e shuffle para False.

import numpy as np
from sklearn import linear_model
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

n_samples_train, n_samples_test, n_features = 75, 150, 500
X, y, coef = make_regression(
    n_samples=n_samples_train + n_samples_test,
    n_features=n_features,
    n_informative=50,
    shuffle=False,
    noise=1.0,
    coef=True,
)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, train_size=n_samples_train, test_size=n_samples_test, shuffle=False
)

Calcular Erros de Treino e Teste

Vamos calcular os erros de treino e teste utilizando o modelo de regressão Elastic-Net do Scikit-learn. Definiremos o parâmetro de regularização alpha numa gama de valores de 10^-5 a 10^1 usando np.logspace(). Também definiremos o l1_ratio para 0,7 e max_iter para 10000.

alphas = np.logspace(-5, 1, 60)
enet = linear_model.ElasticNet(l1_ratio=0.7, max_iter=10000)
train_errors = list()
test_errors = list()
for alpha in alphas:
    enet.set_params(alpha=alpha)
    enet.fit(X_train, y_train)
    train_errors.append(enet.score(X_train, y_train))
    test_errors.append(enet.score(X_test, y_test))

i_alpha_optim = np.argmax(test_errors)
alpha_optim = alphas[i_alpha_optim]
print("Parâmetro de regularização ótimo : %s" % alpha_optim)

Funções para Plotar Resultados

Vamos plotar as funções de resultados utilizando a biblioteca matplotlib. Usaremos a função plt.subplot() para criar dois subplots. No primeiro subplot, plotaremos os erros de treino e teste em função do parâmetro de regularização. Também plotaremos uma linha vertical no parâmetro de regularização ótimo. No segundo subplot, plotaremos os coeficientes verdadeiros e os coeficientes estimados.

import matplotlib.pyplot as plt

plt.subplot(2, 1, 1)
plt.semilogx(alphas, train_errors, label="Treino")
plt.semilogx(alphas, test_errors, label="Teste")
plt.vlines(
    alpha_optim,
    plt.ylim()[0],
    np.max(test_errors),
    color="k",
    linewidth=3,
    label="Ótimo em teste",
)
plt.legend(loc="lower right")
plt.ylim([0, 1.2])
plt.xlabel("Parâmetro de regularização")
plt.ylabel("Desempenho")

## Mostrar coef_ estimado vs coef verdadeiro
plt.subplot(2, 1, 2)
plt.plot(coef, label="Coef verdadeiro")
plt.plot(coef_, label="Coef estimado")
plt.legend()
plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.26)
plt.show()

Resumo

Neste laboratório, aprendemos a utilizar o modelo de regressão Elastic-Net do Scikit-learn para calcular os erros de treino e teste e para plotar as funções de resultados. Também aprendemos que o desempenho de um estimador em dados não vistos (dados de teste) não é o mesmo que o desempenho nos dados de treino. Gerámos dados de amostra, calculamos os erros de treino e teste e plotamos as funções de resultados utilizando as funções make_regression(), linear_model.ElasticNet(), train_test_split(), np.logspace() e matplotlib.