Regressão de Mínimos Quadrados Não Negativos

Beginner

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

Introdução

Neste laboratório, aprenderemos sobre a regressão de mínimos quadrados não negativos, um tipo de regressão linear que restringe os coeficientes de regressão a serem não negativos. Usaremos a biblioteca scikit-learn do Python para implementar este algoritmo e compará-lo com a regressão linear clássica.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, 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, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Gerar Dados Aleatórios

Vamos gerar alguns dados aleatórios para testar o nosso algoritmo. Criaremos 200 amostras com 50 características e usaremos um coeficiente verdadeiro de 3 para cada característica. Em seguida, iremos aplicar um limiar aos coeficientes para torná-los não negativos. Finalmente, adicionaremos algum ruído às amostras.

import numpy as np

np.random.seed(42)

n_samples, n_features = 200, 50
X = np.random.randn(n_samples, n_features)
true_coef = 3 * np.random.randn(n_features)
true_coef[true_coef < 0] = 0
y = np.dot(X, true_coef)
y += 5 * np.random.normal(size=(n_samples,))

Dividir os Dados em Conjuntos de Treino e Teste

Dividiremos os nossos dados em um conjunto de treino e um conjunto de teste, com 50% dos dados em cada conjunto.

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5)

Ajustar Regressão de Mínimos Quadrados Não Negativos

Agora, ajustaremos os nossos dados usando regressão de mínimos quadrados não negativos. Isto é feito usando a classe LinearRegression do scikit-learn com o parâmetro positive=True. Em seguida, preveremos os valores para o nosso conjunto de teste e calcularemos a pontuação R2.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

reg_nnls = LinearRegression(positive=True)
y_pred_nnls = reg_nnls.fit(X_train, y_train).predict(X_test)
r2_score_nnls = r2_score(y_test, y_pred_nnls)
print("NNLS R2 score", r2_score_nnls)

Ajustar Regressão Linear Clássica

Agora, ajustaremos os nossos dados usando regressão linear clássica. Isto é feito usando a classe LinearRegression do scikit-learn. Em seguida, preveremos os valores para o nosso conjunto de teste e calcularemos a pontuação R2.

reg_ols = LinearRegression()
y_pred_ols = reg_ols.fit(X_train, y_train).predict(X_test)
r2_score_ols = r2_score(y_test, y_pred_ols)
print("OLS R2 score", r2_score_ols)

Comparar Coeficientes de Regressão

Agora, compararemos os coeficientes de regressão entre a regressão de mínimos quadrados não negativos e a regressão linear clássica. Vamos plotar os coeficientes um contra o outro e observar que eles estão altamente correlacionados. No entanto, a restrição não negativa reduz alguns coeficientes a 0. Isto porque a regressão de mínimos quadrados não negativos inerentemente produz resultados esparsos.

import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.plot(reg_ols.coef_, reg_nnls.coef_, linewidth=0, marker=".")

low_x, high_x = ax.get_xlim()
low_y, high_y = ax.get_ylim()
low = max(low_x, low_y)
high = min(high_x, high_y)
ax.plot([low, high], [low, high], ls="--", c=".3", alpha=0.5)
ax.set_xlabel("Coeficientes de regressão OLS", fontweight="bold")
ax.set_ylabel("Coeficientes de regressão NNLS", fontweight="bold")

Resumo

Neste laboratório, aprendemos sobre a regressão de mínimos quadrados não negativos e como ela difere da regressão linear clássica. Usamos o scikit-learn para implementar este algoritmo e compará-lo à regressão linear clássica, gerando dados aleatórios e dividindo-os em um conjunto de treino e um conjunto de teste. Em seguida, ajustamos ambos os modelos aos dados, previmos os valores para o conjunto de teste e calculamos a pontuação R2. Finalmente, comparamos os coeficientes de regressão entre os dois modelos e observamos que a regressão de mínimos quadrados não negativos produz resultados esparsos.