Regresión de mínimos cuadrados no negativos

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49228{{"Regresión de mínimos cuadrados no negativos"}} sklearn/model_selection -.-> lab-49228{{"Regresión de mínimos cuadrados no negativos"}} sklearn/metrics -.-> lab-49228{{"Regresión de mínimos cuadrados no negativos"}} ml/sklearn -.-> lab-49228{{"Regresión de mínimos cuadrados no negativos"}} end

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.