Régression linéaire non négative

Beginner

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

Introduction

Dans ce laboratoire, nous allons apprendre à connaître la régression linéaire non négative, un type de régression linéaire qui contraint les coefficients de régression à être non négatifs. Nous utiliserons la bibliothèque scikit-learn de Python pour implémenter cet algorithme et le comparer à la régression linéaire classique.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Notebook pour accéder à Jupyter Notebook pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous réglerons rapidement le problème pour vous.

Générer des données aléatoires

Nous allons générer quelques données aléatoires pour tester notre algorithme. Nous allons créer 200 échantillons avec 50 caractéristiques et utiliser un coefficient réel de 3 pour chaque caractéristique. Nous allons ensuite appliquer un seuil aux coefficients pour les rendre non négatifs. Enfin, nous allons ajouter du bruit aux échantillons.

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,))

Diviser les données en ensembles d'entraînement et de test

Nous allons diviser nos données en un ensemble d'entraînement et un ensemble de test, avec 50 % des données dans chaque ensemble.

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)

Ajuster la régression linéaire non négative

Nous allons maintenant ajuster nos données en utilisant la régression linéaire non négative. Cela se fait en utilisant la classe LinearRegression de scikit-learn avec le paramètre positive=True. Nous prédirons ensuite les valeurs pour notre ensemble de test et calculerons le score 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)

Ajuster la régression linéaire classique

Nous allons maintenant ajuster nos données en utilisant la régression linéaire classique. Cela se fait en utilisant la classe LinearRegression de scikit-learn. Nous prédirons ensuite les valeurs pour notre ensemble de test et calculerons le score 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)

Comparer les coefficients de régression

Nous allons maintenant comparer les coefficients de régression entre la régression linéaire non négative et la régression linéaire classique. Nous allons tracer les coefficients l'un contre l'autre et observer qu'ils sont fortement corrélés. Cependant, la contrainte non négative réduit certains coefficients à 0. Cela est dû au fait que la régression linéaire non négative produit intrinsèquement des résultats parcimonieux.

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")

Sommaire

Dans ce laboratoire, nous avons appris sur la régression linéaire non négative et en quoi elle diffère de la régression linéaire classique. Nous avons utilisé scikit-learn pour implémenter cet algorithme et l'avons comparé à la régression linéaire classique en générant des données aléatoires et en les divisant en un ensemble d'entraînement et un ensemble de test. Nous avons ensuite ajusté les deux modèles aux données, prédit les valeurs pour l'ensemble de test et calculé le score R2. Enfin, nous avons comparé les coefficients de régression entre les deux modèles et observé que la régression linéaire non négative produit des résultats parcimonieux.