Regresión de mínimos cuadrados no negativos

Beginner

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

Introducción

En este laboratorio, aprenderemos sobre la regresión de mínimos cuadrados no negativos, un tipo de regresión lineal que constriñe los coeficientes de regresión a ser no negativos. Usaremos la biblioteca scikit-learn de Python para implementar este algoritmo y compararlo con la regresión lineal clásica.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje comentarios después de la sesión y lo resolveremos rápidamente para usted.

Generar datos aleatorios

Generaremos algunos datos aleatorios para probar nuestro algoritmo. Crearemos 200 muestras con 50 características y usaremos un coeficiente real de 3 para cada característica. Luego, umbralizaremos los coeficientes para que sean no negativos. Por último, agregaremos algo de ruido a las muestras.

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 los datos en conjuntos de entrenamiento y prueba

Dividiremos nuestros datos en un conjunto de entrenamiento y un conjunto de prueba, con el 50% de los datos en 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 la regresión de mínimos cuadrados no negativos

Ahora ajustaremos nuestros datos utilizando la regresión de mínimos cuadrados no negativos. Esto se hace utilizando la clase LinearRegression de scikit-learn con el parámetro positive=True. Luego, predecirá los valores para nuestro conjunto de prueba y calculará la puntuación 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 la regresión lineal clásica

Ahora ajustaremos nuestros datos utilizando la regresión lineal clásica. Esto se hace utilizando la clase LinearRegression de scikit-learn. Luego, predecirá los valores para nuestro conjunto de prueba y calculará la puntuación 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 los coeficientes de regresión

Ahora compararemos los coeficientes de regresión entre la regresión de mínimos cuadrados no negativos y la regresión lineal clásica. Graficaremos los coeficientes uno contra el otro y observaremos que están altamente correlacionados. Sin embargo, la restricción no negativa reduce algunos coeficientes a 0. Esto se debe a que la regresión de mínimos cuadrados no negativos inherentemente produce resultados dispersos.

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("OLS regression coefficients", fontweight="bold")
ax.set_ylabel("NNLS regression coefficients", fontweight="bold")

Resumen

En este laboratorio, aprendimos sobre la regresión de mínimos cuadrados no negativos y cómo difiere de la regresión lineal clásica. Utilizamos scikit-learn para implementar este algoritmo y lo comparamos con la regresión lineal clásica generando datos aleatorios y dividiéndolos en un conjunto de entrenamiento y un conjunto de prueba. Luego ajustamos ambos modelos a los datos, predecimos los valores para el conjunto de prueba y calculamos la puntuación R2. Finalmente, comparamos los coeficientes de regresión entre los dos modelos y observamos que la regresión de mínimos cuadrados no negativos produce resultados dispersos.